@douyinfe/semi-ui 2.2.2 → 2.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/_base/_story/a11y.jsx +6 -6
  2. package/_utils/hooks/usePrevFocus.ts +16 -0
  3. package/_utils/index.ts +4 -0
  4. package/anchor/_story/anchor.stories.js +1 -1
  5. package/anchor/index.tsx +5 -2
  6. package/anchor/link.tsx +29 -4
  7. package/autoComplete/index.tsx +28 -1
  8. package/avatar/_story/avatar.stories.js +4 -4
  9. package/avatar/avatarGroup.tsx +1 -1
  10. package/avatar/index.tsx +10 -4
  11. package/banner/index.tsx +2 -1
  12. package/breadcrumb/_story/breadcrumb.stories.js +22 -8
  13. package/breadcrumb/index.tsx +8 -1
  14. package/breadcrumb/item.tsx +1 -1
  15. package/button/Button.tsx +4 -0
  16. package/button/__test__/button.test.js +1 -1
  17. package/button/_story/button.stories.js +10 -10
  18. package/button/buttonGroup.tsx +4 -2
  19. package/button/splitButtonGroup.tsx +5 -2
  20. package/card/_story/card.stories.js +8 -1
  21. package/card/_story/card.stories.tsx +3 -0
  22. package/card/index.tsx +5 -2
  23. package/cascader/index.tsx +33 -5
  24. package/checkbox/_story/checkbox.stories.js +21 -14
  25. package/checkbox/checkbox.tsx +40 -5
  26. package/checkbox/checkboxGroup.tsx +30 -5
  27. package/checkbox/checkboxInner.tsx +25 -2
  28. package/collapse/index.tsx +2 -2
  29. package/collapse/item.tsx +15 -8
  30. package/collapsible/index.tsx +4 -2
  31. package/configProvider/_story/configProvider.stories.tsx +27 -0
  32. package/datePicker/datePicker.tsx +19 -0
  33. package/dist/css/semi.css +8 -3
  34. package/dist/css/semi.min.css +1 -1
  35. package/dist/umd/semi-ui.js +2470 -1242
  36. package/dist/umd/semi-ui.js.map +1 -1
  37. package/dist/umd/semi-ui.min.js +1 -1
  38. package/dist/umd/semi-ui.min.js.map +1 -1
  39. package/dropdown/dropdownItem.tsx +1 -1
  40. package/dropdown/dropdownMenu.tsx +1 -1
  41. package/empty/index.tsx +5 -5
  42. package/form/_story/FormApi/formApiDemo.jsx +3 -2
  43. package/form/_story/Validate/validateDemo.jsx +1 -1
  44. package/form/_story/demo.jsx +12 -3
  45. package/form/_story/form.stories.js +0 -7
  46. package/form/baseForm.tsx +2 -0
  47. package/form/errorMessage.tsx +13 -2
  48. package/form/hoc/withField.tsx +37 -8
  49. package/form/index.tsx +0 -2
  50. package/form/interface.ts +2 -0
  51. package/form/label.tsx +4 -2
  52. package/input/index.tsx +49 -4
  53. package/input/inputGroup.tsx +9 -4
  54. package/input/textarea.tsx +25 -6
  55. package/inputNumber/index.tsx +28 -1
  56. package/layout/Sider.tsx +6 -2
  57. package/layout/index.tsx +4 -3
  58. package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
  59. package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
  60. package/lib/cjs/_utils/index.d.ts +1 -0
  61. package/lib/cjs/_utils/index.js +6 -1
  62. package/lib/cjs/anchor/index.d.ts +2 -0
  63. package/lib/cjs/anchor/index.js +6 -1
  64. package/lib/cjs/anchor/link.d.ts +4 -1
  65. package/lib/cjs/anchor/link.js +39 -5
  66. package/lib/cjs/autoComplete/index.d.ts +17 -0
  67. package/lib/cjs/autoComplete/index.js +21 -2
  68. package/lib/cjs/avatar/avatarGroup.js +2 -1
  69. package/lib/cjs/avatar/index.d.ts +4 -3
  70. package/lib/cjs/avatar/index.js +20 -11
  71. package/lib/cjs/banner/index.js +4 -2
  72. package/lib/cjs/breadcrumb/index.d.ts +3 -0
  73. package/lib/cjs/breadcrumb/index.js +10 -4
  74. package/lib/cjs/breadcrumb/item.js +2 -2
  75. package/lib/cjs/button/Button.d.ts +2 -0
  76. package/lib/cjs/button/Button.js +4 -2
  77. package/lib/cjs/button/buttonGroup.d.ts +3 -0
  78. package/lib/cjs/button/buttonGroup.js +8 -4
  79. package/lib/cjs/button/index.d.ts +1 -0
  80. package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
  81. package/lib/cjs/button/splitButtonGroup.js +5 -2
  82. package/lib/cjs/card/index.d.ts +3 -0
  83. package/lib/cjs/card/index.js +3 -1
  84. package/lib/cjs/cascader/index.d.ts +14 -0
  85. package/lib/cjs/cascader/index.js +35 -7
  86. package/lib/cjs/checkbox/checkbox.d.ts +21 -1
  87. package/lib/cjs/checkbox/checkbox.js +51 -17
  88. package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
  89. package/lib/cjs/checkbox/checkboxGroup.js +16 -3
  90. package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
  91. package/lib/cjs/checkbox/checkboxInner.js +20 -3
  92. package/lib/cjs/collapse/index.js +2 -1
  93. package/lib/cjs/collapse/item.d.ts +2 -1
  94. package/lib/cjs/collapse/item.js +17 -3
  95. package/lib/cjs/collapsible/index.d.ts +1 -0
  96. package/lib/cjs/collapsible/index.js +4 -2
  97. package/lib/cjs/datePicker/datePicker.d.ts +12 -0
  98. package/lib/cjs/datePicker/datePicker.js +14 -1
  99. package/lib/cjs/dropdown/dropdownItem.js +3 -1
  100. package/lib/cjs/dropdown/dropdownMenu.js +4 -1
  101. package/lib/cjs/empty/index.js +2 -1
  102. package/lib/cjs/form/baseForm.d.ts +9 -0
  103. package/lib/cjs/form/baseForm.js +3 -1
  104. package/lib/cjs/form/errorMessage.d.ts +4 -0
  105. package/lib/cjs/form/errorMessage.js +21 -3
  106. package/lib/cjs/form/field.d.ts +7 -0
  107. package/lib/cjs/form/hoc/withField.js +49 -16
  108. package/lib/cjs/form/index.d.ts +0 -1
  109. package/lib/cjs/form/interface.d.ts +2 -0
  110. package/lib/cjs/form/label.d.ts +2 -0
  111. package/lib/cjs/form/label.js +5 -2
  112. package/lib/cjs/input/index.d.ts +16 -0
  113. package/lib/cjs/input/index.js +51 -15
  114. package/lib/cjs/input/inputGroup.d.ts +2 -1
  115. package/lib/cjs/input/inputGroup.js +11 -1
  116. package/lib/cjs/input/textarea.js +12 -1
  117. package/lib/cjs/inputNumber/index.d.ts +8 -0
  118. package/lib/cjs/inputNumber/index.js +32 -2
  119. package/lib/cjs/layout/Sider.d.ts +4 -0
  120. package/lib/cjs/layout/Sider.js +4 -1
  121. package/lib/cjs/layout/index.js +2 -0
  122. package/lib/cjs/list/item.js +0 -1
  123. package/lib/cjs/modal/Modal.js +2 -0
  124. package/lib/cjs/modal/ModalContent.d.ts +3 -1
  125. package/lib/cjs/modal/ModalContent.js +47 -5
  126. package/lib/cjs/navigation/Item.d.ts +4 -2
  127. package/lib/cjs/navigation/Item.js +25 -5
  128. package/lib/cjs/navigation/SubNav.d.ts +4 -2
  129. package/lib/cjs/navigation/SubNav.js +8 -1
  130. package/lib/cjs/navigation/index.js +2 -0
  131. package/lib/cjs/notification/notice.d.ts +1 -1
  132. package/lib/cjs/notification/notice.js +32 -22
  133. package/lib/cjs/pagination/index.js +16 -6
  134. package/lib/cjs/popover/index.js +7 -3
  135. package/lib/cjs/progress/index.d.ts +8 -0
  136. package/lib/cjs/progress/index.js +42 -9
  137. package/lib/cjs/radio/radio.d.ts +6 -1
  138. package/lib/cjs/radio/radio.js +17 -5
  139. package/lib/cjs/radio/radioGroup.d.ts +16 -1
  140. package/lib/cjs/radio/radioGroup.js +18 -3
  141. package/lib/cjs/radio/radioInner.d.ts +6 -1
  142. package/lib/cjs/radio/radioInner.js +11 -3
  143. package/lib/cjs/rating/index.d.ts +14 -0
  144. package/lib/cjs/rating/index.js +14 -3
  145. package/lib/cjs/rating/item.d.ts +2 -0
  146. package/lib/cjs/rating/item.js +6 -1
  147. package/lib/cjs/select/index.d.ts +16 -0
  148. package/lib/cjs/select/index.js +65 -19
  149. package/lib/cjs/select/option.js +28 -22
  150. package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
  151. package/lib/cjs/sideSheet/SideSheetContent.js +12 -5
  152. package/lib/cjs/sideSheet/index.d.ts +1 -0
  153. package/lib/cjs/sideSheet/index.js +2 -1
  154. package/lib/cjs/slider/index.d.ts +2 -1
  155. package/lib/cjs/slider/index.js +64 -17
  156. package/lib/cjs/spin/icon.js +2 -4
  157. package/lib/cjs/steps/basicStep.d.ts +3 -0
  158. package/lib/cjs/steps/basicStep.js +23 -25
  159. package/lib/cjs/steps/basicSteps.d.ts +1 -0
  160. package/lib/cjs/steps/basicSteps.js +2 -1
  161. package/lib/cjs/steps/fillStep.d.ts +3 -0
  162. package/lib/cjs/steps/fillStep.js +19 -4
  163. package/lib/cjs/steps/fillSteps.d.ts +1 -0
  164. package/lib/cjs/steps/fillSteps.js +2 -1
  165. package/lib/cjs/steps/navStep.d.ts +3 -0
  166. package/lib/cjs/steps/navStep.js +22 -25
  167. package/lib/cjs/steps/navSteps.d.ts +1 -0
  168. package/lib/cjs/steps/navSteps.js +2 -1
  169. package/lib/cjs/switch/index.d.ts +12 -0
  170. package/lib/cjs/switch/index.js +19 -4
  171. package/lib/cjs/table/Body/BaseRow.js +35 -3
  172. package/lib/cjs/table/Body/index.js +9 -1
  173. package/lib/cjs/table/ColumnFilter.js +4 -0
  174. package/lib/cjs/table/ColumnSelection.d.ts +3 -0
  175. package/lib/cjs/table/ColumnSelection.js +6 -2
  176. package/lib/cjs/table/ColumnSorter.js +19 -3
  177. package/lib/cjs/table/CustomExpandIcon.js +7 -1
  178. package/lib/cjs/table/Table.d.ts +2 -0
  179. package/lib/cjs/table/Table.js +31 -15
  180. package/lib/cjs/table/TableCell.d.ts +2 -0
  181. package/lib/cjs/table/TableCell.js +6 -2
  182. package/lib/cjs/table/TableHeaderRow.js +8 -2
  183. package/lib/cjs/tabs/TabBar.js +11 -3
  184. package/lib/cjs/tabs/TabPane.js +3 -1
  185. package/lib/cjs/tabs/index.js +0 -1
  186. package/lib/cjs/tagInput/index.d.ts +4 -1
  187. package/lib/cjs/tagInput/index.js +29 -3
  188. package/lib/cjs/timePicker/TimePicker.d.ts +12 -0
  189. package/lib/cjs/timePicker/TimePicker.js +9 -1
  190. package/lib/cjs/timePicker/index.d.ts +6 -0
  191. package/lib/cjs/timeline/index.d.ts +1 -1
  192. package/lib/cjs/timeline/index.js +1 -0
  193. package/lib/cjs/timeline/item.js +4 -2
  194. package/lib/cjs/toast/toast.js +2 -0
  195. package/lib/cjs/tooltip/TriangleArrow.js +1 -0
  196. package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
  197. package/lib/cjs/tooltip/index.d.ts +16 -12
  198. package/lib/cjs/tooltip/index.js +55 -39
  199. package/lib/cjs/transfer/index.js +32 -14
  200. package/lib/cjs/tree/index.d.ts +1 -0
  201. package/lib/cjs/tree/index.js +15 -6
  202. package/lib/cjs/tree/treeNode.d.ts +12 -4
  203. package/lib/cjs/tree/treeNode.js +44 -4
  204. package/lib/cjs/treeSelect/index.d.ts +16 -0
  205. package/lib/cjs/treeSelect/index.js +60 -12
  206. package/lib/cjs/typography/base.js +18 -7
  207. package/lib/cjs/typography/copyable.js +6 -1
  208. package/lib/cjs/upload/fileCard.js +23 -4
  209. package/lib/cjs/upload/index.js +19 -4
  210. package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
  211. package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
  212. package/lib/es/_utils/index.d.ts +1 -0
  213. package/lib/es/_utils/index.js +4 -1
  214. package/lib/es/anchor/index.d.ts +2 -0
  215. package/lib/es/anchor/index.js +6 -1
  216. package/lib/es/anchor/link.d.ts +4 -1
  217. package/lib/es/anchor/link.js +38 -5
  218. package/lib/es/autoComplete/index.d.ts +17 -0
  219. package/lib/es/autoComplete/index.js +21 -2
  220. package/lib/es/avatar/avatarGroup.js +2 -1
  221. package/lib/es/avatar/index.d.ts +4 -3
  222. package/lib/es/avatar/index.js +20 -11
  223. package/lib/es/banner/index.js +4 -2
  224. package/lib/es/breadcrumb/index.d.ts +3 -0
  225. package/lib/es/breadcrumb/index.js +10 -4
  226. package/lib/es/breadcrumb/item.js +2 -2
  227. package/lib/es/button/Button.d.ts +2 -0
  228. package/lib/es/button/Button.js +4 -2
  229. package/lib/es/button/buttonGroup.d.ts +3 -0
  230. package/lib/es/button/buttonGroup.js +8 -4
  231. package/lib/es/button/index.d.ts +1 -0
  232. package/lib/es/button/splitButtonGroup.d.ts +3 -0
  233. package/lib/es/button/splitButtonGroup.js +5 -2
  234. package/lib/es/card/index.d.ts +3 -0
  235. package/lib/es/card/index.js +3 -1
  236. package/lib/es/cascader/index.d.ts +14 -0
  237. package/lib/es/cascader/index.js +35 -7
  238. package/lib/es/checkbox/checkbox.d.ts +21 -1
  239. package/lib/es/checkbox/checkbox.js +50 -17
  240. package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
  241. package/lib/es/checkbox/checkboxGroup.js +18 -5
  242. package/lib/es/checkbox/checkboxInner.d.ts +15 -0
  243. package/lib/es/checkbox/checkboxInner.js +20 -3
  244. package/lib/es/collapse/index.js +2 -1
  245. package/lib/es/collapse/item.d.ts +2 -1
  246. package/lib/es/collapse/item.js +16 -3
  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/empty/index.js +2 -1
  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 +12 -1
  270. package/lib/es/inputNumber/index.d.ts +8 -0
  271. package/lib/es/inputNumber/index.js +33 -2
  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/item.js +0 -1
  276. package/lib/es/modal/Modal.js +2 -0
  277. package/lib/es/modal/ModalContent.d.ts +3 -1
  278. package/lib/es/modal/ModalContent.js +46 -5
  279. package/lib/es/navigation/Item.d.ts +4 -2
  280. package/lib/es/navigation/Item.js +25 -5
  281. package/lib/es/navigation/SubNav.d.ts +4 -2
  282. package/lib/es/navigation/SubNav.js +8 -1
  283. package/lib/es/navigation/index.js +2 -0
  284. package/lib/es/notification/notice.d.ts +1 -1
  285. package/lib/es/notification/notice.js +33 -24
  286. package/lib/es/pagination/index.js +16 -6
  287. package/lib/es/popover/index.js +7 -3
  288. package/lib/es/progress/index.d.ts +8 -0
  289. package/lib/es/progress/index.js +42 -9
  290. package/lib/es/radio/radio.d.ts +6 -1
  291. package/lib/es/radio/radio.js +16 -5
  292. package/lib/es/radio/radioGroup.d.ts +16 -1
  293. package/lib/es/radio/radioGroup.js +18 -3
  294. package/lib/es/radio/radioInner.d.ts +6 -1
  295. package/lib/es/radio/radioInner.js +11 -3
  296. package/lib/es/rating/index.d.ts +14 -0
  297. package/lib/es/rating/index.js +14 -3
  298. package/lib/es/rating/item.d.ts +2 -0
  299. package/lib/es/rating/item.js +6 -1
  300. package/lib/es/select/index.d.ts +16 -0
  301. package/lib/es/select/index.js +63 -17
  302. package/lib/es/select/option.js +28 -22
  303. package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
  304. package/lib/es/sideSheet/SideSheetContent.js +12 -5
  305. package/lib/es/sideSheet/index.d.ts +1 -0
  306. package/lib/es/sideSheet/index.js +2 -1
  307. package/lib/es/slider/index.d.ts +2 -1
  308. package/lib/es/slider/index.js +63 -16
  309. package/lib/es/spin/icon.js +2 -4
  310. package/lib/es/steps/basicStep.d.ts +3 -0
  311. package/lib/es/steps/basicStep.js +23 -23
  312. package/lib/es/steps/basicSteps.d.ts +1 -0
  313. package/lib/es/steps/basicSteps.js +2 -1
  314. package/lib/es/steps/fillStep.d.ts +3 -0
  315. package/lib/es/steps/fillStep.js +19 -4
  316. package/lib/es/steps/fillSteps.d.ts +1 -0
  317. package/lib/es/steps/fillSteps.js +2 -1
  318. package/lib/es/steps/navStep.d.ts +3 -0
  319. package/lib/es/steps/navStep.js +22 -23
  320. package/lib/es/steps/navSteps.d.ts +1 -0
  321. package/lib/es/steps/navSteps.js +2 -1
  322. package/lib/es/switch/index.d.ts +12 -0
  323. package/lib/es/switch/index.js +19 -4
  324. package/lib/es/table/Body/BaseRow.js +35 -3
  325. package/lib/es/table/Body/index.js +9 -2
  326. package/lib/es/table/ColumnFilter.js +4 -0
  327. package/lib/es/table/ColumnSelection.d.ts +3 -0
  328. package/lib/es/table/ColumnSelection.js +6 -2
  329. package/lib/es/table/ColumnSorter.js +17 -3
  330. package/lib/es/table/CustomExpandIcon.js +6 -1
  331. package/lib/es/table/Table.d.ts +2 -0
  332. package/lib/es/table/Table.js +31 -15
  333. package/lib/es/table/TableCell.d.ts +2 -0
  334. package/lib/es/table/TableCell.js +6 -2
  335. package/lib/es/table/TableHeaderRow.js +8 -2
  336. package/lib/es/tabs/TabBar.js +11 -3
  337. package/lib/es/tabs/TabPane.js +3 -1
  338. package/lib/es/tabs/index.js +0 -1
  339. package/lib/es/tagInput/index.d.ts +4 -1
  340. package/lib/es/tagInput/index.js +29 -3
  341. package/lib/es/timePicker/TimePicker.d.ts +12 -0
  342. package/lib/es/timePicker/TimePicker.js +9 -1
  343. package/lib/es/timePicker/index.d.ts +6 -0
  344. package/lib/es/timeline/index.d.ts +1 -1
  345. package/lib/es/timeline/index.js +1 -0
  346. package/lib/es/timeline/item.js +4 -2
  347. package/lib/es/toast/toast.js +2 -0
  348. package/lib/es/tooltip/TriangleArrow.js +1 -0
  349. package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
  350. package/lib/es/tooltip/index.d.ts +16 -12
  351. package/lib/es/tooltip/index.js +53 -39
  352. package/lib/es/transfer/index.js +32 -14
  353. package/lib/es/tree/index.d.ts +1 -0
  354. package/lib/es/tree/index.js +15 -6
  355. package/lib/es/tree/treeNode.d.ts +12 -4
  356. package/lib/es/tree/treeNode.js +44 -4
  357. package/lib/es/treeSelect/index.d.ts +16 -0
  358. package/lib/es/treeSelect/index.js +57 -10
  359. package/lib/es/typography/base.js +17 -7
  360. package/lib/es/typography/copyable.js +5 -1
  361. package/lib/es/upload/fileCard.js +23 -4
  362. package/lib/es/upload/index.js +19 -4
  363. package/list/item.tsx +0 -1
  364. package/modal/Modal.tsx +2 -0
  365. package/modal/ModalContent.tsx +35 -5
  366. package/navigation/Item.tsx +15 -0
  367. package/navigation/SubNav.tsx +13 -1
  368. package/navigation/index.tsx +1 -1
  369. package/notification/notice.tsx +19 -14
  370. package/package.json +8 -8
  371. package/pagination/index.tsx +9 -5
  372. package/popover/index.tsx +5 -0
  373. package/progress/_story/progress.stories.js +18 -18
  374. package/progress/index.tsx +58 -20
  375. package/radio/radio.tsx +12 -2
  376. package/radio/radioGroup.tsx +29 -3
  377. package/radio/radioInner.tsx +10 -1
  378. package/rating/index.tsx +19 -2
  379. package/rating/item.tsx +6 -0
  380. package/select/__test__/select.test.js +45 -0
  381. package/select/_story/select.stories.js +29 -0
  382. package/select/index.tsx +52 -4
  383. package/select/option.tsx +3 -0
  384. package/sideSheet/SideSheetContent.tsx +13 -9
  385. package/sideSheet/index.tsx +3 -2
  386. package/slider/__test__/slider.test.js +9 -0
  387. package/slider/_story/slider.stories.js +1 -1
  388. package/slider/index.tsx +44 -7
  389. package/spin/icon.tsx +3 -3
  390. package/steps/basicStep.tsx +15 -4
  391. package/steps/basicSteps.tsx +3 -2
  392. package/steps/fillStep.tsx +27 -12
  393. package/steps/fillSteps.tsx +2 -0
  394. package/steps/navStep.tsx +15 -4
  395. package/steps/navSteps.tsx +3 -2
  396. package/switch/_story/switch.stories.js +20 -19
  397. package/switch/_story/switch.stories.tsx +13 -13
  398. package/switch/index.tsx +23 -5
  399. package/table/Body/BaseRow.tsx +25 -1
  400. package/table/Body/index.tsx +7 -2
  401. package/table/ColumnFilter.tsx +7 -1
  402. package/table/ColumnSelection.tsx +4 -1
  403. package/table/ColumnSorter.tsx +18 -1
  404. package/table/CustomExpandIcon.tsx +5 -0
  405. package/table/Table.tsx +26 -13
  406. package/table/TableCell.tsx +11 -1
  407. package/table/TableHeaderRow.tsx +16 -2
  408. package/table/__test__/table.test.js +46 -0
  409. package/tabs/TabBar.tsx +8 -5
  410. package/tabs/TabPane.tsx +3 -1
  411. package/tabs/index.tsx +0 -1
  412. package/tagInput/__test__/tagInput.test.js +46 -0
  413. package/tagInput/_story/tagInput.stories.js +2 -2
  414. package/tagInput/index.tsx +31 -8
  415. package/timePicker/TimePicker.tsx +14 -1
  416. package/timeline/_story/timeline.stories.js +1 -1
  417. package/timeline/index.tsx +2 -2
  418. package/timeline/item.tsx +2 -1
  419. package/toast/toast.tsx +2 -0
  420. package/tooltip/TriangleArrow.tsx +1 -1
  421. package/tooltip/TriangleArrowVertical.tsx +1 -1
  422. package/tooltip/_story/tooltip.stories.js +562 -514
  423. package/tooltip/index.tsx +50 -33
  424. package/transfer/index.tsx +29 -25
  425. package/tree/_story/tree.stories.js +3 -3
  426. package/tree/index.tsx +10 -2
  427. package/tree/treeNode.tsx +46 -10
  428. package/treeSelect/__test__/treeMultiple.test.js +5 -0
  429. package/treeSelect/_story/treeSelect.stories.js +12 -0
  430. package/treeSelect/index.tsx +58 -7
  431. package/typography/base.tsx +7 -1
  432. package/typography/copyable.tsx +10 -1
  433. package/upload/fileCard.tsx +13 -15
  434. package/upload/index.tsx +10 -6
