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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/_base/_story/a11y.jsx +6 -6
  2. package/_base/_story/a11y.scss +0 -1
  3. package/_base/_story/index.scss +2 -5
  4. package/_utils/hooks/usePrevFocus.ts +16 -0
  5. package/_utils/index.ts +4 -0
  6. package/anchor/_story/anchor.stories.js +1 -1
  7. package/anchor/index.tsx +5 -2
  8. package/anchor/link.tsx +29 -4
  9. package/autoComplete/index.tsx +28 -1
  10. package/avatar/_story/avatar.stories.js +4 -4
  11. package/avatar/index.tsx +6 -4
  12. package/banner/index.tsx +2 -1
  13. package/breadcrumb/_story/breadcrumb.stories.js +22 -8
  14. package/breadcrumb/index.tsx +8 -1
  15. package/breadcrumb/item.tsx +1 -1
  16. package/button/Button.tsx +4 -0
  17. package/button/__test__/button.test.js +1 -1
  18. package/button/_story/button.stories.js +10 -10
  19. package/button/buttonGroup.tsx +4 -2
  20. package/button/splitButtonGroup.tsx +5 -2
  21. package/card/_story/card.stories.js +8 -1
  22. package/card/_story/card.stories.tsx +3 -0
  23. package/card/index.tsx +5 -2
  24. package/cascader/index.tsx +33 -5
  25. package/checkbox/_story/checkbox.stories.js +19 -12
  26. package/checkbox/checkbox.tsx +40 -5
  27. package/checkbox/checkboxGroup.tsx +30 -5
  28. package/checkbox/checkboxInner.tsx +25 -2
  29. package/collapse/index.tsx +1 -1
  30. package/collapse/item.tsx +12 -7
  31. package/collapsible/index.tsx +4 -2
  32. package/configProvider/_story/configProvider.stories.tsx +27 -0
  33. package/datePicker/datePicker.tsx +19 -0
  34. package/dist/css/semi.css +23 -12
  35. package/dist/css/semi.min.css +1 -1
  36. package/dist/umd/semi-ui.js +2502 -1249
  37. package/dist/umd/semi-ui.js.map +1 -1
  38. package/dist/umd/semi-ui.min.js +1 -1
  39. package/dist/umd/semi-ui.min.js.map +1 -1
  40. package/dropdown/dropdownItem.tsx +1 -1
  41. package/dropdown/dropdownMenu.tsx +1 -1
  42. package/dropdown/index.tsx +11 -3
  43. package/empty/index.tsx +4 -4
  44. package/form/_story/FormApi/formApiDemo.jsx +3 -2
  45. package/form/_story/Validate/validateDemo.jsx +1 -1
  46. package/form/_story/demo.jsx +12 -3
  47. package/form/_story/form.stories.js +0 -7
  48. package/form/baseForm.tsx +2 -0
  49. package/form/errorMessage.tsx +13 -2
  50. package/form/hoc/withField.tsx +37 -8
  51. package/form/index.tsx +0 -2
  52. package/form/interface.ts +2 -0
  53. package/form/label.tsx +4 -2
  54. package/input/index.tsx +49 -4
  55. package/input/inputGroup.tsx +9 -4
  56. package/input/textarea.tsx +30 -9
  57. package/inputNumber/__test__/inputNumber.test.js +36 -8
  58. package/inputNumber/index.tsx +30 -2
  59. package/layout/Sider.tsx +6 -2
  60. package/layout/index.tsx +4 -3
  61. package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
  62. package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
  63. package/lib/cjs/_utils/index.d.ts +1 -0
  64. package/lib/cjs/_utils/index.js +6 -1
  65. package/lib/cjs/anchor/index.d.ts +2 -0
  66. package/lib/cjs/anchor/index.js +6 -1
  67. package/lib/cjs/anchor/link.d.ts +4 -1
  68. package/lib/cjs/anchor/link.js +39 -5
  69. package/lib/cjs/autoComplete/index.d.ts +17 -0
  70. package/lib/cjs/autoComplete/index.js +21 -2
  71. package/lib/cjs/avatar/index.d.ts +4 -3
  72. package/lib/cjs/avatar/index.js +15 -11
  73. package/lib/cjs/banner/index.js +4 -2
  74. package/lib/cjs/breadcrumb/index.d.ts +3 -0
  75. package/lib/cjs/breadcrumb/index.js +10 -4
  76. package/lib/cjs/breadcrumb/item.js +2 -2
  77. package/lib/cjs/button/Button.d.ts +2 -0
  78. package/lib/cjs/button/Button.js +4 -2
  79. package/lib/cjs/button/buttonGroup.d.ts +3 -0
  80. package/lib/cjs/button/buttonGroup.js +8 -4
  81. package/lib/cjs/button/index.d.ts +1 -0
  82. package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
  83. package/lib/cjs/button/splitButtonGroup.js +5 -2
  84. package/lib/cjs/card/index.d.ts +3 -0
  85. package/lib/cjs/card/index.js +3 -1
  86. package/lib/cjs/cascader/index.d.ts +14 -0
  87. package/lib/cjs/cascader/index.js +35 -7
  88. package/lib/cjs/checkbox/checkbox.d.ts +21 -1
  89. package/lib/cjs/checkbox/checkbox.js +51 -17
  90. package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
  91. package/lib/cjs/checkbox/checkboxGroup.js +16 -3
  92. package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
  93. package/lib/cjs/checkbox/checkboxInner.js +20 -3
  94. package/lib/cjs/collapse/item.d.ts +2 -1
  95. package/lib/cjs/collapse/item.js +12 -2
  96. package/lib/cjs/collapsible/index.d.ts +1 -0
  97. package/lib/cjs/collapsible/index.js +4 -2
  98. package/lib/cjs/datePicker/datePicker.d.ts +12 -0
  99. package/lib/cjs/datePicker/datePicker.js +14 -1
  100. package/lib/cjs/dropdown/dropdownItem.js +3 -1
  101. package/lib/cjs/dropdown/dropdownMenu.js +4 -1
  102. package/lib/cjs/dropdown/index.d.ts +10 -3
  103. package/lib/cjs/form/baseForm.d.ts +9 -0
  104. package/lib/cjs/form/baseForm.js +3 -1
  105. package/lib/cjs/form/errorMessage.d.ts +4 -0
  106. package/lib/cjs/form/errorMessage.js +21 -3
  107. package/lib/cjs/form/field.d.ts +7 -0
  108. package/lib/cjs/form/hoc/withField.js +49 -16
  109. package/lib/cjs/form/index.d.ts +0 -1
  110. package/lib/cjs/form/interface.d.ts +2 -0
  111. package/lib/cjs/form/label.d.ts +2 -0
  112. package/lib/cjs/form/label.js +5 -2
  113. package/lib/cjs/input/index.d.ts +16 -0
  114. package/lib/cjs/input/index.js +51 -15
  115. package/lib/cjs/input/inputGroup.d.ts +2 -1
  116. package/lib/cjs/input/inputGroup.js +11 -1
  117. package/lib/cjs/input/textarea.js +16 -3
  118. package/lib/cjs/inputNumber/index.d.ts +8 -0
  119. package/lib/cjs/inputNumber/index.js +35 -4
  120. package/lib/cjs/layout/Sider.d.ts +4 -0
  121. package/lib/cjs/layout/Sider.js +4 -1
  122. package/lib/cjs/layout/index.js +2 -0
  123. package/lib/cjs/list/index.d.ts +4 -4
  124. package/lib/cjs/list/item.js +0 -1
  125. package/lib/cjs/modal/Modal.js +2 -0
  126. package/lib/cjs/modal/ModalContent.d.ts +3 -1
  127. package/lib/cjs/modal/ModalContent.js +47 -5
  128. package/lib/cjs/navigation/Item.d.ts +4 -2
  129. package/lib/cjs/navigation/Item.js +25 -5
  130. package/lib/cjs/navigation/SubNav.d.ts +4 -2
  131. package/lib/cjs/navigation/SubNav.js +8 -1
  132. package/lib/cjs/navigation/index.js +2 -0
  133. package/lib/cjs/notification/notice.d.ts +1 -1
  134. package/lib/cjs/notification/notice.js +32 -22
  135. package/lib/cjs/pagination/index.js +16 -6
  136. package/lib/cjs/popover/index.js +7 -3
  137. package/lib/cjs/progress/index.d.ts +8 -0
  138. package/lib/cjs/progress/index.js +42 -9
  139. package/lib/cjs/radio/radio.d.ts +6 -1
  140. package/lib/cjs/radio/radio.js +17 -5
  141. package/lib/cjs/radio/radioGroup.d.ts +16 -1
  142. package/lib/cjs/radio/radioGroup.js +18 -3
  143. package/lib/cjs/radio/radioInner.d.ts +6 -1
  144. package/lib/cjs/radio/radioInner.js +11 -3
  145. package/lib/cjs/rating/index.d.ts +14 -0
  146. package/lib/cjs/rating/index.js +14 -3
  147. package/lib/cjs/rating/item.d.ts +2 -0
  148. package/lib/cjs/rating/item.js +6 -1
  149. package/lib/cjs/select/index.d.ts +16 -0
  150. package/lib/cjs/select/index.js +65 -19
  151. package/lib/cjs/select/option.js +28 -22
  152. package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
  153. package/lib/cjs/sideSheet/SideSheetContent.js +4 -1
  154. package/lib/cjs/sideSheet/index.d.ts +1 -0
  155. package/lib/cjs/sideSheet/index.js +2 -1
  156. package/lib/cjs/slider/index.d.ts +2 -1
  157. package/lib/cjs/slider/index.js +64 -17
  158. package/lib/cjs/spin/icon.js +3 -4
  159. package/lib/cjs/steps/basicStep.d.ts +3 -0
  160. package/lib/cjs/steps/basicStep.js +23 -25
  161. package/lib/cjs/steps/basicSteps.d.ts +1 -0
  162. package/lib/cjs/steps/basicSteps.js +2 -1
  163. package/lib/cjs/steps/fillStep.d.ts +3 -0
  164. package/lib/cjs/steps/fillStep.js +19 -4
  165. package/lib/cjs/steps/fillSteps.d.ts +1 -0
  166. package/lib/cjs/steps/fillSteps.js +2 -1
  167. package/lib/cjs/steps/navStep.d.ts +3 -0
  168. package/lib/cjs/steps/navStep.js +22 -25
  169. package/lib/cjs/steps/navSteps.d.ts +1 -0
  170. package/lib/cjs/steps/navSteps.js +2 -1
  171. package/lib/cjs/switch/index.d.ts +12 -0
  172. package/lib/cjs/switch/index.js +19 -4
  173. package/lib/cjs/table/Body/BaseRow.js +35 -3
  174. package/lib/cjs/table/Body/index.js +9 -1
  175. package/lib/cjs/table/ColumnFilter.js +4 -0
  176. package/lib/cjs/table/ColumnSelection.d.ts +3 -0
  177. package/lib/cjs/table/ColumnSelection.js +6 -2
  178. package/lib/cjs/table/ColumnSorter.js +19 -3
  179. package/lib/cjs/table/CustomExpandIcon.js +7 -1
  180. package/lib/cjs/table/Table.d.ts +2 -0
  181. package/lib/cjs/table/Table.js +35 -15
  182. package/lib/cjs/table/TableCell.d.ts +2 -0
  183. package/lib/cjs/table/TableCell.js +6 -2
  184. package/lib/cjs/table/TableHeaderRow.js +8 -2
  185. package/lib/cjs/tabs/TabBar.js +11 -3
  186. package/lib/cjs/tabs/TabPane.js +3 -1
  187. package/lib/cjs/tabs/index.js +0 -1
  188. package/lib/cjs/tagInput/index.d.ts +4 -1
  189. package/lib/cjs/tagInput/index.js +29 -3
  190. package/lib/cjs/timePicker/TimePicker.d.ts +14 -0
  191. package/lib/cjs/timePicker/TimePicker.js +11 -4
  192. package/lib/cjs/timePicker/index.d.ts +7 -0
  193. package/lib/cjs/timeline/index.d.ts +1 -1
  194. package/lib/cjs/timeline/index.js +1 -0
  195. package/lib/cjs/timeline/item.js +4 -2
  196. package/lib/cjs/toast/toast.js +2 -0
  197. package/lib/cjs/tooltip/TriangleArrow.js +1 -0
  198. package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
  199. package/lib/cjs/tooltip/index.d.ts +16 -12
  200. package/lib/cjs/tooltip/index.js +55 -39
  201. package/lib/cjs/transfer/index.js +32 -14
  202. package/lib/cjs/tree/index.d.ts +1 -0
  203. package/lib/cjs/tree/index.js +15 -6
  204. package/lib/cjs/tree/treeNode.d.ts +12 -4
  205. package/lib/cjs/tree/treeNode.js +54 -5
  206. package/lib/cjs/treeSelect/index.d.ts +16 -0
  207. package/lib/cjs/treeSelect/index.js +60 -12
  208. package/lib/cjs/typography/base.js +18 -7
  209. package/lib/cjs/typography/copyable.js +6 -1
  210. package/lib/cjs/upload/fileCard.js +26 -7
  211. package/lib/cjs/upload/index.js +19 -4
  212. package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
  213. package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
  214. package/lib/es/_utils/index.d.ts +1 -0
  215. package/lib/es/_utils/index.js +4 -1
  216. package/lib/es/anchor/index.d.ts +2 -0
  217. package/lib/es/anchor/index.js +6 -1
  218. package/lib/es/anchor/link.d.ts +4 -1
  219. package/lib/es/anchor/link.js +38 -5
  220. package/lib/es/autoComplete/index.d.ts +17 -0
  221. package/lib/es/autoComplete/index.js +21 -2
  222. package/lib/es/avatar/index.d.ts +4 -3
  223. package/lib/es/avatar/index.js +15 -11
  224. package/lib/es/banner/index.js +4 -2
  225. package/lib/es/breadcrumb/index.d.ts +3 -0
  226. package/lib/es/breadcrumb/index.js +10 -4
  227. package/lib/es/breadcrumb/item.js +2 -2
  228. package/lib/es/button/Button.d.ts +2 -0
  229. package/lib/es/button/Button.js +4 -2
  230. package/lib/es/button/buttonGroup.d.ts +3 -0
  231. package/lib/es/button/buttonGroup.js +8 -4
  232. package/lib/es/button/index.d.ts +1 -0
  233. package/lib/es/button/splitButtonGroup.d.ts +3 -0
  234. package/lib/es/button/splitButtonGroup.js +5 -2
  235. package/lib/es/card/index.d.ts +3 -0
  236. package/lib/es/card/index.js +3 -1
  237. package/lib/es/cascader/index.d.ts +14 -0
  238. package/lib/es/cascader/index.js +35 -7
  239. package/lib/es/checkbox/checkbox.d.ts +21 -1
  240. package/lib/es/checkbox/checkbox.js +50 -17
  241. package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
  242. package/lib/es/checkbox/checkboxGroup.js +18 -5
  243. package/lib/es/checkbox/checkboxInner.d.ts +15 -0
  244. package/lib/es/checkbox/checkboxInner.js +20 -3
  245. package/lib/es/collapse/item.d.ts +2 -1
  246. package/lib/es/collapse/item.js +11 -2
  247. package/lib/es/collapsible/index.d.ts +1 -0
  248. package/lib/es/collapsible/index.js +4 -2
  249. package/lib/es/datePicker/datePicker.d.ts +12 -0
  250. package/lib/es/datePicker/datePicker.js +14 -1
  251. package/lib/es/dropdown/dropdownItem.js +3 -1
  252. package/lib/es/dropdown/dropdownMenu.js +4 -1
  253. package/lib/es/dropdown/index.d.ts +10 -3
  254. package/lib/es/form/baseForm.d.ts +9 -0
  255. package/lib/es/form/baseForm.js +3 -1
  256. package/lib/es/form/errorMessage.d.ts +4 -0
  257. package/lib/es/form/errorMessage.js +21 -3
  258. package/lib/es/form/field.d.ts +7 -0
  259. package/lib/es/form/hoc/withField.js +48 -15
  260. package/lib/es/form/index.d.ts +0 -1
  261. package/lib/es/form/index.js +0 -1
  262. package/lib/es/form/interface.d.ts +2 -0
  263. package/lib/es/form/label.d.ts +2 -0
  264. package/lib/es/form/label.js +5 -2
  265. package/lib/es/input/index.d.ts +16 -0
  266. package/lib/es/input/index.js +51 -15
  267. package/lib/es/input/inputGroup.d.ts +2 -1
  268. package/lib/es/input/inputGroup.js +11 -1
  269. package/lib/es/input/textarea.js +16 -3
  270. package/lib/es/inputNumber/index.d.ts +8 -0
  271. package/lib/es/inputNumber/index.js +36 -4
  272. package/lib/es/layout/Sider.d.ts +4 -0
  273. package/lib/es/layout/Sider.js +4 -1
  274. package/lib/es/layout/index.js +2 -0
  275. package/lib/es/list/index.d.ts +4 -4
  276. package/lib/es/list/item.js +0 -1
  277. package/lib/es/modal/Modal.js +2 -0
  278. package/lib/es/modal/ModalContent.d.ts +3 -1
  279. package/lib/es/modal/ModalContent.js +46 -5
  280. package/lib/es/navigation/Item.d.ts +4 -2
  281. package/lib/es/navigation/Item.js +25 -5
  282. package/lib/es/navigation/SubNav.d.ts +4 -2
  283. package/lib/es/navigation/SubNav.js +8 -1
  284. package/lib/es/navigation/index.js +2 -0
  285. package/lib/es/notification/notice.d.ts +1 -1
  286. package/lib/es/notification/notice.js +33 -24
  287. package/lib/es/pagination/index.js +16 -6
  288. package/lib/es/popover/index.js +7 -3
  289. package/lib/es/progress/index.d.ts +8 -0
  290. package/lib/es/progress/index.js +42 -9
  291. package/lib/es/radio/radio.d.ts +6 -1
  292. package/lib/es/radio/radio.js +16 -5
  293. package/lib/es/radio/radioGroup.d.ts +16 -1
  294. package/lib/es/radio/radioGroup.js +18 -3
  295. package/lib/es/radio/radioInner.d.ts +6 -1
  296. package/lib/es/radio/radioInner.js +11 -3
  297. package/lib/es/rating/index.d.ts +14 -0
  298. package/lib/es/rating/index.js +14 -3
  299. package/lib/es/rating/item.d.ts +2 -0
  300. package/lib/es/rating/item.js +6 -1
  301. package/lib/es/select/index.d.ts +16 -0
  302. package/lib/es/select/index.js +63 -17
  303. package/lib/es/select/option.js +28 -22
  304. package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
  305. package/lib/es/sideSheet/SideSheetContent.js +4 -1
  306. package/lib/es/sideSheet/index.d.ts +1 -0
  307. package/lib/es/sideSheet/index.js +2 -1
  308. package/lib/es/slider/index.d.ts +2 -1
  309. package/lib/es/slider/index.js +63 -16
  310. package/lib/es/spin/icon.js +3 -4
  311. package/lib/es/steps/basicStep.d.ts +3 -0
  312. package/lib/es/steps/basicStep.js +23 -23
  313. package/lib/es/steps/basicSteps.d.ts +1 -0
  314. package/lib/es/steps/basicSteps.js +2 -1
  315. package/lib/es/steps/fillStep.d.ts +3 -0
  316. package/lib/es/steps/fillStep.js +19 -4
  317. package/lib/es/steps/fillSteps.d.ts +1 -0
  318. package/lib/es/steps/fillSteps.js +2 -1
  319. package/lib/es/steps/navStep.d.ts +3 -0
  320. package/lib/es/steps/navStep.js +22 -23
  321. package/lib/es/steps/navSteps.d.ts +1 -0
  322. package/lib/es/steps/navSteps.js +2 -1
  323. package/lib/es/switch/index.d.ts +12 -0
  324. package/lib/es/switch/index.js +19 -4
  325. package/lib/es/table/Body/BaseRow.js +35 -3
  326. package/lib/es/table/Body/index.js +9 -2
  327. package/lib/es/table/ColumnFilter.js +4 -0
  328. package/lib/es/table/ColumnSelection.d.ts +3 -0
  329. package/lib/es/table/ColumnSelection.js +6 -2
  330. package/lib/es/table/ColumnSorter.js +17 -3
  331. package/lib/es/table/CustomExpandIcon.js +6 -1
  332. package/lib/es/table/Table.d.ts +2 -0
  333. package/lib/es/table/Table.js +35 -15
  334. package/lib/es/table/TableCell.d.ts +2 -0
  335. package/lib/es/table/TableCell.js +6 -2
  336. package/lib/es/table/TableHeaderRow.js +8 -2
  337. package/lib/es/tabs/TabBar.js +11 -3
  338. package/lib/es/tabs/TabPane.js +3 -1
  339. package/lib/es/tabs/index.js +0 -1
  340. package/lib/es/tagInput/index.d.ts +4 -1
  341. package/lib/es/tagInput/index.js +29 -3
  342. package/lib/es/timePicker/TimePicker.d.ts +14 -0
  343. package/lib/es/timePicker/TimePicker.js +11 -4
  344. package/lib/es/timePicker/index.d.ts +7 -0
  345. package/lib/es/timeline/index.d.ts +1 -1
  346. package/lib/es/timeline/index.js +1 -0
  347. package/lib/es/timeline/item.js +4 -2
  348. package/lib/es/toast/toast.js +2 -0
  349. package/lib/es/tooltip/TriangleArrow.js +1 -0
  350. package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
  351. package/lib/es/tooltip/index.d.ts +16 -12
  352. package/lib/es/tooltip/index.js +53 -39
  353. package/lib/es/transfer/index.js +32 -14
  354. package/lib/es/tree/index.d.ts +1 -0
  355. package/lib/es/tree/index.js +15 -6
  356. package/lib/es/tree/treeNode.d.ts +12 -4
  357. package/lib/es/tree/treeNode.js +53 -5
  358. package/lib/es/treeSelect/index.d.ts +16 -0
  359. package/lib/es/treeSelect/index.js +57 -10
  360. package/lib/es/typography/base.js +17 -7
  361. package/lib/es/typography/copyable.js +5 -1
  362. package/lib/es/upload/fileCard.js +26 -7
  363. package/lib/es/upload/index.js +19 -4
  364. package/list/index.tsx +5 -5
  365. package/list/item.tsx +0 -1
  366. package/modal/Modal.tsx +2 -0
  367. package/modal/ModalContent.tsx +35 -5
  368. package/navigation/Item.tsx +15 -0
  369. package/navigation/SubNav.tsx +13 -1
  370. package/navigation/index.tsx +1 -1
  371. package/notification/notice.tsx +19 -14
  372. package/package.json +8 -8
  373. package/pagination/index.tsx +9 -5
  374. package/popover/index.tsx +5 -0
  375. package/progress/_story/progress.stories.js +18 -18
  376. package/progress/index.tsx +58 -20
  377. package/radio/radio.tsx +12 -2
  378. package/radio/radioGroup.tsx +29 -3
  379. package/radio/radioInner.tsx +10 -1
  380. package/rating/index.tsx +19 -2
  381. package/rating/item.tsx +6 -0
  382. package/select/__test__/select.test.js +45 -0
  383. package/select/_story/select.stories.js +29 -0
  384. package/select/index.tsx +57 -4
  385. package/select/option.tsx +3 -0
  386. package/sideSheet/SideSheetContent.tsx +6 -4
  387. package/sideSheet/index.tsx +3 -2
  388. package/slider/__test__/slider.test.js +9 -0
  389. package/slider/_story/slider.stories.js +1 -1
  390. package/slider/index.tsx +44 -7
  391. package/spin/icon.tsx +4 -3
  392. package/steps/basicStep.tsx +15 -4
  393. package/steps/basicSteps.tsx +3 -2
  394. package/steps/fillStep.tsx +27 -12
  395. package/steps/fillSteps.tsx +2 -0
  396. package/steps/navStep.tsx +15 -4
  397. package/steps/navSteps.tsx +3 -2
  398. package/switch/_story/switch.stories.js +20 -19
  399. package/switch/_story/switch.stories.tsx +13 -13
  400. package/switch/index.tsx +23 -5
  401. package/table/Body/BaseRow.tsx +25 -1
  402. package/table/Body/index.tsx +7 -2
  403. package/table/ColumnFilter.tsx +7 -1
  404. package/table/ColumnSelection.tsx +4 -1
  405. package/table/ColumnSorter.tsx +18 -1
  406. package/table/CustomExpandIcon.tsx +5 -0
  407. package/table/Table.tsx +30 -14
  408. package/table/TableCell.tsx +11 -1
  409. package/table/TableHeaderRow.tsx +16 -2
  410. package/table/__test__/table.test.js +46 -0
  411. package/table/_story/table.stories.js +2 -0
  412. package/table/_story/v2/FixedColumnsChange/index.jsx +104 -0
  413. package/table/_story/v2/FixedZIndex/index.jsx +87 -0
  414. package/tabs/TabBar.tsx +8 -5
  415. package/tabs/TabPane.tsx +3 -1
  416. package/tabs/index.tsx +0 -1
  417. package/tagInput/__test__/tagInput.test.js +46 -0
  418. package/tagInput/_story/tagInput.stories.js +2 -2
  419. package/tagInput/index.tsx +31 -8
  420. package/timePicker/TimePicker.tsx +17 -2
  421. package/timePicker/__test__/timePicker.test.js +34 -3
  422. package/timePicker/_story/timepicker.stories.js +18 -0
  423. package/timeline/_story/timeline.stories.js +1 -1
  424. package/timeline/index.tsx +2 -2
  425. package/timeline/item.tsx +2 -1
  426. package/toast/toast.tsx +2 -0
  427. package/tooltip/TriangleArrow.tsx +1 -1
  428. package/tooltip/TriangleArrowVertical.tsx +1 -1
  429. package/tooltip/_story/tooltip.stories.js +562 -514
  430. package/tooltip/index.tsx +51 -33
  431. package/transfer/index.tsx +29 -25
  432. package/tree/_story/tree.stories.js +3 -3
  433. package/tree/index.tsx +10 -2
  434. package/tree/treeNode.tsx +54 -11
  435. package/treeSelect/__test__/treeMultiple.test.js +5 -0
  436. package/treeSelect/_story/treeSelect.stories.js +12 -0
  437. package/treeSelect/index.tsx +58 -7
  438. package/typography/base.tsx +7 -1
  439. package/typography/copyable.tsx +10 -1
  440. package/upload/fileCard.tsx +14 -16
  441. package/upload/index.tsx +10 -6
