@jetbrains/ring-ui 4.1.0-beta.8 → 4.1.3

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 (440) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +22 -16
  3. package/babel.config.js +3 -2
  4. package/components/alert/alert.js +9 -3
  5. package/components/alert/container.css +1 -1
  6. package/components/alert-service/alert-service.examples.css +18 -0
  7. package/components/alert-service/alert-service.examples.js +21 -0
  8. package/components/alert-service/alert-service.js +10 -3
  9. package/components/analytics/analytics__fus-plugin.js +3 -3
  10. package/components/analytics/analytics__ga-plugin.js +2 -2
  11. package/components/auth/auth.test.js +14 -7
  12. package/components/auth/auth__core.js +64 -33
  13. package/components/auth-dialog/auth-dialog.js +1 -0
  14. package/components/avatar/avatar.css +4 -1
  15. package/components/avatar/avatar.examples.js +3 -2
  16. package/components/avatar/avatar.js +31 -6
  17. package/components/avatar/fallback-avatar.js +136 -0
  18. package/components/avatar-editor-ng/avatar-editor-ng.css +2 -2
  19. package/components/avatar-editor-ng/avatar-editor-ng.js +2 -1
  20. package/components/avatar-editor-ng/{avatar-editor-ng.html → avatar-editor-ng__template.js} +2 -2
  21. package/components/button/button.css +2 -2
  22. package/components/button/button.js +4 -1
  23. package/components/button-group/button-group.js +1 -1
  24. package/components/button-group/caption.js +1 -1
  25. package/components/button-ng/button-ng.js +1 -1
  26. package/components/button-set-ng/button-set-ng.js +3 -1
  27. package/components/checkbox/checkbox.css +1 -1
  28. package/components/code/code.js +2 -5
  29. package/components/confirm/confirm.js +1 -0
  30. package/components/confirm-service/confirm-service.js +5 -5
  31. package/components/content-layout/content-layout.css +1 -1
  32. package/components/data-list/data-list.css +1 -1
  33. package/components/date-picker/date-input.js +5 -4
  34. package/components/date-picker/date-picker.css +34 -22
  35. package/components/date-picker/date-picker.js +16 -14
  36. package/components/date-picker/date-popup.js +22 -7
  37. package/components/date-picker/month-names.js +8 -5
  38. package/components/date-picker/month.js +6 -2
  39. package/components/date-picker/weekdays.js +10 -2
  40. package/components/dialog/dialog.examples.js +3 -1
  41. package/components/dialog/dialog.js +10 -5
  42. package/components/dialog/dialog.test.js +1 -1
  43. package/components/dialog/dialog__body-scroll-preventer.js +51 -31
  44. package/components/dialog-ng/dialog-ng.js +10 -10
  45. package/components/dialog-ng/{dialog-ng.html → dialog-ng__template.js} +2 -2
  46. package/components/dropdown/dropdown.examples.js +36 -1
  47. package/components/dropdown-menu/dropdown-menu.examples.js +47 -0
  48. package/components/dropdown-menu/dropdown-menu.js +117 -0
  49. package/components/dropdown-menu/dropdown-menu.test.js +76 -0
  50. package/components/error-bubble/error-bubble-legacy.css +1 -1
  51. package/components/error-bubble/error-bubble.css +1 -1
  52. package/components/error-bubble/error-bubble.examples.js +1 -1
  53. package/components/error-page/error-page.css +2 -2
  54. package/components/footer-ng/footer-ng.js +13 -3
  55. package/components/form/form.css +2 -2
  56. package/components/form-ng/form-ng.js +3 -1
  57. package/components/global/global.css +1 -1
  58. package/components/global/theme.js +1 -1
  59. package/components/global/variables.css +8 -1
  60. package/components/grid/grid.css +10 -9
  61. package/components/header/header.css +1 -1
  62. package/components/header/header.examples.js +7 -8
  63. package/components/header/profile.js +10 -11
  64. package/components/http/http.js +1 -1
  65. package/components/icon/icon.css +5 -4
  66. package/components/input/input-legacy.css +7 -7
  67. package/components/island/header.js +2 -2
  68. package/components/island/island.css +8 -3
  69. package/components/island-legacy/island-legacy.css +3 -1
  70. package/components/list/list.js +6 -1
  71. package/components/list/list__custom.js +9 -3
  72. package/components/list/list__item.js +8 -2
  73. package/components/list/list__link.js +2 -1
  74. package/components/loader-inline/loader-inline.css +1 -1
  75. package/components/loader-screen/loader-screen.css +1 -1
  76. package/components/message/message.css +1 -1
  77. package/components/message/message.examples.js +8 -7
  78. package/components/pager/pager.js +5 -3
  79. package/components/permissions/permissions.js +1 -1
  80. package/components/progress-bar/progress-bar.css +1 -1
  81. package/components/progress-bar/progress-bar.examples.js +3 -3
  82. package/components/progress-bar/progress-bar.js +5 -2
  83. package/components/progress-bar/progress-bar.test.js +12 -13
  84. package/components/progress-bar-ng/progress-bar-ng.examples.js +3 -3
  85. package/components/query-assist/query-assist.css +13 -3
  86. package/components/query-assist/query-assist.examples.js +3 -4
  87. package/components/query-assist/query-assist.js +56 -12
  88. package/components/query-assist/query-assist.test.js +37 -5
  89. package/components/save-field-ng/save-field-ng.css +0 -3
  90. package/components/save-field-ng/save-field-ng.js +3 -1
  91. package/components/save-field-ng/{save-field-ng.html → save-field-ng__template.js} +2 -2
  92. package/components/select/select.css +12 -7
  93. package/components/select/select.examples.js +13 -0
  94. package/components/select/select.js +30 -43
  95. package/components/select/select.test.js +4 -5
  96. package/components/shortcuts-hint-ng/shortcuts-hint-ng.css +1 -1
  97. package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -1
  98. package/components/shortcuts-hint-ng/{shortcuts-hint-ng.html → shortcuts-hint-ng__template.js} +2 -2
  99. package/components/sidebar/sidebar.css +1 -0
  100. package/components/sidebar-ng/sidebar-ng.js +6 -2
  101. package/components/sidebar-ng/{sidebar-ng__button.html → sidebar-ng__button-template.js} +2 -2
  102. package/components/sidebar-ng/{sidebar-ng.html → sidebar-ng__template.js} +2 -2
  103. package/components/table/header.js +9 -1
  104. package/components/table/row.js +2 -1
  105. package/components/table/table.css +2 -1
  106. package/components/table-legacy/table-legacy.css +2 -2
  107. package/components/table-legacy/table-legacy__toolbar.css +2 -2
  108. package/components/table-legacy-ng/table-legacy-ng.js +38 -5
  109. package/components/table-legacy-ng/table-legacy-ng__pager.js +7 -1
  110. package/components/tabs/collapsible-tab.js +2 -2
  111. package/components/tabs/collapsible-tabs.js +5 -9
  112. package/components/tabs/dumb-tabs.js +1 -0
  113. package/components/tabs/tab-link.js +4 -2
  114. package/components/tabs/tabs.css +32 -5
  115. package/components/tabs-ng/tabs-ng.js +4 -2
  116. package/components/tabs-ng/{tabs-ng.html → tabs-ng__template.js} +6 -2
  117. package/components/tag/tag.css +5 -2
  118. package/components/tag/tag.examples.js +3 -0
  119. package/components/tag/tag.js +19 -16
  120. package/components/tags-input/tag-input.examples.js +1 -1
  121. package/components/tags-input/tags-input.js +5 -2
  122. package/components/template-ng/template-ng.js +1 -1
  123. package/components/tooltip/tooltip.js +7 -2
  124. package/components/user-agreement/user-agreement.css +1 -5
  125. package/components/user-agreement/user-agreement.examples.js +7 -6
  126. package/components/user-agreement/user-agreement.js +11 -3
  127. package/dist/_helpers/_rollupPluginBabelHelpers.js +1 -94
  128. package/dist/_helpers/anchor.js +5 -6
  129. package/dist/_helpers/badge.js +1 -1
  130. package/dist/_helpers/button-group.js +3 -0
  131. package/dist/_helpers/button-set.js +3 -0
  132. package/dist/_helpers/button-toolbar.js +3 -0
  133. package/dist/_helpers/button__classes.js +1 -1
  134. package/dist/_helpers/card.js +6 -8
  135. package/dist/_helpers/checkbox.js +3 -0
  136. package/dist/_helpers/date-picker.js +1 -1
  137. package/dist/_helpers/dialog__body-scroll-preventer.js +49 -32
  138. package/dist/_helpers/error-message.js +3 -0
  139. package/dist/_helpers/footer.js +121 -0
  140. package/dist/_helpers/grid.js +1 -1
  141. package/dist/_helpers/group.js +3 -0
  142. package/dist/_helpers/header.js +1 -1
  143. package/dist/_helpers/icon.js +3 -0
  144. package/dist/_helpers/inject-styles.js +1 -1
  145. package/dist/_helpers/input.js +3 -0
  146. package/dist/_helpers/island.js +1 -1
  147. package/dist/_helpers/link.js +3 -0
  148. package/dist/_helpers/list.js +1 -1
  149. package/dist/_helpers/loader-screen.js +3 -0
  150. package/dist/_helpers/panel.js +3 -0
  151. package/dist/_helpers/query-assist__suggestions.js +1 -1
  152. package/dist/_helpers/radio.js +3 -0
  153. package/dist/_helpers/select__filter.js +6 -8
  154. package/dist/_helpers/services-link.js +6 -8
  155. package/dist/_helpers/sidebar.js +6 -8
  156. package/dist/_helpers/table.js +1 -1
  157. package/dist/_helpers/tabs.js +1 -1
  158. package/dist/_helpers/title.js +1 -1
  159. package/dist/alert/alert.js +15 -9
  160. package/dist/alert/container.js +7 -9
  161. package/dist/alert-service/alert-service.js +24 -13
  162. package/dist/analytics/analytics.js +2 -2
  163. package/dist/analytics/analytics__custom-plugin.js +1 -1
  164. package/dist/analytics/analytics__fus-plugin.js +4 -4
  165. package/dist/analytics/analytics__ga-plugin.js +3 -3
  166. package/dist/analytics/analytics__plugin-utils.js +1 -1
  167. package/dist/analytics-ng/analytics-ng.js +94 -0
  168. package/dist/auth/auth.js +7 -4
  169. package/dist/auth/auth__core.js +86 -48
  170. package/dist/auth/background-flow.js +1 -2
  171. package/dist/auth/down-notification.js +6 -3
  172. package/dist/auth/iframe-flow.js +5 -2
  173. package/dist/auth/landing-entry.js +1 -1
  174. package/dist/auth/landing.js +5 -2
  175. package/dist/auth/request-builder.js +1 -1
  176. package/dist/auth/response-parser.js +1 -1
  177. package/dist/auth/storage.js +3 -2
  178. package/dist/auth/token-validator.js +1 -1
  179. package/dist/auth/window-flow.js +1 -1
  180. package/dist/auth-dialog/auth-dialog.js +5 -3
  181. package/dist/auth-dialog-service/auth-dialog-service.js +6 -5
  182. package/dist/auth-ng/auth-ng.js +203 -0
  183. package/dist/auth-ng/auth-ng.mock.js +33 -0
  184. package/dist/autofocus-ng/autofocus-ng.js +50 -0
  185. package/dist/avatar/avatar.js +36 -30
  186. package/dist/avatar/fallback-avatar.js +141 -0
  187. package/dist/avatar-editor-ng/avatar-editor-ng.js +164 -0
  188. package/dist/avatar-editor-ng/avatar-editor-ng__template.js +30 -0
  189. package/dist/avatar-ng/avatar-ng.js +18 -0
  190. package/dist/badge/badge.js +6 -8
  191. package/dist/badge-ng/badge-ng.js +16 -0
  192. package/dist/breadcrumb-ng/breadcrumb-ng.js +61 -0
  193. package/dist/button/button.js +16 -10
  194. package/dist/button-group/button-group.js +4 -4
  195. package/dist/button-group/caption.js +24 -5
  196. package/dist/button-group-ng/button-group-ng.js +38 -0
  197. package/dist/button-ng/button-ng.js +223 -0
  198. package/dist/button-set/button-set.js +3 -4
  199. package/dist/button-set-ng/button-set-ng.js +19 -0
  200. package/dist/button-toolbar/button-toolbar.js +3 -4
  201. package/dist/button-toolbar-ng/button-toolbar-ng.js +23 -0
  202. package/dist/caret/caret.js +1 -1
  203. package/dist/checkbox/checkbox.js +9 -11
  204. package/dist/checkbox-ng/checkbox-ng.js +55 -0
  205. package/dist/code/code.js +136 -0
  206. package/dist/compiler-ng/compiler-ng.js +53 -0
  207. package/dist/confirm/confirm.js +6 -3
  208. package/dist/confirm-ng/confirm-ng.js +66 -0
  209. package/dist/confirm-service/confirm-service.js +12 -10
  210. package/dist/content-layout/content-layout.js +6 -8
  211. package/dist/contenteditable/contenteditable.js +13 -16
  212. package/dist/data-list/data-list.js +10 -7
  213. package/dist/data-list/data-list.mock.js +2 -2
  214. package/dist/data-list/item.js +5 -3
  215. package/dist/data-list/selection.js +1 -1
  216. package/dist/data-list/title.js +3 -1
  217. package/dist/data-list-ng/data-list-ng.js +59 -0
  218. package/dist/date-picker/consts.js +1 -2
  219. package/dist/date-picker/date-input.js +10 -6
  220. package/dist/date-picker/date-picker.js +38 -29
  221. package/dist/date-picker/date-popup.js +51 -28
  222. package/dist/date-picker/day.js +2 -2
  223. package/dist/date-picker/formats.js +1 -1
  224. package/dist/date-picker/month-names.js +16 -9
  225. package/dist/date-picker/month-slider.js +2 -2
  226. package/dist/date-picker/month.js +13 -7
  227. package/dist/date-picker/months.js +3 -3
  228. package/dist/date-picker/weekdays.js +12 -4
  229. package/dist/date-picker/years.js +2 -2
  230. package/dist/dialog/dialog.js +19 -14
  231. package/dist/dialog/dialog__body-scroll-preventer.js +1 -1
  232. package/dist/dialog-ng/dialog-ng.js +601 -0
  233. package/dist/dialog-ng/dialog-ng__template.js +71 -0
  234. package/dist/docked-panel-ng/docked-panel-ng.js +170 -0
  235. package/dist/dropdown/anchor.js +2 -1
  236. package/dist/dropdown/dropdown.js +8 -10
  237. package/dist/dropdown-menu/dropdown-menu.js +175 -0
  238. package/dist/error-bubble/error-bubble.js +7 -9
  239. package/dist/error-message/error-message.js +4 -4
  240. package/dist/error-message-ng/error-message-ng.js +53 -0
  241. package/dist/footer/footer.js +6 -122
  242. package/dist/footer-ng/footer-ng.js +75 -0
  243. package/dist/form-ng/form-ng.js +169 -0
  244. package/dist/global/angular-component-factory.js +1 -2
  245. package/dist/global/compose.js +1 -1
  246. package/dist/global/composeRefs.js +1 -1
  247. package/dist/global/conic-gradient.js +3 -5
  248. package/dist/global/create-stateful-context.js +1 -1
  249. package/dist/global/data-tests.js +1 -1
  250. package/dist/global/focus-sensor-hoc.js +9 -11
  251. package/dist/global/fuzzy-highlight.js +1 -1
  252. package/dist/global/get-event-key.js +1 -1
  253. package/dist/global/get-uid.js +1 -1
  254. package/dist/global/linear-function.js +1 -2
  255. package/dist/global/listeners.js +1 -1
  256. package/dist/global/memoize.js +1 -1
  257. package/dist/global/normalize-indent.js +1 -1
  258. package/dist/global/promise-with-timeout.js +1 -1
  259. package/dist/global/radial-gradient-mask.js +1 -1
  260. package/dist/global/react-dom-renderer.js +1 -1
  261. package/dist/global/rerender-hoc.js +3 -5
  262. package/dist/global/ring-angular-component.js +1 -1
  263. package/dist/global/schedule-raf.js +1 -1
  264. package/dist/global/sniffer.js +1 -1
  265. package/dist/global/supports-css.js +1 -1
  266. package/dist/global/theme.js +6 -8
  267. package/dist/global/trivial-template-tag.js +1 -1
  268. package/dist/global/variables_dark.js +1 -1
  269. package/dist/grid/col.js +6 -8
  270. package/dist/grid/grid.js +5 -7
  271. package/dist/grid/row.js +6 -8
  272. package/dist/group/group.js +7 -10
  273. package/dist/group-ng/group-ng.js +11 -0
  274. package/dist/header/header.js +29 -26
  275. package/dist/header/logo.js +8 -9
  276. package/dist/header/profile.js +37 -32
  277. package/dist/header/services-link.js +1 -0
  278. package/dist/header/services.js +10 -9
  279. package/dist/header/smart-profile.js +27 -24
  280. package/dist/header/smart-services.js +10 -9
  281. package/dist/header/tray-icon.js +12 -12
  282. package/dist/header/tray.js +6 -8
  283. package/dist/heading/heading.js +9 -12
  284. package/dist/http/http.js +37 -37
  285. package/dist/http/http.mock.js +4 -4
  286. package/dist/hub-source/hub-source.js +1 -1
  287. package/dist/hub-source/hub-source__users-groups.js +1 -1
  288. package/dist/icon/icon.js +8 -8
  289. package/dist/icon/icon__svg.js +81 -6
  290. package/dist/icon/index.js +2 -1
  291. package/dist/icon-ng/icon-ng.js +89 -0
  292. package/dist/input/input.js +9 -12
  293. package/dist/input-ng/input-ng.js +166 -0
  294. package/dist/island/adaptive-island-hoc.js +1 -2
  295. package/dist/island/content.js +6 -8
  296. package/dist/island/header.js +7 -9
  297. package/dist/island/island.js +6 -9
  298. package/dist/island-legacy/content-legacy.js +6 -8
  299. package/dist/island-legacy/header-legacy.js +6 -8
  300. package/dist/island-legacy/island-legacy.js +6 -8
  301. package/dist/island-ng/island-content-ng.js +56 -0
  302. package/dist/island-ng/island-header-ng.js +32 -0
  303. package/dist/island-ng/island-ng-class-fixer.js +9 -0
  304. package/dist/island-ng/island-ng.js +31 -0
  305. package/dist/link/clickableLink.js +6 -8
  306. package/dist/link/link.js +7 -11
  307. package/dist/link-ng/link-ng.js +25 -0
  308. package/dist/list/list.js +25 -13
  309. package/dist/list/list__custom.js +13 -10
  310. package/dist/list/list__hint.js +1 -1
  311. package/dist/list/list__item.js +20 -13
  312. package/dist/list/list__link.js +11 -12
  313. package/dist/list/list__separator.js +1 -1
  314. package/dist/list/list__title.js +1 -1
  315. package/dist/list/list__users-groups-source.js +11 -7
  316. package/dist/loader/loader.js +6 -8
  317. package/dist/loader/loader__core.js +2 -2
  318. package/dist/loader-inline/inject-styles.js +1 -1
  319. package/dist/loader-inline/loader-inline.js +6 -8
  320. package/dist/loader-inline-ng/loader-inline-ng.js +42 -0
  321. package/dist/loader-ng/loader-ng.js +43 -0
  322. package/dist/loader-screen/loader-screen.js +7 -10
  323. package/dist/loader-screen-ng/loader-screen-ng.js +99 -0
  324. package/dist/login-dialog/login-dialog.js +5 -3
  325. package/dist/login-dialog/service.js +7 -5
  326. package/dist/markdown/code.js +30 -0
  327. package/dist/markdown/heading.js +23 -0
  328. package/dist/markdown/link.js +30 -0
  329. package/dist/markdown/markdown.js +73 -0
  330. package/dist/message/message.js +5 -4
  331. package/dist/message-bundle-ng/message-bundle-ng.js +111 -0
  332. package/dist/old-browsers-message/old-browsers-message.js +0 -1
  333. package/dist/old-browsers-message/old-browsers-message__stop.js +0 -1
  334. package/dist/old-browsers-message/white-list.js +4 -5
  335. package/dist/pager/pager.js +18 -9
  336. package/dist/pager-ng/pager-ng.js +96 -0
  337. package/dist/panel/panel.js +7 -10
  338. package/dist/panel-ng/panel-ng.js +16 -0
  339. package/dist/permissions/permissions.js +1 -1
  340. package/dist/permissions/permissions__cache.js +1 -1
  341. package/dist/permissions-ng/permissions-ng.js +274 -0
  342. package/dist/place-under-ng/place-under-ng.js +157 -0
  343. package/dist/popup/popup.js +8 -8
  344. package/dist/popup/popup.target.js +4 -5
  345. package/dist/popup/position.js +1 -2
  346. package/dist/popup-menu/popup-menu.js +21 -14
  347. package/dist/progress-bar/progress-bar.js +12 -10
  348. package/dist/progress-bar-ng/progress-bar-ng.js +15 -0
  349. package/dist/promised-click-ng/promised-click-ng.js +126 -0
  350. package/dist/proxy-attrs/proxy-attrs.js +1 -1
  351. package/dist/query-assist/query-assist.js +97 -28
  352. package/dist/query-assist/query-assist__suggestions.js +5 -1
  353. package/dist/query-assist-ng/query-assist-ng.js +82 -0
  354. package/dist/radio/radio.js +7 -5
  355. package/dist/radio/radio__item.js +10 -15
  356. package/dist/radio-ng/radio-ng.js +63 -0
  357. package/dist/save-field-ng/save-field-ng.js +335 -0
  358. package/dist/save-field-ng/save-field-ng__template.js +34 -0
  359. package/dist/select/select.js +50 -49
  360. package/dist/select/select__filter.js +6 -1
  361. package/dist/select/select__popup.js +8 -3
  362. package/dist/select-ng/select-ng.js +621 -0
  363. package/dist/select-ng/select-ng__lazy.js +150 -0
  364. package/dist/select-ng/select-ng__options.js +145 -0
  365. package/dist/shortcuts/core.js +2 -2
  366. package/dist/shortcuts/shortcuts-hoc.js +6 -8
  367. package/dist/shortcuts/shortcuts.js +6 -6
  368. package/dist/shortcuts-hint-ng/shortcuts-hint-ng.js +120 -0
  369. package/dist/shortcuts-hint-ng/shortcuts-hint-ng__template.js +50 -0
  370. package/dist/shortcuts-ng/shortcuts-ng.js +261 -0
  371. package/dist/sidebar-ng/sidebar-ng.js +111 -0
  372. package/dist/sidebar-ng/sidebar-ng__button-template.js +20 -0
  373. package/dist/sidebar-ng/sidebar-ng__template.js +12 -0
  374. package/dist/storage/storage.js +3 -2
  375. package/dist/storage/storage__fallback.js +1 -1
  376. package/dist/storage/storage__local.js +3 -2
  377. package/dist/style.css +1 -1
  378. package/dist/tab-trap/tab-trap.js +7 -9
  379. package/dist/table/cell.js +2 -2
  380. package/dist/table/disable-hover-hoc.js +2 -2
  381. package/dist/table/header-cell.js +8 -9
  382. package/dist/table/header.js +10 -6
  383. package/dist/table/multitable.js +1 -1
  384. package/dist/table/row-with-focus-sensor.js +5 -3
  385. package/dist/table/row.js +11 -10
  386. package/dist/table/selection-adapter.js +1 -1
  387. package/dist/table/selection-shortcuts-hoc.js +8 -6
  388. package/dist/table/selection.js +1 -1
  389. package/dist/table/smart-table.js +14 -8
  390. package/dist/table/table.js +10 -11
  391. package/dist/table-legacy-ng/table-legacy-ng.js +501 -0
  392. package/dist/table-legacy-ng/table-legacy-ng__pager.js +122 -0
  393. package/dist/table-legacy-ng/table-legacy-ng__selection-navigate-actions.js +123 -0
  394. package/dist/table-legacy-ng/table-legacy-ng__selection.js +179 -0
  395. package/dist/table-legacy-ng/table-legacy-ng__toolbar.js +56 -0
  396. package/dist/table-ng/smart-table-ng.js +65 -0
  397. package/dist/table-ng/table-ng.js +64 -0
  398. package/dist/tabs/collapsible-more.js +9 -6
  399. package/dist/tabs/collapsible-tab.js +7 -7
  400. package/dist/tabs/collapsible-tabs.js +19 -20
  401. package/dist/tabs/dumb-tabs.js +12 -9
  402. package/dist/tabs/smart-tabs.js +11 -9
  403. package/dist/tabs/tab-link.js +13 -7
  404. package/dist/tabs/tab.js +1 -1
  405. package/dist/tabs/tabs.js +5 -1
  406. package/dist/tabs-ng/tabs-ng.js +193 -0
  407. package/dist/tabs-ng/tabs-ng__template.js +40 -0
  408. package/dist/tag/tag.js +20 -14
  409. package/dist/tags-input/tags-input.js +14 -10
  410. package/dist/tags-input-ng/tags-input-ng.js +89 -0
  411. package/dist/tags-list/tags-list.js +8 -9
  412. package/dist/template-ng/template-ng.js +70 -0
  413. package/dist/text/text.js +7 -9
  414. package/dist/theme-ng/theme-ng.js +44 -0
  415. package/dist/title-ng/title-ng.js +114 -0
  416. package/dist/toggle/toggle.js +8 -11
  417. package/dist/toggle-ng/toggle-ng.js +16 -0
  418. package/dist/tooltip/tooltip.js +14 -12
  419. package/dist/tooltip-ng/tooltip-ng.js +98 -0
  420. package/dist/user-agreement/service.js +409 -0
  421. package/dist/user-agreement/toolbox.eula.js +162 -0
  422. package/dist/user-agreement/user-agreement.js +167 -0
  423. package/dist/user-card/card.js +3 -0
  424. package/dist/user-card/smart-user-card-tooltip.js +14 -14
  425. package/dist/user-card/tooltip.js +9 -7
  426. package/dist/user-card/user-card.js +5 -2
  427. package/dist/user-card-ng/user-card-ng.js +59 -0
  428. package/package.json +84 -82
  429. package/webpack.config.js +14 -10
  430. package/components/button-set-ng/button-set-ng.html +0 -1
  431. package/components/footer-ng/footer-ng.html +0 -13
  432. package/components/form-ng/form-ng__error-bubble.html +0 -3
  433. package/components/table-legacy-ng/table-legacy-ng.html +0 -4
  434. package/components/table-legacy-ng/table-legacy-ng__column.html +0 -12
  435. package/components/table-legacy-ng/table-legacy-ng__header.html +0 -4
  436. package/components/table-legacy-ng/table-legacy-ng__pager.html +0 -7
  437. package/components/table-legacy-ng/table-legacy-ng__row.html +0 -12
  438. package/components/table-legacy-ng/table-legacy-ng__title.html +0 -9
  439. package/dist/_helpers/caption.js +0 -25
  440. package/dist/_helpers/icon__svg.js +0 -83
