@douyinfe/semi-ui 2.2.1 → 2.3.1

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 (445) 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/__test__/datePicker.test.js +93 -0
  34. package/datePicker/_story/datePicker.stories.js +84 -1
  35. package/datePicker/datePicker.tsx +21 -0
  36. package/datePicker/monthsGrid.tsx +2 -1
  37. package/dist/css/semi.css +8 -3
  38. package/dist/css/semi.min.css +1 -1
  39. package/dist/umd/semi-ui.js +2490 -1255
  40. package/dist/umd/semi-ui.js.map +1 -1
  41. package/dist/umd/semi-ui.min.js +1 -1
  42. package/dist/umd/semi-ui.min.js.map +1 -1
  43. package/dropdown/dropdownItem.tsx +1 -1
  44. package/dropdown/dropdownMenu.tsx +1 -1
  45. package/dropdown/index.tsx +11 -3
  46. package/empty/index.tsx +4 -4
  47. package/form/_story/FormApi/formApiDemo.jsx +3 -2
  48. package/form/_story/Validate/validateDemo.jsx +1 -1
  49. package/form/_story/demo.jsx +12 -3
  50. package/form/_story/form.stories.js +0 -7
  51. package/form/baseForm.tsx +2 -0
  52. package/form/errorMessage.tsx +13 -2
  53. package/form/hoc/withField.tsx +37 -8
  54. package/form/index.tsx +0 -2
  55. package/form/interface.ts +2 -0
  56. package/form/label.tsx +4 -2
  57. package/input/index.tsx +49 -4
  58. package/input/inputGroup.tsx +9 -4
  59. package/input/textarea.tsx +25 -6
  60. package/inputNumber/_story/inputNumber.stories.js +12 -0
  61. package/inputNumber/index.tsx +35 -3
  62. package/layout/Sider.tsx +6 -2
  63. package/layout/index.tsx +4 -3
  64. package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
  65. package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
  66. package/lib/cjs/_utils/index.d.ts +1 -0
  67. package/lib/cjs/_utils/index.js +6 -1
  68. package/lib/cjs/anchor/index.d.ts +2 -0
  69. package/lib/cjs/anchor/index.js +6 -1
  70. package/lib/cjs/anchor/link.d.ts +4 -1
  71. package/lib/cjs/anchor/link.js +39 -5
  72. package/lib/cjs/autoComplete/index.d.ts +17 -0
  73. package/lib/cjs/autoComplete/index.js +21 -2
  74. package/lib/cjs/avatar/index.d.ts +4 -3
  75. package/lib/cjs/avatar/index.js +15 -11
  76. package/lib/cjs/banner/index.js +4 -2
  77. package/lib/cjs/breadcrumb/index.d.ts +3 -0
  78. package/lib/cjs/breadcrumb/index.js +10 -4
  79. package/lib/cjs/breadcrumb/item.js +2 -2
  80. package/lib/cjs/button/Button.d.ts +2 -0
  81. package/lib/cjs/button/Button.js +4 -2
  82. package/lib/cjs/button/buttonGroup.d.ts +3 -0
  83. package/lib/cjs/button/buttonGroup.js +8 -4
  84. package/lib/cjs/button/index.d.ts +1 -0
  85. package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
  86. package/lib/cjs/button/splitButtonGroup.js +5 -2
  87. package/lib/cjs/card/index.d.ts +3 -0
  88. package/lib/cjs/card/index.js +3 -1
  89. package/lib/cjs/cascader/index.d.ts +14 -0
  90. package/lib/cjs/cascader/index.js +35 -7
  91. package/lib/cjs/checkbox/checkbox.d.ts +21 -1
  92. package/lib/cjs/checkbox/checkbox.js +51 -17
  93. package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
  94. package/lib/cjs/checkbox/checkboxGroup.js +16 -3
  95. package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
  96. package/lib/cjs/checkbox/checkboxInner.js +20 -3
  97. package/lib/cjs/collapse/item.d.ts +2 -1
  98. package/lib/cjs/collapse/item.js +12 -2
  99. package/lib/cjs/collapsible/index.d.ts +1 -0
  100. package/lib/cjs/collapsible/index.js +4 -2
  101. package/lib/cjs/datePicker/datePicker.d.ts +12 -0
  102. package/lib/cjs/datePicker/datePicker.js +18 -3
  103. package/lib/cjs/datePicker/monthsGrid.d.ts +1 -0
  104. package/lib/cjs/datePicker/monthsGrid.js +2 -1
  105. package/lib/cjs/dropdown/dropdownItem.js +3 -1
  106. package/lib/cjs/dropdown/dropdownMenu.js +4 -1
  107. package/lib/cjs/dropdown/index.d.ts +10 -3
  108. package/lib/cjs/form/baseForm.d.ts +9 -0
  109. package/lib/cjs/form/baseForm.js +3 -1
  110. package/lib/cjs/form/errorMessage.d.ts +4 -0
  111. package/lib/cjs/form/errorMessage.js +21 -3
  112. package/lib/cjs/form/field.d.ts +7 -0
  113. package/lib/cjs/form/hoc/withField.js +49 -16
  114. package/lib/cjs/form/index.d.ts +0 -1
  115. package/lib/cjs/form/interface.d.ts +2 -0
  116. package/lib/cjs/form/label.d.ts +2 -0
  117. package/lib/cjs/form/label.js +5 -2
  118. package/lib/cjs/input/index.d.ts +16 -0
  119. package/lib/cjs/input/index.js +51 -15
  120. package/lib/cjs/input/inputGroup.d.ts +2 -1
  121. package/lib/cjs/input/inputGroup.js +11 -1
  122. package/lib/cjs/input/textarea.js +12 -1
  123. package/lib/cjs/inputNumber/index.d.ts +21 -12
  124. package/lib/cjs/inputNumber/index.js +40 -5
  125. package/lib/cjs/layout/Sider.d.ts +4 -0
  126. package/lib/cjs/layout/Sider.js +4 -1
  127. package/lib/cjs/layout/index.js +2 -0
  128. package/lib/cjs/list/index.d.ts +4 -4
  129. package/lib/cjs/list/item.js +0 -1
  130. package/lib/cjs/modal/Modal.js +2 -0
  131. package/lib/cjs/modal/ModalContent.d.ts +3 -1
  132. package/lib/cjs/modal/ModalContent.js +47 -5
  133. package/lib/cjs/navigation/Item.d.ts +4 -2
  134. package/lib/cjs/navigation/Item.js +25 -5
  135. package/lib/cjs/navigation/SubNav.d.ts +4 -2
  136. package/lib/cjs/navigation/SubNav.js +8 -1
  137. package/lib/cjs/navigation/index.js +2 -0
  138. package/lib/cjs/notification/notice.d.ts +1 -1
  139. package/lib/cjs/notification/notice.js +32 -22
  140. package/lib/cjs/pagination/index.js +16 -6
  141. package/lib/cjs/popover/index.js +7 -3
  142. package/lib/cjs/progress/index.d.ts +8 -0
  143. package/lib/cjs/progress/index.js +42 -9
  144. package/lib/cjs/radio/radio.d.ts +6 -1
  145. package/lib/cjs/radio/radio.js +17 -5
  146. package/lib/cjs/radio/radioGroup.d.ts +16 -1
  147. package/lib/cjs/radio/radioGroup.js +18 -3
  148. package/lib/cjs/radio/radioInner.d.ts +6 -1
  149. package/lib/cjs/radio/radioInner.js +11 -3
  150. package/lib/cjs/rating/index.d.ts +14 -0
  151. package/lib/cjs/rating/index.js +14 -3
  152. package/lib/cjs/rating/item.d.ts +2 -0
  153. package/lib/cjs/rating/item.js +6 -1
  154. package/lib/cjs/select/index.d.ts +16 -0
  155. package/lib/cjs/select/index.js +65 -19
  156. package/lib/cjs/select/option.js +28 -22
  157. package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
  158. package/lib/cjs/sideSheet/SideSheetContent.js +4 -1
  159. package/lib/cjs/sideSheet/index.d.ts +1 -0
  160. package/lib/cjs/sideSheet/index.js +2 -1
  161. package/lib/cjs/slider/index.d.ts +2 -1
  162. package/lib/cjs/slider/index.js +64 -17
  163. package/lib/cjs/spin/icon.js +3 -4
  164. package/lib/cjs/steps/basicStep.d.ts +3 -0
  165. package/lib/cjs/steps/basicStep.js +23 -25
  166. package/lib/cjs/steps/basicSteps.d.ts +1 -0
  167. package/lib/cjs/steps/basicSteps.js +2 -1
  168. package/lib/cjs/steps/fillStep.d.ts +3 -0
  169. package/lib/cjs/steps/fillStep.js +19 -4
  170. package/lib/cjs/steps/fillSteps.d.ts +1 -0
  171. package/lib/cjs/steps/fillSteps.js +2 -1
  172. package/lib/cjs/steps/navStep.d.ts +3 -0
  173. package/lib/cjs/steps/navStep.js +22 -25
  174. package/lib/cjs/steps/navSteps.d.ts +1 -0
  175. package/lib/cjs/steps/navSteps.js +2 -1
  176. package/lib/cjs/switch/index.d.ts +12 -0
  177. package/lib/cjs/switch/index.js +19 -4
  178. package/lib/cjs/table/Body/BaseRow.js +35 -3
  179. package/lib/cjs/table/Body/index.js +9 -1
  180. package/lib/cjs/table/ColumnFilter.js +4 -0
  181. package/lib/cjs/table/ColumnSelection.d.ts +3 -0
  182. package/lib/cjs/table/ColumnSelection.js +6 -2
  183. package/lib/cjs/table/ColumnSorter.js +19 -3
  184. package/lib/cjs/table/CustomExpandIcon.js +7 -1
  185. package/lib/cjs/table/Table.d.ts +2 -0
  186. package/lib/cjs/table/Table.js +31 -15
  187. package/lib/cjs/table/TableCell.d.ts +2 -0
  188. package/lib/cjs/table/TableCell.js +6 -2
  189. package/lib/cjs/table/TableHeaderRow.js +8 -2
  190. package/lib/cjs/tabs/TabBar.js +11 -3
  191. package/lib/cjs/tabs/TabPane.js +3 -1
  192. package/lib/cjs/tabs/index.js +0 -1
  193. package/lib/cjs/tagInput/index.d.ts +4 -1
  194. package/lib/cjs/tagInput/index.js +29 -3
  195. package/lib/cjs/timePicker/TimePicker.d.ts +12 -0
  196. package/lib/cjs/timePicker/TimePicker.js +9 -1
  197. package/lib/cjs/timePicker/index.d.ts +6 -0
  198. package/lib/cjs/timeline/index.d.ts +1 -1
  199. package/lib/cjs/timeline/index.js +1 -0
  200. package/lib/cjs/timeline/item.js +4 -2
  201. package/lib/cjs/toast/toast.js +2 -0
  202. package/lib/cjs/tooltip/TriangleArrow.js +1 -0
  203. package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
  204. package/lib/cjs/tooltip/index.d.ts +16 -12
  205. package/lib/cjs/tooltip/index.js +55 -39
  206. package/lib/cjs/transfer/index.d.ts +1 -1
  207. package/lib/cjs/transfer/index.js +35 -17
  208. package/lib/cjs/tree/index.d.ts +1 -0
  209. package/lib/cjs/tree/index.js +15 -6
  210. package/lib/cjs/tree/treeNode.d.ts +12 -4
  211. package/lib/cjs/tree/treeNode.js +44 -4
  212. package/lib/cjs/treeSelect/index.d.ts +16 -0
  213. package/lib/cjs/treeSelect/index.js +60 -12
  214. package/lib/cjs/typography/base.js +18 -7
  215. package/lib/cjs/typography/copyable.js +6 -1
  216. package/lib/cjs/upload/fileCard.js +26 -7
  217. package/lib/cjs/upload/index.js +19 -4
  218. package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
  219. package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
  220. package/lib/es/_utils/index.d.ts +1 -0
  221. package/lib/es/_utils/index.js +4 -1
  222. package/lib/es/anchor/index.d.ts +2 -0
  223. package/lib/es/anchor/index.js +6 -1
  224. package/lib/es/anchor/link.d.ts +4 -1
  225. package/lib/es/anchor/link.js +38 -5
  226. package/lib/es/autoComplete/index.d.ts +17 -0
  227. package/lib/es/autoComplete/index.js +21 -2
  228. package/lib/es/avatar/index.d.ts +4 -3
  229. package/lib/es/avatar/index.js +15 -11
  230. package/lib/es/banner/index.js +4 -2
  231. package/lib/es/breadcrumb/index.d.ts +3 -0
  232. package/lib/es/breadcrumb/index.js +10 -4
  233. package/lib/es/breadcrumb/item.js +2 -2
  234. package/lib/es/button/Button.d.ts +2 -0
  235. package/lib/es/button/Button.js +4 -2
  236. package/lib/es/button/buttonGroup.d.ts +3 -0
  237. package/lib/es/button/buttonGroup.js +8 -4
  238. package/lib/es/button/index.d.ts +1 -0
  239. package/lib/es/button/splitButtonGroup.d.ts +3 -0
  240. package/lib/es/button/splitButtonGroup.js +5 -2
  241. package/lib/es/card/index.d.ts +3 -0
  242. package/lib/es/card/index.js +3 -1
  243. package/lib/es/cascader/index.d.ts +14 -0
  244. package/lib/es/cascader/index.js +35 -7
  245. package/lib/es/checkbox/checkbox.d.ts +21 -1
  246. package/lib/es/checkbox/checkbox.js +50 -17
  247. package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
  248. package/lib/es/checkbox/checkboxGroup.js +18 -5
  249. package/lib/es/checkbox/checkboxInner.d.ts +15 -0
  250. package/lib/es/checkbox/checkboxInner.js +20 -3
  251. package/lib/es/collapse/item.d.ts +2 -1
  252. package/lib/es/collapse/item.js +11 -2
  253. package/lib/es/collapsible/index.d.ts +1 -0
  254. package/lib/es/collapsible/index.js +4 -2
  255. package/lib/es/datePicker/datePicker.d.ts +12 -0
  256. package/lib/es/datePicker/datePicker.js +18 -3
  257. package/lib/es/datePicker/monthsGrid.d.ts +1 -0
  258. package/lib/es/datePicker/monthsGrid.js +2 -1
  259. package/lib/es/dropdown/dropdownItem.js +3 -1
  260. package/lib/es/dropdown/dropdownMenu.js +4 -1
  261. package/lib/es/dropdown/index.d.ts +10 -3
  262. package/lib/es/form/baseForm.d.ts +9 -0
  263. package/lib/es/form/baseForm.js +3 -1
  264. package/lib/es/form/errorMessage.d.ts +4 -0
  265. package/lib/es/form/errorMessage.js +21 -3
  266. package/lib/es/form/field.d.ts +7 -0
  267. package/lib/es/form/hoc/withField.js +48 -15
  268. package/lib/es/form/index.d.ts +0 -1
  269. package/lib/es/form/index.js +0 -1
  270. package/lib/es/form/interface.d.ts +2 -0
  271. package/lib/es/form/label.d.ts +2 -0
  272. package/lib/es/form/label.js +5 -2
  273. package/lib/es/input/index.d.ts +16 -0
  274. package/lib/es/input/index.js +51 -15
  275. package/lib/es/input/inputGroup.d.ts +2 -1
  276. package/lib/es/input/inputGroup.js +11 -1
  277. package/lib/es/input/textarea.js +12 -1
  278. package/lib/es/inputNumber/index.d.ts +21 -12
  279. package/lib/es/inputNumber/index.js +41 -5
  280. package/lib/es/layout/Sider.d.ts +4 -0
  281. package/lib/es/layout/Sider.js +4 -1
  282. package/lib/es/layout/index.js +2 -0
  283. package/lib/es/list/index.d.ts +4 -4
  284. package/lib/es/list/item.js +0 -1
  285. package/lib/es/modal/Modal.js +2 -0
  286. package/lib/es/modal/ModalContent.d.ts +3 -1
  287. package/lib/es/modal/ModalContent.js +46 -5
  288. package/lib/es/navigation/Item.d.ts +4 -2
  289. package/lib/es/navigation/Item.js +25 -5
  290. package/lib/es/navigation/SubNav.d.ts +4 -2
  291. package/lib/es/navigation/SubNav.js +8 -1
  292. package/lib/es/navigation/index.js +2 -0
  293. package/lib/es/notification/notice.d.ts +1 -1
  294. package/lib/es/notification/notice.js +33 -24
  295. package/lib/es/pagination/index.js +16 -6
  296. package/lib/es/popover/index.js +7 -3
  297. package/lib/es/progress/index.d.ts +8 -0
  298. package/lib/es/progress/index.js +42 -9
  299. package/lib/es/radio/radio.d.ts +6 -1
  300. package/lib/es/radio/radio.js +16 -5
  301. package/lib/es/radio/radioGroup.d.ts +16 -1
  302. package/lib/es/radio/radioGroup.js +18 -3
  303. package/lib/es/radio/radioInner.d.ts +6 -1
  304. package/lib/es/radio/radioInner.js +11 -3
  305. package/lib/es/rating/index.d.ts +14 -0
  306. package/lib/es/rating/index.js +14 -3
  307. package/lib/es/rating/item.d.ts +2 -0
  308. package/lib/es/rating/item.js +6 -1
  309. package/lib/es/select/index.d.ts +16 -0
  310. package/lib/es/select/index.js +63 -17
  311. package/lib/es/select/option.js +28 -22
  312. package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
  313. package/lib/es/sideSheet/SideSheetContent.js +4 -1
  314. package/lib/es/sideSheet/index.d.ts +1 -0
  315. package/lib/es/sideSheet/index.js +2 -1
  316. package/lib/es/slider/index.d.ts +2 -1
  317. package/lib/es/slider/index.js +63 -16
  318. package/lib/es/spin/icon.js +3 -4
  319. package/lib/es/steps/basicStep.d.ts +3 -0
  320. package/lib/es/steps/basicStep.js +23 -23
  321. package/lib/es/steps/basicSteps.d.ts +1 -0
  322. package/lib/es/steps/basicSteps.js +2 -1
  323. package/lib/es/steps/fillStep.d.ts +3 -0
  324. package/lib/es/steps/fillStep.js +19 -4
  325. package/lib/es/steps/fillSteps.d.ts +1 -0
  326. package/lib/es/steps/fillSteps.js +2 -1
  327. package/lib/es/steps/navStep.d.ts +3 -0
  328. package/lib/es/steps/navStep.js +22 -23
  329. package/lib/es/steps/navSteps.d.ts +1 -0
  330. package/lib/es/steps/navSteps.js +2 -1
  331. package/lib/es/switch/index.d.ts +12 -0
  332. package/lib/es/switch/index.js +19 -4
  333. package/lib/es/table/Body/BaseRow.js +35 -3
  334. package/lib/es/table/Body/index.js +9 -2
  335. package/lib/es/table/ColumnFilter.js +4 -0
  336. package/lib/es/table/ColumnSelection.d.ts +3 -0
  337. package/lib/es/table/ColumnSelection.js +6 -2
  338. package/lib/es/table/ColumnSorter.js +17 -3
  339. package/lib/es/table/CustomExpandIcon.js +6 -1
  340. package/lib/es/table/Table.d.ts +2 -0
  341. package/lib/es/table/Table.js +31 -15
  342. package/lib/es/table/TableCell.d.ts +2 -0
  343. package/lib/es/table/TableCell.js +6 -2
  344. package/lib/es/table/TableHeaderRow.js +8 -2
  345. package/lib/es/tabs/TabBar.js +11 -3
  346. package/lib/es/tabs/TabPane.js +3 -1
  347. package/lib/es/tabs/index.js +0 -1
  348. package/lib/es/tagInput/index.d.ts +4 -1
  349. package/lib/es/tagInput/index.js +29 -3
  350. package/lib/es/timePicker/TimePicker.d.ts +12 -0
  351. package/lib/es/timePicker/TimePicker.js +9 -1
  352. package/lib/es/timePicker/index.d.ts +6 -0
  353. package/lib/es/timeline/index.d.ts +1 -1
  354. package/lib/es/timeline/index.js +1 -0
  355. package/lib/es/timeline/item.js +4 -2
  356. package/lib/es/toast/toast.js +2 -0
  357. package/lib/es/tooltip/TriangleArrow.js +1 -0
  358. package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
  359. package/lib/es/tooltip/index.d.ts +16 -12
  360. package/lib/es/tooltip/index.js +53 -39
  361. package/lib/es/transfer/index.d.ts +1 -1
  362. package/lib/es/transfer/index.js +35 -17
  363. package/lib/es/tree/index.d.ts +1 -0
  364. package/lib/es/tree/index.js +15 -6
  365. package/lib/es/tree/treeNode.d.ts +12 -4
  366. package/lib/es/tree/treeNode.js +44 -4
  367. package/lib/es/treeSelect/index.d.ts +16 -0
  368. package/lib/es/treeSelect/index.js +57 -10
  369. package/lib/es/typography/base.js +17 -7
  370. package/lib/es/typography/copyable.js +5 -1
  371. package/lib/es/upload/fileCard.js +26 -7
  372. package/lib/es/upload/index.js +19 -4
  373. package/list/index.tsx +5 -5
  374. package/list/item.tsx +0 -1
  375. package/modal/Modal.tsx +2 -0
  376. package/modal/ModalContent.tsx +35 -5
  377. package/navigation/Item.tsx +15 -0
  378. package/navigation/SubNav.tsx +13 -1
  379. package/navigation/index.tsx +1 -1
  380. package/notification/notice.tsx +19 -14
  381. package/package.json +8 -8
  382. package/pagination/index.tsx +9 -5
  383. package/popover/index.tsx +5 -0
  384. package/progress/_story/progress.stories.js +18 -18
  385. package/progress/index.tsx +58 -20
  386. package/radio/radio.tsx +12 -2
  387. package/radio/radioGroup.tsx +29 -3
  388. package/radio/radioInner.tsx +10 -1
  389. package/rating/index.tsx +19 -2
  390. package/rating/item.tsx +6 -0
  391. package/select/__test__/select.test.js +45 -0
  392. package/select/_story/select.stories.js +29 -0
  393. package/select/index.tsx +52 -4
  394. package/select/option.tsx +3 -0
  395. package/sideSheet/SideSheetContent.tsx +6 -4
  396. package/sideSheet/index.tsx +3 -2
  397. package/slider/__test__/slider.test.js +9 -0
  398. package/slider/_story/slider.stories.js +1 -1
  399. package/slider/index.tsx +44 -7
  400. package/spin/icon.tsx +4 -3
  401. package/steps/basicStep.tsx +15 -4
  402. package/steps/basicSteps.tsx +3 -2
  403. package/steps/fillStep.tsx +27 -12
  404. package/steps/fillSteps.tsx +2 -0
  405. package/steps/navStep.tsx +15 -4
  406. package/steps/navSteps.tsx +3 -2
  407. package/switch/_story/switch.stories.js +20 -19
  408. package/switch/_story/switch.stories.tsx +13 -13
  409. package/switch/index.tsx +23 -5
  410. package/table/Body/BaseRow.tsx +25 -1
  411. package/table/Body/index.tsx +7 -2
  412. package/table/ColumnFilter.tsx +7 -1
  413. package/table/ColumnSelection.tsx +4 -1
  414. package/table/ColumnSorter.tsx +18 -1
  415. package/table/CustomExpandIcon.tsx +5 -0
  416. package/table/Table.tsx +26 -13
  417. package/table/TableCell.tsx +11 -1
  418. package/table/TableHeaderRow.tsx +16 -2
  419. package/table/__test__/table.test.js +46 -0
  420. package/tabs/TabBar.tsx +8 -5
  421. package/tabs/TabPane.tsx +3 -1
  422. package/tabs/index.tsx +0 -1
  423. package/tagInput/__test__/tagInput.test.js +46 -0
  424. package/tagInput/_story/tagInput.stories.js +2 -2
  425. package/tagInput/index.tsx +31 -8
  426. package/timePicker/TimePicker.tsx +14 -1
  427. package/timeline/_story/timeline.stories.js +1 -1
  428. package/timeline/index.tsx +2 -2
  429. package/timeline/item.tsx +2 -1
  430. package/toast/toast.tsx +2 -0
  431. package/tooltip/TriangleArrow.tsx +1 -1
  432. package/tooltip/TriangleArrowVertical.tsx +1 -1
  433. package/tooltip/_story/tooltip.stories.js +562 -514
  434. package/tooltip/index.tsx +51 -33
  435. package/transfer/index.tsx +32 -28
  436. package/tree/_story/tree.stories.js +3 -3
  437. package/tree/index.tsx +10 -2
  438. package/tree/treeNode.tsx +46 -10
  439. package/treeSelect/__test__/treeMultiple.test.js +5 -0
  440. package/treeSelect/_story/treeSelect.stories.js +12 -0
  441. package/treeSelect/index.tsx +58 -7
  442. package/typography/base.tsx +7 -1
  443. package/typography/copyable.tsx +10 -1
  444. package/upload/fileCard.tsx +14 -16
  445. package/upload/index.tsx +10 -6