@@ -36,6 +36,13 @@ export type RadioGroupProps = {
36
36
  type?: RadioType;
37
37
  buttonSize?: RadioGroupButtonSize;
38
38
  prefixCls?: string;
39
+ 'aria-label'?: React.AriaAttributes['aria-label'];
40
+ 'aria-describedby'?: React.AriaAttributes['aria-describedby'];
41
+ 'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
42
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
43
+ 'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
44
+ 'aria-required'?: React.AriaAttributes['aria-required'];
45
+ id?: string;
39
46
  };
40
47
 
41
48
  export interface RadioGroupState {
@@ -57,7 +64,14 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
57
64
  className: PropTypes.string,
58
65
  style: PropTypes.object,
59
66
  direction: PropTypes.oneOf(strings.DIRECTION_SET),
60
- mode: PropTypes.oneOf(strings.MODE)
67
+ mode: PropTypes.oneOf(strings.MODE),
68
+ 'aria-label': PropTypes.string,
69
+ 'aria-describedby': PropTypes.string,
70
+ 'aria-errormessage': PropTypes.string,
71
+ 'aria-invalid': PropTypes.bool,
72
+ 'aria-labelledby': PropTypes.string,
73
+ 'aria-required': PropTypes.bool,
74
+ id: PropTypes.string,
61
75
  };