@@ -0,0 +1,117 @@
1
+ import React, {useMemo, cloneElement} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import List, {ActiveItemContext} from '../list/list';
5
+ import Dropdown from '../dropdown/dropdown';
6
+ import PopupMenu from '../popup-menu/popup-menu';
7
+ import getUID from '../global/get-uid';
8
+ import Anchor from '../dropdown/anchor';
9
+
10
+ const {children, ...dropdownPropTypes} = Dropdown.propTypes || {};
11
+ const {
12
+ id: idPropType,
13
+ data: dataPropType,
14
+ ariaLabel: ariaLabelPropType,
15
+ onSelect: onSelectPropType
16
+ } = PopupMenu.propTypes || {};
17
+
18
+ const defaultAriaLabel = 'Dropdown menu';
19
+
20
+ function DropdownAnchorWrapper({anchor, pinned, active, activeListItemId, listId, ...restProps}) {
21
+ const anchorAriaProps = useMemo(() => ({
22
+ ...(listId ? {'aria-haspopup': 'true'} : {}),
23
+ ...(activeListItemId ? {'aria-activedescendant': activeListItemId, 'aria-owns': listId} : {}),
24
+ ...(active ? {'aria-expanded': 'true'} : {})
25
+ }), [active, activeListItemId, listId]);
26
+
27
+ const anchorProps = useMemo(
28
+ () => ({active, pinned, ...restProps, ...anchorAriaProps}),
29
+ [pinned, active, restProps, anchorAriaProps]
30
+ );
31
+
32
+ const anchorComponentProps = useMemo(
33
+ () => ({...anchorProps, pinned: `${anchorProps.pinned}`}),
34
+ [anchorProps]
35
+ );
36
+
37
+ if (typeof anchor === 'string') {
38
+ return (
39
+ <Anchor
40
+ {...anchorComponentProps}
41
+ >{anchor}</Anchor>
42
+ );
43
+ }
44
+ if (typeof anchor === 'function') {
45
+ return anchor(({active, pinned, ...restProps}), anchorAriaProps);
46
+ }
47
+ if (!Array.isArray(anchor)) {
48
+ return cloneElement(
49
+ anchor,
50
+ typeof anchor.type === 'string' ? anchorAriaProps : anchorComponentProps
51
+ );
52
+ }
53
+ return (
54
+ <div {...anchorAriaProps}>{anchor}</div>
55
+ );
56
+ }
57
+
58
+ DropdownAnchorWrapper.propTypes = {
59
+ anchor: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.func]).isRequired,
60
+ pinned: PropTypes.bool,
61
+ active: PropTypes.bool,
62
+ activeListItemId: PropTypes.string,
63
+ listId: PropTypes.string
64
+ };
65
+
66
+ const DropdownMenu = React.forwardRef(function DropdownMenu(
67
+ {id, anchor, ariaLabel, data, onSelect, menuProps, ...restDropdownProps},
68
+ forwardedRef
69
+ ) {
70
+ const listId = useMemo(() => id || getUID('dropdown-menu-list'), [id]);
71
+
72
+ return (
73
+ <ActiveItemContext.Provider>
74
+ <Dropdown
75
+ anchor={({pinned, active, ...restAnchorProps}) => (
76
+ <ActiveItemContext.ValueContext.Consumer>
77
+ {activeItemId => (
78
+ <DropdownAnchorWrapper
79
+ anchor={anchor}
80
+ pinned={pinned}
81
+ active={active}
82
+ activeListItemId={activeItemId}
83
+ listId={listId}
84
+ {...restAnchorProps}
85
+ />
86
+ )}
87
+ </ActiveItemContext.ValueContext.Consumer>
88
+ )}
89
+ {...restDropdownProps}
90
+ >
91
+ <PopupMenu
92
+ ref={forwardedRef}
93
+ id={listId}
94
+ ariaLabel={ariaLabel || defaultAriaLabel}
95
+ closeOnSelect
96
+ activateFirstItem
97
+ data={data}
98
+ onSelect={onSelect}
99
+ {...menuProps}
100
+ />
101
+ </Dropdown>
102
+ </ActiveItemContext.Provider>
103
+ );
104
+ });
105
+
106
+ DropdownMenu.propTypes = {
107
+ id: idPropType,
108
+ data: dataPropType,
109
+ ariaLabel: ariaLabelPropType,
110
+ onSelect: onSelectPropType,
111
+ menuProps: PropTypes.object,
112
+ ...dropdownPropTypes
113
+ };
114
+
115
+ DropdownMenu.ListProps = List.ListProps;
116
+
117
+ export default DropdownMenu;
@@ -0,0 +1,76 @@
1
+ import React from 'react';
2
+ import {shallow, mount} from 'enzyme';
3
+
4
+ import PopupMenu from '../popup-menu/popup-menu';
5
+ import Anchor from '../dropdown/anchor';
6
+
7
+ import DropdownMenu from './dropdown-menu';
8
+
9
+ const waitForCondition = (condition, rejectMessage) => new Promise((resolve, reject) => {
10
+ const interval = 10;
11
+ const maxWaitingTime = 2000;
12
+ let remainingTime = maxWaitingTime;
13
+
14
+ const intervalId = setInterval(() => {
15
+ if (condition()) {
16
+ clearInterval(intervalId);
17
+ resolve();
18
+ } else if (remainingTime < 0) {
19
+ clearInterval(intervalId);
20
+ reject(new Error(rejectMessage));
21
+ } else {
22
+ remainingTime -= interval;
23
+ }
24
+ }, interval);
25
+ });
26
+
27
+ describe('Dropdown Menu', () => {
28
+ const shallowDropdownMenu = props => shallow(<DropdownMenu id="test-list-id" {...props}/>);
29
+ const mountDropdownMenu = props => mount(<DropdownMenu id="test-list-id" {...props}/>);
30
+
31
+ const mountAndWaitForMenuContent = async props => {
32
+ const wrapper = mountDropdownMenu(props);
33
+
34
+ wrapper.find('button').getDOMNode().click();
35
+ await waitForCondition(
36
+ () => !!wrapper.find(PopupMenu).length,
37
+ 'List was not rendered in a dropdown menu'
38
+ );
39
+
40
+ return wrapper;
41
+ };
42
+
43
+ it('should create component', () => {
44
+ shallowDropdownMenu({anchor: 'Anchor text'}).should.exist;
45
+ });
46
+
47
+ it('should open List', async () => {
48
+ const wrapper = await mountAndWaitForMenuContent({anchor: 'Anchor text'});
49
+
50
+ const list = wrapper.find(PopupMenu).instance().list;
51
+ list.should.exist;
52
+
53
+ //We need it to maintain compatibility between Dropdown Menu and List
54
+ list.props.data.length.should.equal(0);
55
+ });
56
+
57
+ it('should pass params to List', async () => {
58
+ const wrapper = await mountAndWaitForMenuContent({
59
+ anchor: 'Anchor text',
60
+ data: [{key: 'key1'}]
61
+ });
62
+
63
+ shallow(wrapper.find(PopupMenu).instance().list.renderItem({index: 1})).should.exist;
64
+ });
65
+
66
+ it('should add accessibility attributes to anchor', async () => {
67
+ const wrapper = await mountAndWaitForMenuContent({
68
+ anchor: 'Anchor text',
69
+ data: [{key: 'key1'}, {key: 'key2'}]
70
+ });
71
+
72
+ const anchorProps = wrapper.update().find(Anchor).props();
73
+ anchorProps['aria-owns'].should.equal('test-list-id');
74
+ anchorProps['aria-activedescendant'].should.contain(':key1');
75
+ });
76
+ });
@@ -44,7 +44,7 @@
44
44
  width: unit;