@@ -238,7 +238,7 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
238
238
  }
239
239
 
240
240
  if (isExpandedColumn(column) && !displayExpandedColumn) {
241
- cells.push(<TableCell key={columnIndex} isSection={isSection} />);
241
+ cells.push(<TableCell key={columnIndex} colIndex={columnIndex} isSection={isSection} />);
242
242
  } else if (!isScrollbarColumn(column)) {
243
243
  const diyProps: { width?: number } = {};
244
244
 
@@ -248,6 +248,7 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
248
248
 
249
249
  cells.push(
250
250
  <TableCell
251
+ colIndex={columnIndex}
251
252
  {...expandableProps}
252
253
  {...diyProps}
253
254
  hideExpandedColumn={hideExpandedColumn}
@@ -318,6 +319,10 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
318
319
  record,
319
320
  hovered,
320
321
  expanded,
322
+ expandableRow,
323
+ level,
324
+ expandedRow,
325
+ isSection
321
326
  } = this.props;
322
327
 
323
328
  const BodyRow: any = components.body.row;
@@ -341,9 +346,28 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
341
346
  },
342
347
  customClassName
343
348
  );
349
+ const ariaProps = {};
350
+ if (typeof index === 'number') {
351
+ ariaProps['aria-rowindex'] = index + 1;
352
+ }
353
+ if (expandableRow) {
354
+ ariaProps['aria-expanded'] = expanded;
355
+ }
356
+ // if row is expandedRow, set it's level to 2
357
+ if (expanded || expandedRow) {
358
+ ariaProps['aria-level'] = 2;
359
+ }
360
+ if (typeof level === 'number') {
361
+ ariaProps['aria-level'] = level + 1;
362
+ }
363
+ if (isSection) {
364
+ ariaProps['aria-level'] = 1;
365
+ }
344
366
 
