@jetbrains/ring-ui 7.0.0-beta.8 → 7.0.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 (256) hide show
  1. package/babel.config.js +20 -14
  2. package/components/alert/alert.css +7 -7
  3. package/components/alert/alert.d.ts +2 -2
  4. package/components/alert/alert.js +10 -12
  5. package/components/alert/container.js +1 -1
  6. package/components/alert-service/alert-service.js +4 -2
  7. package/components/analytics/analytics__custom-plugin.js +1 -1
  8. package/components/auth/auth.js +1 -1
  9. package/components/auth/auth__core.js +36 -36
  10. package/components/auth/background-flow.js +2 -2
  11. package/components/auth/down-notification.js +3 -1
  12. package/components/auth/iframe-flow.js +4 -2
  13. package/components/auth/request-builder.js +5 -5
  14. package/components/auth/storage.js +10 -9
  15. package/components/auth/token-validator.js +8 -15
  16. package/components/auth-dialog/auth-dialog.js +8 -8
  17. package/components/auth-dialog-service/auth-dialog-service.js +4 -4
  18. package/components/avatar/avatar.js +9 -7
  19. package/components/avatar/fallback-avatar.js +15 -12
  20. package/components/button/button.css +36 -25
  21. package/components/button/button.js +9 -9
  22. package/components/button/button__classes.d.ts +1 -1
  23. package/components/button/button__classes.js +3 -4
  24. package/components/button-group/button-group.css +25 -13
  25. package/components/button-group/caption.js +1 -1
  26. package/components/button-toolbar/button-toolbar.d.ts +1 -1
  27. package/components/button-toolbar/button-toolbar.js +2 -2
  28. package/components/caret/caret.js +8 -8
  29. package/components/checkbox/checkbox.css +8 -5
  30. package/components/checkbox/checkbox.js +1 -1
  31. package/components/clipboard/clipboard-fallback.js +2 -6
  32. package/components/clipboard/clipboard.js +5 -5
  33. package/components/code/code.d.ts +1 -1
  34. package/components/code/code.js +2 -2
  35. package/components/code/highlight.css +3 -1
  36. package/components/collapse/collapse-content.d.ts +1 -2
  37. package/components/collapse/collapse-content.js +25 -14
  38. package/components/collapse/collapse-context.js +1 -1
  39. package/components/collapse/collapse-control.js +5 -3
  40. package/components/collapse/collapse.css +21 -20
  41. package/components/collapse/collapse.js +2 -2
  42. package/components/confirm/confirm.d.ts +2 -2
  43. package/components/confirm/confirm.js +2 -2
  44. package/components/confirm-service/confirm-service.d.ts +1 -1
  45. package/components/confirm-service/confirm-service.js +6 -6
  46. package/components/content-layout/content-layout.css +6 -5
  47. package/components/content-layout/content-layout.js +7 -6
  48. package/components/content-layout/sidebar.js +5 -5
  49. package/components/contenteditable/contenteditable.d.ts +1 -1
  50. package/components/contenteditable/contenteditable.js +3 -4
  51. package/components/control-label/control-label.js +5 -3
  52. package/components/data-list/data-list.css +3 -3
  53. package/components/data-list/data-list.d.ts +2 -2
  54. package/components/data-list/data-list.js +6 -7
  55. package/components/data-list/data-list.mock.js +57 -47
  56. package/components/data-list/item.js +14 -16
  57. package/components/data-list/selection.js +5 -7
  58. package/components/data-list/title.js +5 -6
  59. package/components/date-picker/consts.js +2 -2
  60. package/components/date-picker/date-input.js +4 -4
  61. package/components/date-picker/date-picker.css +23 -18
  62. package/components/date-picker/date-picker.d.ts +2 -1
  63. package/components/date-picker/date-picker.js +13 -19
  64. package/components/date-picker/date-popup.js +30 -36
  65. package/components/date-picker/day.js +6 -9
  66. package/components/date-picker/formats.js +647 -1
  67. package/components/date-picker/month-names.js +6 -8
  68. package/components/date-picker/month-slider.js +2 -2
  69. package/components/date-picker/month.js +1 -3
  70. package/components/date-picker/months.js +2 -6
  71. package/components/date-picker/weekdays.js +2 -3
  72. package/components/date-picker/years.js +3 -3
  73. package/components/dialog/dialog.d.ts +1 -0
  74. package/components/dialog/dialog.js +20 -13
  75. package/components/dialog/dialog__body-scroll-preventer.js +1 -1
  76. package/components/dropdown/dropdown.css +2 -4
  77. package/components/dropdown/dropdown.d.ts +2 -2
  78. package/components/dropdown/dropdown.js +5 -5
  79. package/components/dropdown-menu/dropdown-menu.js +5 -5
  80. package/components/editable-heading/editable-heading.css +5 -2
  81. package/components/editable-heading/editable-heading.js +21 -19
  82. package/components/error-bubble/error-bubble.js +1 -1
  83. package/components/error-message/error-message.js +2 -4
  84. package/components/footer/footer.js +11 -15
  85. package/components/form/form.stories.js +45 -63
  86. package/components/global/create-stateful-context.js +2 -4
  87. package/components/global/data-tests.js +5 -6
  88. package/components/global/dom.js +8 -11
  89. package/components/global/focus-sensor-hoc.js +5 -6
  90. package/components/global/fuzzy-highlight.js +1 -1
  91. package/components/global/get-event-key.js +2 -2
  92. package/components/global/global.css +0 -3
  93. package/components/global/linear-function.js +1 -1
  94. package/components/global/normalize-indent.js +2 -6
  95. package/components/global/react-dom-renderer.js +2 -3
  96. package/components/global/theme.d.ts +4 -2
  97. package/components/global/theme.js +14 -12
  98. package/components/global/url.js +8 -8
  99. package/components/global/variables.css +1 -8
  100. package/components/global/variables_dark.css +0 -1
  101. package/components/grid/col.js +6 -6
  102. package/components/grid/grid.css +174 -173
  103. package/components/grid/grid.js +1 -1
  104. package/components/grid/row.js +13 -6
  105. package/components/group/group.js +1 -1
  106. package/components/header/header-icon.js +2 -2
  107. package/components/header/header.css +19 -15
  108. package/components/header/header.js +3 -5
  109. package/components/header/links.js +1 -1
  110. package/components/header/logo.js +1 -1
  111. package/components/header/profile.d.ts +2 -2
  112. package/components/header/profile.js +9 -9
  113. package/components/header/services-link.js +1 -1
  114. package/components/header/services.js +4 -5
  115. package/components/header/smart-profile.js +4 -3
  116. package/components/header/smart-services.js +9 -5
  117. package/components/header/tray.js +1 -1
  118. package/components/heading/heading.css +0 -1
  119. package/components/heading/heading.js +2 -2
  120. package/components/http/http.d.ts +3 -3
  121. package/components/http/http.js +25 -29
  122. package/components/http/http.mock.js +9 -6
  123. package/components/hub-source/hub-source.js +5 -7
  124. package/components/hub-source/hub-source__user.js +1 -1
  125. package/components/hub-source/hub-source__users-groups.js +6 -7
  126. package/components/i18n/README.md +3 -4
  127. package/components/i18n/i18n-context.js +2 -4
  128. package/components/icon/icon.css +1 -1
  129. package/components/icon/icon.js +7 -9
  130. package/components/icon/icon__svg.js +6 -6
  131. package/components/input/input.css +1 -1
  132. package/components/input/input.js +11 -14
  133. package/components/input-size/input-size.stories.js +42 -22
  134. package/components/island/adaptive-island-hoc.js +1 -1
  135. package/components/island/content.js +4 -6
  136. package/components/island/header.js +8 -10
  137. package/components/island/island.css +5 -5
  138. package/components/island/island.js +1 -1
  139. package/components/link/clickableLink.js +3 -1
  140. package/components/link/link.js +5 -3
  141. package/components/list/consts.js +1 -1
  142. package/components/list/list.d.ts +1 -1
  143. package/components/list/list.js +35 -57
  144. package/components/list/list__custom.js +3 -5
  145. package/components/list/list__hint.js +3 -1
  146. package/components/list/list__item.js +11 -9
  147. package/components/list/list__link.js +1 -1
  148. package/components/list/list__separator.js +2 -2
  149. package/components/list/list__title.js +7 -3
  150. package/components/list/list__users-groups-source.js +6 -8
  151. package/components/loader/loader.js +1 -1
  152. package/components/loader/loader__core.js +5 -5
  153. package/components/loader-inline/loader-inline.css +0 -3
  154. package/components/loader-inline/loader-inline.js +5 -7
  155. package/components/loader-screen/loader-screen.js +1 -1
  156. package/components/login-dialog/login-dialog.js +4 -4
  157. package/components/login-dialog/service.js +5 -5
  158. package/components/markdown/markdown.css +6 -6
  159. package/components/markdown/markdown.d.ts +2 -2
  160. package/components/markdown/markdown.js +4 -6
  161. package/components/message/message.css +2 -1
  162. package/components/message/message.js +30 -21
  163. package/components/old-browsers-message/old-browsers-message.js +2 -2
  164. package/components/old-browsers-message/white-list.js +2 -3
  165. package/components/pager/pager.js +28 -29
  166. package/components/permissions/permissions.js +8 -13
  167. package/components/permissions/permissions__cache.js +6 -7
  168. package/components/popup/popup.consts.js +8 -2
  169. package/components/popup/popup.js +27 -33
  170. package/components/popup/popup.target.js +4 -4
  171. package/components/popup/position.js +21 -28
  172. package/components/popup-menu/popup-menu.js +1 -1
  173. package/components/progress-bar/progress-bar.css +10 -8
  174. package/components/progress-bar/progress-bar.d.ts +2 -2
  175. package/components/progress-bar/progress-bar.js +2 -2
  176. package/components/query-assist/query-assist.css +0 -3
  177. package/components/query-assist/query-assist.js +73 -84
  178. package/components/query-assist/query-assist__suggestions.js +10 -9
  179. package/components/radio/radio.css +6 -2
  180. package/components/radio/radio.js +1 -3
  181. package/components/scrollable-section/scrollable-section.css +5 -6
  182. package/components/scrollable-section/scrollable-section.js +1 -1
  183. package/components/select/select.css +5 -7
  184. package/components/select/select.d.ts +1 -1
  185. package/components/select/select.js +96 -110
  186. package/components/select/select__filter.js +1 -1
  187. package/components/select/select__popup.js +40 -51
  188. package/components/shortcuts/core.js +8 -6
  189. package/components/shortcuts/shortcut-title.js +6 -6
  190. package/components/shortcuts/shortcuts.js +1 -1
  191. package/components/sidebar/sidebar.css +3 -1
  192. package/components/slider/slider.css +14 -14
  193. package/components/slider/slider.js +7 -7
  194. package/components/tab-trap/tab-trap.js +7 -9
  195. package/components/table/cell.js +3 -1
  196. package/components/table/disable-hover-hoc.js +2 -2
  197. package/components/table/header-cell.js +5 -3
  198. package/components/table/header.d.ts +2 -10
  199. package/components/table/header.js +10 -12
  200. package/components/table/multitable.js +5 -3
  201. package/components/table/row.d.ts +0 -1
  202. package/components/table/row.js +20 -27
  203. package/components/table/selection-adapter.js +1 -1
  204. package/components/table/selection-shortcuts-hoc.js +2 -2
  205. package/components/table/selection.d.ts +2 -3
  206. package/components/table/selection.js +4 -5
  207. package/components/table/simple-table.js +4 -4
  208. package/components/table/smart-table.js +5 -5
  209. package/components/table/table.css +8 -9
  210. package/components/table/table.d.ts +0 -1
  211. package/components/table/table.js +22 -23
  212. package/components/table/table.stories.json +45 -16
  213. package/components/tabs/collapsible-more.d.ts +1 -1
  214. package/components/tabs/collapsible-more.js +13 -16
  215. package/components/tabs/collapsible-tab.js +2 -2
  216. package/components/tabs/collapsible-tabs.d.ts +2 -2
  217. package/components/tabs/collapsible-tabs.js +13 -22
  218. package/components/tabs/dumb-tabs.js +6 -9
  219. package/components/tabs/smart-tabs.js +4 -4
  220. package/components/tabs/tab-link.js +1 -3
  221. package/components/tabs/tabs.css +7 -9
  222. package/components/tag/tag.css +7 -7
  223. package/components/tag/tag.d.ts +1 -1
  224. package/components/tag/tag.js +9 -12
  225. package/components/tags-input/tags-input.js +15 -19
  226. package/components/tags-list/tags-list.d.ts +2 -2
  227. package/components/tags-list/tags-list.js +6 -5
  228. package/components/text/text.js +5 -3
  229. package/components/toggle/toggle.css +12 -10
  230. package/components/toggle/toggle.d.ts +2 -2
  231. package/components/toggle/toggle.js +4 -3
  232. package/components/tooltip/tooltip.d.ts +4 -1
  233. package/components/tooltip/tooltip.js +19 -10
  234. package/components/user-agreement/service.js +15 -13
  235. package/components/user-agreement/user-agreement.js +3 -5
  236. package/components/user-card/card.js +10 -9
  237. package/components/user-card/smart-user-card-tooltip.js +5 -7
  238. package/components/user-card/tooltip.js +4 -4
  239. package/components/user-card/user-card.css +4 -0
  240. package/jslint-xml.js +20 -19
  241. package/package.json +66 -58
  242. package/postcss.config.js +3 -4
  243. package/typings.d.ts +2 -4
  244. package/webpack.config.js +20 -25
  245. package/components/badge/badge.css +0 -42
  246. package/components/badge/badge.d.ts +0 -14
  247. package/components/badge/badge.js +0 -29
  248. package/components/island-legacy/content-legacy.d.ts +0 -5
  249. package/components/island-legacy/content-legacy.js +0 -12
  250. package/components/island-legacy/header-legacy.d.ts +0 -5
  251. package/components/island-legacy/header-legacy.js +0 -14
  252. package/components/island-legacy/island-legacy.css +0 -98
  253. package/components/island-legacy/island-legacy.d.ts +0 -7
  254. package/components/island-legacy/island-legacy.js +0 -14
  255. package/components/table-legacy/table-legacy.css +0 -346
  256. package/components/table-legacy/table-legacy__toolbar.css +0 -25