@@ -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,13 @@ 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
743
+ role="button"
744
+ aria-label="Use the input box to create an optional item"
745
+ onClick={e => this.onSelect(option, optionIndex, e)}
746
+ key={option.key || option.label}
747
+ >
721
748
  {customCreateItem}
722
749
  </div>
723
750
  );
@@ -783,6 +810,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
783
810
  innerBottomSlot,
784
811
  loading,
785
812
  virtualize,
813
+ multiple,
786
814
  } = this.props;
787
815
 
788
816
  // Do a filter first, instead of directly judging in forEach, so that the focusIndex can correspond to
@@ -808,6 +836,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
808
836
  style={{ maxHeight: `${maxHeight}px` }}
809
837
  className={optionListCls}
810
838
  role="listbox"
839
+ aria-multiselectable={multiple}
811
840
  onScroll={e => this.foundation.handleListScroll(e)}
812
841
  >
813
842
  {innerTopSlot}
@@ -935,6 +964,10 @@ class Select extends BaseComponent<SelectProps, SelectState> {
935
964
  this.foundation.handleMouseLeave(e as any);
936
965
  }
937
966
 
967
+ onKeyPress(e: React.KeyboardEvent) {
968
+ this.foundation.handleKeyPress(e as any);
969
+ }
970
+
938
971
  /* Processing logic when popover visible changes */