45
45
  height: unit;
46
46
 
47
- content: '';
47
+ content: "";
48
48
  transform: rotate(45deg);
49
49
 
50
50
  border: 1px solid var(--ring-popup-border-color);
@@ -46,7 +46,7 @@
46
46
  width: unit;
47
47
  height: unit;
48
48
 
49
- content: '';
49
+ content: "";
50
50
  transform: rotate(45deg);
51
51
 
52
52
  border: 1px solid var(--ring-popup-border-color);
@@ -57,7 +57,7 @@ export const inDialogForm = () => {
57
57
  const {value} = this.state;
58
58
 
59
59
  return (
60
- <Dialog show>
60
+ <Dialog label="Dialog" show>
61
61
  <Header>Dialog example</Header>
62
62
  <Content>
63
63
  <form className="ring-form">
@@ -15,10 +15,10 @@
15
15
  width: 100%;
16
16
  height: 100%;
17
17
 
18
- content: '';
18
+ content: "";
19
19
  }
20
20
 
21
21
  .enabled::before {
22
22
  opacity: 0.06;
23
- background: url('error-page.gif');
23
+ background: url("error-page.gif");
24
24
  }
@@ -4,8 +4,6 @@ import RingAngularComponent from '../global/ring-angular-component';
4
4
  import styles from '../footer/footer.css';
5
5
  import {copyright} from '../footer/footer';
6
6
 
7
- import template from './footer-ng.html';
8
-
9
7
  /**
10
8
  * @name Footer Ng
11
9
  */
@@ -22,7 +20,19 @@ class rgFooterComponent extends RingAngularComponent {
22
20
  right: '?rgFooterRight'
23
21
  };
24
22
 
25
- static template = template;
23
+ static template = `<footer ng-class=":: $ctrl.styles.footer" data-test="ring-footer">
24
+ <div ng-class=":: $ctrl.styles.columnLeft">
25
+ <div ng-transclude="left" ng-class=":: $ctrl.styles.columnItem"></div>
26
+ </div>
27
+
28
+ <div ng-class=":: $ctrl.styles.columnCenter">
29
+ <div ng-transclude="center" ng-class=":: $ctrl.styles.columnItem"></div>
30
+ </div>
31
+
32
+ <div ng-class=":: $ctrl.styles.columnRight">
33
+ <div ng-transclude="right" ng-class=":: $ctrl.styles.columnItem"></div>
34
+ </div>
35
+ </footer>`;
26
36
  }
