@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.
Files changed (441) hide show
  1. package/_base/_story/a11y.jsx +6 -6
  2. package/_base/_story/a11y.scss +0 -1
  3. package/_base/_story/index.scss +2 -5
  4. package/_utils/hooks/usePrevFocus.ts +16 -0
  5. package/_utils/index.ts +4 -0
  6. package/anchor/_story/anchor.stories.js +1 -1
  7. package/anchor/index.tsx +5 -2
  8. package/anchor/link.tsx +29 -4
  9. package/autoComplete/index.tsx +28 -1
  10. package/avatar/_story/avatar.stories.js +4 -4
  11. package/avatar/index.tsx +6 -4
  12. package/banner/index.tsx +2 -1
  13. package/breadcrumb/_story/breadcrumb.stories.js +22 -8
  14. package/breadcrumb/index.tsx +8 -1
  15. package/breadcrumb/item.tsx +1 -1
  16. package/button/Button.tsx +4 -0
  17. package/button/__test__/button.test.js +1 -1
  18. package/button/_story/button.stories.js +10 -10
  19. package/button/buttonGroup.tsx +4 -2
  20. package/button/splitButtonGroup.tsx +5 -2
  21. package/card/_story/card.stories.js +8 -1
  22. package/card/_story/card.stories.tsx +3 -0
  23. package/card/index.tsx +5 -2
  24. package/cascader/index.tsx +33 -5
  25. package/checkbox/_story/checkbox.stories.js +19 -12
  26. package/checkbox/checkbox.tsx +40 -5
  27. package/checkbox/checkboxGroup.tsx +30 -5
  28. package/checkbox/checkboxInner.tsx +25 -2
  29. package/collapse/index.tsx +1 -1
  30. package/collapse/item.tsx +12 -7
  31. package/collapsible/index.tsx +4 -2
  32. package/configProvider/_story/configProvider.stories.tsx +27 -0
  33. package/datePicker/datePicker.tsx +19 -0
  34. package/dist/css/semi.css +23 -12
  35. package/dist/css/semi.min.css +1 -1
  36. package/dist/umd/semi-ui.js +2502 -1249
  37. package/dist/umd/semi-ui.js.map +1 -1
  38. package/dist/umd/semi-ui.min.js +1 -1
  39. package/dist/umd/semi-ui.min.js.map +1 -1
  40. package/dropdown/dropdownItem.tsx +1 -1
  41. package/dropdown/dropdownMenu.tsx +1 -1
  42. package/dropdown/index.tsx +11 -3
  43. package/empty/index.tsx +4 -4
  44. package/form/_story/FormApi/formApiDemo.jsx +3 -2
  45. package/form/_story/Validate/validateDemo.jsx +1 -1
  46. package/form/_story/demo.jsx +12 -3
  47. package/form/_story/form.stories.js +0 -7
  48. package/form/baseForm.tsx +2 -0
  49. package/form/errorMessage.tsx +13 -2
  50. package/form/hoc/withField.tsx +37 -8
  51. package/form/index.tsx +0 -2
  52. package/form/interface.ts +2 -0
  53. package/form/label.tsx +4 -2
  54. package/input/index.tsx +49 -4
  55. package/input/inputGroup.tsx +9 -4
  56. package/input/textarea.tsx +30 -9
  57. package/inputNumber/__test__/inputNumber.test.js +36 -8
  58. package/inputNumber/index.tsx +30 -2
  59. package/layout/Sider.tsx +6 -2
  60. package/layout/index.tsx +4 -3
  61. package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
  62. package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
  63. package/lib/cjs/_utils/index.d.ts +1 -0
  64. package/lib/cjs/_utils/index.js +6 -1
  65. package/lib/cjs/anchor/index.d.ts +2 -0
  66. package/lib/cjs/anchor/index.js +6 -1
  67. package/lib/cjs/anchor/link.d.ts +4 -1
  68. package/lib/cjs/anchor/link.js +39 -5
  69. package/lib/cjs/autoComplete/index.d.ts +17 -0
  70. package/lib/cjs/autoComplete/index.js +21 -2
  71. package/lib/cjs/avatar/index.d.ts +4 -3
  72. package/lib/cjs/avatar/index.js +15 -11
  73. package/lib/cjs/banner/index.js +4 -2
  74. package/lib/cjs/breadcrumb/index.d.ts +3 -0
  75. package/lib/cjs/breadcrumb/index.js +10 -4
  76. package/lib/cjs/breadcrumb/item.js +2 -2
  77. package/lib/cjs/button/Button.d.ts +2 -0
  78. package/lib/cjs/button/Button.js +4 -2
  79. package/lib/cjs/button/buttonGroup.d.ts +3 -0
  80. package/lib/cjs/button/buttonGroup.js +8 -4
  81. package/lib/cjs/button/index.d.ts +1 -0
  82. package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
  83. package/lib/cjs/button/splitButtonGroup.js +5 -2
  84. package/lib/cjs/card/index.d.ts +3 -0
  85. package/lib/cjs/card/index.js +3 -1
  86. package/lib/cjs/cascader/index.d.ts +14 -0
  87. package/lib/cjs/cascader/index.js +35 -7
  88. package/lib/cjs/checkbox/checkbox.d.ts +21 -1
  89. package/lib/cjs/checkbox/checkbox.js +51 -17
  90. package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
  91. package/lib/cjs/checkbox/checkboxGroup.js +16 -3
  92. package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
  93. package/lib/cjs/checkbox/checkboxInner.js +20 -3
  94. package/lib/cjs/collapse/item.d.ts +2 -1
  95. package/lib/cjs/collapse/item.js +12 -2
  96. package/lib/cjs/collapsible/index.d.ts +1 -0
  97. package/lib/cjs/collapsible/index.js +4 -2
  98. package/lib/cjs/datePicker/datePicker.d.ts +12 -0
  99. package/lib/cjs/datePicker/datePicker.js +14 -1
  100. package/lib/cjs/dropdown/dropdownItem.js +3 -1
  101. package/lib/cjs/dropdown/dropdownMenu.js +4 -1
  102. package/lib/cjs/dropdown/index.d.ts +10 -3
  103. package/lib/cjs/form/baseForm.d.ts +9 -0
  104. package/lib/cjs/form/baseForm.js +3 -1
  105. package/lib/cjs/form/errorMessage.d.ts +4 -0
  106. package/lib/cjs/form/errorMessage.js +21 -3
  107. package/lib/cjs/form/field.d.ts +7 -0
  108. package/lib/cjs/form/hoc/withField.js +49 -16
  109. package/lib/cjs/form/index.d.ts +0 -1
  110. package/lib/cjs/form/interface.d.ts +2 -0
  111. package/lib/cjs/form/label.d.ts +2 -0
  112. package/lib/cjs/form/label.js +5 -2
  113. package/lib/cjs/input/index.d.ts +16 -0
  114. package/lib/cjs/input/index.js +51 -15
  115. package/lib/cjs/input/inputGroup.d.ts +2 -1
  116. package/lib/cjs/input/inputGroup.js +11 -1
  117. package/lib/cjs/input/textarea.js +16 -3
  118. package/lib/cjs/inputNumber/index.d.ts +8 -0
  119. package/lib/cjs/inputNumber/index.js +35 -4
  120. package/lib/cjs/layout/Sider.d.ts +4 -0
  121. package/lib/cjs/layout/Sider.js +4 -1
  122. package/lib/cjs/layout/index.js +2 -0
  123. package/lib/cjs/list/index.d.ts +4 -4
  124. package/lib/cjs/list/item.js +0 -1
  125. package/lib/cjs/modal/Modal.js +2 -0
  126. package/lib/cjs/modal/ModalContent.d.ts +3 -1
  127. package/lib/cjs/modal/ModalContent.js +47 -5
  128. package/lib/cjs/navigation/Item.d.ts +4 -2
  129. package/lib/cjs/navigation/Item.js +25 -5
  130. package/lib/cjs/navigation/SubNav.d.ts +4 -2
  131. package/lib/cjs/navigation/SubNav.js +8 -1
  132. package/lib/cjs/navigation/index.js +2 -0
  133. package/lib/cjs/notification/notice.d.ts +1 -1
  134. package/lib/cjs/notification/notice.js +32 -22
  135. package/lib/cjs/pagination/index.js +16 -6
  136. package/lib/cjs/popover/index.js +7 -3
  137. package/lib/cjs/progress/index.d.ts +8 -0
  138. package/lib/cjs/progress/index.js +42 -9
  139. package/lib/cjs/radio/radio.d.ts +6 -1
  140. package/lib/cjs/radio/radio.js +17 -5
  141. package/lib/cjs/radio/radioGroup.d.ts +16 -1
  142. package/lib/cjs/radio/radioGroup.js +18 -3
  143. package/lib/cjs/radio/radioInner.d.ts +6 -1
  144. package/lib/cjs/radio/radioInner.js +11 -3
  145. package/lib/cjs/rating/index.d.ts +14 -0
  146. package/lib/cjs/rating/index.js +14 -3
  147. package/lib/cjs/rating/item.d.ts +2 -0
  148. package/lib/cjs/rating/item.js +6 -1
  149. package/lib/cjs/select/index.d.ts +16 -0
  150. package/lib/cjs/select/index.js +65 -19
  151. package/lib/cjs/select/option.js +28 -22
  152. package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
  153. package/lib/cjs/sideSheet/SideSheetContent.js +4 -1
  154. package/lib/cjs/sideSheet/index.d.ts +1 -0
  155. package/lib/cjs/sideSheet/index.js +2 -1
  156. package/lib/cjs/slider/index.d.ts +2 -1
  157. package/lib/cjs/slider/index.js +64 -17
  158. package/lib/cjs/spin/icon.js +3 -4
  159. package/lib/cjs/steps/basicStep.d.ts +3 -0
  160. package/lib/cjs/steps/basicStep.js +23 -25
  161. package/lib/cjs/steps/basicSteps.d.ts +1 -0
  162. package/lib/cjs/steps/basicSteps.js +2 -1
  163. package/lib/cjs/steps/fillStep.d.ts +3 -0
  164. package/lib/cjs/steps/fillStep.js +19 -4
  165. package/lib/cjs/steps/fillSteps.d.ts +1 -0
  166. package/lib/cjs/steps/fillSteps.js +2 -1
  167. package/lib/cjs/steps/navStep.d.ts +3 -0
  168. package/lib/cjs/steps/navStep.js +22 -25
  169. package/lib/cjs/steps/navSteps.d.ts +1 -0
  170. package/lib/cjs/steps/navSteps.js +2 -1
  171. package/lib/cjs/switch/index.d.ts +12 -0
  172. package/lib/cjs/switch/index.js +19 -4
  173. package/lib/cjs/table/Body/BaseRow.js +35 -3
  174. package/lib/cjs/table/Body/index.js +9 -1
  175. package/lib/cjs/table/ColumnFilter.js +4 -0
  176. package/lib/cjs/table/ColumnSelection.d.ts +3 -0
  177. package/lib/cjs/table/ColumnSelection.js +6 -2
  178. package/lib/cjs/table/ColumnSorter.js +19 -3
  179. package/lib/cjs/table/CustomExpandIcon.js +7 -1
  180. package/lib/cjs/table/Table.d.ts +2 -0
  181. package/lib/cjs/table/Table.js +35 -15
  182. package/lib/cjs/table/TableCell.d.ts +2 -0
  183. package/lib/cjs/table/TableCell.js +6 -2
  184. package/lib/cjs/table/TableHeaderRow.js +8 -2
  185. package/lib/cjs/tabs/TabBar.js +11 -3
  186. package/lib/cjs/tabs/TabPane.js +3 -1
  187. package/lib/cjs/tabs/index.js +0 -1
  188. package/lib/cjs/tagInput/index.d.ts +4 -1
  189. package/lib/cjs/tagInput/index.js +29 -3
  190. package/lib/cjs/timePicker/TimePicker.d.ts +14 -0
  191. package/lib/cjs/timePicker/TimePicker.js +11 -4
  192. package/lib/cjs/timePicker/index.d.ts +7 -0
  193. package/lib/cjs/timeline/index.d.ts +1 -1
  194. package/lib/cjs/timeline/index.js +1 -0
  195. package/lib/cjs/timeline/item.js +4 -2
  196. package/lib/cjs/toast/toast.js +2 -0
  197. package/lib/cjs/tooltip/TriangleArrow.js +1 -0
  198. package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
  199. package/lib/cjs/tooltip/index.d.ts +16 -12
  200. package/lib/cjs/tooltip/index.js +55 -39
  201. package/lib/cjs/transfer/index.js +32 -14
  202. package/lib/cjs/tree/index.d.ts +1 -0
  203. package/lib/cjs/tree/index.js +15 -6
  204. package/lib/cjs/tree/treeNode.d.ts +12 -4
  205. package/lib/cjs/tree/treeNode.js +54 -5
  206. package/lib/cjs/treeSelect/index.d.ts +16 -0
  207. package/lib/cjs/treeSelect/index.js +60 -12
  208. package/lib/cjs/typography/base.js +18 -7
  209. package/lib/cjs/typography/copyable.js +6 -1
  210. package/lib/cjs/upload/fileCard.js +26 -7
  211. package/lib/cjs/upload/index.js +19 -4
  212. package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
  213. package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
  214. package/lib/es/_utils/index.d.ts +1 -0
  215. package/lib/es/_utils/index.js +4 -1
  216. package/lib/es/anchor/index.d.ts +2 -0
  217. package/lib/es/anchor/index.js +6 -1
  218. package/lib/es/anchor/link.d.ts +4 -1
  219. package/lib/es/anchor/link.js +38 -5
  220. package/lib/es/autoComplete/index.d.ts +17 -0
  221. package/lib/es/autoComplete/index.js +21 -2
  222. package/lib/es/avatar/index.d.ts +4 -3
  223. package/lib/es/avatar/index.js +15 -11
  224. package/lib/es/banner/index.js +4 -2
  225. package/lib/es/breadcrumb/index.d.ts +3 -0
  226. package/lib/es/breadcrumb/index.js +10 -4
  227. package/lib/es/breadcrumb/item.js +2 -2
  228. package/lib/es/button/Button.d.ts +2 -0
  229. package/lib/es/button/Button.js +4 -2
  230. package/lib/es/button/buttonGroup.d.ts +3 -0
  231. package/lib/es/button/buttonGroup.js +8 -4
  232. package/lib/es/button/index.d.ts +1 -0
  233. package/lib/es/button/splitButtonGroup.d.ts +3 -0
  234. package/lib/es/button/splitButtonGroup.js +5 -2
  235. package/lib/es/card/index.d.ts +3 -0
  236. package/lib/es/card/index.js +3 -1
  237. package/lib/es/cascader/index.d.ts +14 -0
  238. package/lib/es/cascader/index.js +35 -7
  239. package/lib/es/checkbox/checkbox.d.ts +21 -1
  240. package/lib/es/checkbox/checkbox.js +50 -17
  241. package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
  242. package/lib/es/checkbox/checkboxGroup.js +18 -5
  243. package/lib/es/checkbox/checkboxInner.d.ts +15 -0
  244. package/lib/es/checkbox/checkboxInner.js +20 -3
  245. package/lib/es/collapse/item.d.ts +2 -1
  246. package/lib/es/collapse/item.js +11 -2
  247. package/lib/es/collapsible/index.d.ts +1 -0
  248. package/lib/es/collapsible/index.js +4 -2
  249. package/lib/es/datePicker/datePicker.d.ts +12 -0
  250. package/lib/es/datePicker/datePicker.js +14 -1
  251. package/lib/es/dropdown/dropdownItem.js +3 -1
  252. package/lib/es/dropdown/dropdownMenu.js +4 -1
  253. package/lib/es/dropdown/index.d.ts +10 -3
  254. package/lib/es/form/baseForm.d.ts +9 -0
  255. package/lib/es/form/baseForm.js +3 -1
  256. package/lib/es/form/errorMessage.d.ts +4 -0
  257. package/lib/es/form/errorMessage.js +21 -3
  258. package/lib/es/form/field.d.ts +7 -0
  259. package/lib/es/form/hoc/withField.js +48 -15
  260. package/lib/es/form/index.d.ts +0 -1
  261. package/lib/es/form/index.js +0 -1
  262. package/lib/es/form/interface.d.ts +2 -0
  263. package/lib/es/form/label.d.ts +2 -0
  264. package/lib/es/form/label.js +5 -2
  265. package/lib/es/input/index.d.ts +16 -0
  266. package/lib/es/input/index.js +51 -15
  267. package/lib/es/input/inputGroup.d.ts +2 -1
  268. package/lib/es/input/inputGroup.js +11 -1
  269. package/lib/es/input/textarea.js +16 -3
  270. package/lib/es/inputNumber/index.d.ts +8 -0
  271. package/lib/es/inputNumber/index.js +36 -4
  272. package/lib/es/layout/Sider.d.ts +4 -0
  273. package/lib/es/layout/Sider.js +4 -1
  274. package/lib/es/layout/index.js +2 -0
  275. package/lib/es/list/index.d.ts +4 -4
  276. package/lib/es/list/item.js +0 -1
  277. package/lib/es/modal/Modal.js +2 -0
  278. package/lib/es/modal/ModalContent.d.ts +3 -1
  279. package/lib/es/modal/ModalContent.js +46 -5
  280. package/lib/es/navigation/Item.d.ts +4 -2
  281. package/lib/es/navigation/Item.js +25 -5
  282. package/lib/es/navigation/SubNav.d.ts +4 -2
  283. package/lib/es/navigation/SubNav.js +8 -1
  284. package/lib/es/navigation/index.js +2 -0
  285. package/lib/es/notification/notice.d.ts +1 -1
  286. package/lib/es/notification/notice.js +33 -24
  287. package/lib/es/pagination/index.js +16 -6
  288. package/lib/es/popover/index.js +7 -3
  289. package/lib/es/progress/index.d.ts +8 -0
  290. package/lib/es/progress/index.js +42 -9
  291. package/lib/es/radio/radio.d.ts +6 -1
  292. package/lib/es/radio/radio.js +16 -5
  293. package/lib/es/radio/radioGroup.d.ts +16 -1
  294. package/lib/es/radio/radioGroup.js +18 -3
  295. package/lib/es/radio/radioInner.d.ts +6 -1
  296. package/lib/es/radio/radioInner.js +11 -3
  297. package/lib/es/rating/index.d.ts +14 -0
  298. package/lib/es/rating/index.js +14 -3
  299. package/lib/es/rating/item.d.ts +2 -0
  300. package/lib/es/rating/item.js +6 -1
  301. package/lib/es/select/index.d.ts +16 -0
  302. package/lib/es/select/index.js +63 -17
  303. package/lib/es/select/option.js +28 -22
  304. package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
  305. package/lib/es/sideSheet/SideSheetContent.js +4 -1
  306. package/lib/es/sideSheet/index.d.ts +1 -0
  307. package/lib/es/sideSheet/index.js +2 -1
  308. package/lib/es/slider/index.d.ts +2 -1
  309. package/lib/es/slider/index.js +63 -16
  310. package/lib/es/spin/icon.js +3 -4
  311. package/lib/es/steps/basicStep.d.ts +3 -0
  312. package/lib/es/steps/basicStep.js +23 -23
  313. package/lib/es/steps/basicSteps.d.ts +1 -0
  314. package/lib/es/steps/basicSteps.js +2 -1
  315. package/lib/es/steps/fillStep.d.ts +3 -0
  316. package/lib/es/steps/fillStep.js +19 -4
  317. package/lib/es/steps/fillSteps.d.ts +1 -0
  318. package/lib/es/steps/fillSteps.js +2 -1
  319. package/lib/es/steps/navStep.d.ts +3 -0
  320. package/lib/es/steps/navStep.js +22 -23
  321. package/lib/es/steps/navSteps.d.ts +1 -0
  322. package/lib/es/steps/navSteps.js +2 -1
  323. package/lib/es/switch/index.d.ts +12 -0
  324. package/lib/es/switch/index.js +19 -4
  325. package/lib/es/table/Body/BaseRow.js +35 -3
  326. package/lib/es/table/Body/index.js +9 -2
  327. package/lib/es/table/ColumnFilter.js +4 -0
  328. package/lib/es/table/ColumnSelection.d.ts +3 -0
  329. package/lib/es/table/ColumnSelection.js +6 -2
  330. package/lib/es/table/ColumnSorter.js +17 -3
  331. package/lib/es/table/CustomExpandIcon.js +6 -1
  332. package/lib/es/table/Table.d.ts +2 -0
  333. package/lib/es/table/Table.js +35 -15
  334. package/lib/es/table/TableCell.d.ts +2 -0
  335. package/lib/es/table/TableCell.js +6 -2
  336. package/lib/es/table/TableHeaderRow.js +8 -2
  337. package/lib/es/tabs/TabBar.js +11 -3
  338. package/lib/es/tabs/TabPane.js +3 -1
  339. package/lib/es/tabs/index.js +0 -1
  340. package/lib/es/tagInput/index.d.ts +4 -1
  341. package/lib/es/tagInput/index.js +29 -3
  342. package/lib/es/timePicker/TimePicker.d.ts +14 -0
  343. package/lib/es/timePicker/TimePicker.js +11 -4
  344. package/lib/es/timePicker/index.d.ts +7 -0
  345. package/lib/es/timeline/index.d.ts +1 -1
  346. package/lib/es/timeline/index.js +1 -0
  347. package/lib/es/timeline/item.js +4 -2
  348. package/lib/es/toast/toast.js +2 -0
  349. package/lib/es/tooltip/TriangleArrow.js +1 -0
  350. package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
  351. package/lib/es/tooltip/index.d.ts +16 -12
  352. package/lib/es/tooltip/index.js +53 -39
  353. package/lib/es/transfer/index.js +32 -14
  354. package/lib/es/tree/index.d.ts +1 -0
  355. package/lib/es/tree/index.js +15 -6
  356. package/lib/es/tree/treeNode.d.ts +12 -4
  357. package/lib/es/tree/treeNode.js +53 -5
  358. package/lib/es/treeSelect/index.d.ts +16 -0
  359. package/lib/es/treeSelect/index.js +57 -10
  360. package/lib/es/typography/base.js +17 -7
  361. package/lib/es/typography/copyable.js +5 -1
  362. package/lib/es/upload/fileCard.js +26 -7
  363. package/lib/es/upload/index.js +19 -4
  364. package/list/index.tsx +5 -5
  365. package/list/item.tsx +0 -1
  366. package/modal/Modal.tsx +2 -0
  367. package/modal/ModalContent.tsx +35 -5
  368. package/navigation/Item.tsx +15 -0
  369. package/navigation/SubNav.tsx +13 -1
  370. package/navigation/index.tsx +1 -1
  371. package/notification/notice.tsx +19 -14
  372. package/package.json +8 -8
  373. package/pagination/index.tsx +9 -5
  374. package/popover/index.tsx +5 -0
  375. package/progress/_story/progress.stories.js +18 -18
  376. package/progress/index.tsx +58 -20
  377. package/radio/radio.tsx +12 -2
  378. package/radio/radioGroup.tsx +29 -3
  379. package/radio/radioInner.tsx +10 -1
  380. package/rating/index.tsx +19 -2
  381. package/rating/item.tsx +6 -0
  382. package/select/__test__/select.test.js +45 -0
  383. package/select/_story/select.stories.js +29 -0
  384. package/select/index.tsx +57 -4
  385. package/select/option.tsx +3 -0
  386. package/sideSheet/SideSheetContent.tsx +6 -4
  387. package/sideSheet/index.tsx +3 -2
  388. package/slider/__test__/slider.test.js +9 -0
  389. package/slider/_story/slider.stories.js +1 -1
  390. package/slider/index.tsx +44 -7
  391. package/spin/icon.tsx +4 -3
  392. package/steps/basicStep.tsx +15 -4
  393. package/steps/basicSteps.tsx +3 -2
  394. package/steps/fillStep.tsx +27 -12
  395. package/steps/fillSteps.tsx +2 -0
  396. package/steps/navStep.tsx +15 -4
  397. package/steps/navSteps.tsx +3 -2
  398. package/switch/_story/switch.stories.js +20 -19
  399. package/switch/_story/switch.stories.tsx +13 -13
  400. package/switch/index.tsx +23 -5
  401. package/table/Body/BaseRow.tsx +25 -1
  402. package/table/Body/index.tsx +7 -2
  403. package/table/ColumnFilter.tsx +7 -1
  404. package/table/ColumnSelection.tsx +4 -1
  405. package/table/ColumnSorter.tsx +18 -1
  406. package/table/CustomExpandIcon.tsx +5 -0
  407. package/table/Table.tsx +30 -14
  408. package/table/TableCell.tsx +11 -1
  409. package/table/TableHeaderRow.tsx +16 -2
  410. package/table/__test__/table.test.js +46 -0
  411. package/table/_story/table.stories.js +2 -0
  412. package/table/_story/v2/FixedColumnsChange/index.jsx +104 -0
  413. package/table/_story/v2/FixedZIndex/index.jsx +87 -0
  414. package/tabs/TabBar.tsx +8 -5
  415. package/tabs/TabPane.tsx +3 -1
  416. package/tabs/index.tsx +0 -1
  417. package/tagInput/__test__/tagInput.test.js +46 -0
  418. package/tagInput/_story/tagInput.stories.js +2 -2
  419. package/tagInput/index.tsx +31 -8
  420. package/timePicker/TimePicker.tsx +17 -2
  421. package/timePicker/__test__/timePicker.test.js +34 -3
  422. package/timePicker/_story/timepicker.stories.js +18 -0
  423. package/timeline/_story/timeline.stories.js +1 -1
  424. package/timeline/index.tsx +2 -2
  425. package/timeline/item.tsx +2 -1
  426. package/toast/toast.tsx +2 -0
  427. package/tooltip/TriangleArrow.tsx +1 -1
  428. package/tooltip/TriangleArrowVertical.tsx +1 -1
  429. package/tooltip/_story/tooltip.stories.js +562 -514
  430. package/tooltip/index.tsx +51 -33
  431. package/transfer/index.tsx +29 -25
  432. package/tree/_story/tree.stories.js +3 -3
  433. package/tree/index.tsx +10 -2
  434. package/tree/treeNode.tsx +54 -11
  435. package/treeSelect/__test__/treeMultiple.test.js +5 -0
  436. package/treeSelect/_story/treeSelect.stories.js +12 -0
  437. package/treeSelect/index.tsx +58 -7
  438. package/typography/base.tsx +7 -1
  439. package/typography/copyable.tsx +10 -1
  440. package/upload/fileCard.tsx +14 -16
  441. package/upload/index.tsx +10 -6