@@ -1,10 +1,11 @@
1
- import { Component, createContext } from 'react';
2
1
  import * as React from 'react';
2
+ import { Component, createContext } from 'react';
3
3
  import classNames from 'classnames';
4
4
  import Popup from '../popup/popup';
5
5
  import { Listeners } from '../global/dom';
6
6
  import dataTests from '../global/data-tests';
7
7
  import scheduleRAF from '../global/schedule-raf';
8
+ import Theme, { ThemeProvider } from '../global/theme';
8
9
  import styles from './tooltip.css';
9
10
  const scheduleScroll = scheduleRAF();
10
11
  const TooltipContext = createContext(undefined);
@@ -15,11 +16,12 @@ export default class Tooltip extends Component {
15
16
  static defaultProps = {
16
17
  title: '',
17
18
  selfOverflowOnly: false,
18
- popupProps: {}
19
+ theme: Theme.DARK,
20
+ popupProps: {},
19
21
  };
20
22
  state = {
21
23
  showPopup: false,
22
- showNestedPopup: false
24
+ showNestedPopup: false,
23
25
  };
24
26
  componentDidMount() {
25
27
  if (this.props.title) {
@@ -87,8 +89,13 @@ export default class Tooltip extends Component {
87
89
  };
88
90
  addListeners() {
89
91
  if (this.containerNode != null) {
90
- this.listeners.add(this.containerNode, 'mouseover', this.tryToShowPopup);
91
- this.listeners.add(this.containerNode, 'mouseout', this.hidePopup);
92
+ this.listeners.add(this.containerNode, 'mouseenter', this.tryToShowPopup);
93
+ this.listeners.add(this.containerNode, 'mouseleave', ev => {
94
+ if (ev.relatedTarget && this.popup?.container?.contains(ev.relatedTarget)) {
95
+ return;
96
+ }
97
+ this.hidePopup();
98
+ });
92
99
  }
93
100
  this.listeners.add(document, 'scroll', () => scheduleScroll(this.hidePopup), { passive: true });
94
101
  }
@@ -103,15 +110,17 @@ export default class Tooltip extends Component {
103
110
  this.setState({ showNestedPopup: false });
104
111
  };
105
112
  render() {
106
- const { children, 'data-test': dataTest, title, delay, selfOverflowOnly, popupProps, long, ...restProps } = this.props;
107
- const ariaProps = typeof title === 'string' && !!title
108
- ? { 'aria-label': title, role: 'tooltip' }
109
- : {};
113
+ const { children, 'data-test': dataTest, title, delay, theme, selfOverflowOnly, popupProps, long, ...restProps } = this.props;
114
+ const ariaProps = typeof title === 'string' && !!title ? { 'aria-label': title, role: 'tooltip' } : {};
110
115
  const { onNestedTooltipShow, onNestedTooltipHide } = this;
111
116
  return (<TooltipContext.Provider value={{ onNestedTooltipShow, onNestedTooltipHide }}>
112
117
  <span {...ariaProps} {...restProps} ref={this.containerRef} data-test={dataTests('ring-tooltip', dataTest)} data-test-title={typeof title === 'string' ? title : undefined}>
113
118
  {children}
114
- <Popup trapFocus={false} hidden={!this.state.showPopup || this.state.showNestedPopup} onCloseAttempt={this.hidePopup} maxHeight={400} className={classNames(styles.tooltip, { [styles.long]: long })} attached={false} top={4} dontCloseOnAnchorClick ref={this.popupRef} {...popupProps}>{title}</Popup>
119
+ <ThemeProvider theme={theme} passToPopups WrapperComponent={props => <span {...props}/>}>
120
+ <Popup trapFocus={false} anchorElement={this.containerNode} hidden={!this.state.showPopup || this.state.showNestedPopup} onCloseAttempt={this.hidePopup} maxHeight={400} className={classNames(styles.tooltip, { [styles.long]: long })} attached={false} onMouseOut={this.hidePopup} top={4} dontCloseOnAnchorClick ref={this.popupRef} {...popupProps}>
121
+ {title}
122
+ </Popup>
123
+ </ThemeProvider>
115
124
  </span>
116
125
  </TooltipContext.Provider>);
117
126
  }
@@ -14,14 +14,14 @@ export const hideMessage = 'userAgreementHide';
14
14
  const DEFAULT_CONSENT = {
15
15
  accepted: false,
16
16
  majorVersion: 0,
17
- minorVersion: 0
17
+ minorVersion: 0,
18
18
  };
19
19
  const DEFAULT_AGREEMENT = {
20
20
  enabled: false,
21
21
  majorVersion: 0,
22
22
  minorVersion: 0,
23
23
  requiredForREST: false,
24
- content: ''
24
+ content: '',
25
25
  };
26
26
  export default class UserAgreementService {
27
27
  config;
@@ -107,10 +107,7 @@ export default class UserAgreementService {
107
107
  };
108
108
  checkConsent = async () => {
109
109
  if (!this.checkingPromise) {
110
- this.checkingPromise = Promise.all([
111
- this.getUserAgreement(),
112
- this.getUserConsent()
113
- ]);
110
+ this.checkingPromise = Promise.all([this.getUserAgreement(), this.getUserConsent()]);
114
111
  }
115
112
  const [userAgreement, userConsent] = await this.checkingPromise;
116
113
  this.checkingPromise = null;
@@ -124,7 +121,7 @@ export default class UserAgreementService {
124
121
  return this._alertPromise;
125
122
  }
126
123
  this._alertPromise = new Promise((resolve, reject) => {
127
- const { userAgreement, reviewNow, remindLater } = (this.config.translations || {});
124
+ const { userAgreement, reviewNow, remindLater } = this.config.translations || {};
128
125
  const onRemind = () => {
129
126
  this.hideDialogAndAlert(withoutNotifications);
130
127
  reject('Postponed');
@@ -136,8 +133,12 @@ export default class UserAgreementService {
136
133
  };
137
134
  const message = (<Group>
138
135
  <span>{userAgreement || 'User Agreement'}</span>
139
- <Link onClick={onReview} data-test="review">{reviewNow || 'Review now'}</Link>
140
- <Link onClick={onRemind} data-test="later">{remindLater || 'Remind me later'}</Link>
136
+ <Link onClick={onReview} data-test="review">
137
+ {reviewNow || 'Review now'}
138
+ </Link>
139
+ <Link onClick={onRemind} data-test="later">
140
+ {remindLater || 'Remind me later'}
141
+ </Link>
141
142
  </Group>);
142
143
  this.alertKey = alertService.addAlert(message, Alert.Type.WARNING, 0, { closeable: false });
143
144
  });
@@ -180,11 +181,12 @@ export default class UserAgreementService {
180
181
  onDecline,
181
182
  onClose,
182
183
  translations,
183
- preview, ...restOptions
184
+ preview,
185
+ ...restOptions,
184
186
  };
185
- this.reactRoot.render((<ControlsHeightContext.Provider value={getGlobalControlsHeight()}>
186
- <UserAgreement {...props}/>
187
- </ControlsHeightContext.Provider>));
187
+ this.reactRoot.render(<ControlsHeightContext.Provider value={getGlobalControlsHeight()}>
188
+ <UserAgreement {...props}/>
189
+ </ControlsHeightContext.Provider>);
188
190
  if (onDialogShow) {
189
191
  onDialogShow();
190
192
  }
@@ -18,10 +18,10 @@ export default class UserAgreement extends PureComponent {
18
18
  show: false,
19
19
  onAccept: noop,
20
20
  onDecline: noop,
21
- onClose: noop
21
+ onClose: noop,
22
22
  };
23
23
  state = {
24
- scrolledDown: false
24
+ scrolledDown: false,
25
25
  };
26
26
  onScrollToBottom = () => this.setState({ scrolledDown: true });
27
27
  render() {
@@ -34,9 +34,7 @@ export default class UserAgreement extends PureComponent {
34
34
  {children}
35
35
  </Content>
36
36
  {!preview && (<Panel>
37
- {onRemindLater && !scrolledDown && (<div className={style.suggestion}>
38
- {translations?.scrollToAccept ?? translate('scrollToAccept')}
39
- </div>)}
37
+ {onRemindLater && !scrolledDown && (<div className={style.suggestion}>{translations?.scrollToAccept ?? translate('scrollToAccept')}</div>)}
40
38
  <Button primary disabled={!scrolledDown} onClick={onAccept} data-test="accept">
41
39
  {translations?.accept ?? translate('accept')}
42
40
  </Button>
@@ -5,9 +5,10 @@ import copyIcon from '@jetbrains/icons/copy';
5
5
  import Avatar, { Size as AvatarSize } from '../avatar/avatar';
6
6
  import Link from '../link/link';
7
7
  import clipboard from '../clipboard/clipboard';
8
- import badgeStyles from '../badge/badge.css';
8
+ import Tag from '../tag/tag';
9
9
  import Icon, { Size as IconSize } from '../icon/icon';
10
10
  import { I18nContext } from '../i18n/i18n-context';
11
+ import Tooltip from '../tooltip/tooltip';
11
12
  import styles from './user-card.css';
12
13
  export default class UserCard extends PureComponent {
13
14
  static contextType = I18nContext;
@@ -35,13 +36,13 @@ export default class UserCard extends PureComponent {
35
36
  {user.name}
36
37
  </Link>)}
37
38
  {!user.href && <span className={styles.userName}>{user.name}</span>}
38
- {typeof user.online === 'boolean' &&
39
- (<span className={userActiveStatusClasses} title={user.online
40
- ? (translations?.online ?? translate('online'))
41
- : (translations?.offline ?? translate('offline'))}/>)}
39
+ {typeof user.online === 'boolean' && (<span className={userActiveStatusClasses} title={user.online
40
+ ? (translations?.online ?? translate('online'))
41
+ : (translations?.offline ?? translate('offline'))}/>)}
42
42
  {!!info && <span className={styles.userNameInfo}>{info}</span>}
43
- {user.banned &&
44
- (<span className={classNames(badgeStyles.badge, badgeStyles.invalid)} title={user.banReason}>{translations?.banned ?? translate('banned')}</span>)}
43
+ {user.banned && (<Tooltip title={user.banReason}>
44
+ <Tag className={styles.banLabel}>{translations?.banned ?? translate('banned')}</Tag>
45
+ </Tooltip>)}
45
46
  </div>
46
47
  <div className={styles.userLogin}>{user.login}</div>
47
48
  {user.email && (<span className={styles.userEmailWrapper}>
@@ -49,8 +50,8 @@ export default class UserCard extends PureComponent {
49
50
  {user.email}
50
51
  </Link>
51
52
  {user.unverifiedEmail && (<span className={styles.unverifiedLabel}>
52
- {translations?.unverified ?? translate('unverified')}
53
- </span>)}
53
+ {translations?.unverified ?? translate('unverified')}
54
+ </span>)}
54
55
  <Icon title={translations?.copyToClipboard ?? translate('copyToClipboard')} className={styles.userCopyIcon} onClick={this.copyEmail} glyph={copyIcon} size={IconSize.Size14} suppressSizeWarning/>
55
56
  </span>)}
56
57
  </div>
@@ -5,7 +5,7 @@ import styles from './user-card.css';
5
5
  export default class SmartUserCardTooltip extends Component {
6
6
  state = {
7
7
  user: null,
8
- loading: false
8
+ loading: false,
9
9
  };
10
10
  loadUser = async () => {
11
11
  if (this.state.user) {
@@ -23,17 +23,15 @@ export default class SmartUserCardTooltip extends Component {
23
23
  this.setState({ loading: false });
24
24
  }
25
25
  };
26
- renderNoUser = () => (this.state.loading
27
- ? (<div className={styles.userCardSpaced}>
28
- <LoaderInline />
29
- </div>)
30
- : '');
26
+ renderNoUser = () => this.state.loading ? (<div className={styles.userCardSpaced}>
27
+ <LoaderInline />
28
+ </div>) : ('');
31
29
  render() {
32
30
  const { user } = this.state;
33
31
  const { children, userDataSource, ...restProps } = this.props;
34
32
  const dropdownProps = {
35
33
  onMouseEnter: this.loadUser,
36
- ...UserCardTooltip.defaultProps.dropdownProps
34
+ ...UserCardTooltip.defaultProps.dropdownProps,
37
35
  };
38
36
  return (<UserCardTooltip user={user} renderNoUser={this.renderNoUser} dropdownProps={dropdownProps} {...restProps}>
39
37
  {children}
@@ -9,13 +9,13 @@ export default class UserCardTooltip extends Component {
9
9
  static defaultProps = {
10
10
  renderUserCard: (props) => {
11
11
  const { user, ...restProps } = props;
12
- return user && (<UserCard user={user} {...restProps}/>);
12
+ return user && <UserCard user={user} {...restProps}/>;
13
13
  },
14
14
  renderNoUser: () => '',
15
15
  dropdownProps: {
16
16
  hoverShowTimeOut: DEFAULT_TIMEOUT,
17
- hoverHideTimeOut: DEFAULT_TIMEOUT
18
- }
17
+ hoverHideTimeOut: DEFAULT_TIMEOUT,
18
+ },
19
19
  };
20
20
  render() {
21
21
  const { children, renderUserCard, renderNoUser, dropdownProps, user, ...restProps } = this.props;
@@ -25,7 +25,7 @@ export default class UserCardTooltip extends Component {
25
25
  ? renderUserCard({
26
26
  ...restProps,
27
27
  user,
28
- className: classNames(styles.userCardSpaced, this.props.className)
28
+ className: classNames(styles.userCardSpaced, this.props.className),
29
29
  })
30
30
  : renderNoUser()}
31
31
  </Popup>
@@ -106,6 +106,10 @@
106
106
  margin-bottom: 3px;
107
107
  }
108
108
 
109
+ .banLabel {
110
+ color: var(--ring-error-color);
111
+ }
112
+
109
113
  .userActiveStatus {
110
114
  display: inline-block;
111
115
 
package/jslint-xml.js CHANGED
@@ -1,33 +1,34 @@
1
- // eslint-disable-next-line no-control-regex
2
- const xmlEscape = s => (`${s}`).replace(/[<>&"'\x00-\x1F\x7F\u0080-\uFFFF]/g, c => {
3
- switch (c) {
4
- case '<':
5
- return '&lt;';
6
- case '>':
7
- return '&gt;';
8
- case '&':
9
- return '&amp;';
10
- case '"':
11
- return '&quot;';
12
- case '\'':
13
- return '&apos;';
14
- default:
15
- return `&#${c.charCodeAt(0)};`;
16
- }
17
- });
1
+ const xmlEscape = s =>
2
+ // eslint-disable-next-line no-control-regex
3
+ `${s}`.replace(/[<>&"'\x00-\x1F\x7F\u0080-\uFFFF]/g, c => {
4
+ switch (c) {
5
+ case '<':
6
+ return '&lt;';
7
+ case '>':
8
+ return '&gt;';
9
+ case '&':
10
+ return '&amp;';
11
+ case '"':
12
+ return '&quot;';
13
+ case "'":
14
+ return '&apos;';
15
+ default:
16
+ return `&#${c.charCodeAt(0)};`;
17
+ }
18
+ });
18
19
 
19
20
  module.exports = results => {
20
21
  const files = results.map(file => {
21
22
  const warnings = file.warnings.map(({column, line, text}) => {
22
23
  const css = file._postcssResult && file._postcssResult.css;
23
- const lines = css && css.split('\n') || [];
24
+ const lines = (css && css.split('\n')) || [];
24
25
  const evidence = lines[line - 1];
25
26
 
26
27
  return [
27
28
  `<issue line="${line}"`,
28
29
  ` char="${column}"`,
29
30
  ` evidence="${evidence ? xmlEscape(evidence) : ''}"`,
30
- ` reason="${xmlEscape(text)}" />`
31
+ ` reason="${xmlEscape(text)}" />`,
31
32
  ].join('');
32
33
  });
33
34
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jetbrains/ring-ui",
3
- "version": "7.0.0-beta.8",
3
+ "version": "7.0.0",
4
4
  "description": "JetBrains UI library",
5
5
  "author": "JetBrains",
6
6
  "license": "Apache-2.0",
@@ -32,7 +32,8 @@
32
32
  },
33
33
  "scripts": {
34
34
  "apply-resolutions": "npx npm-force-resolutions@0.0.10",
35
- "_postinstall": "husky",
35
+ "_postinstall": "husky && npm run postinstall:gitconfig",
36
+ "postinstall:gitconfig": "git config blame.ignoreRevsFile .git-blame-ignore-revs",
36
37
  "prepare": "webpack -c .storybook/custom-header/webpack.config.js",
37
38
  "prea11y-audit": "playwright install",
38
39
  "a11y-audit": "test-storybook --url http://localhost:9999",
@@ -55,8 +56,8 @@
55
56
  "lint": "npm run lint:js . && npm run stylelint",
56
57
  "prelint-ci": "echo \"##teamcity[importData type='jslint' path='eslint-report.xml']\"",
57
58
  "lint-ci": "eslint --format jslint-xml . > eslint-report.xml && npm run stylelint-ci",
58
- "stylelint-ci": "stylelint --ignore-path .eslintignore --custom-formatter './jslint-xml.js' '**/*.css' | xmlappend eslint-report.xml",
59
- "stylelint": "stylelint --ignore-path .eslintignore '**/*.css'",
59
+ "stylelint-ci": "stylelint --ignore-path .stylelintignore --custom-formatter './jslint-xml.js' '**/*.css' | xmlappend eslint-report.xml",
60
+ "stylelint": "stylelint --ignore-path .stylelintignore '**/*.css'",
60
61
  "validate-tc-config": "mvn --file .teamcity/pom.xml org.jetbrains.teamcity:teamcity-configs-maven-plugin:generate -e",
61
62
  "pretest-ci": "npm run lint-ci",
62
63
  "typecheck": "tsc",
@@ -76,71 +77,79 @@
76
77
  },
77
78
  "readmeFilename": "README.md",
78
79
  "devDependencies": {
79
- "@babel/cli": "^7.25.6",
80
- "@babel/eslint-parser": "^7.25.1",
81
- "@csstools/css-parser-algorithms": "^3.0.0",
80
+ "@babel/cli": "^7.25.9",
81
+ "@babel/eslint-parser": "^7.25.9",
82
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
83
+ "@csstools/css-parser-algorithms": "^3.0.4",
82
84
  "@csstools/stylelint-no-at-nest-rule": "^4.0.0",
83
- "@jetbrains/eslint-config": "^5.4.2",
85
+ "@eslint/compat": "^1.2.2",
86
+ "@eslint/eslintrc": "^3.1.0",
87
+ "@eslint/js": "^9.14.0",
88
+ "@jetbrains/eslint-config": "^6.0.4",
84
89
  "@jetbrains/logos": "3.0.0-canary.734b213.0",
85
90
  "@jetbrains/stylelint-config": "^4.0.2",
86
- "@primer/octicons": "^19.11.0",
91
+ "@jetbrains/rollup-css-plugin": "./packages/rollup-css-plugin",
92
+ "@primer/octicons": "^19.12.0",
87
93
  "@rollup/plugin-babel": "^6.0.4",
88
94
  "@rollup/plugin-json": "^6.1.0",
89
- "@rollup/plugin-node-resolve": "^15.2.3",
90
- "@rollup/plugin-replace": "^5.0.7",
91
- "@storybook/addon-a11y": "8.3.0",
92
- "@storybook/addon-docs": "8.3.0",
93
- "@storybook/addon-essentials": "8.3.0",
94
- "@storybook/addon-themes": "^8.3.0",
95
- "@storybook/components": "8.3.0",
95
+ "@rollup/plugin-node-resolve": "^15.3.0",
96
+ "@rollup/plugin-replace": "^6.0.1",
97
+ "@storybook/addon-a11y": "8.4.2",
98
+ "@storybook/addon-docs": "8.4.2",
99
+ "@storybook/addon-essentials": "8.4.2",
100
+ "@storybook/addon-themes": "^8.4.2",
101
+ "@storybook/components": "8.4.2",
96
102
  "@storybook/csf": "^0.1.11",
97
- "@storybook/manager-api": "8.3.0",
98
- "@storybook/preview-api": "8.3.0",
99
- "@storybook/react": "8.3.0",
100
- "@storybook/react-webpack5": "8.3.0",
103
+ "@storybook/manager-api": "8.4.2",
104
+ "@storybook/preview-api": "8.4.2",
105
+ "@storybook/react": "8.4.2",
106
+ "@storybook/react-webpack5": "8.4.2",
101
107
  "@storybook/test-runner": "^0.19.1",
102
- "@storybook/theming": "8.3.0",
108
+ "@storybook/theming": "8.4.2",
103
109
  "@testing-library/dom": "^10.4.0",
104
110
  "@testing-library/react": "^16.0.1",
105
111
  "@testing-library/user-event": "^14.5.2",
106
- "@types/chai": "^4.3.19",
107
- "@types/chai-as-promised": "^8.0.0",
112
+ "@types/chai": "^5.0.1",
113
+ "@types/chai-as-promised": "^8.0.1",
108
114
  "@types/chai-dom": "0.0.10",
109
115
  "@types/chai-enzyme": "^0.6.13",
110
116
  "@types/enzyme": "^3.10.18",
117
+ "@types/eslint__js": "^8.42.3",
111
118
  "@types/markdown-it": "^14.1.2",
112
- "@types/react": "^18.3.6",
113
- "@types/react-dom": "^18.3.0",
119
+ "@types/react": "^18.3.12",
120
+ "@types/react-dom": "^18.3.1",
114
121
  "@types/sinon": "^17.0.3",
115
- "@types/sinon-chai": "^3.2.12",
122
+ "@types/sinon-chai": "^4.0.0",
116
123
  "@types/webpack-env": "^1.18.5",
117
- "@typescript-eslint/eslint-plugin": "^8.5.0",
118
- "@typescript-eslint/parser": "^8.5.0",
119
- "@vitejs/plugin-react": "^4.3.1",
124
+ "@vitejs/plugin-react": "^4.3.3",
125
+ "@vitest/eslint-plugin": "^1.1.6",
120
126
  "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0",
121
- "acorn": "^8.12.1",
122
- "axe-playwright": "^2.0.2",
127
+ "acorn": "^8.14.0",
128
+ "axe-playwright": "^2.0.3",
123
129
  "babel-plugin-require-context-hook": "^1.0.0",
124
- "caniuse-lite": "^1.0.30001660",
125
- "chai": "^5.1.1",
130
+ "caniuse-lite": "^1.0.30001677",
131
+ "chai": "^5.1.2",
126
132
  "chai-as-promised": "^8.0.0",
127
133
  "chai-dom": "^1.10.0",
128
134
  "chai-enzyme": "1.0.0-beta.1",
129
135
  "cheerio": "^1.0.0-rc.12",
130
- "core-js": "^3.38.1",
136
+ "core-js": "^3.39.0",
131
137
  "cpy-cli": "^5.0.0",
132
138
  "enzyme": "^3.11.0",
133
- "eslint": "^8.57.0",
139
+ "eslint": "^9.14.0",
140
+ "eslint-config-prettier": "^9.1.0",
141
+ "eslint-formatter-jslint-xml": "^8.40.0",
134
142
  "eslint-import-resolver-webpack": "^0.13.9",
135
- "eslint-plugin-bdd": "^2.1.1",
136
- "eslint-plugin-import": "^2.30.0",
137
- "eslint-plugin-jsx-a11y": "^6.10.0",
138
- "eslint-plugin-react": "^7.36.1",
139
- "eslint-plugin-react-hooks": "^4.6.2",
140
- "eslint-plugin-storybook": "^0.8.0",
143
+ "eslint-plugin-import": "^2.31.0",
144
+ "eslint-plugin-jsx-a11y": "^6.10.2",
145
+ "eslint-plugin-prettier": "^5.2.1",
146
+ "eslint-plugin-react": "^7.37.2",
147
+ "eslint-plugin-react-hooks": "^5.0.0",
148
+ "eslint-plugin-storybook": "^0.11.0",
141
149
  "events": "^3.3.0",
142
150
  "glob": "^11.0.0",
143
- "html-webpack-plugin": "^5.6.0",
151
+ "globals": "^15.12.0",
152
+ "html-webpack-plugin": "^5.6.3",
144
153
  "http-server": "^14.1.1",
145
154
  "husky": "^9.1.6",
146
155
  "identity-obj-proxy": "^3.0.0",
@@ -158,22 +167,22 @@
158
167
  "react-test-renderer": "^18.3.1",
159
168
  "regenerator-runtime": "^0.14.1",
160
169
  "rimraf": "^6.0.1",
161
- "rollup": "^4.21.3",
170
+ "rollup": "^4.24.4",
162
171
  "rollup-plugin-clear": "^2.0.7",
163
- "rollup-plugin-styles": "^4.0.0",
164
172
  "sinon": "^19.0.2",
165
173
  "sinon-chai": "^4.0.0",
166
174
  "storage-mock": "^2.1.0",
167
- "storybook": "8.3.0",
168
- "stylelint": "^16.9.0",
175
+ "storybook": "8.4.2",
176
+ "stylelint": "^16.10.0",
169
177
  "svg-inline-loader": "^0.8.2",
170
178
  "teamcity-service-messages": "^0.1.14",
171
179
  "terser-webpack-plugin": "^5.3.10",
172
- "typescript": "~5.5.4",
173
- "vitest": "^2.1.1",
180
+ "typescript": "~5.6.3",
181
+ "typescript-eslint": "^8.13.0",
182
+ "vitest": "^2.1.4",
174
183
  "vitest-teamcity-reporter": "^0.3.1",
175
184
  "wallaby-webpack": "^3.9.16",
176
- "webpack": "^5.94.0",
185
+ "webpack": "^5.96.1",
177
186
  "webpack-cli": "^5.1.4",
178
187
  "xmlappend": "^1.0.4"
179
188
  },
@@ -197,25 +206,24 @@
197
206
  }
198
207
  },
199
208
  "dependencies": {
200
- "@babel/core": "^7.25.2",
201
- "@babel/preset-typescript": "^7.24.7",
209
+ "@babel/core": "^7.26.0",
210
+ "@babel/preset-typescript": "^7.26.0",
202
211
  "@jetbrains/babel-preset-jetbrains": "^2.4.0",
203
- "@jetbrains/icons": "^4.4.0",
212
+ "@jetbrains/icons": "^4.8.0",
204
213
  "@jetbrains/postcss-require-hover": "^0.1.2",
205
214
  "@types/combokeys": "^2.4.9",
206
215
  "@types/element-resize-detector": "^1.1.6",
207
216
  "@types/react-virtualized": "9.21.30",
208
- "@types/util-deprecate": "^1.0.3",
209
- "@ungap/url-search-params": "^0.2.2",
210
- "babel-loader": "9.1.3",
217
+ "@types/util-deprecate": "^1.0.4",
218
+ "babel-loader": "9.2.1",
211
219
  "babel-plugin-transform-define": "^2.1.4",
212
- "browserslist": "^4.23.3",
220
+ "browserslist": "^4.24.2",
213
221
  "change-case": "^4.1.1",
214
222
  "classnames": "^2.5.1",
215
223
  "combokeys": "^3.0.1",
216
224
  "css-loader": "^7.1.2",
217
225
  "csstype": "^3.1.3",
218
- "date-fns": "^4.0.0",
226
+ "date-fns": "^4.1.0",
219
227
  "dequal": "^2.0.3",
220
228
  "element-resize-detector": "^1.2.4",
221
229
  "es6-error": "^4.1.1",
@@ -231,7 +239,7 @@
231
239
  "postcss-font-family-system-ui": "^5.0.0",
232
240
  "postcss-loader": "^8.1.1",
233
241
  "postcss-modules-values-replace": "^4.2.0",
234
- "postcss-preset-env": "^10.0.3",
242
+ "postcss-preset-env": "^10.0.9",
235
243
  "react-movable": "^3.3.1",
236
244
  "react-virtualized": "^9.22.5",
237
245
  "react-waypoint": "^10.3.0",
package/postcss.config.js CHANGED
@@ -1,19 +1,18 @@
1
1
  const EMBRACED_STAGE = 3; // See https://cssdb.org/#staging-process
2
2
 
3
-
4
3
  module.exports = () => {
5
4
  const plugins = [
6
5
  require('postcss-modules-values-replace')(),
7
6
  require('postcss-preset-env')({
8
7
  stage: EMBRACED_STAGE,
9
8
  features: {
10
- 'nesting-rules': true
11
- }
9
+ 'nesting-rules': true,
10
+ },
12
11
  }),
13
12
  require('postcss-font-family-system-ui')({browsers: ['last 2 versions']}),
14
13
  require('postcss-flexbugs-fixes')(),
15
14
  require('@jetbrains/postcss-require-hover')(),
16
- require('postcss-calc')({mediaQueries: true})
15
+ require('postcss-calc')({mediaQueries: true}),
17
16
  ];
18
17
 
19
18
  return {plugins};
package/typings.d.ts CHANGED
@@ -32,12 +32,10 @@ declare module 'combokeys/test/lib/key-event' {
32
32
  keyCode: number,
33
33
  modifiers?: ('shift' | 'ctrl' | 'alt' | 'meta')[],
34
34
  element?: Element,
35
- repeat?: number
35
+ repeat?: number,
36
36
  ): void;
37
37
  }
38
38
 
39
39
  declare module 'scrollbar-width' {
40
- export default function getScrollbarWidth(
41
- recalculate?: boolean
42
- ): number | null;
40
+ export default function getScrollbarWidth(recalculate?: boolean): number | null;
43
41
  }