939
972
  handlePopoverVisibleChange(status) {
940
973
  const { virtualize } = this.props;
@@ -974,7 +1007,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
974
1007
  }
975
1008
 
976
1009
  renderPrefix() {
977
- const { prefix, insetLabel } = this.props;
1010
+ const { prefix, insetLabel, insetLabelId } = this.props;
978
1011
  const labelNode = (prefix || insetLabel) as React.ReactElement<any, any>;
979
1012
 
980
1013
  const prefixWrapperCls = cls({
@@ -984,7 +1017,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
984
1017
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
985
1018
  });
986
1019
 
987
- return <div className={prefixWrapperCls}>{labelNode}</div>;
1020
+ return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
988
1021
  }
989
1022
 
990
1023
  renderSelection() {
@@ -1005,6 +1038,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1005
1038
  triggerRender,
1006
1039
  arrowIcon,
1007
1040
  } = this.props;
1041
+
1008
1042
  const { selections, isOpen, keyboardEventSet, inputValue, isHovering, isFocus } = this.state;
1009
1043
  const useCustomTrigger = typeof triggerRender === 'function';
1010
1044
  const filterable = Boolean(filter); // filter(boolean || function)
@@ -1060,7 +1094,14 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1060
1094
  </Fragment>,
1061
1095
  <Fragment key="clearicon">