@@ -99,6 +99,11 @@ export type OverrideCommonProps =
99
99
  */
100
100
  // eslint-disable-next-line max-len
101
101
  export interface TreeSelectProps extends Omit<BasicTreeSelectProps, OverrideCommonProps | 'validateStatus' | 'searchRender'>, Pick<TreeProps, OverrideCommonProps>{
102
+ 'aria-describedby'?: React.AriaAttributes['aria-describedby'];
103
+ 'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
104
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
105
+ 'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
106
+ 'aria-required'?: React.AriaAttributes['aria-required'];
102
107
  motion?: Motion;
103
108
  mouseEnterDelay?: number;
104
109
  mouseLeaveDelay?: number;
@@ -110,6 +115,7 @@ export interface TreeSelectProps extends Omit<BasicTreeSelectProps, OverrideComm
110
115
  dropdownMatchSelectWidth?: boolean;
111
116
  dropdownStyle?: React.CSSProperties;
112
117
  insetLabel?: React.ReactNode;
118
+ insetLabelId?: string;
113
119
  maxTagCount?: number;
114
120
  motionExpand?: boolean;
115
121
  optionListStyle?: React.CSSProperties;
@@ -164,6 +170,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
164
170
  static contextType = ConfigContext;
165
171
 
166
172
  static propTypes = {
173
+ 'aria-describedby': PropTypes.string,
174
+ 'aria-errormessage': PropTypes.string,
175
+ 'aria-invalid': PropTypes.bool,
176
+ 'aria-labelledby': PropTypes.string,
177
+ 'aria-required': PropTypes.bool,
167
178
  loadedKeys: PropTypes.arrayOf(PropTypes.string),
168
179
  loadData: PropTypes.func,
169
180
  onLoad: PropTypes.func,
@@ -218,6 +229,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
218
229
  suffix: PropTypes.node,
219
230
  prefix: PropTypes.node,
220
231
  insetLabel: PropTypes.node,
232
+ insetLabelId: PropTypes.string,
221
233
  zIndex: PropTypes.number,
222
234
  getPopupContainer: PropTypes.func,
223
235
  dropdownMatchSelectWidth: PropTypes.bool,
@@ -238,6 +250,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
238
250
  optionListStyle: PropTypes.object,
239
251
  searchRender: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]),
