@jetbrains/ring-ui 4.1.0-beta.9 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +17 -15
  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 +1 -1
  10. package/components/auth/auth.test.js +14 -7
  11. package/components/auth/auth__core.js +64 -33
  12. package/components/auth-dialog/auth-dialog.js +1 -0
  13. package/components/avatar/avatar.css +4 -1
  14. package/components/avatar/avatar.examples.js +3 -2
  15. package/components/avatar/avatar.js +31 -6
  16. package/components/avatar/fallback-avatar.js +136 -0
  17. package/components/avatar-editor-ng/avatar-editor-ng.css +2 -2
  18. package/components/avatar-editor-ng/avatar-editor-ng.js +2 -1
  19. package/components/avatar-editor-ng/{avatar-editor-ng.html → avatar-editor-ng__template.js} +2 -2
  20. package/components/button/button.css +2 -2
  21. package/components/button/button.js +4 -1
  22. package/components/button-group/button-group.js +1 -1
  23. package/components/button-group/caption.js +1 -1
  24. package/components/button-ng/button-ng.js +1 -1
  25. package/components/button-set-ng/button-set-ng.js +3 -1
  26. package/components/checkbox/checkbox.css +1 -1
  27. package/components/code/code.js +1 -1
  28. package/components/confirm/confirm.js +1 -0
  29. package/components/confirm-service/confirm-service.js +5 -5
  30. package/components/content-layout/content-layout.css +1 -1
  31. package/components/data-list/data-list.css +1 -1
  32. package/components/date-picker/date-input.js +5 -4
  33. package/components/date-picker/date-picker.css +34 -22
  34. package/components/date-picker/date-picker.js +16 -14
  35. package/components/date-picker/date-popup.js +22 -7
  36. package/components/date-picker/month-names.js +8 -5
  37. package/components/date-picker/month.js +6 -2
  38. package/components/date-picker/weekdays.js +10 -2
  39. package/components/dialog/dialog.examples.js +3 -1
  40. package/components/dialog/dialog.js +5 -2
  41. package/components/dialog/dialog.test.js +1 -1
  42. package/components/dialog/dialog__body-scroll-preventer.js +2 -2
  43. package/components/dialog-ng/dialog-ng.js +7 -8
  44. package/components/dialog-ng/{dialog-ng.html → dialog-ng__template.js} +2 -2
  45. package/components/dropdown/dropdown.examples.js +36 -1
  46. package/components/dropdown-menu/dropdown-menu.examples.js +47 -0
  47. package/components/dropdown-menu/dropdown-menu.js +117 -0
  48. package/components/dropdown-menu/dropdown-menu.test.js +76 -0
  49. package/components/error-bubble/error-bubble-legacy.css +1 -1
  50. package/components/error-bubble/error-bubble.css +1 -1
  51. package/components/error-bubble/error-bubble.examples.js +1 -1
  52. package/components/error-page/error-page.css +2 -2
  53. package/components/footer-ng/footer-ng.js +13 -3
  54. package/components/form/form.css +2 -2
  55. package/components/form-ng/form-ng.js +3 -1
  56. package/components/global/global.css +1 -1
  57. package/components/global/theme.js +1 -1
  58. package/components/global/variables.css +8 -1
  59. package/components/grid/grid.css +10 -9
  60. package/components/header/header.css +1 -1
  61. package/components/header/header.examples.js +7 -8
  62. package/components/header/profile.js +10 -11
  63. package/components/http/http.js +1 -1
  64. package/components/icon/icon.css +5 -4
  65. package/components/island/island.css +4 -3
  66. package/components/island-legacy/island-legacy.css +3 -1
  67. package/components/list/list.js +6 -1
  68. package/components/list/list__custom.js +9 -3
  69. package/components/list/list__item.js +8 -2
  70. package/components/list/list__link.js +2 -1
  71. package/components/loader-inline/loader-inline.css +1 -1
  72. package/components/loader-screen/loader-screen.css +1 -1
  73. package/components/message/message.css +1 -1
  74. package/components/message/message.examples.js +8 -5
  75. package/components/pager/pager.js +5 -3
  76. package/components/permissions/permissions.js +1 -1
  77. package/components/progress-bar/progress-bar.css +1 -1
  78. package/components/progress-bar/progress-bar.examples.js +3 -3
  79. package/components/progress-bar/progress-bar.js +5 -2
  80. package/components/progress-bar/progress-bar.test.js +12 -13
  81. package/components/progress-bar-ng/progress-bar-ng.examples.js +3 -3
  82. package/components/query-assist/query-assist.css +13 -3
  83. package/components/query-assist/query-assist.examples.js +3 -1
  84. package/components/query-assist/query-assist.js +56 -12
  85. package/components/query-assist/query-assist.test.js +37 -5
  86. package/components/save-field-ng/save-field-ng.css +0 -3
  87. package/components/save-field-ng/save-field-ng.js +3 -1
  88. package/components/save-field-ng/{save-field-ng.html → save-field-ng__template.js} +2 -2
  89. package/components/select/select.css +12 -7
  90. package/components/select/select.examples.js +13 -0
  91. package/components/select/select.js +30 -43
  92. package/components/select/select.test.js +4 -5
  93. package/components/shortcuts-hint-ng/shortcuts-hint-ng.css +1 -1
  94. package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -1
  95. package/components/shortcuts-hint-ng/{shortcuts-hint-ng.html → shortcuts-hint-ng__template.js} +2 -2
  96. package/components/sidebar/sidebar.css +1 -0
  97. package/components/sidebar-ng/sidebar-ng.js +6 -2
  98. package/components/sidebar-ng/{sidebar-ng__button.html → sidebar-ng__button-template.js} +2 -2
  99. package/components/sidebar-ng/{sidebar-ng.html → sidebar-ng__template.js} +2 -2
  100. package/components/table/row.js +2 -1
  101. package/components/table/table.css +2 -1
  102. package/components/table-legacy/table-legacy.css +2 -2
  103. package/components/table-legacy/table-legacy__toolbar.css +2 -2
  104. package/components/table-legacy-ng/table-legacy-ng.js +38 -5
  105. package/components/table-legacy-ng/table-legacy-ng__pager.js +7 -1
  106. package/components/tabs/collapsible-tab.js +2 -2
  107. package/components/tabs/collapsible-tabs.js +4 -8
  108. package/components/tabs/tab-link.js +4 -2
  109. package/components/tabs/tabs.css +27 -0
  110. package/components/tabs-ng/tabs-ng.js +4 -2
  111. package/components/tabs-ng/{tabs-ng.html → tabs-ng__template.js} +6 -2
  112. package/components/tag/tag.css +5 -2
  113. package/components/tag/tag.examples.js +3 -0
  114. package/components/tag/tag.js +19 -16
  115. package/components/tags-input/tag-input.examples.js +1 -1
  116. package/components/tags-input/tags-input.js +5 -2
  117. package/components/template-ng/template-ng.js +1 -1
  118. package/components/tooltip/tooltip.js +7 -2
  119. package/components/user-agreement/user-agreement.css +1 -1
  120. package/components/user-agreement/user-agreement.examples.js +7 -4
  121. package/components/user-agreement/user-agreement.js +1 -0
  122. package/package.json +75 -78
  123. package/webpack.config.js +14 -10
  124. package/components/button-set-ng/button-set-ng.html +0 -1
  125. package/components/footer-ng/footer-ng.html +0 -13
  126. package/components/form-ng/form-ng__error-bubble.html +0 -3
  127. package/components/table-legacy-ng/table-legacy-ng.html +0 -4
  128. package/components/table-legacy-ng/table-legacy-ng__column.html +0 -12
  129. package/components/table-legacy-ng/table-legacy-ng__header.html +0 -4
  130. package/components/table-legacy-ng/table-legacy-ng__pager.html +0 -7
  131. package/components/table-legacy-ng/table-legacy-ng__row.html +0 -12
  132. package/components/table-legacy-ng/table-legacy-ng__title.html +0 -9
  133. package/dist/_helpers/_rollupPluginBabelHelpers.js +0 -127
  134. package/dist/_helpers/anchor.js +0 -33
  135. package/dist/_helpers/badge.js +0 -3
  136. package/dist/_helpers/button__classes.js +0 -39
  137. package/dist/_helpers/caption.js +0 -25
  138. package/dist/_helpers/card.js +0 -77
  139. package/dist/_helpers/date-picker.js +0 -3
  140. package/dist/_helpers/dialog__body-scroll-preventer.js +0 -56
  141. package/dist/_helpers/grid.js +0 -3
  142. package/dist/_helpers/header.js +0 -3
  143. package/dist/_helpers/icon__svg.js +0 -83
  144. package/dist/_helpers/inject-styles.js +0 -22
  145. package/dist/_helpers/island.js +0 -3
  146. package/dist/_helpers/list.js +0 -3
  147. package/dist/_helpers/query-assist__suggestions.js +0 -95
  148. package/dist/_helpers/select__filter.js +0 -78
  149. package/dist/_helpers/services-link.js +0 -42
  150. package/dist/_helpers/sidebar.js +0 -127
  151. package/dist/_helpers/table.js +0 -3
  152. package/dist/_helpers/tabs.js +0 -3
  153. package/dist/_helpers/title.js +0 -99
  154. package/dist/alert/alert.js +0 -254
  155. package/dist/alert/container.js +0 -50
  156. package/dist/alert-service/alert-service.js +0 -159
  157. package/dist/analytics/analytics.js +0 -116
  158. package/dist/analytics/analytics__custom-plugin.js +0 -127
  159. package/dist/analytics/analytics__fus-plugin.js +0 -101
  160. package/dist/analytics/analytics__ga-plugin.js +0 -66
  161. package/dist/analytics/analytics__plugin-utils.js +0 -79
  162. package/dist/auth/auth.js +0 -90
  163. package/dist/auth/auth__core.js +0 -987
  164. package/dist/auth/background-flow.js +0 -123
  165. package/dist/auth/down-notification.js +0 -111
  166. package/dist/auth/iframe-flow.js +0 -147
  167. package/dist/auth/landing-entry.js +0 -5
  168. package/dist/auth/landing.js +0 -84
  169. package/dist/auth/request-builder.js +0 -75
  170. package/dist/auth/response-parser.js +0 -117
  171. package/dist/auth/storage.js +0 -279
  172. package/dist/auth/token-validator.js +0 -176
  173. package/dist/auth/window-flow.js +0 -133
  174. package/dist/auth-dialog/auth-dialog.js +0 -132
  175. package/dist/auth-dialog-service/auth-dialog-service.js +0 -67
  176. package/dist/avatar/avatar-example-datauri.js +0 -26
  177. package/dist/avatar/avatar.js +0 -155
  178. package/dist/badge/badge.js +0 -52
  179. package/dist/button/button.js +0 -117
  180. package/dist/button/button__classes.js +0 -5
  181. package/dist/button-group/button-group.js +0 -30
  182. package/dist/button-group/caption.js +0 -5
  183. package/dist/button-set/button-set.js +0 -27
  184. package/dist/button-toolbar/button-toolbar.js +0 -30
  185. package/dist/caret/caret.js +0 -264
  186. package/dist/checkbox/checkbox.js +0 -110
  187. package/dist/confirm/confirm.js +0 -122
  188. package/dist/confirm-service/confirm-service.js +0 -112
  189. package/dist/content-layout/content-layout.js +0 -67
  190. package/dist/content-layout/sidebar.js +0 -6
  191. package/dist/contenteditable/contenteditable.js +0 -81
  192. package/dist/data-list/data-list.js +0 -203
  193. package/dist/data-list/data-list.mock.js +0 -190
  194. package/dist/data-list/item.js +0 -225
  195. package/dist/data-list/selection.js +0 -101
  196. package/dist/data-list/title.js +0 -16
  197. package/dist/date-picker/consts.js +0 -70
  198. package/dist/date-picker/date-input.js +0 -169
  199. package/dist/date-picker/date-picker.js +0 -356
  200. package/dist/date-picker/date-popup.js +0 -459
  201. package/dist/date-picker/day.js +0 -119
  202. package/dist/date-picker/formats.js +0 -3
  203. package/dist/date-picker/month-names.js +0 -92
  204. package/dist/date-picker/month-slider.js +0 -83
  205. package/dist/date-picker/month.js +0 -48
  206. package/dist/date-picker/months.js +0 -121
  207. package/dist/date-picker/weekdays.js +0 -24
  208. package/dist/date-picker/years.js +0 -109
  209. package/dist/dialog/dialog.js +0 -197
  210. package/dist/dialog/dialog__body-scroll-preventer.js +0 -2
  211. package/dist/dropdown/anchor.js +0 -16
  212. package/dist/dropdown/dropdown.js +0 -236
  213. package/dist/error-bubble/error-bubble.js +0 -59
  214. package/dist/error-message/error-message.js +0 -55
  215. package/dist/footer/footer.js +0 -127
  216. package/dist/global/angular-component-factory.js +0 -83
  217. package/dist/global/compose.js +0 -9
  218. package/dist/global/composeRefs.js +0 -15
  219. package/dist/global/conic-gradient.js +0 -37
  220. package/dist/global/create-stateful-context.js +0 -54
  221. package/dist/global/data-tests.js +0 -22
  222. package/dist/global/dom.js +0 -124
  223. package/dist/global/focus-sensor-hoc.js +0 -147
  224. package/dist/global/fuzzy-highlight.js +0 -67
  225. package/dist/global/get-event-key.js +0 -111
  226. package/dist/global/get-uid.js +0 -15
  227. package/dist/global/inject-styles.js +0 -17
  228. package/dist/global/linear-function.js +0 -18
  229. package/dist/global/listeners.js +0 -42
  230. package/dist/global/memoize.js +0 -18
  231. package/dist/global/normalize-indent.js +0 -28
  232. package/dist/global/promise-with-timeout.js +0 -13
  233. package/dist/global/radial-gradient-mask.js +0 -49
  234. package/dist/global/react-dom-renderer.js +0 -45
  235. package/dist/global/rerender-hoc.js +0 -53
  236. package/dist/global/ring-angular-component.js +0 -24
  237. package/dist/global/schedule-raf.js +0 -31
  238. package/dist/global/sniffer.js +0 -6
  239. package/dist/global/supports-css.js +0 -20
  240. package/dist/global/theme.js +0 -56
  241. package/dist/global/trivial-template-tag.js +0 -15
  242. package/dist/global/url.js +0 -163
  243. package/dist/global/variables_dark.js +0 -57
  244. package/dist/grid/col.js +0 -62
  245. package/dist/grid/grid.js +0 -35
  246. package/dist/grid/row.js +0 -66
  247. package/dist/group/group.js +0 -34
  248. package/dist/header/header.js +0 -144
  249. package/dist/header/logo.js +0 -39
  250. package/dist/header/profile.js +0 -212
  251. package/dist/header/services-link.js +0 -10
  252. package/dist/header/services.js +0 -135
  253. package/dist/header/smart-profile.js +0 -227
  254. package/dist/header/smart-services.js +0 -159
  255. package/dist/header/tray-icon.js +0 -45
  256. package/dist/header/tray.js +0 -33
  257. package/dist/heading/heading.js +0 -76
  258. package/dist/http/http.js +0 -216
  259. package/dist/http/http.mock.js +0 -65
  260. package/dist/hub-source/hub-source.js +0 -130
  261. package/dist/hub-source/hub-source__user.js +0 -28
  262. package/dist/hub-source/hub-source__users-groups.js +0 -62
  263. package/dist/icon/icon.js +0 -105
  264. package/dist/icon/icon__constants.js +0 -33
  265. package/dist/icon/icon__svg.js +0 -6
  266. package/dist/icon/index.js +0 -9
  267. package/dist/input/input.js +0 -231
  268. package/dist/island/adaptive-island-hoc.js +0 -48
  269. package/dist/island/content.js +0 -158
  270. package/dist/island/header.js +0 -85
  271. package/dist/island/island.js +0 -53
  272. package/dist/island-legacy/content-legacy.js +0 -28
  273. package/dist/island-legacy/header-legacy.js +0 -30
  274. package/dist/island-legacy/island-legacy.js +0 -30
  275. package/dist/link/clickableLink.js +0 -65
  276. package/dist/link/link.js +0 -118
  277. package/dist/list/consts.js +0 -26
  278. package/dist/list/list.js +0 -800
  279. package/dist/list/list__custom.js +0 -82
  280. package/dist/list/list__hint.js +0 -26
  281. package/dist/list/list__item.js +0 -197
  282. package/dist/list/list__link.js +0 -65
  283. package/dist/list/list__separator.js +0 -30
  284. package/dist/list/list__title.js +0 -39
  285. package/dist/list/list__users-groups-source.js +0 -124
  286. package/dist/loader/loader.js +0 -72
  287. package/dist/loader/loader__core.js +0 -272
  288. package/dist/loader-inline/inject-styles.js +0 -11
  289. package/dist/loader-inline/loader-inline.js +0 -58
  290. package/dist/loader-screen/loader-screen.js +0 -46
  291. package/dist/login-dialog/login-dialog.js +0 -184
  292. package/dist/login-dialog/service.js +0 -67
  293. package/dist/message/message.js +0 -232
  294. package/dist/old-browsers-message/old-browsers-message.js +0 -101
  295. package/dist/old-browsers-message/old-browsers-message__stop.js +0 -5
  296. package/dist/old-browsers-message/white-list.js +0 -34
  297. package/dist/pager/pager.js +0 -352
  298. package/dist/panel/panel.js +0 -34
  299. package/dist/permissions/permissions.js +0 -200
  300. package/dist/permissions/permissions__cache.js +0 -272
  301. package/dist/popup/popup.consts.js +0 -41
  302. package/dist/popup/popup.js +0 -389
  303. package/dist/popup/popup.target.js +0 -27
  304. package/dist/popup/position.js +0 -280
  305. package/dist/popup-menu/popup-menu.js +0 -108
  306. package/dist/progress-bar/progress-bar.js +0 -111
  307. package/dist/proxy-attrs/proxy-attrs.js +0 -19
  308. package/dist/query-assist/query-assist.js +0 -1023
  309. package/dist/query-assist/query-assist__suggestions.js +0 -43
  310. package/dist/radio/radio.js +0 -39
  311. package/dist/radio/radio__item.js +0 -82
  312. package/dist/select/select.js +0 -1335
  313. package/dist/select/select__filter.js +0 -49
  314. package/dist/select/select__popup.js +0 -541
  315. package/dist/shortcuts/core.js +0 -245
  316. package/dist/shortcuts/shortcut-title.js +0 -51
  317. package/dist/shortcuts/shortcuts-hoc.js +0 -43
  318. package/dist/shortcuts/shortcuts.js +0 -72
  319. package/dist/storage/storage.js +0 -55
  320. package/dist/storage/storage__fallback.js +0 -214
  321. package/dist/storage/storage__local.js +0 -150
  322. package/dist/style.css +0 -1
  323. package/dist/tab-trap/tab-trap.js +0 -178
  324. package/dist/table/cell.js +0 -25
  325. package/dist/table/disable-hover-hoc.js +0 -53
  326. package/dist/table/header-cell.js +0 -91
  327. package/dist/table/header.js +0 -189
  328. package/dist/table/multitable.js +0 -140
  329. package/dist/table/row-with-focus-sensor.js +0 -79
  330. package/dist/table/row.js +0 -270
  331. package/dist/table/selection-adapter.js +0 -14
  332. package/dist/table/selection-shortcuts-hoc.js +0 -212
  333. package/dist/table/selection.js +0 -221
  334. package/dist/table/smart-table.js +0 -113
  335. package/dist/table/table.js +0 -405
  336. package/dist/tabs/collapsible-more.js +0 -193
  337. package/dist/tabs/collapsible-tab.js +0 -90
  338. package/dist/tabs/collapsible-tabs.js +0 -361
  339. package/dist/tabs/custom-item.js +0 -13
  340. package/dist/tabs/dumb-tabs.js +0 -159
  341. package/dist/tabs/smart-tabs.js +0 -102
  342. package/dist/tabs/tab-link.js +0 -35
  343. package/dist/tabs/tab.js +0 -32
  344. package/dist/tabs/tabs.js +0 -65
  345. package/dist/tag/tag.js +0 -190
  346. package/dist/tags-input/tags-input.js +0 -474
  347. package/dist/tags-list/tags-list.js +0 -94
  348. package/dist/text/text.js +0 -38
  349. package/dist/toggle/toggle.js +0 -80
  350. package/dist/tooltip/tooltip.js +0 -205
  351. package/dist/user-card/card.js +0 -14
  352. package/dist/user-card/smart-user-card-tooltip.js +0 -112
  353. package/dist/user-card/tooltip.js +0 -91
  354. package/dist/user-card/user-card.js +0 -46