62
76
 
63
77
  static defaultProps: Partial<RadioGroupProps> = {
@@ -69,6 +83,7 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
69
83
  buttonSize: 'middle'
70
84
  };
71
85
 
86
+ foundation: RadioGroupFoundation;
72
87
  constructor(props: RadioGroupProps) {
73
88
  super(props);
74
89
  this.state = {
@@ -121,7 +136,8 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
121
136
  style,
122
137
  direction,
123
138
  type,
124
- buttonSize
139
+ buttonSize,
140
+ id,
125
141
  } = this.props;
126
142
 
127
143
  const isButtonRadio = type === strings.TYPE_BUTTON;
@@ -177,7 +193,17 @@ class RadioGroup extends BaseComponent<RadioGroupProps, RadioGroupState> {
177
193
  }
178
194
 
179
195
  return (
180
- <div className={prefixClsDisplay} style={style}>
196
+ <div
197
+ className={prefixClsDisplay}
198
+ style={style}
199
+ id={id}
200
+ aria-label={this.props['aria-label']}
201
+ aria-invalid={this.props['aria-invalid']}
202
+ aria-errormessage={this.props['aria-errormessage']}
203
+ aria-labelledby={this.props['aria-labelledby']}
204
+ aria-describedby={this.props['aria-describedby']}
205
+ aria-required={this.props['aria-required']}
206
+ >
181
207
  <Context.Provider
182
208
  value={{
183
209
  radioGroup: {
@@ -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
- role="radiogroup"
294
+ id={id}
278
295
  >
279
296
  {itemList}
280
297
  </ul>
package/rating/item.tsx CHANGED
@@ -20,6 +20,7 @@ export interface RatingItemProps {
20
20
  disabled: boolean;
21
21
  count: number;
22
22
  size: number | ArrayElement<typeof strings.SIZE_SET>;
23
+ 'aria-describedby'?: React.AriaAttributes['aria-describedby'];
23
24
  }
24
25
 
25
26
  export default class Item extends PureComponent<RatingItemProps> {
@@ -38,6 +39,7 @@ export default class Item extends PureComponent<RatingItemProps> {
38
39
  PropTypes.oneOf(strings.SIZE_SET),
39
40
  PropTypes.number,
40
41
  ]),
42
+ 'aria-describedby': PropTypes.string,
41
43
  };
42
44
 
43
45
  onHover: React.MouseEventHandler = e => {
@@ -100,6 +102,10 @@ export default class Item extends PureComponent<RatingItemProps> {
100
102
  aria-checked={value > index ? 'true' : 'false'}
101
103
  aria-posinset={index + 1}
102
104
  aria-setsize={count}
105
+ aria-disabled={disabled}
106
+ aria-label={`Rating ${index + (isHalf ? 0.5 : 1)}`}
107
+ aria-labelledby={this.props['aria-describedby']} // screen reader will read labelledby instead of describedby
108
+ aria-describedby={this.props['aria-describedby']}
103
109
  tabIndex={0}
104
110
  className={`${prefixCls}-wrapper`}
105
111
  >
@@ -1239,6 +1239,51 @@ describe('Select', () => {
1239
1239
  expect(spyOnChange.calledWith(['hotsoon']));
1240
1240
  });
1241
1241
 
1242
+ it('autoClearSearchValue', () => {
1243
+ // default usage
1244
+ let optionList = Array.from({ length: 100 }, (v, i) => ({ label: `option-${i}`, value: i }));
1245
+
1246
+ let props = {
1247
+ multiple: true,
1248
+ optionList: optionList,
1249
+ defaultOpen: true,
1250
+ filter: true,
1251
+ };
1252
+ let select = getSelect(props);
1253
+ select.find(`.${BASE_CLASS_PREFIX}-select`).simulate('click', {});
1254
+ let keyword = 'option';
1255
+ let event = { target: { value: keyword } };
1256
+ select.find('input').simulate('change', event);
1257
+
1258
+ let options = select.find(`.${BASE_CLASS_PREFIX}-select-option-list`).children();
1259
+ const nativeEvent = { nativeEvent: { stopImmediatePropagation: noop } };
1260
+ options.at(0).simulate('click', nativeEvent);
1261
+ let inputValue = select.find('input').getDOMNode().value;
1262
+ expect(inputValue).toEqual('');
1263
+ });
1264
+
1265
+ it('autoClearSearchValue = false', () => {
1266
+ let optionList = Array.from({ length: 100 }, (v, i) => ({ label: `option-${i}`, value: i }));
1267
+
1268
+ let props = {
1269
+ multiple: true,
1270
+ optionList: optionList,
1271
+ defaultOpen: true,
1272
+ autoClearSearchValue: false,
1273
+ filter: true,
1274
+ };
1275
+ let select = getSelect(props);
1276
+ select.find(`.${BASE_CLASS_PREFIX}-select`).simulate('click', {});
1277
+ let keyword = 'option';
1278
+ let event = { target: { value: keyword } };
1279
+ select.find('input').simulate('change', event);
1280
+
1281
+ let options = select.find(`.${BASE_CLASS_PREFIX}-select-option-list`).children();
1282
+ const nativeEvent = { nativeEvent: { stopImmediatePropagation: noop } };
1283
+ options.at(0).simulate('click', nativeEvent);
1284
+ let inputValue = select.find('input').getDOMNode().value;
1285
+ expect(inputValue).toEqual(keyword);
1286
+ });
1242
1287
  // TODO ref selectAll \deselectAll when onChangeWithObject is true
1243
1288
  // TODO when loading is true, do not response any keyborard event
1244
1289
  // TODO can't remove tag when option is diabled
@@ -2875,3 +2875,32 @@ SelectInputPropsDemo.story = {
2875
2875
  name: 'inputProps',
2876
2876
  };
2877
2877
 
2878
+
2879
+ export const AutoClearSearchValue = () => {
2880
+ const [val, setVal] = useState(['semi1']);
2881
+ const optionList = [
2882
+ { label: 'semi1', value: 'semi1' },
2883
+ { label: 'semi2', value: 'semi2' },
2884
+ { label: 'semi3', value: 'semi3' },
2885
+ { label: 'semi4', value: 'semi4' },
2886
+ { label: 'semi5', value: 'semi5' },
2887
+ { label: 'semi6', value: 'semi6' },
2888
+ ];
2889
+
2890
+ return (
2891
+ <>
2892
+ <h4>Controlled mode + multiple</h4>
2893
+ <Select style={{ width: 400 }} multiple optionList={optionList} filter value={val} onChange={value => setVal(value)} autoClearSearchValue={false}></Select>
2894
+ <br />
2895
+ <br />
2896
+ <h4>Uncontrolled mode + multiple</h4>
2897
+ <Select style={{ width: 400 }} multiple optionList={optionList} filter autoClearSearchValue={false}></Select>
2898
+ <h4>Uncontrolled mode + multiple + defaultValue</h4>
2899
+ <Select style={{ width: 400 }} multiple optionList={optionList} filter defaultValue={['semi2']} autoClearSearchValue={false}></Select>
2900
+ </>
2901
+ )
2902
+ }
2903
+
2904
+ SelectInputPropsDemo.story = {
2905
+ name: 'AutoClearSearchValue',
2906
+ };
package/select/index.tsx CHANGED
@@ -85,8 +85,14 @@ export type RenderMultipleSelectedItemFn = (optionNode: Record<string, any>, mul
85
85
  export type RenderSelectedItemFn = RenderSingleSelectedItemFn | RenderMultipleSelectedItemFn;
86
86
 
87
87
  export type SelectProps = {
88
+ 'aria-describedby'?: React.AriaAttributes['aria-describedby'];
89
+ 'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
90
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
91
+ 'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
92
+ 'aria-required'?: React.AriaAttributes['aria-required'];
88
93
  id?: string;
89
94
  autoFocus?: boolean;
95
+ autoClearSearchValue?: boolean;
90
96
  arrowIcon?: React.ReactNode;
91
97
  defaultValue?: string | number | any[] | Record<string, any>;
92
98
  value?: string | number | any[] | Record<string, any>;
@@ -122,6 +128,7 @@ export type SelectProps = {
122
128
  suffix?: React.ReactNode;
123
129
  prefix?: React.ReactNode;
124
130
  insetLabel?: React.ReactNode;
131
+ insetLabelId?: string;
125
132
  inputProps?: Subtract<InputProps, ExcludeInputType>;
126
133
  showClear?: boolean;
127
134
  showArrow?: boolean;
@@ -180,7 +187,13 @@ class Select extends BaseComponent<SelectProps, SelectState> {
180
187
  static OptGroup = OptionGroup;
181
188
 
182
189
  static propTypes = {
190
+ 'aria-describedby': PropTypes.string,
191
+ 'aria-errormessage': PropTypes.string,
192
+ 'aria-invalid': PropTypes.bool,
193
+ 'aria-labelledby': PropTypes.string,
194
+ 'aria-required': PropTypes.bool,
183
195
  autoFocus: PropTypes.bool,
196
+ autoClearSearchValue: PropTypes.bool,
184
197
  children: PropTypes.node,
185
198
  defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array, PropTypes.object]),
186
199
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array, PropTypes.object]),
@@ -227,6 +240,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
227
240
  suffix: PropTypes.node,
228
241
  prefix: PropTypes.node,
229
242
  insetLabel: PropTypes.node,
243
+ insetLabelId: PropTypes.string,
230
244
  showClear: PropTypes.bool,
231
245
  showArrow: PropTypes.bool,
232
246
 
@@ -292,6 +306,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
292
306
  showClear: false,
293
307
  remote: false,
294
308
  autoAdjustOverflow: true,
309
+ autoClearSearchValue: true,
295
310
  arrowIcon: <IconChevronDown />
296
311
  // Radio selection is different from the default renderSelectedItem for multiple selection, so it is not declared here
297
312
  // renderSelectedItem: (optionNode) => optionNode.label,
@@ -335,6 +350,8 @@ class Select extends BaseComponent<SelectProps, SelectState> {
335
350
  this.onMouseEnter = this.onMouseEnter.bind(this);
336
351
  this.onMouseLeave = this.onMouseLeave.bind(this);
337
352
  this.renderOption = this.renderOption.bind(this);
353
+ this.onKeyPress = this.onKeyPress.bind(this);
354
+ this.onClearBtnEnterPress = this.onClearBtnEnterPress.bind(this);
338
355
 
339
356
  this.foundation = new SelectFoundation(this.adapter);
340
357
 
@@ -638,6 +655,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
638
655
  this.foundation.handleClearClick(e as any);
639
656
  }
640
657
 
658
+ onClearBtnEnterPress(e: React.KeyboardEvent) {
659
+ this.foundation.handleClearBtnEnterPress(e as any);
660
+ }
661
+
641
662
  renderEmpty() {
642
663
  return <Option empty={true} emptyContent={this.props.emptyContent} />;
643
664
  }
@@ -717,7 +738,8 @@ class Select extends BaseComponent<SelectProps, SelectState> {
717
738
  const customCreateItem = renderCreateItem(option.value, isFocused);
718
739
 
719
740
  return (
720
- <div onClick={e => this.onSelect(option, optionIndex, e)} key={new Date().valueOf()}>
741
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus
742
+ <div role="button" aria-label="Use the input box to create an optional item" onClick={e => this.onSelect(option, optionIndex, e)} key={new Date().valueOf()}>
721
743
  {customCreateItem}
722
744
  </div>
723
745
  );
@@ -783,6 +805,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
783
805
  innerBottomSlot,
784
806
  loading,
785
807
  virtualize,
808
+ multiple,
786
809
  } = this.props;
787
810
 
788
811
  // Do a filter first, instead of directly judging in forEach, so that the focusIndex can correspond to
@@ -808,6 +831,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
808
831
  style={{ maxHeight: `${maxHeight}px` }}
809
832
  className={optionListCls}
810
833
  role="listbox"
834
+ aria-multiselectable={multiple}
811
835
  onScroll={e => this.foundation.handleListScroll(e)}
812
836
  >
813
837
  {innerTopSlot}
@@ -935,6 +959,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
935
959
  this.foundation.handleMouseLeave(e as any);
936
960
  }
937
961
 
962
+ onKeyPress(e: React.KeyboardEvent) {
963
+ this.foundation.handleKeyPress(e as any);
964
+ }
965
+
938
966
  /* Processing logic when popover visible changes */
939
967
  handlePopoverVisibleChange(status) {
940
968
  const { virtualize } = this.props;
@@ -974,7 +1002,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
974
1002
  }
975
1003
 
976
1004
  renderPrefix() {
977
- const { prefix, insetLabel } = this.props;
1005
+ const { prefix, insetLabel, insetLabelId } = this.props;
978
1006
  const labelNode = (prefix || insetLabel) as React.ReactElement<any, any>;
979
1007
 
980
1008
  const prefixWrapperCls = cls({
@@ -984,7 +1012,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
984
1012
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
985
1013
  });
986
1014
 
987
- return <div className={prefixWrapperCls}>{labelNode}</div>;
1015
+ return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
988
1016
  }
989
1017
 
990
1018
  renderSelection() {
@@ -1005,6 +1033,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1005
1033
  triggerRender,
1006
1034
  arrowIcon,
1007
1035
  } = this.props;
1036
+
1008
1037
  const { selections, isOpen, keyboardEventSet, inputValue, isHovering, isFocus } = this.state;
1009
1038
  const useCustomTrigger = typeof triggerRender === 'function';
1010
1039
  const filterable = Boolean(filter); // filter(boolean || function)
@@ -1060,7 +1089,14 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1060
1089
  </Fragment>,
1061
1090
  <Fragment key="clearicon">
1062
1091
  {showClear ? (
1063
- <div className={cls(`${prefixcls}-clear`)} onClick={this.onClear}>
1092
+ <div
1093
+ role="button"
1094
+ aria-label="Clear selected value"
1095
+ tabIndex={0}
1096
+ className={cls(`${prefixcls}-clear`)}
1097
+ onClick={this.onClear}
1098
+ onKeyPress={this.onClearBtnEnterPress}
1099
+ >
1064
1100
  <IconClear />
1065
1101
  </div>
1066
1102
  ) : arrowContent}
@@ -1072,6 +1108,17 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1072
1108
  const tabIndex = disabled ? null : 0;
1073
1109
  return (
1074
1110
  <div
1111
+ role="combobox"
1112
+ aria-disabled={disabled}
1113
+ aria-expanded={isOpen}
1114
+ aria-controls={`${prefixcls}-${this.selectOptionListID}`}
1115
+ aria-haspopup="listbox"
1116
+ aria-label="select value"
1117
+ aria-invalid={this.props['aria-invalid']}
1118
+ aria-errormessage={this.props['aria-errormessage']}
1119
+ aria-labelledby={this.props['aria-labelledby']}
1120
+ aria-describedby={this.props['aria-describedby']}
1121
+ aria-required={this.props['aria-required']}
1075
1122
  className={selectionCls}
1076
1123
  ref={ref => ((this.triggerRef as any).current = ref)}
1077
1124
  onClick={e => this.foundation.handleClick(e)}
@@ -1082,6 +1129,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1082
1129
  onMouseLeave={this.onMouseLeave}
1083
1130
  // onFocus={e => this.foundation.handleTriggerFocus(e)}
1084
1131
  onBlur={e => this.foundation.handleTriggerBlur(e as any)}
1132
+ onKeyPress={this.onKeyPress}
1085
1133
  {...keyboardEventSet}
1086
1134
  >
1087
1135
  {inner}
package/select/option.tsx CHANGED
@@ -134,6 +134,7 @@ class Option extends PureComponent<OptionProps> {
134
134
  }
135
135
  };
136
136
  return (
137
+ // eslint-disable-next-line jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events
137
138
  <div
138
139
  className={optionClassName}
139
140
  onClick={e => {
@@ -141,6 +142,8 @@ class Option extends PureComponent<OptionProps> {
141
142
  }}
142
143
  onMouseEnter={e => onMouseEnter && onMouseEnter(e)}
143
144
  role="option"
145
+ aria-selected={selected ? "true" : "false"}
146
+ aria-disabled={disabled ? "true" : "false"}
144
147
  style={style}
145
148
  >
146
149
  {showTick ? (
@@ -10,7 +10,7 @@ let uuid = 0;
10
10
  const prefixCls = cssClasses.PREFIX;
11
11
 
12
12
 
13
- export interface SideSheetContentProps{
13
+ export interface SideSheetContentProps {
14
14
  onClose?: (e: React.MouseEvent) => void;
15
15
  mask?: boolean;
16
16
  maskStyle?: CSSProperties;
@@ -24,6 +24,7 @@ export interface SideSheetContentProps{
24
24
  bodyStyle?: CSSProperties;
25
25
  className: string;
26
26
  footer?: React.ReactNode;
27
+ 'aria-label'?: string;
27
28
  }
28
29
 
29
30
  export default class SideSheetContent extends React.PureComponent<SideSheetContentProps> {
@@ -66,6 +67,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
66
67
  if (mask) {
67
68
  return (
68
69
  <div
70
+ aria-hidden={true}
69
71
  key="mask"
70
72
  className={`${prefixCls}-mask`}
71
73
  style={maskStyle}
@@ -85,7 +87,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
85
87
  let header, closer;
86
88
  if (title) {
87
89
  header = (
88
- <div className={`${prefixCls}-title`}>
90
+ <div className={`${prefixCls}-title`} aria-label={'Sidesheet title'}>
89
91
  {this.props.title}
90
92
  </div>
91
93
  );
@@ -97,14 +99,14 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
97
99
  key="close-btn"
98
100
  onClick={this.close}
99
101
  type="tertiary"
100
- icon={<IconClose />}
102
+ icon={<IconClose/>}
101
103
  theme="borderless"
102
104
  size="small"
103
105
  />
104
106
  );
105
107
  }
106
108
  return (
107
- <div className={`${prefixCls}-header`} style={{ ...headerStyle }}>
109
+ <div className={`${prefixCls}-header`} role={'heading'} style={{ ...headerStyle }}>
108
110
  {header}
109
111
  {closer}
110
112
  </div>
@@ -128,20 +130,20 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
128
130
  const dialogElement = (
129
131
  <div
130
132
  key="dialog-element"
131
- role="sidesheet"
133
+ role="dialog"
132
134
  tabIndex={-1}
133
135
  className={`${prefixCls}-inner ${prefixCls}-inner-wrap`}
134
136
  // onMouseDown={this.onDialogMouseDown}
135
137
  style={{ ...props.style, ...style }}
136
138
  // id={this.dialogId}
137
139
  >
138
- <div className={`${prefixCls}-content`}>
140
+ <div className={`${prefixCls}-content`} aria-label={`Sidesheet content`}>
139
141
  {header}
140
- <div className={`${prefixCls}-body`} style={props.bodyStyle}>
142
+ <div className={`${prefixCls}-body`} aria-label={`Sidesheet body`} style={props.bodyStyle}>
141
143
  {props.children}
142
144
  </div>
143
145
  {props.footer ? (
144
- <div className={`${prefixCls}-footer`}>
146
+ <div className={`${prefixCls}-footer`} aria-label={`Sidesheet footer`}>
145
147
  {props.footer}
146
148
  </div>
147
149
  ) : null}
@@ -165,7 +167,9 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
165
167
  wrapperStyle.width = width;
166
168
  }
167
169
  return (
168
- <div className={wrapperCls} style={wrapperStyle}>
170
+ <div className={wrapperCls}
171
+ style={wrapperStyle}
172
+ aria-label={this.props['aria-label']}>
169
173
  {this.getMaskElement()}
170
174
  {this.getDialogElement()}
171
175
  </div>
@@ -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
  );