240
252
  renderSelectedItem: PropTypes.func,
253
+ 'aria-label': PropTypes.string,
241
254
  };
242
255
 
243
256
  static defaultProps: Partial<TreeSelectProps> = {
@@ -266,6 +279,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
266
279
  expandAction: false,
267
280
  clickToHide: true,
268
281
  searchAutoFocus: false,
282
+ 'aria-label': 'TreeSelect'
269
283
  };
270
284
  inputRef: React.RefObject<typeof Input>;
271
285
  tagInputRef: React.RefObject<TagInput>;
@@ -276,6 +290,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
276
290
  onNodeClick: any;
277
291
  onNodeDoubleClick: any;
278
292
  onMotionEnd: any;
293
+ treeSelectID: string;
279
294
 
280
295
  constructor(props: TreeSelectProps) {
281
296
  super(props);
@@ -311,6 +326,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
311
326
  this.optionsRef = React.createRef();
312
327
  this.clickOutsideHandler = null;
313
328
  this.foundation = new TreeSelectFoundation(this.adapter);
329
+ this.treeSelectID = Math.random().toString(36).slice(2);
314
330
  }
315
331
 
316
332
  // eslint-disable-next-line max-lines-per-function
@@ -614,7 +630,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
614
630
  };
615
631
 
616
632
  renderPrefix = () => {
617
- const { prefix, insetLabel }: any = this.props;
633
+ const { prefix, insetLabel, insetLabelId }: any = this.props;
618
634
  const labelNode = prefix || insetLabel;
619
635
  const prefixWrapperCls = cls({
620
636
  [`${prefixcls}-prefix`]: true,
@@ -624,7 +640,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
624
640
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
625
641
  });
626
642
 
627
- return <div className={prefixWrapperCls}>{labelNode}</div>;
643
+ return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
628
644
  };