27
37
 
28
38
  class rgFooterLineComponent extends RingAngularComponent {
@@ -96,7 +96,7 @@
96
96
  display: block;
97
97
  clear: both;
98
98
 
99
- content: '';
99
+ content: "";
100
100
  }
101
101
 
102
102
  :global(.ring-form__group_united) {
@@ -167,7 +167,7 @@
167
167
 
168
168
  height: calc(unit * 3);
169
169
 
170
- content: '';
170
+ content: "";
171
171
  vertical-align: middle;
172
172
  }
173
173
 
@@ -54,7 +54,9 @@ angularModule.directive('rgErrorBubble', function rgErrorBubbleDirective(getForm
54
54
  },
55
55
 
56
56
  replace: true,
57
- template: require('./form-ng__error-bubble.html'),
57
+ template: `<div class="ring-error-bubble" ng-class="{ active: active, 'ring-error-bubble_material': material }" ng-style="style">
58
+ <div ng-repeat="errorMessage in getFormErrorMessages(errorBubble().$error)">{{ errorMessage }}</div>
59
+ </div>`,
58
60
 
59
61
  link: function link(scope, iElement, iAttrs) {
60
62
  scope.style = {};
@@ -11,7 +11,7 @@ Also it won't form in FF47 https://bugzilla.mozilla.org/show_bug.cgi?id=594933
11
11
  display: block;
12
12
  clear: both;
13
13
 
14
- content: '';
14
+ content: "";
15
15
  }
16
16
  }