@@ -0,0 +1,136 @@
1
+ import React, {useMemo} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import getUID from '../global/get-uid';
5
+
6
+ const colorPairs = [
7
+ ['#60A800', '#D5CA00'],
8
+ ['#21D370', '#03E9E1'],
9
+ ['#3BA1FF', '#36E97D'],
10
+ ['#00C243', '#00FFFF'],
11
+ ['#4BE098', '#627FFF'],
12
+ ['#168BFA', '#26F7C7'],
13
+ ['#9D4CFF', '#39D3C3'],
14
+ ['#0A81F6', '#0ACFF6'],
15
+ ['#765AF8', '#5A91F8'],
16
+ ['#9E54FF', '#0ACFF6'],
17
+ ['#B345F1', '#669DFF'],
18
+ ['#765AF8', '#C059EE'],
19
+ ['#9039D0', '#C239D0'],
20
+ ['#9F2AFF', '#FD56FD'],
21
+ ['#AB3AF2', '#E40568'],
22
+ ['#9F2AFF', '#E9A80B'],
23
+ ['#D50F6B', '#E73AE8'],
24
+ ['#ED5502', '#E73AE8'],
25
+ ['#ED358C', '#DBED18'],
26
+ ['#ED358C', '#F9902E'],
27
+ ['#FF7500', '#FFCA00']
28
+ ];
29
+
30
+ const Sizes = {
31
+ 18: {
32
+ radius: 2,
33
+ text: {x: 9, y: 13},
34
+ fontSize: '11px',
35
+ textAnchor: 'middle'
36
+ },
37
+ 24: {
38
+ radius: 3,
39
+ text: {x: 2, y: 13},
40
+ fontSize: '11px',
41
+ underscore: {x: 3, y: 17}
42
+ },
43
+ 32: {
44
+ radius: 3,
45
+ text: {x: 3, y: 17},
46
+ fontSize: '13px',
47
+ letterSpacing: 1,
48
+ underscore: {x: 4, y: 22}
49
+ },
50
+ 40: {
51
+ radius: 3,
52
+ text: {x: 5, y: 19},
53
+ fontSize: '15px',
54
+ letterSpacing: 1,
55
+ underscore: {x: 6, y: 28}
56
+ }
57
+ };
58
+
59
+ const sizeKeys = Object.keys(Sizes).map(Number);
60
+
61
+ function extractLetters(name) {
62
+ const names = name.split(/[\s._]+/).filter(Boolean);
63
+ if (names.length >= 2) {
64
+ return names[0][0].toUpperCase() + names[1][0].toUpperCase();
65
+ } else if (names.length === 1) {
66
+ if (names[0].length >= 2) {
67
+ return names[0].slice(0, 2).toUpperCase();
68
+ } else {
69
+ return `${names[0][0].toUpperCase()}X`;
70
+ }
71
+ } else {
72
+ return 'XX';
73
+ }
74
+ }
75
+
76
+ // https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0#gistcomment-2775538
77
+ const BASE = 32;
78
+ function hashCode(s) {
79
+ let h = 0;
80
+ for (let i = 0; i < s.length; i++) {
81
+ h = Math.imul(BASE - 1, h) + s.charCodeAt(i) | 0;
82
+ }
83
+
84
+ return h;
85
+ }
86
+
87
+ export default function FallbackAvatar({username, size, round}) {
88
+ const hash = Math.abs(hashCode(username.toLowerCase()));
89
+ const [fromColor, toColor] = colorPairs[hash % colorPairs.length];
90
+ const possibleSizeKeys = sizeKeys.filter(key => key >= size);
91
+ const sizeKey = possibleSizeKeys.length > 0
92
+ ? Math.min(...possibleSizeKeys)
93
+ : Math.max(...sizeKeys);
94
+ const sizes = Sizes[sizeKey];
95
+ const radius = round ? '50%' : sizes.radius;
96
+ const gradientId = useMemo(() => getUID('gradient-'), []);
97
+ return (
98
+ <svg viewBox={`0 0 ${sizeKey} ${sizeKey}`} xmlns="http://www.w3.org/2000/svg">
99
+ <defs>
100
+ <linearGradient id={gradientId} x1="0" y1="0" x2="0" y2="1">
101
+ <stop stopColor={fromColor} offset="0"/>
102
+ <stop stopColor={toColor} offset="1"/>
103
+ </linearGradient>
104
+ </defs>
105
+ <g>
106
+ <rect
107
+ fill={`url(#${gradientId})`}
108
+ x="0"
109
+ y="0"
110
+ width={sizeKey}
111
+ height={sizeKey}
112
+ rx={radius}
113
+ ry={radius}
114
+ />
115
+ <text
116
+ x={sizes.text.x}
117
+ y={sizes.text.y}
118
+ fontFamily="Arial, Helvetica, sans-serif"
119
+ fontSize={sizes.fontSize}
120
+ letterSpacing={sizes.letterSpacing}
121
+ fill="#FFFFFF"
122
+ textAnchor={sizes.textAnchor}
123
+ >
124
+ <tspan>{extractLetters(username)}</tspan>
125
+ {sizes.underscore && <tspan x={sizes.underscore.x} y={sizes.underscore.y}>{'_'}</tspan>}
126
+ </text>
127
+ </g>
128
+ </svg>
129
+ );
130
+ }
131
+
132
+ FallbackAvatar.propTypes = {
133
+ username: PropTypes.string.isRequired,
134
+ size: PropTypes.number.isRequired,
135
+ round: PropTypes.bool
136
+ };
@@ -19,7 +19,7 @@
19
19
  width: 0;