629
645
 
630
646
  renderContent = () => {
@@ -633,7 +649,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
633
649
  const style = { minWidth: dropdownMinWidth, ...dropdownStyle };
634
650
  const popoverCls = cls(dropdownClassName, `${prefixcls}-popover`);
635
651
  return (
636
- <div className={popoverCls} role="list-box" style={style}>
652
+ <div className={popoverCls} style={style}>
637
653
  {this.renderTree()}
638
654
  </div>
639
655
  );
@@ -647,6 +663,10 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
647
663
  this.foundation.handleClick(e);
648
664
  };
649
665
 
666
+ handleSelectionEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
667
+ this.foundation.handleSelectionEnterPress(e);
668
+ };
669
+
650
670
  showClearBtn = () => {
651
671
  const { searchPosition } = this.props;
652
672
  const { inputValue } = this.state;
@@ -782,6 +802,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
782
802
  this.foundation.handleClear(e);
783
803
  };
784
804
 
805
+ handleClearEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
806
+ e && e.stopPropagation();
807
+ this.foundation.handleClearEnterPress(e);
808
+ };
809
+
785
810
  handleMouseOver = (e: React.MouseEvent) => {
786
811
  this.foundation.toggleHoverState(true);
787
812
  };
@@ -812,7 +837,14 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
812
837
  const clearCls = cls(`${prefixcls}-clearbtn`);