17
17
 
@@ -5,7 +5,7 @@ const Theme = {
5
5
  DARK: 'dark'
6
6
  };
7
7
 
8
- export const ThemeContext = createContext();
8
+ export const ThemeContext = createContext(null);
9
9
 
10
10
  const getDisplayName = Component => (typeof Component === 'string' ? Component : (Component.name ?? Component.displayName ?? 'Component'));
11
11
 
@@ -87,7 +87,14 @@
87
87
  --ring-ease: 0.3s ease-out;
88
88
  --ring-fast-ease: 0.15s ease-out;
89
89
  --ring-font-family: system-ui, Arial, sans-serif;
90
- --ring-font-family-monospace: Menlo, "Bitstream Vera Sans Mono", "Ubuntu Mono", Consolas, "Courier New", Courier, monospace;
90
+ --ring-font-family-monospace:
91
+ Menlo,
92
+ "Bitstream Vera Sans Mono",
93
+ "Ubuntu Mono",
94
+ Consolas,
95
+ "Courier New",
96
+ Courier,
97
+ monospace;
91
98
 
92
99
  /* Common z-index-values */
93
100
 
@@ -1,23 +1,24 @@
1
1
  @import "../global/variables.css";
2
2
 
3
- @value unit, breakpoint-small, breakpoint-middle, breakpoint-large, large-screen-media, middle-screen-media, small-screen-media from '../global/global.css';
3
+ @value unit, breakpoint-small, breakpoint-middle, breakpoint-large from "../global/global.css";
4
+ @value large-screen-media, middle-screen-media, small-screen-media from "../global/global.css";
4
5
  @value gutterWidth: (unit*2);