20
20
  height: calc(unit * 5);
21
21
 
22
- content: '';
22
+ content: "";
23
23
  vertical-align: middle;
24
24
  }
25
25
  }
@@ -49,7 +49,7 @@
49
49
  width: 100%;
50
50
  height: 100%;
51
51
 
52
- content: '';
52
+ content: "";
53
53
 
54
54
  background-color: rgba(0, 0, 0, 0.8);
55
55
  }
@@ -6,6 +6,7 @@ import messageBundleNg from '../message-bundle-ng/message-bundle-ng';
6
6
  import alertService from '../alert-service/alert-service';
7
7
  import IconNG from '../icon-ng/icon-ng';
8
8
 
9
+ import template from './avatar-editor-ng__template';
9
10
  import './avatar-editor-ng.css';
10
11
 
11
12
  const angularModule = angular.module('Ring.avatar-editor', [messageBundleNg, IconNG]);
@@ -26,7 +27,7 @@ function rgAvatarEditor() {
26
27
  deleteLabel: '@',
27
28
  addMessage: '@'
28
29
  },
29
- template: require('./avatar-editor-ng.html'),
30
+ template,
30
31
  transclude: true,
31
32
  controller: [
32
33
  '$scope', '$attrs', 'RingMessageBundle',
@@ -1,4 +1,4 @@
1
- <div>
1
+ export default `<div>
2
2
  <div ng-click="!ngDisabled && controls.select()" class="ring-avatar-editor__frame" ng-class="{
3
3
  'ring-avatar-editor_controlled': controlled,
4
4
  'ring-avatar-editor': !ngDisabled
@@ -25,4 +25,4 @@
25
25
  >
26
26
  <span translate>{{ getDeleteLabel() }}</span>
27
27
  </rg-button>
28
- </div>
28
+ </div>`;
@@ -451,7 +451,7 @@
451
451
  width: calc(100% + loaderWidth);
452
452
  height: 100%;
453
453
 
454
- content: '';
454
+ content: "";
455
455
  animation: progress 1s linear infinite;
456
456
 
457
457
  background-repeat: repeat;
@@ -460,7 +460,7 @@
460
460
  }