813
838
  if (showClearBtn) {
814
839
  return (
815
- <div className={clearCls} onClick={this.handleClear}>
840
+ <div
841
+ role='button'
842
+ tabIndex={0}
843
+ aria-label="Clear TreeSelect value"
844
+ className={clearCls}
845
+ onClick={this.handleClear}
846
+ onKeyPress={this.handleClearEnterPress}
847
+ >
816
848
  <IconClear />
817
849
  </div>
818
850
  );
@@ -902,13 +934,29 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
902
934
  <Fragment key={'arrow'}>{this.renderArrow()}</Fragment>,
903
935
  ]
904
936
  );
905
-
937
+ const tabIndex = disabled ? null : 0;
938
+ /**
939
+ * Reasons for disabling the a11y eslint rule:
940
+ * The following attributes(aria-controls,aria-expanded) will be automatically added by Tooltip, no need to declare here
941
+ */
906
942
  return (
907
943
  <div
944
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
945
+ role='combobox'
946
+ aria-disabled={disabled}
947
+ aria-haspopup="tree"
948
+ tabIndex={tabIndex}
908
949
  className={classNames}
909
950
  style={style}
910
951
  ref={this.triggerRef}
911
952
  onClick={this.handleClick}
953
+ onKeyPress={this.handleSelectionEnterPress}
954
+ aria-invalid={this.props['aria-invalid']}
955
+ aria-errormessage={this.props['aria-errormessage']}
956
+ aria-label={this.props['aria-label']}
957
+ aria-labelledby={this.props['aria-labelledby']}
958
+ aria-describedby={this.props['aria-describedby']}
959
+ aria-required={this.props['aria-required']}
912
960
  {...mouseEvent}
913
961
  >
914
962
  {inner}
@@ -979,6 +1027,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
979
1027
  size,
980
1028
  searchAutoFocus,
981
1029
  placeholder,
1030
+ maxTagCount,
982
1031
  } = this.props;