1062
1096
  {showClear ? (
1063
- <div className={cls(`${prefixcls}-clear`)} onClick={this.onClear}>
1097
+ <div
1098
+ role="button"
1099
+ aria-label="Clear selected value"
1100
+ tabIndex={0}
1101
+ className={cls(`${prefixcls}-clear`)}
1102
+ onClick={this.onClear}
1103
+ onKeyPress={this.onClearBtnEnterPress}
1104
+ >
1064
1105
  <IconClear />
1065
1106
  </div>
1066
1107
  ) : arrowContent}
@@ -1072,6 +1113,17 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1072
1113
  const tabIndex = disabled ? null : 0;
1073
1114
  return (
1074
1115
  <div
1116
+ role="combobox"
1117
+ aria-disabled={disabled}
1118
+ aria-expanded={isOpen}
1119
+ aria-controls={`${prefixcls}-${this.selectOptionListID}`}
1120
+ aria-haspopup="listbox"
1121
+ aria-label="select value"
1122
+ aria-invalid={this.props['aria-invalid']}
1123
+ aria-errormessage={this.props['aria-errormessage']}
1124
+ aria-labelledby={this.props['aria-labelledby']}
1125
+ aria-describedby={this.props['aria-describedby']}
1126
+ aria-required={this.props['aria-required']}
1075
1127
  className={selectionCls}
1076
1128
  ref={ref => ((this.triggerRef as any).current = ref)}
1077
1129
  onClick={e => this.foundation.handleClick(e)}
@@ -1082,6 +1134,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1082
1134
  onMouseLeave={this.onMouseLeave}
1083
1135
  // onFocus={e => this.foundation.handleTriggerFocus(e)}
1084
1136
  onBlur={e => this.foundation.handleTriggerBlur(e as any)}
1137
+ onKeyPress={this.onKeyPress}
1085
1138
  {...keyboardEventSet}
1086
1139
  >
1087
1140
  {inner}
package/select/option.tsx CHANGED
@@ -134,6 +134,7 @@ class Option extends PureComponent<OptionProps> {
134
134
  }
135
135
  };