461
461
 
462
462
  .delayed .content::after {
463
- content: '';
463
+ content: "";
464
464
  }
465
465
 
466
466
  .short {
@@ -1,5 +1,5 @@
1
1
  import 'focus-visible';
2
- import React, {PureComponent} from 'react';
2
+ import React, {createRef, PureComponent} from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import classNames from 'classnames';
5
5
  import chevronDown from '@jetbrains/icons/chevron-10px';
@@ -47,6 +47,8 @@ class Button extends PureComponent {
47
47
  static IconSize = Size;
48
48
  static Theme = Theme;
49
49
 
50
+ buttonRef = createRef();
51
+
50
52
  render() {
51
53
  const {
52
54
  // Modifiers
@@ -102,6 +104,7 @@ class Button extends PureComponent {
102
104
  const Tag = isLink ? ClickableLink : 'button';
103
105
  return (
104
106
  <Tag
107
+ ref={this.buttonRef}
105
108
  tabIndex={loader ? -1 : 0}
106
109
  type={isLink ? null : 'button'}
107
110
  {...props}
@@ -12,7 +12,7 @@ export default class ButtonGroup extends PureComponent {
12
12
  static propTypes = {
13
13
  children: PropTypes.node,
14
14
  className: PropTypes.string
15
- }
15
+ };
16
16
 
17
17
  render() {
18
18
  const {className} = this.props;
@@ -7,7 +7,7 @@ import styles from './button-group.css';
7
7
  export default class Caption extends PureComponent {
8
8
  static propTypes = {
9
9
  className: PropTypes.node
10
- }
10
+ };
11
11
 
12
12
  render() {
13
13
  const {className} = this.props;
@@ -166,7 +166,7 @@ class ButtonController extends RingAngularComponent {
166
166
  }
167
167
 
168
168
  $compile(icon)($scope);
169
- }
169
+ };
170
170
  }
171
171
 
172
172
  function changeTheme(element, data) {
@@ -3,6 +3,8 @@
3
3
  */
4
4
  import angular from 'angular';
5
5
 
6
+ import buttonSetStyles from '../button-set/button-set.css';
7
+
6
8
  const angularModule = angular.module('Ring.button-set', []);
7
9
 
8
10
  function rgButtonSet() {
@@ -11,7 +13,7 @@ function rgButtonSet() {
11
13
  replace: true,
12
14
  scope: false,
13
15
  transclude: true,
14
- template: require('./button-set-ng.html')
16
+ template: `<div class="${buttonSetStyles.buttonSet}" ng-transclude></div>`
15
17
  };
16
18
  }
17
19
 
@@ -89,7 +89,7 @@
89
89
  /* stylelint-disable-next-line selector-max-specificity */
90
90
  &:checked + .cell,
91
91
  &:indeterminate[checked] + .cell,
92
- &:indeterminate[data-checked=true] + .cell {
92
+ &:indeterminate[data-checked="true"] + .cell {
93
93
  border-color: var(--ring-border-hover-color);
94
94
  background-color: var(--ring-selected-background-color);
95
95
  }
@@ -14,7 +14,7 @@ function noop() {}
14
14
 
15
15
  const registerLanguage = memoize(async language => {
16
16
  const languageExports = await import(
17
- /* webpackChunkName: "highlight-[request]", webpackPrefetch: true */
17
+ /* webpackChunkName: "highlight-[request]" */
18
18
  `highlight.js/lib/languages/${language}`
19
19
  );
20
20
  highlight.registerLanguage(language, languageExports.default);
@@ -64,6 +64,7 @@ export default class Confirm extends PureComponent {
64
64
 
65
65
  return (
66
66
  <Dialog
67
+ label={text || description}
67
68
  className={className}
68
69
  onEscPress={this.onEscPress}
69
70
  show={show}
@@ -38,20 +38,20 @@ export default function confirm({
38
38
  renderConfirm({...props, inProgress: true});
39
39
  return Promise.resolve(onBeforeConfirm()).
40
40
  then(() => {
41
- renderConfirm({show: false});
41
+ renderConfirm({...props, show: false});
42
42
  resolve();
43
43
  }).
44
44
  catch(err => {
45
- renderConfirm({show: false});
45
+ renderConfirm({...props, show: false});
46
46
  reject(err);
47
47
  });
48
48
  }
49
- renderConfirm({show: false});
49
+ renderConfirm({...props, show: false});
50
50
  return resolve();
51
51
  },
52
52
 
53
53
  onReject: () => {
54
- renderConfirm({show: false});
54
+ renderConfirm({...props, show: false});
55
55
  reject(new Error('Confirm(@jetbrains/ring-ui): null exception'));
56
56
  }
57
57
  };
@@ -61,5 +61,5 @@ export default function confirm({
61
61
  }
62
62
 
63
63
  export function hideConfirm() {
64
- renderConfirm({show: false});
64
+ renderConfirm({text: '', show: false});
65
65
  }
@@ -1,6 +1,6 @@
1
1
  @import "../global/variables.css";
2
2
 
3
- @value unit, extra-small-screen-media, small-screen-media from '../global/global.css';
3
+ @value unit, extra-small-screen-media, small-screen-media from "../global/global.css";
4
4
  @value sidebarWidth: calc(unit * 30);
5
5
 
6
6
  .contentLayout {
@@ -1,7 +1,7 @@
1
1
  @import "../global/variables.css";
2
2
 
3
3
  @value unit from "../global/global.css";
4
- @value height, compensate from '../table/table.css';
4
+ @value height, compensate from "../table/table.css";
5
5
 
6
6
  .dataListWrapper {
7
7
  position: relative;
@@ -25,7 +25,8 @@ export default class DateInput extends React.PureComponent {
25
25
  onInput: PropTypes.func,
26
26
  onActivate: PropTypes.func,
27
27
  onConfirm: PropTypes.func,
28
- onClear: PropTypes.func
28
+ onClear: PropTypes.func,
29
+ locale: PropTypes.object
29
30
  };
30
31
 
31
32
  static defaultProps = {
@@ -78,16 +79,16 @@ export default class DateInput extends React.PureComponent {
78
79
  time, name, hoverDate,
79
80
  date, displayFormat, translations,
80
81
  onActivate, onClear,
81
- fromPlaceholder, toPlaceholder, timePlaceholder
82
+ fromPlaceholder, toPlaceholder, timePlaceholder, locale
82
83
  } = this.props;
83
84
 
84
85
  let displayText = '';
85
86
  if (active && hoverDate) {
86
- displayText = displayFormat(hoverDate);
87
+ displayText = displayFormat(hoverDate, locale);
87
88
  } else if (active && text != null) {
88
89
  displayText = text;
89
90
  } else if (date) {
90
- displayText = displayFormat(date);
91
+ displayText = displayFormat(date, locale);
91
92
  } else if (name === 'time') {
92
93
  displayText = time || '';
93
94
  }
@@ -96,7 +96,7 @@
96
96
  position: absolute;
97
97
  right: unit;
98
98
 
99
- content: '';
99
+ content: "";
100
100
 
101
101
  line-height: calc(4 * unit - 2px);
102
102
  }
@@ -123,7 +123,7 @@
123
123
  position: absolute;
124
124
  left: calc(-1 * unit);
125
125
 
126
- content: ',';
126
+ content: ",";
127
127
 
128
128
  line-height: calc(4 * unit - 3px);
129
129
  }
@@ -136,7 +136,7 @@
136
136
  color: var(--ring-secondary-color);
137
137
  }
138
138
 
139
- .weekday {
139
+ .weekday.weekday {
140
140
  display: inline-block;
141
141
 
142
142
  width: cellSize;
@@ -145,7 +145,7 @@
145
145
  text-transform: capitalize;
146
146
  }
147
147
 
148
- .weekend {
148
+ .weekend.weekend {
149
149
  color: var(--ring-error-color);
150
150
  }
151
151
 
@@ -160,7 +160,7 @@
160
160
  box-shadow: 0 -1px var(--ring-line-color);
161
161
  }
162
162
 
163
- .months {
163
+ .months.months {
164
164
  position: absolute;
165
165
  top: 0;
166
166
  right: yearWidth;
@@ -173,7 +173,7 @@
173
173
  left: 0;
174
174
  }
175
175
 
176
- .month {
176
+ .month.month {
177
177
  display: flex;
178
178
  flex-wrap: wrap;
179
179
 
@@ -181,7 +181,7 @@
181
181
  margin: calc(unit * 2);
182
182
  }
183
183
 
184
- .month > * {
184
+ .month.month > * {
185
185
  flex-shrink: 0;
186
186
 
187
187
  height: cellSize;
@@ -198,6 +198,8 @@
198
198
 
199
199
  text-align: left;
200
200
 
201
+ text-transform: capitalize;
202
+
201
203
  font-weight: bold;
202
204
 
203
205
  @supports (flex-basis: 1px) {
@@ -209,7 +211,9 @@
209
211
 
210
212
  .day {
211
213
  composes: resetButton;
214
+ }
212
215
 
216
+ .day.day {
213
217
  position: relative;
214
218
 
215
219
  flex-basis: cellSize;
@@ -226,25 +230,25 @@
226
230
  }
227
231
  }
228
232
 
229
- .between {
233
+ .between.between {
230
234
  transition: none;
231
235
 
232
236
  background-color: var(--ring-selected-background-color);
233
237
  }
234
238
 
235
- .activeBetween {
239
+ .activeBetween.activeBetween {
236
240
  transition: none;
237
241
 
238
242
  background-color: var(--ring-date-picker-hover-color);
239
243
  }
240
244
 
241
- .current {
245
+ .current.current {
242
246
  color: var(--ring-dark-text-color);
243
247
  border-radius: var(--ring-border-radius);
244
248
  background-color: var(--ring-main-color);
245
249
  }
246
250
 
247
- .active {
251
+ .active.active {
248
252
  transition: none;
249
253
 
250
254
  color: var(--ring-link-hover-color);
@@ -252,17 +256,17 @@
252
256
  background-color: var(--ring-date-picker-hover-color);
253
257
  }
254
258
 
255
- .disabled {
259
+ .disabled.disabled {
256
260
  cursor: not-allowed;
257
261
 
258
262
  color: var(--ring-disabled-color);
259
263
  }
260
264
 
261
- .from {
265
+ .from.from {
262
266
  border-radius: var(--ring-border-radius) 0 0 var(--ring-border-radius);
263
267
  }
264
268
 
265
- .to {
269
+ .to.to {
266
270
  border-radius: 0 var(--ring-border-radius) var(--ring-border-radius) 0;
267
271
  }
268
272
 
@@ -280,7 +284,7 @@
280
284
  width: calc(unit * 2);
281
285
  height: 100%;
282
286
 
283
- content: '';
287
+ content: "";
284
288
  transition: background-color var(--ring-ease);
285
289
  }
286
290
 
@@ -323,7 +327,7 @@
323
327
  width: calc(unit * 23);
324
328
  height: calc(unit * 8);
325
329
 
326
- content: '';
330
+ content: "";
327
331
  transition: background-color var(--ring-ease);
328
332
  }
329
333
 
@@ -355,7 +359,7 @@
355
359
  width: calc(unit * 2);
356
360
  height: 100%;
357
361
 
358
- content: '';
362
+ content: "";
359
363
  transition: background-color var(--ring-ease);
360
364
  }
361
365
  }
@@ -390,13 +394,13 @@
390
394
  }
391
395
  }
392
396
 
393
- .empty {
397
+ .empty.empty {
394
398
  pointer-events: none;
395
399
 
396
400
  opacity: 0;
397
401
  }
398
402
 
399
- .today {
403
+ .today.today {
400
404
  position: relative;
401
405
 
402
406
  font-weight: bold;
@@ -407,7 +411,7 @@
407
411
  top: 0;
408
412
  left: calc(unit * 0.5);
409
413
 
410
- content: '';
414
+ content: "";
411
415
 
412
416
  font-size: var(--ring-font-size-smaller);
413
417
  }
@@ -441,7 +445,9 @@
441
445
  .monthName {
442
446
  composes: hoverable;
443
447
  composes: resetButton;
448
+ }
444
449
 
450
+ .monthName.monthName {
445
451
  position: relative;
446
452
 
447
453
  width: 100%;
@@ -449,12 +455,16 @@
449
455
  height: cellSize;
450
456
  padding-left: calc(unit * 1.5);
451
457
 
458
+ text-transform: capitalize;
459
+
452
460
  line-height: cellSize;
453
461
  }
454
462
 
455
463
  .monthSlider {
456
464
  composes: resetButton;
465
+ }
457
466
 
467
+ .monthSlider.monthSlider {
458
468
  position: absolute;
459
469
  z-index: var(--ring-fixed-z-index);
460
470
  right: 0;
@@ -474,7 +484,7 @@
474
484
  opacity: 0.3;
475
485
  }
476
486
 
477
- .dragging.dragging {
487
+ .dragging {
478
488
  cursor: grabbing;
479
489
 
480
490
  opacity: 0.35;
@@ -505,7 +515,9 @@
505
515
  .year {
506
516
  composes: hoverable;
507
517
  composes: resetButton;
518
+ }
508
519
 
520
+ .year.year {
509
521
  position: relative;
510
522
 
511
523
  width: 100%;
@@ -519,7 +531,7 @@
519
531
  line-height: yearHeight;
520
532
  }
521
533
 
522
- .currentYear {
534
+ .currentYear.currentYear {
523
535
  cursor: auto;
524
536
  transition: none;
525
537
 
@@ -90,7 +90,8 @@ export default class DatePicker extends PureComponent {
90
90
  disabled: PropTypes.bool,
91
91
  minDate: dateType,
92
92
  maxDate: dateType,
93
- translations: PropTypes.object
93
+ translations: PropTypes.object,
94
+ locale: PropTypes.object
94
95
  };
95
96
 
96
97
  static defaultProps = {
@@ -101,10 +102,10 @@ export default class DatePicker extends PureComponent {
101
102
  from: null,
102
103
  to: null,
103
104
  clear: false,
104
- displayFormat: date => (date ? formatDate(date, 'd MMM yyyy') : ''),
105
- displayMonthFormat: date => (date ? formatDate(date, 'd MMM') : ''),
106
- displayDayFormat: date => (date ? formatDate(date, 'd') : ''),
107
- displayTimeFormat: date => (date ? formatDate(date, 'HH:mm') : ''),
105
+ displayFormat: (date, locale) => (date ? formatDate(date, 'd MMM yyyy', {locale}) : ''),
106
+ displayMonthFormat: (date, locale) => (date ? formatDate(date, 'd MMM', {locale}) : ''),
107
+ displayDayFormat: (date, locale) => (date ? formatDate(date, 'd', {locale}) : ''),
108
+ displayTimeFormat: (date, locale) => (date ? formatDate(date, 'HH:mm', {locale}) : ''),
108
109
  datePlaceholder: 'Set a date',
109
110
  dateTimePlaceholder: 'Set date and time',
110
111
  rangePlaceholder: 'Set a period',
@@ -194,7 +195,8 @@ export default class DatePicker extends PureComponent {
194
195
  displayFormat,
195
196
  displayMonthFormat,
196
197
  displayDayFormat,
197
- translations
198
+ translations,
199
+ locale
198
200
  } = this.props;
199
201
 
200
202
  const date = this.parse(this.props.date);
@@ -204,27 +206,27 @@ export default class DatePicker extends PureComponent {
204
206
 
205
207
  let text;
206
208
  if (!range && !withTime) {
207
- text = date ? displayFormat(date) : datePlaceholder || translations.setDate;
209
+ text = date ? displayFormat(date, locale) : datePlaceholder || translations.setDate;
208
210
  } else if (!range && withTime) {
209
211
  if (!date && !time) {
210
212
  text = dateTimePlaceholder || translations.setDateTime;
211
213
  } else {
212
- text = `${date && displayFormat(date) || '—'}, ${time || '—'}`;
214
+ text = `${date && displayFormat(date, locale) || '—'}, ${time || '—'}`;
213
215
  }
214
216
  } else if (!from && !to) {
215
217
  text = rangePlaceholder || translations.setPeriod;
216
218
  } else if (!to) {
217
- text = `${displayFormat(from)} —`;
219
+ text = `${displayFormat(from, locale)} —`;
218
220
  } else if (!from) {
219
- text = `— ${displayFormat(to)}`;
221
+ text = `— ${displayFormat(to, locale)}`;
220
222
  } else if (!isSameYear(from, to)) {
221
- text = `${displayFormat(from)} — ${displayFormat(to)}`;
223
+ text = `${displayFormat(from, locale)} — ${displayFormat(to, locale)}`;
222
224
  } else if (!isSameMonth(from, to)) {
223
- text = `${displayMonthFormat(from)} — ${displayFormat(to)}`;
225
+ text = `${displayMonthFormat(from, locale)} — ${displayFormat(to, locale)}`;
224
226
  } else if (!isSameDay(from, to)) {
225
- text = `${displayDayFormat(from)} — ${displayFormat(to)}`;
227
+ text = `${displayDayFormat(from, locale)} — ${displayFormat(to, locale)}`;
226
228
  } else {
227
- text = `${displayFormat(to)}`;
229
+ text = `${displayFormat(to, locale)}`;
228
230
  }
229
231
 
230
232
  return text;