983
1032
  const {
984
1033
  keyEntities,
@@ -988,6 +1037,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
988
1037
  const keyList = normalizeKeyList(checkedKeys, keyEntities, leafOnly);
989
1038
  return (
990
1039
  <TagInput
1040
+ maxTagCount={maxTagCount}
991
1041
  disabled={disabled}
992
1042
  onInputChange={v => this.search(v)}
993
1043
  ref={this.tagInputRef}
@@ -1054,6 +1104,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
1054
1104
  }
1055
1105
  return (
1056
1106
  <Input
1107
+ aria-label='Filter TreeSelect item'
1057
1108
  ref={this.inputRef as any}
1058
1109
  autofocus={searchAutoFocus}
1059
1110
  placeholder={placeholder}
@@ -1232,7 +1283,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
1232
1283
  labelEllipsis: typeof labelEllipsis === 'undefined' ? virtualize : labelEllipsis,
1233
1284
  }}
1234
1285
  >
1235
- <div className={wrapperCls} role="list-box">
1286
+ <div className={wrapperCls}>
1236
1287
  {outerTopSlot}
1237
1288
  {
1238
1289
  !outerTopSlot &&
@@ -1240,7 +1291,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
1240
1291
  isDropdownPositionSearch &&
1241
1292
  this.renderInput()
1242
1293
  }
1243
- <div className={listCls} role="tree" style={optionListStyle}>
1294
+ <div className={listCls} role="tree" aria-multiselectable={multiple ? true : false} style={optionListStyle}>
1244
1295
  {noData ? this.renderEmpty() : this.renderNodeList()}
1245
1296
  </div>
1246
1297
  {outerBottomSlot}
@@ -11,6 +11,7 @@ import Tooltip from '../tooltip/index';
11
11
  import Popover from '../popover/index';
12
12
  import getRenderText from './util';
13
13
  import warning from '@douyinfe/semi-foundation/utils/warning';
14
+ import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';
14
15
  import LocaleConsumer from '../locale/localeConsumer';
15
16
  import { Locale } from '../locale/interface';
16
17
  import { Ellipsis, EllipsisPos, ShowTooltip, TypographyBaseSize, TypographyBaseType } from './interface';