136
136
  return (
137
+ // eslint-disable-next-line jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events
137
138
  <div
138
139
  className={optionClassName}
139
140
  onClick={e => {
@@ -141,6 +142,8 @@ class Option extends PureComponent<OptionProps> {
141
142
  }}
142
143
  onMouseEnter={e => onMouseEnter && onMouseEnter(e)}
143
144
  role="option"
145
+ aria-selected={selected ? "true" : "false"}
146
+ aria-disabled={disabled ? "true" : "false"}
144
147
  style={style}
145
148
  >
146
149
  {showTick ? (
@@ -10,7 +10,7 @@ let uuid = 0;
10
10
  const prefixCls = cssClasses.PREFIX;
11
11
 
12
12
 
13
- export interface SideSheetContentProps{
13
+ export interface SideSheetContentProps {
14
14
  onClose?: (e: React.MouseEvent) => void;
15
15
  mask?: boolean;
16
16
  maskStyle?: CSSProperties;
@@ -24,6 +24,7 @@ export interface SideSheetContentProps{
24
24
  bodyStyle?: CSSProperties;
25
25
  className: string;
26
26
  footer?: React.ReactNode;
27
+ 'aria-label'?: string;
27
28
  }
28
29
 
29
30
  export default class SideSheetContent extends React.PureComponent<SideSheetContentProps> {
@@ -66,6 +67,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
66
67
  if (mask) {
67
68
  return (
68
69
  <div
70
+ aria-hidden={true}
69
71
  key="mask"
70
72
  className={`${prefixCls}-mask`}
71
73
  style={maskStyle}
@@ -97,14 +99,14 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
97
99
  key="close-btn"
98
100
  onClick={this.close}
99
101
  type="tertiary"
100
- icon={<IconClose />}
102
+ icon={<IconClose/>}
101
103
  theme="borderless"
102
104
  size="small"
103
105
  />
104
106
  );
105
107
  }
106
108
  return (
107
- <div className={`${prefixCls}-header`} style={{ ...headerStyle }}>
109
+ <div className={`${prefixCls}-header`} role={'heading'} aria-level={1} style={{ ...headerStyle }}>
108
110
  {header}
109
111
  {closer}
110
112
  </div>
@@ -128,7 +130,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
128
130
  const dialogElement = (
129
131
  <div
130
132
  key="dialog-element"
131
- role="sidesheet"
133
+ role="dialog"
132
134
  tabIndex={-1}
133
135
  className={`${prefixCls}-inner ${prefixCls}-inner-wrap`}
134
136
  // onMouseDown={this.onDialogMouseDown}
@@ -23,7 +23,7 @@ const defaultHeight = strings.HEIGHT;
23
23
  export { SideSheetContentProps } from './SideSheetContent';
24
24
  export { SideSheetTransitionProps } from './SideSheetTransition';
25
25
 
26
- export interface SideSheetReactProps extends SideSheetProps{
26
+ export interface SideSheetReactProps extends SideSheetProps {
27
27
  bodyStyle?: CSSProperties;
28
28
  headerStyle?: CSSProperties;
29
29
  maskStyle?: CSSProperties;
@@ -65,7 +65,8 @@ export default class SideSheet extends BaseComponent<SideSheetReactProps, SideSh
65
65
  afterVisibleChange: PropTypes.func,
66
66
  closeOnEsc: PropTypes.bool,
67
67
  footer: PropTypes.node,
68
- keepDOM: PropTypes.bool
68
+ keepDOM: PropTypes.bool,
69
+ 'aria-label': PropTypes.string,
69
70
  };
70
71
 
71
72
  static defaultProps: SideSheetReactProps = {
@@ -137,6 +137,15 @@ describe('Slider', () => {
137
137
  expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
138
138
  });
139
139
 
140
+ it('marks clickable', () => {
141
+ const STYLE = { width: 100, height: 32 }; // it is really hack to mock slider wrapper getBoundingClientRect data
142
+ let slider = mount(<Slider style={STYLE} marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
143
+ expect(slider.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
144
+ expect(slider.state('currentValue')).toEqual([0, 100])
145
+ slider.find(`.${BASE_CLASS_PREFIX}-slider-dot`).at(0).simulate('click', {pageX: 20 })
146
+ expect(slider.state('currentValue')).toEqual([20, 100])
147
+ });
148
+
140
149
  it('when tooltipVisible is true, tooltip should show always, or should never show', () => {
141
150
  let wrapper = mount(<Slider defaultValue={30} tooltipVisible />);
142
151
  expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
@@ -173,7 +173,7 @@ let divStyle1 = {
173
173
  export const VerticalSlider = () => (
174
174
  <div>
175
175
  <div style={divStyle1}>
176
- <Slider vertical range defaultValue={[20, 60]}></Slider>
176
+ <Slider vertical range defaultValue={[20, 60]} aria-label="slider test"></Slider>
177
177
  </div>
178
178
  </div>
179
179
  );
package/slider/index.tsx CHANGED
@@ -78,6 +78,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
78
78
  private dragging: boolean[];
79
79
  private eventListenerSet: Set<() => void>;
80
80
  private chooseMovePos: 'min' | 'max';
81
+ foundation: SliderFoundation;
81
82
 
82
83
  constructor(props: SliderProps) {
83
84
  super(props);
@@ -281,7 +282,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
281
282
  }
282
283
 
283
284
  renderHandle = () => {
284
- const { vertical, range, tooltipVisible, tipFormatter } = this.props;
285
+ const { vertical, range, tooltipVisible, tipFormatter, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, 'aria-valuetext': ariaValueText, getAriaValueText, disabled } = this.props;
285
286
  const { chooseMovePos, isDrag, isInRenderTree } = this.state;
286
287
  const stylePos = vertical ? 'top' : 'left';
287
288
  const percentInfo = this.foundation.getMinAndMaxPercent(this.state.currentValue);
@@ -299,6 +300,15 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
299
300
  const maxClass = cls(cssClasses.HANDLE, {
300
301
  [`${cssClasses.HANDLE}-clicked`]: chooseMovePos === 'max' && isDrag,
301
302
  });
303
+ const {min, max, currentValue} = this.state;
304
+
305
+ const commonAria = {
306
+ 'aria-label': ariaLabel,
307
+ 'aria-labelledby': ariaLabelledby,
308
+ 'aria-disabled': disabled
309
+ };
310
+ vertical && Object.assign(commonAria, {'aria-orientation': 'vertical'});
311
+
302
312
  const handleContents = !range ? (
303
313
  <Tooltip
304
314
  content={tipChildren.min}
@@ -338,6 +348,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
338
348
  onTouchEnd={e => {
339
349
  this.foundation.onHandleUp(e);
340
350
  }}
351
+ onFocus={e => this.foundation.onFocus(e, 'min')}
352
+ role="slider"
353
+ tabIndex={0}
354
+ {...commonAria}
355
+ aria-valuenow={currentValue as number}
356
+ aria-valuemax={max}
357
+ aria-valuemin={min}
358
+ aria-valuetext={getAriaValueText ? getAriaValueText(currentValue as number) : ariaValueText}
341
359
  />
342
360
  </Tooltip>
343
361
  ) : (
@@ -379,6 +397,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
379
397
  onTouchEnd={e => {
380
398
  this.foundation.onHandleUp(e);
381
399
  }}
400
+ onFocus={e => this.foundation.onFocus(e, 'min')}
401
+ role="slider"
402
+ tabIndex={0}
403
+ {...commonAria}
404
+ aria-valuenow={currentValue[0]}
405
+ aria-valuetext={getAriaValueText ? getAriaValueText(currentValue[0]) : ariaValueText}
406
+ aria-valuemax={currentValue[1]}
407
+ aria-valuemin={min}
382
408
  />
383
409
  </Tooltip>
384
410
  <Tooltip
@@ -418,6 +444,14 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
418
444
  onTouchEnd={e => {
419
445
  this.foundation.onHandleUp(e);
420
446
  }}
447
+ onFocus={e => this.foundation.onFocus(e, 'min')}
448
+ role="slider"
449
+ tabIndex={0}
450
+ {...commonAria}
451
+ aria-valuenow={currentValue[1]}
452
+ aria-valuetext={getAriaValueText ? getAriaValueText(currentValue[1]) : ariaValueText}
453
+ aria-valuemax={max}
454
+ aria-valuemin={currentValue[0]}
421
455
  />
422
456
  </Tooltip>
423
457
  </React.Fragment>
@@ -440,7 +474,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
440
474
  top: range ? `${minPercent * 100}%` : 0,
441
475
  };
442
476
  trackStyle = included ? trackStyle : {};
443
- return (
477
+ return (// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
444
478
  <div className={cssClasses.TRACK} style={trackStyle} onClick={e => this.foundation.handleWrapClick(e)}>
445
479
  {/* {this.renderTrack} */}
446
480
  </div>
@@ -462,6 +496,7 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
462
496
  return activeResult ? (
463
497
  <span
464
498
  key={mark}
499
+ onClick={e => this.foundation.handleWrapClick(e)}
465
500
  className={markClass}
466
501
  style={{ [stylePos]: `calc(${markPercent * 100}% - 2px)` }}
467
502
  />
@@ -522,11 +557,13 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
522
557
  onMouseEnter={() => this.foundation.handleWrapperEnter()}
523
558
  onMouseLeave={() => this.foundation.handleWrapperLeave()}
524
559
  >
525
- <div
526
- className={`${prefixCls}-rail`}
527
- onClick={e => this.foundation.handleWrapClick(e)}
528
- style={this.props.railStyle}
529
- />
560
+ {// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
561
+ <div
562
+ className={`${prefixCls}-rail`}
563
+ onClick={e => this.foundation.handleWrapClick(e)}
564
+ style={this.props.railStyle}
565
+ />
566
+ }
530
567
  {this.renderTrack()}
531
568
  {this.renderStepDot()}
532
569
  <div>{this.renderHandle()}</div>
package/spin/icon.tsx CHANGED
@@ -29,6 +29,8 @@ function Icon(props: IconProps = {}) {
29
29
  viewBox="0 0 36 36"
30
30
  version="1.1"
31
31
  xmlns="http://www.w3.org/2000/svg"
32
+ aria-hidden
33
+ data-icon="spin"
32
34
  >
33
35
  <defs>
34
36
  <linearGradient x1="0%" y1="100%" x2="100%" y2="100%" id={id}>
@@ -37,11 +39,10 @@ function Icon(props: IconProps = {}) {
37
39
  <stop stopColor="currentColor" offset="100%" />
38
40
  </linearGradient>
39
41
  </defs>
40
- <g id="Artboard" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
41
- <rect id="Rectangle" fillOpacity="0.01" fill="#FFFFFF" x="0" y="0" width="36" height="36" />
42
+ <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
43
+ <rect fillOpacity="0.01" fill="#FFFFFF" x="0" y="0" width="36" height="36" />
42
44
  <path
43
45
  d="M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951"
44
- id="Path"
45
46
  stroke={`url(#${id})`}
46
47
  strokeWidth="4"
47
48
  strokeLinecap="round"