5
6
  @value gutterCompensation: calc(gutterWidth / -2);
6
7
  @value outerMargin: calc(unit*2);
7
8
  @value containerSmall: calc(breakpoint-small + gutterWidth);
8
9
  @value containerMedium: calc(breakpoint-middle + gutterWidth);
9
10
  @value containerLarge: calc(breakpoint-large + gutterWidth);
10
- @value width-1: 8.33333333%;
11
- @value width-2: 16.66666667%;
11
+ @value width-1: 8.3333%;
12
+ @value width-2: 16.6667%;
12
13
  @value width-3: 25%;
13
- @value width-4: 33.33333333%;
14
- @value width-5: 41.66666667%;
14
+ @value width-4: 33.3333%;
15
+ @value width-5: 41.6667%;
15
16
  @value width-6: 50%;
16
- @value width-7: 58.33333333%;
17
- @value width-8: 66.66666667%;
17
+ @value width-7: 58.3333%;
18
+ @value width-8: 66.6667%;
18
19
  @value width-9: 75%;
19
- @value width-10: 83.33333333%;
20
- @value width-11: 91.66666667%;
20
+ @value width-10: 83.3333%;
21
+ @value width-11: 91.6667%;
21
22
  @value width-12: 100%;
22
23
 
23
24
  .container-fluid,