@@ -372,13 +373,18 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
372
373
  }
373
374
  if (!noExpandText || !noCollapseText) {
374
375
  return (
376
+ // TODO: replace `a` tag with `span` in next major version
377
+ // NOTE: may have effect on style
378
+ // eslint-disable-next-line jsx-a11y/anchor-is-valid
375
379
  <a
380
+ role="button"
381
+ tabIndex={0}
376
382
  className={`${prefixCls}-ellipsis-expand`}
377
383
  key="expand"
378
384
  ref={this.expandRef}
379
385
  aria-label={text}
380
386
  onClick={this.toggleOverflow}
381
- // style={{ marginLeft: '8px' }}
387
+ onKeyPress={e => isEnterPress(e) && this.toggleOverflow(e as any)}
382
388
  >
383
389
  {text}
384
390
  </a>
@@ -9,6 +9,7 @@ import LocaleConsumer from '../locale/localeConsumer';
9
9
  import { IconCopy, IconTick } from '@douyinfe/semi-icons';
10
10
  import { BaseProps } from '../_base/baseComponent';
11
11
  import { Locale } from '../locale/interface';
12
+ import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';
12
13
 
13
14
  const prefixCls = cssClasses.PREFIX;
14
15
  export interface CopyableProps extends BaseProps {
@@ -120,8 +121,16 @@ export class Copyable extends React.PureComponent<CopyableProps, CopyableState>
120
121
  this.renderSuccessTip()
121
122
  ) : (
122
123
  <Tooltip content={typeof copyTip !== 'undefined' ? copyTip : locale.copy}>
124
+ {/* TODO: replace `a` tag with `span` in next major version
125
+ NOTE: may have effect on style */}
126
+ {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
123
127
  <a className={`${prefixCls}-action-copy-icon`}>
124
- <IconCopy onClick={this.copy} />
128
+ <IconCopy
129
+ role="button"
130
+ tabIndex={0}
131
+ onClick={this.copy}
132
+ onKeyPress={e => isEnterPress(e) && this.copy(e as any)}
133
+ />
125
134
  </a>
126
135
  </Tooltip>
127
136
  )}
@@ -17,7 +17,7 @@ import { RenderFileItemProps } from './interface';
17
17
  const prefixCls = cssClasses.PREFIX;
18
18
 
19
19
  const ErrorSvg: FC<SVGProps<SVGSVGElement>> = (props = {}) => (
20
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
20
+ <svg focusable={false} aria-hidden width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
21
21
  <circle cx="7.99992" cy="7.99992" r="6.66667" fill="white" />
22
22
  <path
23
23
  fillRule="evenodd"
@@ -28,7 +28,7 @@ const ErrorSvg: FC<SVGProps<SVGSVGElement>> = (props = {}) => (
28
28
  );
29
29
 
30
30
  const ReplaceSvg: FC<SVGProps<SVGSVGElement>> = (props = {}) => (
31
- <svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
31
+ <svg focusable={false} aria-hidden width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
32
32
  <circle cx="14" cy="14" r="14" fill="#16161A" fillOpacity="0.6" />
33
33
  <path d="M9 10.25V18.25L10.25 13.25H17.875V11.75C17.875 11.4739 17.6511 11.25 17.375 11.25H14L12.75 9.75H9.5C9.22386 9.75 9 9.97386 9 10.25Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
34
34
  <path d="M18 18.25L19 13.25H10.2031L9 18.25H18Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
@@ -36,7 +36,7 @@ const ReplaceSvg: FC<SVGProps<SVGSVGElement>> = (props = {}) => (
36
36
  );
37
37
 
38
38
  const DirectorySvg: FC<SVGProps<SVGSVGElement>> = (props = {}) => (
39
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
39
+ <svg focusable={false} aria-hidden width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
40
40
  <path d="M6 17V7.58824C6 7.26336 6.26863 7 6.6 7H10.5L12 8.76471H16.05C16.3814 8.76471 16.65 9.02806 16.65 9.35294V11.1176H7.5L6 17ZM6 17L7.44375 11.1176H18L16.8 17L6 17Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
41
41
  </svg>
42
42
 
@@ -136,15 +136,13 @@ class FileCard extends PureComponent<FileCardProps> {
136
136
  });
137
137
  const closeCls = `${prefixCls}-picture-file-card-close`;
138
138
  const retry = (
139
- <div
140
- className={`${prefixCls}-picture-file-card-retry`} onClick={e => this.onRetry(e)}>
139
+ <div role="button" tabIndex={0} className={`${prefixCls}-picture-file-card-retry`} onClick={e => this.onRetry(e)}>
141
140
  <IconRefresh className={`${prefixCls}-picture-file-card-icon-retry`} />
142
141
  </div>
143
142
  );
144
143
  const replace = (
145
144
  <Tooltip trigger="hover" position="top" content={locale.replace} showArrow={false} spacing={4}>
146
- <div
147
- className={`${prefixCls}-picture-file-card-replace`} onClick={(e): void => this.onReplace(e)}>
145
+ <div role="button" tabIndex={0} className={`${prefixCls}-picture-file-card-replace`} onClick={(e): void => this.onReplace(e)}>
148
146
  <ReplaceSvg className={`${prefixCls}-picture-file-card-icon-replace`} />
149
147
  </div>
150
148
  </Tooltip>
@@ -155,18 +153,18 @@ class FileCard extends PureComponent<FileCardProps> {
155
153
  <div className={`${prefixCls }-picture-file-card-pic-info`}>{index + 1}</div>
156
154
  );
157
155
 
158
- const thumbnail = typeof renderThumbnail === 'function' ? renderThumbnail(this.props) : <img src={url} alt={`picture of ${name}`} />;
156
+ const thumbnail = typeof renderThumbnail === 'function' ? renderThumbnail(this.props) : <img src={url} alt={name} />;
159
157
 
160
158
  return (
161
- <div className={filePicCardCls} style={style} onClick={onPreviewClick}>
159
+ <div role="listitem" className={filePicCardCls} style={style} onClick={onPreviewClick}>
162
160
  {thumbnail}
163
- {showProgress ? <Progress percent={percent} type="circle" size="small" orbitStroke={'#FFF'} /> : null}
161
+ {showProgress ? <Progress percent={percent} type="circle" size="small" orbitStroke={'#FFF'} aria-label="uploading file progress" /> : null}
164
162
  {showRetry ? retry : null}
165
163
  {showReplace && replace}
166
164
  {showPicInfo && picInfo}
167
165
  {!disabled && (
168
- <div className={closeCls}>
169
- <IconClose size="extra-small" onClick={e => this.onRemove(e)} />
166
+ <div className={closeCls} onClick={e => this.onRemove(e)}>
167
+ <IconClose tabIndex={0} role="button" size="extra-small" />
170
168
  </div>
171
169
  )}
172
170
  {this.renderPicValidateMsg()}
@@ -193,12 +191,12 @@ class FileCard extends PureComponent<FileCardProps> {
193
191
  const showRetry = status === strings.FILE_STATUS_UPLOAD_FAIL && propsShowRetry;
194
192
  const showReplace = status === strings.FILE_STATUS_SUCCESS && propsShowReplace;
195
193
  const fileSize = this.transSize(size);
196
- let previewContent: ReactNode = preview ? (<img src={url} />) : (<IconFile size="large" />);
194
+ let previewContent: ReactNode = preview ? (<img src={url} alt={name} />) : (<IconFile size="large" />);
197
195
  if (previewFile) {
198
196
  previewContent = previewFile(this.props);
199
197
  }
200
198
  return (
201
- <div className={fileCardCls} style={style} onClick={onPreviewClick}>
199
+ <div role="listitem" className={fileCardCls} style={style} onClick={onPreviewClick}>
202
200
  <div className={previewCls}>
203
201
  {previewContent}
204
202
  </div>
@@ -225,12 +223,12 @@ class FileCard extends PureComponent<FileCardProps> {
225
223
  </span>
226
224
 
227
225
  </div>
228
- {showProgress ? (<Progress percent={percent} style={{ width: '100%' }} />) : null}
226
+ {showProgress ? (<Progress percent={percent} style={{ width: '100%' }} aria-label="uploading file progress" />) : null}
229
227
  <div className={`${infoCls}-main-control`}>
230
228
  <span className={`${infoCls}-validate-message`}>
231
229
  {this.renderValidateMessage()}
232
230
  </span>
233
- {showRetry ? <span className={`${infoCls}-retry`} onClick={e => this.onRetry(e)}>{locale.retry}</span> : null}
231
+ {showRetry ? <span role="button" tabIndex={0} className={`${infoCls}-retry`} onClick={e => this.onRetry(e)}>{locale.retry}</span> : null}
234
232
  </div>
235
233
  </div>
236
234
  <IconButton
package/upload/index.tsx CHANGED
@@ -400,6 +400,7 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
400
400
  });
401
401
  const mainCls = `${prefixCls}-file-list-main`;
402
402
  const addContentProps = {
403
+ role: 'button',
403
404
  className: uploadAddCls,
404
405
  onClick: this.onClick,
405
406
  };
@@ -432,7 +433,7 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
432
433
  <LocaleConsumer componentName="Upload">
433
434
  {(locale: Locale['Upload']) => (
434
435
  <div {...containerProps}>
435
- <div className={mainCls}>
436
+ <div className={mainCls} role="list" aria-label="picture list">
436
437
  {fileList.map((file, index) => this.renderFile(file, index, locale))}
437
438
  {showAddTriggerInList ? addContent : null}
438
439
  </div>
@@ -467,14 +468,14 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
467
468
  <div className={titleCls}>
468
469
  <span className={`${titleCls}-choosen`}>{locale.selectedFiles}</span>
469
470
  {showClear ? (
470
- <span onClick={this.clear} className={`${titleCls}-clear`}>
471
+ <span role="button" tabIndex={0} onClick={this.clear} className={`${titleCls}-clear`}>
471
472
  {locale.clear}
472
473
  </span>
473
474
  ) : null}
474
475
  </div>
475
476
  ) : null}
476
477
 
477
- <div className={mainCls}>
478
+ <div className={mainCls} role="list" aria-label="file list">
478
479
  {fileList.map((file, index) => this.renderFile(file, index, locale))}
479
480
  </div>
480
481
  </div>
@@ -501,7 +502,7 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
501
502
  };
502
503
 
503
504
  renderAddContent = () => {
504
- const { draggable, children, listType } = this.props;
505
+ const { draggable, children, listType, disabled } = this.props;
505
506
  const uploadAddCls = cls(`${prefixCls}-add`);
506
507
  if (listType === strings.FILE_LIST_PIC) {
507
508
  return null;
@@ -510,7 +511,7 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
510
511
  return this.renderDragArea();
511
512
  }
512
513
  return (
513
- <div className={uploadAddCls} onClick={this.onClick}>
514
+ <div role="button" tabIndex={0} aria-disabled={disabled} className={uploadAddCls} onClick={this.onClick}>
514
515
  {children}
515
516
  </div>
516
517
  );
@@ -518,7 +519,7 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
518
519
 
519
520
  renderDragArea = (): ReactNode => {
520
521
  const { dragAreaStatus } = this.state;
521
- const { children, dragIcon, dragMainText, dragSubText } = this.props;
522
+ const { children, dragIcon, dragMainText, dragSubText, disabled } = this.props;
522
523
  const dragAreaBaseCls = `${prefixCls}-drag-area`;
523
524
  const dragAreaCls = cls(dragAreaBaseCls, {
524
525
  [`${dragAreaBaseCls}-legal`]: dragAreaStatus === strings.DRAG_AREA_LEGAL,
@@ -530,6 +531,9 @@ class Upload extends BaseComponent<UploadProps, UploadState> {
530
531
  <LocaleConsumer componentName="Upload">
531
532
  {(locale: Locale['Upload']): ReactNode => (
532
533
  <div
534
+ role="button"
535
+ tabIndex={0}
536
+ aria-disabled={disabled}
533
537
  className={dragAreaCls}
534
538
  onDrop={this.onDrop}
535
539
  onDragOver={this.onDragOver}