345
367
  return (
346
368
  <BodyRow
369
+ role="row"
370
+ {...ariaProps}
347
371
  {...rowProps}
348
372
  style={baseRowStyle}
349
373
  className={rowCls}
@@ -3,7 +3,7 @@
3
3
  /* eslint-disable max-len */
4
4
  import React, { ReactNode } from 'react';
5
5
  import PropTypes from 'prop-types';
6
- import { get, size, isMap, each, isEqual, pick, isNull } from 'lodash';
6
+ import { get, size, isMap, each, isEqual, pick, isNull, isFunction } from 'lodash';
7
7
  import classnames from 'classnames';
8
8
  import { VariableSizeList as List } from 'react-window';
9
9
 
@@ -15,7 +15,8 @@ import {
15
15
  isDisabled,
16
16
  getRecord,
17
17
  genExpandedRowKey,
18
- getDefaultVirtualizedRowConfig
18
+ getDefaultVirtualizedRowConfig,
19
+ isTreeTable
19
20
  } from '@douyinfe/semi-foundation/table/utils';
20
21
  import BodyFoundation, { BodyAdapter, FlattenData, GroupFlattenData } from '@douyinfe/semi-foundation/table/bodyFoundation';
21
22
  import { strings } from '@douyinfe/semi-foundation/table/constants';
@@ -730,6 +731,7 @@ class Body extends BaseComponent<BodyProps, BodyState> {
730
731
  dataSource,
731
732
  onScroll,
732
733
  groups,
734
+ expandedRowRender,
733
735
  } = this.props;
734
736
 
735
737
  const x = get(scroll, 'x');
@@ -775,6 +777,9 @@ class Body extends BaseComponent<BodyProps, BodyState> {
775
777
  onScroll={handleBodyScroll}
776
778
  >
777
779
  <Table
780
+ role={ isMap(groups) || isFunction(expandedRowRender) || isTreeTable({ dataSource }) ? 'treegrid' : 'grid'}
781
+ aria-rowcount={dataSource && dataSource.length}
782
+ aria-colcount={columns && columns.length}
778
783
  style={tableStyle}
779
784
  className={classnames(prefixCls, {
780
785
  [`${prefixCls}-fixed`]: anyColumnFixed,
@@ -164,7 +164,13 @@ export default function ColumnFilter(props: ColumnFilterProps = {}): React.React
164
164
  } else {
165
165
  iconElem = (
166
166
  <div className={finalCls}>
167
- <IconFilter size="small" />
167
+ <IconFilter
168
+ role="button"
169
+ aria-label="Filter data with this column"
170
+ aria-haspopup="listbox"
171
+ tabIndex={-1}
172
+ size="small"
173
+ />
168
174
  </div>
169
175
  );
170
176
  }
@@ -20,6 +20,7 @@ export interface TableSelectionCellProps {
20
20
  indeterminate?: boolean; // Intermediate state, shown as a solid horizontal line
21
21
  prefixCls?: string;
22
22
  className?: string;
23
+ 'aria-label'?: React.AriaAttributes['aria-label'];
23
24
  }
24
25
 
25
26
  /**
@@ -36,6 +37,7 @@ export default class TableSelectionCell extends BaseComponent<TableSelectionCell
36
37
  indeterminate: PropTypes.bool,
37
38
  prefixCls: PropTypes.string,
38
39
  className: PropTypes.string,
40
+ 'aria-label': PropTypes.string,
39
41
  };
40
42
 
41
43
  static defaultProps = {
@@ -60,6 +62,7 @@ export default class TableSelectionCell extends BaseComponent<TableSelectionCell
60
62
 
61
63
  render() {
62
64
  const { selected, getCheckboxProps, indeterminate, disabled, prefixCls, className } = this.props;
65
+ const ariaLabel = this.props['aria-label'];
63
66
  let checkboxProps = {
64
67
  onChange: this.handleChange,
65
68
  disabled,
@@ -81,7 +84,7 @@ export default class TableSelectionCell extends BaseComponent<TableSelectionCell
81
84
 
82
85
  return (
83
86
  <span className={wrapCls}>
84
- <Checkbox {...checkboxProps} />
87
+ <Checkbox aria-label={ariaLabel} {...checkboxProps} />
85
88
  </span>
86
89
  );
87
90
  }
@@ -7,6 +7,7 @@ import { IconCaretup, IconCaretdown } from '@douyinfe/semi-icons';
7
7
  import { cssClasses, strings } from '@douyinfe/semi-foundation/table/constants';
8
8
 
9
9
  import { SortOrder } from './interface';
10
+ import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';
10
11
 
11
12
  export interface ColumnSorterProps {
12
13
  className?: string;
@@ -43,9 +44,25 @@ export default class ColumnSorter extends PureComponent<ColumnSorterProps> {
43
44
  const downCls = cls(`${prefixCls}-column-sorter-down`, {
44
45
  on: sortOrder === strings.SORT_DIRECTIONS[1],
45
46
  });
47
+ const ariaProps = {
48
+ /**
49
+ * Set 'aria-sort' to aria-columnheader is difficult, so set 'aria-label' about sort info to sorter
50
+ * reference: https://developer.mozilla.org/en-US/docs/Web/API/Element/ariaSort
51
+ */
52
+ 'aria-label': `Current sort order is ${sortOrder ? `${sortOrder}ing` : 'none'}`,
53
+ 'aria-roledescription': 'Sort data with this column',
54
+ };
46
55
 
47
56
  return (
48
- <div style={style} className={`${prefixCls}-column-sorter`} onClick={onClick}>
57
+ <div
58
+ role='button'
59
+ {...ariaProps}
60
+ tabIndex={-1}
61
+ style={style}
62
+ className={`${prefixCls}-column-sorter`}
63
+ onClick={onClick}
64
+ onKeyPress={e => isEnterPress(e) && onClick(e as any)}
65
+ >
49
66
  <span className={`${upCls}`}>
50
67
  <IconCaretup size={iconBtnSize} />
51
68
  </span>
@@ -5,6 +5,7 @@ import { noop } from 'lodash';
5
5
 
6
6
  import { IconChevronRight, IconChevronDown, IconTreeTriangleDown, IconTreeTriangleRight } from '@douyinfe/semi-icons';
7
7
  import { cssClasses } from '@douyinfe/semi-foundation/table/constants';
8
+ import isEnterPress from '@douyinfe/semi-foundation/utils/isEnterPress';
8
9
 
9
10
  import Rotate from '../motions/Rotate';
10
11
 
@@ -65,10 +66,14 @@ export default function CustomExpandIcon(props: CustomExpandIconProps) {
65
66
 
66
67
  return (
67
68
  <span
69
+ role="button"
70
+ aria-label="Expand this row"
71
+ tabIndex={-1}
68
72
  onClick={handleClick}
69
73
  onMouseEnter={onMouseEnter}
70
74
  onMouseLeave={onMouseLeave}
71
75
  className={`${prefixCls}-expand-icon`}
76
+ onKeyPress={e => isEnterPress(e) && handleClick(e as any)}
72
77
  >
73
78
  {icon}
74
79
  </span>
package/table/Table.tsx CHANGED
@@ -95,6 +95,7 @@ export interface NormalTableState<RecordType extends Record<string, any> = Data>
95
95
  bodyHasScrollBar?: boolean;
96
96
  prePropRowSelection?: TableStateRowSelection<RecordType>;
97
97
  tableWidth?: number;
98
+ prePagination?: Pagination;
98
99
  }
99
100
 
100
101
  export type TableStateRowSelection<RecordType extends Record<string, any> = Data> = (RowSelectionProps<RecordType> & { selectedRowKeysSet?: Set<(string | number)> }) | boolean;
@@ -390,6 +391,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
390
391
  headWidths: [], // header cell width
391
392
  bodyHasScrollBar: false,
392
393
  prePropRowSelection: undefined,
394
+ prePagination: undefined
393
395
  };
394
396
 
395
397
  this.rootWrapRef = createRef();
@@ -412,7 +414,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
412
414
 
413
415
  static getDerivedStateFromProps(props: NormalTableProps, state: NormalTableState) {
414
416
  const willUpdateStates: Partial<NormalTableState> = {};
415
- const { rowSelection, dataSource, childrenRecordName, rowKey } = props;
417
+ const { rowSelection, dataSource, childrenRecordName, rowKey, pagination } = props;
416
418
  props.columns && props.children && logger.warn('columns should not given by object and children at the same time');
417
419
 
418
420
  if (props.columns && props.columns !== state.cachedColumns) {
@@ -453,6 +455,17 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
453
455
  willUpdateStates.rowSelection = newSelectionStates;
454
456
  willUpdateStates.prePropRowSelection = rowSelection;
455
457
  }
458
+ if (pagination !== state.prePagination) {
459
+ let newPagination: Pagination = {};
460
+ if (isObject(state.pagination)) {
461
+ newPagination = { ...newPagination, ...state.pagination };
462
+ }
463
+ if (isObject(pagination)) {
464
+ newPagination = { ...newPagination, ...pagination };
465
+ }
466
+ willUpdateStates.pagination = newPagination;
467
+ willUpdateStates.prePagination = pagination;
468
+ }
456
469
  return willUpdateStates;
457
470
  }
458
471
 
@@ -468,16 +481,17 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
468
481
  // TODO: Extract the setState operation to the adapter or getDerivedStateFromProps function
469
482
  componentDidUpdate(prevProps: NormalTableProps<RecordType>, prevState: NormalTableState<RecordType>) {
470
483
  const {
471
- pagination,
472
484
  dataSource,
473
485
  expandedRowKeys,
474
486
  expandAllRows,
475
487
  expandAllGroupRows,
476
488
  virtualized,
477
489
  components,
490
+ pagination: propsPagination
478
491
  } = this.props;
479
492
 
480
493
  const {
494
+ pagination: statePagination,
481
495
  queries: stateQueries,
482
496
  cachedColumns: stateCachedColumns,
483
497
  cachedChildren: stateCachedChildren,
@@ -521,11 +535,6 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
521
535
  }
522
536
 
523
537
 
524
- // Update pagination
525
- if (pagination !== prevProps.pagination) {
526
- states.pagination = isObject(pagination) ? { ...pagination } : pagination;
527
- }
528
-
529
538
  /**
530
539
  * After dataSource is updated || (cachedColumns || cachedChildren updated)
531
540
  * 1. Cache filtered sorted data and a collection of data rows, stored in this
@@ -538,10 +547,11 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
538
547
  const filteredSortedDataSource = this.foundation.getFilteredSortedDataSource(_dataSource, stateQueries);
539
548
  this.foundation.setCachedFilteredSortedDataSource(filteredSortedDataSource);
540
549
  states.dataSource = filteredSortedDataSource;
541
-
542
- if (pagination === prevProps.pagination) {
543
- states.pagination = isObject(pagination) ? { ...pagination } : pagination;
544
- }
550
+ // when dataSource has change, should reset currentPage
551
+ states.pagination = isObject(statePagination) ? {
552
+ ...statePagination,
553
+ currentPage: isObject(propsPagination) && propsPagination.currentPage ? propsPagination.currentPage : 1,
554
+ } : statePagination;
545
555
 
546
556
  if (this.props.groupBy) {
547
557
  states.groups = null;
@@ -551,11 +561,11 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
551
561
  if (Object.keys(states).length) {
552
562
  const {
553
563
  // eslint-disable-next-line @typescript-eslint/no-shadow
564
+ pagination: mergedStatePagination = null,
554
565
  queries: stateQueries = null,
555
- pagination: statePagination = null,
556
566
  dataSource: stateDataSource = null,
557
567
  } = states;
558
- const handledProps: Partial<NormalTableState<RecordType>> = this.foundation.getCurrentPageData(stateDataSource, statePagination as TablePaginationProps, stateQueries);
568
+ const handledProps: Partial<NormalTableState<RecordType>> = this.foundation.getCurrentPageData(stateDataSource, mergedStatePagination as TablePaginationProps, stateQueries);
559
569
 
560
570
  // After the pager is updated, reset allRowKeys of the current page
561
571
  this.adapter.setAllRowKeys(handledProps.allRowKeys);
@@ -790,6 +800,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
790
800
  const hasRowSelected = this.foundation.hasRowSelected(selectedRowKeys, allRowKeysSet);
791
801
  return (
792
802
  <ColumnSelection
803
+ aria-label={`${allIsSelected ? 'Deselect' : 'Select'} all rows`}
793
804
  disabled={disabled}
794
805
  key={columnKey}
795
806
  selected={allIsSelected}
@@ -806,6 +817,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
806
817
 
807
818
  return (
808
819
  <ColumnSelection
820
+ aria-label={`${selected ? 'Deselect' : 'Select'} this row`}
809
821
  getCheckboxProps={checkboxPropsFn}
810
822
  selected={selected}
811
823
  onChange={(status, e) => this.toggleSelectRow(status, key, e)}
@@ -966,6 +978,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
966
978
  /**
967
979
  * render pagination
968
980
  * @param {object} pagination
981
+ * @param {object} propRenderPagination
969
982
  */
970
983
  renderPagination = (pagination: TablePaginationProps, propRenderPagination: RenderPagination) => {
971
984
  if (!pagination) {
@@ -42,6 +42,7 @@ export interface TableCellProps extends BaseProps {
42
42
  selected?: boolean; // Whether the current row is selected
43
43
  expanded?: boolean; // Whether the current line is expanded
44
44
  disabled?: boolean;
45
+ colIndex?: number;
45
46
  }
46
47
 
47
48
  function isInvalidRenderCellText(text: any) {
@@ -82,6 +83,7 @@ export default class TableCell extends BaseComponent<TableCellProps, Record<stri
82
83
  height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
83
84
  selected: PropTypes.bool,
84
85
  expanded: PropTypes.bool,
86
+ colIndex: PropTypes.number,
85
87
  };
86
88
 
87
89
  get adapter(): TableCellAdapter {
@@ -314,6 +316,7 @@ export default class TableCell extends BaseComponent<TableCellProps, Record<stri
314
316
  fixedRight,
315
317
  lastFixedLeft,
316
318
  firstFixedRight,
319
+ colIndex
317
320
  } = this.props;
318
321
  const { className } = column;
319
322
  const fixedLeftFlag = fixedLeft || typeof fixedLeft === 'number';
@@ -347,7 +350,14 @@ export default class TableCell extends BaseComponent<TableCellProps, Record<stri
347
350
  );
348
351
 
349
352
  return (
350
- <BodyCell className={columnCls} onClick={this.handleClick} {...newTdProps} ref={this.setRef}>
353
+ <BodyCell
354
+ role="gridcell"
355
+ aria-colindex={colIndex + 1}
356
+ className={columnCls}
357
+ onClick={this.handleClick}
358
+ {...newTdProps}
359
+ ref={this.setRef}
360
+ >
351
361
  {inner}
352
362
  </BodyCell>
353
363
  );
@@ -168,11 +168,25 @@ export default class TableHeaderRow extends BaseComponent<TableHeaderRowProps, R
168
168
  return null;
169
169
  }
170
170
 
171
- return <HeaderCell {...props} style={cellStyle} key={column.key || column.dataIndex || cellIndex} />;
171
+ return (
172
+ <HeaderCell
173
+ role="columnheader"
174
+ aria-colindex={cellIndex + 1}
175
+ {...props}
176
+ style={cellStyle}
177
+ key={column.key || column.dataIndex || cellIndex}
178
+ />
179
+ );
172
180
  });
173
181
 
174
182
  return (
175
- <HeaderRow {...rowProps} style={style} ref={this.cacheRef}>
183
+ <HeaderRow
184
+ role="row"
185
+ aria-rowindex={index + 1}
186
+ {...rowProps}
187
+ style={style}
188
+ ref={this.cacheRef}
189
+ >
176
190
  {cells}
177
191
  </HeaderRow>
178
192
  );
@@ -1452,6 +1452,52 @@ describe(`Table`, () => {
1452
1452
  });
1453
1453
  expect(demo.find(BaseTable).state('disabledRowKeys').length).toEqual(2);
1454
1454
  });
1455
+ /**
1456
+ * 分页受控场景,更新数据后查看分页器是否保持当前页
1457
+ */
1458
+ it('test controlled pagination reset when dataSource change', async () => {
1459
+ const total = 100;
1460
+ const pagination = {
1461
+ pageSize: 10,
1462
+ currentPage: 2,
1463
+ };
1464
+ const columns = getColumns();
1465
+ const demo = mount(<Table dataSource={getData(total)} columns={columns} pagination={pagination}/>);
1466
+
1467
+ const dataNum = getRandomNumber(100, 40);
1468
+ const newData = getData(dataNum);
1469
+ demo.setProps({
1470
+ dataSource: newData,
1471
+ });
1472
+ await sleep(2000);
1473
+ expect(
1474
+ demo
1475
+ .find(`.${BASE_CLASS_PREFIX}-page .${BASE_CLASS_PREFIX}-page-item-active`)
1476
+ .getDOMNode().innerHTML
1477
+ ).toBe('2');
1478
+ });
1479
+
1480
+ /**
1481
+ * 分页非受控场景,更新数据后查看分页器是否重置
1482
+ */
1483
+ it('test uncontrolled pagination reset when dataSource change', async () => {
1484
+ const total = 100;
1485
+ const columns = getColumns();
1486
+ const demo = mount(<Table dataSource={getData(total)} columns={columns}/>);
1487
+ demo.find(`.${BASE_CLASS_PREFIX}-page .${BASE_CLASS_PREFIX}-page-item`)
1488
+ .at(2)
1489
+ .simulate('click');
1490
+ const dataNum = getRandomNumber(100, 40);
1491
+ const newData = getData(dataNum);
1492
+ demo.setProps({
1493
+ dataSource: newData,
1494
+ });
1495
+ await sleep(2000);
1496
+ demo.update();
1497
+ expect(demo.find(`.semi-page .semi-page-item-active`).getDOMNode().innerHTML).toBe('1');
1498
+ expect(demo.find(BaseTable).state('pagination')).toHaveProperty('currentPage', 1);
1499
+ });
1500
+
1455
1501
  it('test pagination changed', async () => {
1456
1502
  const total = 100;
1457
1503
  const pagination = {
package/tabs/TabBar.tsx CHANGED
@@ -91,7 +91,7 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
91
91
  renderTabItem = (panel: PlainTab): ReactNode => {
92
92
  const { size, type, deleteTabItem } = this.props;
93
93
  const panelIcon = panel.icon ? this.renderIcon(panel.icon) : null;
94
- const closableIcon = (type === 'card' && panel.closable) ? <IconClose className={`${cssClasses.TABS_TAB}-icon-close`} onClick={(e: React.MouseEvent<HTMLSpanElement>) => deleteTabItem(panel.itemKey, e)} /> : null;
94
+ const closableIcon = (type === 'card' && panel.closable) ? <IconClose aria-label="Close" role="button" className={`${cssClasses.TABS_TAB}-icon-close`} onClick={(e: React.MouseEvent<HTMLSpanElement>) => deleteTabItem(panel.itemKey, e)} /> : null;
95
95
  let events = {};
96
96
  const key = panel.itemKey;
97
97
  if (!panel.disabled) {
@@ -99,8 +99,9 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
99
99
  onClick: (e: MouseEvent<HTMLDivElement>): void => this.handleItemClick(key, e),
100
100
  };
101
101
  }
102
+ const isSelected = this._isActive(key);
102
103
  const className = cls(cssClasses.TABS_TAB, {
103
- [cssClasses.TABS_TAB_ACTIVE]: this._isActive(key),
104
+ [cssClasses.TABS_TAB_ACTIVE]: isSelected,
104
105
  [cssClasses.TABS_TAB_DISABLED]: panel.disabled,
105
106
  [`${cssClasses.TABS_TAB}-small`]: size === 'small',
106
107
  [`${cssClasses.TABS_TAB}-medium`]: size === 'medium',
@@ -108,8 +109,10 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
108
109
  return (
109
110
  <div
110
111
  role="tab"
112
+ id={`semiTab${key}`}
113
+ aria-controls={`semiTabPanel${key}`}
111
114
  aria-disabled={panel.disabled ? 'true' : 'false'}
112
- aria-selected={this._isActive(key) ? 'true' : 'false'}
115
+ aria-selected={isSelected ? 'true' : 'false'}
113
116
  {...events}
114
117
  className={className}
115
118
  key={this._getItemKey(key)}
@@ -182,7 +185,7 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
182
185
  style={dropdownStyle}
183
186
  trigger={'hover'}
184
187
  >
185
- <div className={arrowCls} onClick={(e): void => this.handleArrowClick(items, pos)}>
188
+ <div role="presentation" className={arrowCls} onClick={(e): void => this.handleArrowClick(items, pos)}>
186
189
  <Button
187
190
  disabled={disabled}
188
191
  icon={icon}
@@ -233,7 +236,7 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
233
236
  const contents = collapsible ? this.renderCollapsedTab() : this.renderTabComponents(list);
234
237
 
235
238
  return (
236
- <div role="tab-list" className={classNames} style={style} {...getDataAttr(restProps)} data-uuid={this.uuid}>
239
+ <div role="tablist" aria-orientation={tabPosition === "left" ? "vertical" : "horizontal"} className={classNames} style={style} {...getDataAttr(restProps)} data-uuid={this.uuid}>
237
240
  {contents}
238
241
  {extra}
239
242
  </div>
package/tabs/TabPane.tsx CHANGED
@@ -86,7 +86,9 @@ class TabPane extends PureComponent<TabPaneProps> {
86
86
  return (
87
87
  <div
88
88
  ref={this.ref}
89
- role="tab-panel"
89
+ role="tabpanel"
90
+ id={`semiTabPanel${itemKey}`}
91
+ aria-labelledby={`semiTab${itemKey}`}
90
92
  className={classNames}
91
93
  style={style}
92
94
  aria-hidden={active ? 'false' : 'true'}
package/tabs/index.tsx CHANGED
@@ -285,7 +285,6 @@ class Tabs extends BaseComponent<TabsProps, TabsState> {
285
285
  >
286
286
  <div
287
287
  ref={this.setContentRef}
288
- role="tab-content"
289
288
  className={tabContentCls}
290
289
  style={{ ...contentStyle }}
291
290
  >
@@ -76,6 +76,28 @@ describe('TagInput', () => {
76
76
  tagInput.unmount();
77
77
  });
78
78
 
79
+ it('TagInput with defaultValue and value is undefined', () => {
80
+ const props = {
81
+ defaultValue: ['tiktok', 'hotsoon'],
82
+ value: undefined,
83
+ };
84
+ const tagInput = getTagInput(props);
85
+ const tags = tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`);
86
+ expect(tags.length).toEqual(0);
87
+ tagInput.unmount();
88
+ });
89
+
90
+ it('TagInput with defaultValue and value is null', () => {
91
+ const props = {
92
+ defaultValue: ['tiktok', 'hotsoon'],
93
+ value: null,
94
+ };
95
+ const tagInput = getTagInput(props);
96
+ const tags = tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`);
97
+ expect(tags.length).toEqual(0);
98
+ tagInput.unmount();
99
+ });
100
+
79
101
  it('TagInput with disabled', () => {
80
102
  const disabledTagInput = mount(<TagInput disabled />);
81
103
  expect(disabledTagInput.exists(`.${BASE_CLASS_PREFIX}-tagInput-disabled`)).toEqual(true);
@@ -328,6 +350,30 @@ describe('TagInput', () => {
328
350
  expect(tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`).getDOMNode().textContent).toEqual('hotsoon');
329
351
  });
330
352
 
353
+ it('tagInput with set value to null ', () => {
354
+ const props = {
355
+ value: ['tiktok']
356
+ };
357
+ const tagInput = getTagInput(props);
358
+ expect(tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`).getDOMNode().textContent).toEqual('tiktok');
359
+ tagInput.setProps({ value: null });
360
+ tagInput.update();
361
+ const tags = tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`);
362
+ expect(tags.length).toEqual(0);
363
+ });
364
+
365
+ it('tagInput with set value to null ', () => {
366
+ const props = {
367
+ value: ['tiktok']
368
+ };
369
+ const tagInput = getTagInput(props);
370
+ expect(tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`).getDOMNode().textContent).toEqual('tiktok');
371
+ tagInput.setProps({ value: undefined });
372
+ tagInput.update();
373
+ const tags = tagInput.find(`.${BASE_CLASS_PREFIX}-tagInput-wrapper .${BASE_CLASS_PREFIX}-tag-content`);
374
+ expect(tags.length).toEqual(0);
375
+ });
376
+
331
377
  it('tagInput with inputValue controlled mode ', () => {
332
378
  const props = {
333
379
  inputValue: 'abc'
@@ -13,7 +13,7 @@ export default {
13
13
 
14
14
  export const Default = () => (
15
15
  <>
16
- <TagInput defaultValue={['抖音', '火山', '西瓜视频']} placeholder="请输入..." style={style} />
16
+ <TagInput aria-label='input tag' defaultValue={['抖音', '火山', '西瓜视频']} placeholder="请输入..." style={style} />
17
17
  <TagInput
18
18
  maxTagCount={2}
19
19
  showRestTagsPopover={true}
@@ -348,7 +348,7 @@ class CustomRender extends React.Component {
348
348
  marginRight: 10,
349
349
  }}
350
350
  >
351
- <Avatar src={node.avatar} size="extra-small">
351
+ <Avatar alt="avatar" src={node.avatar} size="extra-small">
352
352
  {node.abbr}
353
353
  </Avatar>
354
354
  <span