@@ -152,7 +152,7 @@
152
152
  width: unit;
153
153
  height: unit;
154
154
 
155
- content: '';
155
+ content: "";
156
156
 
157
157
  border: 1px solid var(--ring-dark-text-color);
158
158
  border-radius: 50%;
@@ -13,8 +13,7 @@ import hubConfig from '../../.storybook/hub-config';
13
13
  import Link from '@jetbrains/ring-ui/components/link/link';
14
14
 
15
15
 
16
- import PopupMenu from '@jetbrains/ring-ui/components/popup-menu/popup-menu';
17
- import Dropdown from '@jetbrains/ring-ui/components/dropdown/dropdown';
16
+ import DropdownMenu from '@jetbrains/ring-ui/components/dropdown-menu/dropdown-menu';
18
17
  import showAuthDialog from '@jetbrains/ring-ui/components/auth-dialog-service/auth-dialog-service';
19
18
 
20
19
  import Theme from '@jetbrains/ring-ui/components/global/theme';
@@ -77,13 +76,13 @@ export const header = ({isCompact, ...args}) => {
77
76
  <TrayIcon title="Help" icon={helpIcon}/>
78
77
  <TrayIcon title="What's new" icon={giftIcon}/>
79
78
  <TrayIcon title="Search" icon={searchIcon}/>
80
- <Dropdown
81
- anchor={({active}) => (
82
- <TrayIcon title="Settings" active={active} icon={settingsIcon}/>
79
+ <DropdownMenu
80
+ data={[{label: 'Test'}, {label: 'Test2'}]}
81
+ anchor={({active, pinned, ...ariaProps}) => (
82
+ <TrayIcon title="Settings" active={active} icon={settingsIcon} {...ariaProps}/>
83
83
  )}
84
- >
85
- <PopupMenu top={-12} closeOnSelect data={[{label: 'Test'}, {label: 'Test2'}]}/>
86
- </Dropdown>
84
+ menuProps={{top: -12}}
85
+ />
87
86
  <SmartServices auth={auth}/>
88
87
  <SmartProfile auth={auth} hasUpdates LinkComponent={Comp}/>
89
88
  </Tray>
@@ -4,7 +4,7 @@ import classNames from 'classnames';
4
4
 
5
5
  import Avatar, {Size} from '../avatar/avatar';
6
6
  import Button from '../button/button';
7
- import Dropdown from '../dropdown/dropdown';
7
+ import DropdownMenu from '../dropdown-menu/dropdown-menu';
8
8
  import PopupMenu from '../popup-menu/popup-menu';
9
9
 
10
10
  import styles from './header.css';
@@ -162,21 +162,20 @@ export default class Profile extends PureComponent {
162
162
  ].filter(it => !!it);
163
163
 
164
164
  return (
165
- <Dropdown
165
+ <DropdownMenu
166
166
  {...props}
167
167
  title={user.name}
168
168
  anchor={anchor}
169
+ data={renderPopupItems(items)}
169
170
  data-test="ring-profile"
170
171
  className={classNames(styles.profile, className)}
171
- >
172
- <PopupMenu
173
- closeOnSelect={closeOnSelect}
174
- data={renderPopupItems(items)}
175
- left={-2}
176
- top={-8}
177
- sidePadding={32}
178
- />
179
- </Dropdown>
172
+ menuProps={{
173
+ closeOnSelect,
174
+ left: -2,
175
+ top: -8,
176
+ sidePadding: 32
177
+ }}
178
+ />
180
179
  );
181
180
  }
182
181
  }
@@ -192,5 +192,5 @@ export default class HTTP {
192
192
  method: 'POST',
193
193
  ...params
194
194
  })
195
- )
195
+ );
196
196
  }
@@ -16,22 +16,22 @@
16
16
 
17
17
  pointer-events: none;
18
18
 
19
- &[width='10'] {
19
+ &[width="10"] {
20
20
  vertical-align: -1px;
21
21
  }
22
22
 
23
- &[width='14'] {
23
+ &[width="14"] {
24
24
  margin-right: -2px;
25
25
  margin-left: 0;
26
26
 
27
27
  vertical-align: -3px;
28
28
  }
29
29
 
30
- &[width='16'] {
30
+ &[width="16"] {
31
31
  vertical-align: -3px;
32
32
  }
33
33
 
34
- &[width='20'] {
34
+ &[width="20"] {
35
35
  vertical-align: -2px;
36
36
  }
37
37
 
@@ -44,6 +44,7 @@
44
44
  }
45
45
 
46
46
  /* HACK: This media query hack makes styles applied for WebKit browsers only */
47
+ /* stylelint-disable-next-line media-feature-name-no-vendor-prefix */
47
48
  @media screen and (-webkit-min-device-pixel-ratio: 0) {
48
49
  .glyph {
49
50
  width: auto; /* Safari size bug workaround, see https://youtrack.jetbrains.com/issue/RG-1983 */
@@ -38,10 +38,10 @@ Input
38
38
  appearance: none;
39
39
  }
40
40
 
41
- :global(.ring-input:active,
42
- .ring-input:focus,
43
- .ring-input_active,
44
- .ring-input_focus) {
41
+ :global(.ring-input:active),
42
+ :global(.ring-input:focus),
43
+ :global(.ring-input_active),
44
+ :global(.ring-input_focus) {
45
45
  border-color: var(--ring-main-color);
46
46
  outline: 0;
47
47
  }
@@ -72,9 +72,9 @@ Input
72
72
  border-left: 0;
73
73
  }
74
74
 
75
- :global(.ring-input.ring-input:disabled,
76
- .ring-input.ring-input[disabled],
77
- .ring-input.ring-input_disabled) {
75
+ :global(.ring-input.ring-input:disabled),
76
+ :global(.ring-input.ring-input[disabled]),
77
+ :global(.ring-input.ring-input_disabled) {
78
78
  color: var(--ring-disabled-color);
79
79
  border-color: var(--ring-border-disabled-color);
80
80
  background-color: var(--ring-sidebar-background-color);
@@ -75,12 +75,12 @@ class Header extends Component {
75
75
  >
76
76
  {wrapWithTitle &&
77
77
  (
78
- <div
78
+ <h2
79
79
  className={styles.title}
80
80
  style={titleStyle}
81
81
  >
82
82
  {children}
83
- </div>
83
+ </h2>
84
84
  )}
85
85
 
86
86
  {!wrapWithTitle && children}
@@ -41,11 +41,15 @@
41
41
  display: block;
42
42
  float: left;
43
43
 
44
+ margin: 0;
45
+
44
46
  transform-origin: 0 50%;
45
47
  word-break: break-word;
46
48
 
47
49
  color: var(--ring-heading-color);
48
50
 
51
+ font-size: inherit;
52
+
49
53
  font-weight: bold;
50
54
  }
51
55
 
@@ -92,12 +96,13 @@
92
96
  width: 100%;
93
97
  height: calc(unit * 3);
94
98
 
95
- content: '';
99
+ content: "";
96
100
 
97
101
  pointer-events: none;
98
102
 
99
103
  opacity: 0.8;
100
- background: linear-gradient(to top, gradientStart, gradientStop); /* stylelint-disable-line function-linear-gradient-no-nonstandard-direction */
104
+
105
+ background: linear-gradient(to top, gradientStart, gradientStop);
101
106
  }
102
107
 
103
108
  .contentWithTopFade:first-child::before {
@@ -115,7 +120,7 @@
115
120
  width: 100%;
116
121
  height: calc(unit * 3);
117
122
 
118
- content: '';
123
+ content: "";
119
124
  pointer-events: none;
120
125
 
121
126
  opacity: 0.8;
@@ -70,7 +70,9 @@
70
70
 
71
71
  :global(.ring-island__header-btn),
72
72
  :global(.ring-island__header-button:hover) {
73
- background: var(--ring-hover-background-color) linear-gradient(to top, var(--ring-hover-background-color), var(--ring-content-background-color));
73
+ background:
74
+ var(--ring-hover-background-color)
75
+ linear-gradient(to top, var(--ring-hover-background-color), var(--ring-content-background-color));
74
76
  }
75
77
 
76
78
  :global(.ring-island__header-btn),
@@ -570,7 +570,11 @@ export default class List extends Component {
570
570
  )}
571
571
  </CellMeasurer>
572
572
  )
573
- : cloneElement(el, {key: itemKey});
573
+ : (
574
+ <div role="row" id={itemId} key={itemKey}>
575
+ <div role="cell">{cloneElement(el)}</div>
576
+ </div>
577
+ );
574
578
  };
575
579
 
576
580
  addItemDataTestToProp = props => {
@@ -679,6 +683,7 @@ export default class List extends Component {
679
683
  >
680
684
  <div
681
685
  aria-label={this.props.ariaLabel}
686
+ role="grid"
682
687
  style={maxHeight
683
688
  ? {maxHeight: this.getVisibleListHeight(this.props)}
684
689
  : null
@@ -24,6 +24,8 @@ export default class ListCustom extends PureComponent {
24
24
  onMouseOver: PropTypes.func,
25
25
  onMouseUp: PropTypes.func,
26
26
  onCheckboxChange: PropTypes.func,
27
+ role: PropTypes.string,
28
+ tagName: PropTypes.string,
27
29
  'data-test': PropTypes.string
28
30
  };
29
31
 
@@ -51,6 +53,8 @@ export default class ListCustom extends PureComponent {
51
53
  onCheckboxChange,
52
54
  onMouseOver,
53
55
  onMouseUp,
56
+ role,
57
+ tagName,
54
58
  ...restProps
55
59
  } = this.props;
56
60
  const classes = classNames(styles.item, className, {
@@ -65,9 +69,11 @@ export default class ListCustom extends PureComponent {
65
69
  }, restProps['data-test']);
66
70
 
67
71
  const content = (typeof template === 'function') ? template(this.props) : template;
72
+ const TagName = tagName || 'span';
73
+
68
74
  return (
69
- <span
70
- role="button"
75
+ <TagName
76
+ role={role || 'button'}
71
77
  tabIndex={tabIndex}
72
78
  onClick={onClick}
73
79
  onKeyPress={this.handleKeyPress}
@@ -78,7 +84,7 @@ export default class ListCustom extends PureComponent {
78
84
  data-test={dataTest}
79
85
  >
80
86
  {content}
81
- </span>
87
+ </TagName>
82
88
  );
83
89
  }
84
90
  }