@jetbrains/ring-ui 7.0.96 → 7.0.98
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.
- package/components/auth/auth-core.js +2 -2
- package/components/avatar/avatar.js +1 -1
- package/components/list/list-item.js +1 -1
- package/components/list/list.d.ts +1 -1
- package/components/list/list.js +26 -25
- package/components/query-assist/query-assist.d.ts +6 -3
- package/components/query-assist/query-assist.js +35 -17
- package/components/tabs/collapsible-tabs.js +1 -3
- package/components/tooltip/tooltip.d.ts +2 -0
- package/components/tooltip/tooltip.js +12 -8
- package/package.json +24 -17
|
@@ -373,7 +373,7 @@ class Auth {
|
|
|
373
373
|
await this._backendCheckPromise;
|
|
374
374
|
}
|
|
375
375
|
catch (e) {
|
|
376
|
-
throw new Error('Cannot refresh token: backend is not available. Postponed by user.');
|
|
376
|
+
throw new Error('Cannot refresh token: backend is not available. Postponed by user.', { cause: e });
|
|
377
377
|
}
|
|
378
378
|
finally {
|
|
379
379
|
this._backendCheckPromise = null;
|
|
@@ -734,7 +734,7 @@ class Auth {
|
|
|
734
734
|
throw new Error('No state in AuthResponse');
|
|
735
735
|
}
|
|
736
736
|
const { scope: defaultScope } = this.config;
|
|
737
|
-
let urlFromState
|
|
737
|
+
let urlFromState;
|
|
738
738
|
try {
|
|
739
739
|
urlFromState = new URL(state); // checking if state contains valid URL on same origin, see HUB-11514
|
|
740
740
|
}
|
|
@@ -65,7 +65,7 @@ export default class Avatar extends PureComponent {
|
|
|
65
65
|
};
|
|
66
66
|
src = encodeURL(urlStart, queryParams);
|
|
67
67
|
}
|
|
68
|
-
let subavatarSrc
|
|
68
|
+
let subavatarSrc;
|
|
69
69
|
if (subavatar && !isDataURI(subavatar)) {
|
|
70
70
|
const [urlStart, query] = subavatar.split('?');
|
|
71
71
|
const queryParams = {
|
|
@@ -36,7 +36,7 @@ export default class ListItem extends PureComponent {
|
|
|
36
36
|
const style = {
|
|
37
37
|
paddingLeft: `${(Number(level) || 0) * RING_UNIT + DEFAULT_PADDING + (showCheckbox ? CHECKBOX_WIDTH : 0)}px`,
|
|
38
38
|
};
|
|
39
|
-
let computedTitle
|
|
39
|
+
let computedTitle;
|
|
40
40
|
if (this._isString(title)) {
|
|
41
41
|
// if title is specified and is a string then use it
|
|
42
42
|
computedTitle = title;
|
|
@@ -68,7 +68,6 @@ export interface ListState<T = unknown> {
|
|
|
68
68
|
prevActiveIndex: number | null;
|
|
69
69
|
prevData: ListDataItem<T>[];
|
|
70
70
|
activeItem: ListDataItem<T> | null;
|
|
71
|
-
needScrollToActive: boolean;
|
|
72
71
|
scrolling: boolean;
|
|
73
72
|
hasOverflow: boolean;
|
|
74
73
|
scrolledToBottom: boolean;
|
|
@@ -151,6 +150,7 @@ export default class List<T = unknown> extends Component<ListProps<T>, ListState
|
|
|
151
150
|
getSelected(): ListDataItem<T> | null;
|
|
152
151
|
defaultItemHeight(): number;
|
|
153
152
|
scrollEndHandler: () => void;
|
|
153
|
+
scrollToActive: () => void;
|
|
154
154
|
checkOverflow: () => void;
|
|
155
155
|
getVisibleListHeight(maxHeight: number): number;
|
|
156
156
|
private _deprecatedGenerateKeyFromContent;
|
package/components/list/list.js
CHANGED
|
@@ -74,7 +74,6 @@ export default class List extends Component {
|
|
|
74
74
|
prevActiveIndex: null,
|
|
75
75
|
prevData: [],
|
|
76
76
|
activeItem: null,
|
|
77
|
-
needScrollToActive: false,
|
|
78
77
|
scrolling: false,
|
|
79
78
|
hasOverflow: false,
|
|
80
79
|
scrolledToBottom: false,
|
|
@@ -101,7 +100,6 @@ export default class List extends Component {
|
|
|
101
100
|
Object.assign(nextState, {
|
|
102
101
|
activeIndex,
|
|
103
102
|
activeItem: data[activeIndex],
|
|
104
|
-
needScrollToActive: true,
|
|
105
103
|
});
|
|
106
104
|
}
|
|
107
105
|
else if (data !== prevData && restoreActiveIndex && activeItem && activeItem.key) {
|
|
@@ -121,6 +119,9 @@ export default class List extends Component {
|
|
|
121
119
|
shouldActivateFirstItem(this.props)) {
|
|
122
120
|
this.activateFirst();
|
|
123
121
|
}
|
|
122
|
+
if (!this.props.renderOptimization) {
|
|
123
|
+
this.scrollToActive();
|
|
124
|
+
}
|
|
124
125
|
}
|
|
125
126
|
shouldComponentUpdate(nextProps, nextState) {
|
|
126
127
|
return (Object.keys(nextProps).some(key => !Object.is(nextProps[key], this.props[key])) ||
|
|
@@ -131,22 +132,10 @@ export default class List extends Component {
|
|
|
131
132
|
this.virtualizedList.recomputeRowHeights();
|
|
132
133
|
}
|
|
133
134
|
const { activeIndex } = this.state;
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
this.state.needScrollToActive &&
|
|
137
|
-
activeIndex != null &&
|
|
138
|
-
activeIndex !== prevState.activeIndex) {
|
|
139
|
-
const itemId = this.getId(this.props.data[activeIndex]);
|
|
140
|
-
if (itemId) {
|
|
141
|
-
document.getElementById(itemId)?.scrollIntoView?.({
|
|
142
|
-
block: 'center',
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
this.setState({ needScrollToActive: false });
|
|
135
|
+
if (activeIndex != null && activeIndex !== prevState.activeIndex) {
|
|
136
|
+
this.scrollToActive();
|
|
146
137
|
}
|
|
147
|
-
const isActiveItemRetainedPosition = activeIndex
|
|
148
|
-
? prevProps.data[activeIndex]?.key === this.props.data[activeIndex]?.key
|
|
149
|
-
: false;
|
|
138
|
+
const isActiveItemRetainedPosition = activeIndex != null ? prevProps.data[activeIndex]?.key === this.props.data[activeIndex]?.key : false;
|
|
150
139
|
if ((this.props.activeIndex === null || this.props.activeIndex === undefined) &&
|
|
151
140
|
getDataHash(this.props.data) !== getDataHash(prevProps.data) &&
|
|
152
141
|
shouldActivateFirstItem(this.props) &&
|
|
@@ -209,7 +198,6 @@ export default class List extends Component {
|
|
|
209
198
|
this.setState({
|
|
210
199
|
activeIndex: firstActivatableIndex,
|
|
211
200
|
activeItem: this.props.data[firstActivatableIndex],
|
|
212
|
-
needScrollToActive: true,
|
|
213
201
|
});
|
|
214
202
|
}
|
|
215
203
|
};
|
|
@@ -284,7 +272,6 @@ export default class List extends Component {
|
|
|
284
272
|
this.setState({
|
|
285
273
|
activeIndex: correctedIndex,
|
|
286
274
|
activeItem: item,
|
|
287
|
-
needScrollToActive: true,
|
|
288
275
|
}, function onSet() {
|
|
289
276
|
if (!isActivatable(item)) {
|
|
290
277
|
retryCallback(e);
|
|
@@ -344,6 +331,21 @@ export default class List extends Component {
|
|
|
344
331
|
}
|
|
345
332
|
}
|
|
346
333
|
});
|
|
334
|
+
scrollToActive = () => {
|
|
335
|
+
const { activeIndex } = this.state;
|
|
336
|
+
if (this.props.disableScrollToActive || activeIndex == null) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
if (this.virtualizedList) {
|
|
340
|
+
this.virtualizedList.scrollToRow(activeIndex + 1);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
const itemId = this.getId(this.props.data[activeIndex]);
|
|
344
|
+
if (itemId) {
|
|
345
|
+
document.getElementById(itemId)?.scrollIntoView?.({ block: 'center' });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
};
|
|
347
349
|
checkOverflow = () => {
|
|
348
350
|
if (this.inner) {
|
|
349
351
|
this.setState({
|
|
@@ -455,7 +457,11 @@ export default class List extends Component {
|
|
|
455
457
|
return props;
|
|
456
458
|
};
|
|
457
459
|
virtualizedListRef = (el) => {
|
|
460
|
+
const isFirstAssignment = el != null && this.virtualizedList == null;
|
|
458
461
|
this.virtualizedList = el;
|
|
462
|
+
if (isFirstAssignment) {
|
|
463
|
+
this.scrollToActive();
|
|
464
|
+
}
|
|
459
465
|
};
|
|
460
466
|
containerRef = (el) => {
|
|
461
467
|
this.container = el;
|
|
@@ -476,12 +482,7 @@ export default class List extends Component {
|
|
|
476
482
|
this.scrollEndHandler();
|
|
477
483
|
}} scrollTop={scrollTop} rowCount={rowCount} estimatedRowSize={this.defaultItemHeight()} rowHeight={this._cache.rowHeight} rowRenderer={this.renderItem} overscanRowCount={this._bufferSize}
|
|
478
484
|
// ensure rerendering
|
|
479
|
-
noop={() => { }}
|
|
480
|
-
this.state.needScrollToActive &&
|
|
481
|
-
this.state.activeIndex !== null &&
|
|
482
|
-
this.state.activeIndex !== undefined
|
|
483
|
-
? this.state.activeIndex + 1
|
|
484
|
-
: undefined} scrollToAlignment='center' deferredMeasurementCache={this._cache} onRowsRendered={this.checkOverflow} containerRole='none' // row role is set by rowRenderer
|
|
485
|
+
noop={() => { }} scrollToAlignment='center' deferredMeasurementCache={this._cache} onRowsRendered={this.checkOverflow} containerRole='none' // row role is set by rowRenderer
|
|
485
486
|
/>
|
|
486
487
|
</div>)}
|
|
487
488
|
</AutoSizer>);
|
|
@@ -157,7 +157,7 @@ interface CaretPositionParams {
|
|
|
157
157
|
forceSetCaret?: boolean | null | undefined;
|
|
158
158
|
}
|
|
159
159
|
interface HistoryEntry {
|
|
160
|
-
|
|
160
|
+
normalizedQuery: string;
|
|
161
161
|
caret: Position | number;
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
@@ -218,7 +218,8 @@ export default class QueryAssist extends Component<QueryAssistProps> {
|
|
|
218
218
|
immediateState: QueryAssistChange;
|
|
219
219
|
requestData?: (afterCompletion?: boolean) => void;
|
|
220
220
|
ngModelStateField: string;
|
|
221
|
-
|
|
221
|
+
undoHistoryStack: HistoryEntry[];
|
|
222
|
+
redoHistoryStack: HistoryEntry[];
|
|
222
223
|
mouseIsDownOnPopup?: boolean;
|
|
223
224
|
handleFocusChange: (e: SyntheticEvent) => void;
|
|
224
225
|
node?: HTMLElement | null;
|
|
@@ -233,9 +234,11 @@ export default class QueryAssist extends Component<QueryAssistProps> {
|
|
|
233
234
|
handleInput: (e: Event | SyntheticEvent) => void;
|
|
234
235
|
handleEnter: (e: React.KeyboardEvent) => void;
|
|
235
236
|
handleTab: (e: Event) => boolean | void;
|
|
236
|
-
setState: (state: Partial<QueryAssistState>, resolve?: () => void) => void;
|
|
237
|
+
setState: (state: Partial<QueryAssistState>, resolve?: () => void, undoOrRedo?: boolean) => void;
|
|
237
238
|
private _pushHistory;
|
|
238
239
|
undo: (e: Event) => void;
|
|
240
|
+
redo: (e: Event) => void;
|
|
241
|
+
private _undoOrRedo;
|
|
239
242
|
handlePaste: (e: React.ClipboardEvent) => void;
|
|
240
243
|
handleCaretMove: (e: Event | SyntheticEvent) => void;
|
|
241
244
|
handleStyleRangesResponse: ({ suggestions, ...restProps }: QueryAssistResponse) => Promise<void>;
|
|
@@ -118,7 +118,7 @@ export default class QueryAssist extends Component {
|
|
|
118
118
|
this.requestStyleRanges().catch(noop);
|
|
119
119
|
}
|
|
120
120
|
this.setCaretPosition();
|
|
121
|
-
this._pushHistory(this.state);
|
|
121
|
+
this._pushHistory(this.state.query);
|
|
122
122
|
}
|
|
123
123
|
shouldComponentUpdate(props, state) {
|
|
124
124
|
return (state.query !== this.state.query ||
|
|
@@ -163,8 +163,8 @@ export default class QueryAssist extends Component {
|
|
|
163
163
|
immediateState;
|
|
164
164
|
requestData;
|
|
165
165
|
ngModelStateField = ngModelStateField;
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
undoHistoryStack = [];
|
|
167
|
+
redoHistoryStack = [];
|
|
168
168
|
mouseIsDownOnPopup;
|
|
169
169
|
handleFocusChange = (e) => {
|
|
170
170
|
// otherwise it's blur and false
|
|
@@ -290,6 +290,9 @@ export default class QueryAssist extends Component {
|
|
|
290
290
|
if (this.props.autoOpen === 'force' || props.query.length > 0) {
|
|
291
291
|
this.requestData?.();
|
|
292
292
|
}
|
|
293
|
+
else {
|
|
294
|
+
this.handleResponse({ caret: props.caret });
|
|
295
|
+
}
|
|
293
296
|
};
|
|
294
297
|
// It's necessary to prevent new element creation before any other hooks
|
|
295
298
|
handleEnter = (e) => {
|
|
@@ -313,31 +316,45 @@ export default class QueryAssist extends Component {
|
|
|
313
316
|
}
|
|
314
317
|
return true;
|
|
315
318
|
};
|
|
316
|
-
setState = (state, resolve) => {
|
|
319
|
+
setState = (state, resolve, undoOrRedo = false) => {
|
|
317
320
|
super.setState(state, () => {
|
|
318
|
-
|
|
321
|
+
if (!undoOrRedo && 'query' in state) {
|
|
322
|
+
this._pushHistory(state.query);
|
|
323
|
+
}
|
|
319
324
|
resolve?.();
|
|
320
325
|
});
|
|
321
326
|
};
|
|
322
|
-
_pushHistory(
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
query: state.query,
|
|
327
|
+
_pushHistory(query) {
|
|
328
|
+
const normalizedQuery = query ?? '';
|
|
329
|
+
if (!this.undoHistoryStack.length || this.undoHistoryStack[0].normalizedQuery !== normalizedQuery) {
|
|
330
|
+
this.undoHistoryStack.unshift({
|
|
331
|
+
normalizedQuery,
|
|
328
332
|
caret: this.caret?.getPosition({ avoidFocus: true }) ?? -1,
|
|
329
333
|
});
|
|
334
|
+
this.redoHistoryStack = [];
|
|
330
335
|
}
|
|
331
336
|
}
|
|
332
337
|
undo = (e) => {
|
|
333
|
-
|
|
334
|
-
|
|
338
|
+
this._undoOrRedo(e, false);
|
|
339
|
+
};
|
|
340
|
+
redo = (e) => {
|
|
341
|
+
this._undoOrRedo(e, true);
|
|
342
|
+
};
|
|
343
|
+
_undoOrRedo = (e, redo) => {
|
|
344
|
+
const stack = redo ? this.redoHistoryStack : this.undoHistoryStack;
|
|
345
|
+
const [current, previous] = stack;
|
|
346
|
+
const stateToApply = redo ? current : previous;
|
|
347
|
+
if (!stateToApply) {
|
|
335
348
|
return;
|
|
336
349
|
}
|
|
337
|
-
|
|
338
|
-
|
|
350
|
+
stack.shift();
|
|
351
|
+
e.preventDefault?.();
|
|
352
|
+
this.setState({ query: stateToApply.normalizedQuery }, () => {
|
|
353
|
+
const oppositeStack = redo ? this.undoHistoryStack : this.redoHistoryStack;
|
|
354
|
+
oppositeStack.unshift(current);
|
|
355
|
+
this.caret?.setPosition(stateToApply.caret);
|
|
339
356
|
this.handleInput(e);
|
|
340
|
-
});
|
|
357
|
+
}, true);
|
|
341
358
|
};
|
|
342
359
|
handlePaste = (e) => {
|
|
343
360
|
const INSERT_COMMAND = 'insertText';
|
|
@@ -368,7 +385,7 @@ export default class QueryAssist extends Component {
|
|
|
368
385
|
}
|
|
369
386
|
};
|
|
370
387
|
handleStyleRangesResponse = ({ suggestions, ...restProps }) => this.handleResponse(restProps);
|
|
371
|
-
handleResponse = ({ query = '', caret = 0, styleRanges, suggestions = [] }, afterCompletion = false) => new Promise((resolve, reject) => {
|
|
388
|
+
handleResponse = ({ query = '', caret = 0, styleRanges = [], suggestions = [] }, afterCompletion = false) => new Promise((resolve, reject) => {
|
|
372
389
|
if (query === this.getQuery() &&
|
|
373
390
|
(caret === this.immediateState.caret || this.immediateState.caret === undefined)) {
|
|
374
391
|
// Do not setState on unmounted component
|
|
@@ -665,6 +682,7 @@ export default class QueryAssist extends Component {
|
|
|
665
682
|
'ctrl+space': this.handleCtrlSpace,
|
|
666
683
|
tab: this.handleTab,
|
|
667
684
|
'meta+z': this.undo,
|
|
685
|
+
'meta+shift+z': this.redo,
|
|
668
686
|
right: noop,
|
|
669
687
|
left: noop,
|
|
670
688
|
space: noop,
|
|
@@ -42,7 +42,7 @@ export const CollapsibleTabs = ({ children, selected, onSelect, onLastVisibleInd
|
|
|
42
42
|
const adjustTabs = useCallback((entry) => {
|
|
43
43
|
const containerWidth = entry.contentRect.width;
|
|
44
44
|
const { tabs: tabsSizes, more = 0 } = elements.sizes;
|
|
45
|
-
|
|
45
|
+
const renderMore = children.some(tab => tab.props.alwaysHidden);
|
|
46
46
|
const tabsToRender = [];
|
|
47
47
|
let filledWidth = renderMore ? (more ?? 0) : 0;
|
|
48
48
|
for (let i = 0; i < tabsSizes.length; i++) {
|
|
@@ -58,7 +58,6 @@ export const CollapsibleTabs = ({ children, selected, onSelect, onLastVisibleInd
|
|
|
58
58
|
for (let i = tabsToRender.length - 1; i >= 0; i--) {
|
|
59
59
|
if (filledWidth + more < containerWidth + MEASURE_TOLERANCE) {
|
|
60
60
|
filledWidth += more;
|
|
61
|
-
renderMore = true;
|
|
62
61
|
break;
|
|
63
62
|
}
|
|
64
63
|
else {
|
|
@@ -71,7 +70,6 @@ export const CollapsibleTabs = ({ children, selected, onSelect, onLastVisibleInd
|
|
|
71
70
|
const selectedWidth = tabsSizes[selectedIndex];
|
|
72
71
|
for (let i = tabsToRender.length - 1; i >= 0; i--) {
|
|
73
72
|
if (filledWidth + selectedWidth < containerWidth + MEASURE_TOLERANCE) {
|
|
74
|
-
filledWidth += selectedWidth;
|
|
75
73
|
break;
|
|
76
74
|
}
|
|
77
75
|
else {
|
|
@@ -13,6 +13,7 @@ export interface TooltipProps extends Omit<AllHTMLAttributes<HTMLSpanElement>, '
|
|
|
13
13
|
selfOverflowOnly?: boolean | null | undefined;
|
|
14
14
|
popupProps?: Partial<PopupAttrs> | null | undefined;
|
|
15
15
|
title?: ReactNode | null | undefined;
|
|
16
|
+
hide?: boolean | null | undefined;
|
|
16
17
|
theme?: Theme | 'inherit';
|
|
17
18
|
'data-test'?: string | null | undefined;
|
|
18
19
|
long?: boolean | null | undefined;
|
|
@@ -21,6 +22,7 @@ export interface TooltipProps extends Omit<AllHTMLAttributes<HTMLSpanElement>, '
|
|
|
21
22
|
* @name Tooltip
|
|
22
23
|
*/
|
|
23
24
|
export default class Tooltip extends Component<TooltipProps> {
|
|
25
|
+
private static isShow;
|
|
24
26
|
static defaultProps: {
|
|
25
27
|
title: string;
|
|
26
28
|
selfOverflowOnly: boolean;
|
|
@@ -13,6 +13,9 @@ const TooltipContext = createContext(undefined);
|
|
|
13
13
|
* @name Tooltip
|
|
14
14
|
*/
|
|
15
15
|
export default class Tooltip extends Component {
|
|
16
|
+
static isShow({ title, hide }) {
|
|
17
|
+
return !!title && !hide;
|
|
18
|
+
}
|
|
16
19
|
static defaultProps = {
|
|
17
20
|
title: '',
|
|
18
21
|
selfOverflowOnly: false,
|
|
@@ -24,15 +27,17 @@ export default class Tooltip extends Component {
|
|
|
24
27
|
showNestedPopup: false,
|
|
25
28
|
};
|
|
26
29
|
componentDidMount() {
|
|
27
|
-
if (this.props
|
|
30
|
+
if (Tooltip.isShow(this.props)) {
|
|
28
31
|
this.addListeners();
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
34
|
componentDidUpdate(prevProps) {
|
|
32
|
-
|
|
35
|
+
const prevShow = Tooltip.isShow(prevProps);
|
|
36
|
+
const currShow = Tooltip.isShow(this.props);
|
|
37
|
+
if (!prevShow && currShow) {
|
|
33
38
|
this.addListeners();
|
|
34
39
|
}
|
|
35
|
-
else if (
|
|
40
|
+
else if (prevShow && !currShow) {
|
|
36
41
|
this.hidePopup();
|
|
37
42
|
this.listeners.removeAll();
|
|
38
43
|
}
|
|
@@ -50,10 +55,9 @@ export default class Tooltip extends Component {
|
|
|
50
55
|
this.containerNode = el;
|
|
51
56
|
};
|
|
52
57
|
tryToShowPopup = () => {
|
|
53
|
-
|
|
54
|
-
if (!title) {
|
|
58
|
+
if (!Tooltip.isShow(this.props))
|
|
55
59
|
return;
|
|
56
|
-
}
|
|
60
|
+
const { delay } = this.props;
|
|
57
61
|
if (delay) {
|
|
58
62
|
clearTimeout(this.timeout);
|
|
59
63
|
this.timeout = window.setTimeout(this.showPopup, delay);
|
|
@@ -125,8 +129,8 @@ export default class Tooltip extends Component {
|
|
|
125
129
|
this.setState({ showNestedPopup: false });
|
|
126
130
|
};
|
|
127
131
|
render() {
|
|
128
|
-
const { children, 'data-test': dataTest, title, delay, theme, selfOverflowOnly, popupProps, long, ...restProps } = this.props;
|
|
129
|
-
const ariaProps = typeof title === 'string' &&
|
|
132
|
+
const { children, 'data-test': dataTest, title, delay, theme, selfOverflowOnly, popupProps, long, hide, ...restProps } = this.props;
|
|
133
|
+
const ariaProps = typeof title === 'string' && Tooltip.isShow({ title, hide }) ? { 'aria-label': title, role: 'tooltip' } : {};
|
|
130
134
|
const { onNestedTooltipShow, onNestedTooltipHide } = this;
|
|
131
135
|
const popup = (<Popup trapFocus={false} anchorElement={this.containerNode} hidden={!this.state.showPopup || this.state.showNestedPopup} onCloseAttempt={this.hidePopup} maxHeight={400} attached={false} onMouseOut={this.hideIfMovedOutsidePopup} top={4} dontCloseOnAnchorClick ref={this.popupRef} {...popupProps} className={classNames(styles.tooltip, { [styles.long]: long, [styles.inheritedTheme]: theme === 'inherit' }, popupProps?.className)}>
|
|
132
136
|
{title}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jetbrains/ring-ui",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.98",
|
|
4
4
|
"description": "JetBrains UI library",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "JetBrains"
|
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
"figma-connect-unpublish": "npx figma connect unpublish --token=$FIGMA_CODE_CONNECT_TOKEN",
|
|
57
57
|
"figma-connect-unpublish-local": "dotenv -- npm run figma-connect-unpublish",
|
|
58
58
|
"lint": "npm run lint:js && npm run stylelint",
|
|
59
|
+
"prelint-ci": "echo \"##teamcity[importData type='jslint' path='eslint-report.xml']\"",
|
|
60
|
+
"lint-ci": "eslint --format jslint-xml . > eslint-report.xml && npm run stylelint-ci",
|
|
59
61
|
"lint:js": "eslint",
|
|
60
62
|
"postbuild": "cpy './**/*.d.ts' ../dist --parents --cwd=components/",
|
|
61
63
|
"_postinstall": "husky && npm run postinstall:gitconfig",
|
|
@@ -79,12 +81,15 @@
|
|
|
79
81
|
"start": "storybook dev -p 9999",
|
|
80
82
|
"storybook-debug": "node --inspect-brk node_modules/@storybook/react/bin -p 9999",
|
|
81
83
|
"stylelint": "stylelint --ignore-path .stylelintignore '**/*.css'",
|
|
84
|
+
"stylelint-ci": "stylelint --ignore-path .stylelintignore --custom-formatter 'scripts/jslint-xml.js' '**/*.css' | xmlappend eslint-report.xml",
|
|
82
85
|
"test": "vitest src",
|
|
83
86
|
"type-check": "(npm run type-check:create-d-ts && npm run type-check:main && npm run type-check:build) ; npm run type-check:cleanup-d-ts",
|
|
84
87
|
"type-check:create-d-ts": "npx tcm src && npx tcm .storybook",
|
|
85
88
|
"type-check:main": "tsc --noEmit -p tsconfig.json",
|
|
86
89
|
"type-check:build": "tsc --noEmit -p tsconfig-build.json",
|
|
87
90
|
"type-check:cleanup-d-ts": "rimraf src/**/*.css.d.ts .storybook/*.css.d.ts .storybook/**/*.css.d.ts",
|
|
91
|
+
"pretype-check-ci": "npm run type-check:create-d-ts",
|
|
92
|
+
"type-check-ci": "node scripts/tsc-teamcity",
|
|
88
93
|
"update-styles": "node scripts/update-styles.mjs",
|
|
89
94
|
"validate-tc-config": "mvn --file .teamcity/pom.xml org.jetbrains.teamcity:teamcity-configs-maven-plugin:generate -e"
|
|
90
95
|
},
|
|
@@ -99,9 +104,9 @@
|
|
|
99
104
|
"@csstools/css-parser-algorithms": "^4.0.0",
|
|
100
105
|
"@csstools/stylelint-no-at-nest-rule": "^5.0.0",
|
|
101
106
|
"@eslint/compat": "^2.0.2",
|
|
102
|
-
"@eslint/eslintrc": "^3.3.
|
|
107
|
+
"@eslint/eslintrc": "^3.3.4",
|
|
103
108
|
"@eslint/js": "^10.0.1",
|
|
104
|
-
"@figma/code-connect": "^1.
|
|
109
|
+
"@figma/code-connect": "^1.4.1",
|
|
105
110
|
"@jetbrains/eslint-config": "^6.0.5",
|
|
106
111
|
"@jetbrains/logos": "3.0.0-canary.734b213.0",
|
|
107
112
|
"@jetbrains/rollup-css-plugin": "./packages/rollup-css-plugin",
|
|
@@ -112,11 +117,11 @@
|
|
|
112
117
|
"@rollup/plugin-json": "^6.1.0",
|
|
113
118
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
114
119
|
"@rollup/plugin-replace": "^6.0.3",
|
|
115
|
-
"@storybook/addon-a11y": "10.2.
|
|
116
|
-
"@storybook/addon-docs": "^10.2.
|
|
117
|
-
"@storybook/addon-themes": "^10.2.
|
|
120
|
+
"@storybook/addon-a11y": "10.2.13",
|
|
121
|
+
"@storybook/addon-docs": "^10.2.13",
|
|
122
|
+
"@storybook/addon-themes": "^10.2.13",
|
|
118
123
|
"@storybook/csf": "^0.1.13",
|
|
119
|
-
"@storybook/react-webpack5": "10.2.
|
|
124
|
+
"@storybook/react-webpack5": "10.2.13",
|
|
120
125
|
"@storybook/test-runner": "^0.24.2",
|
|
121
126
|
"@testing-library/dom": "^10.4.1",
|
|
122
127
|
"@testing-library/react": "^16.3.2",
|
|
@@ -129,7 +134,7 @@
|
|
|
129
134
|
"@types/webpack-env": "^1.18.8",
|
|
130
135
|
"@vitejs/plugin-react": "^5.1.4",
|
|
131
136
|
"@vitest/eslint-plugin": "^1.6.9",
|
|
132
|
-
"acorn": "^8.
|
|
137
|
+
"acorn": "^8.16.0",
|
|
133
138
|
"babel-plugin-require-context-hook": "^1.0.0",
|
|
134
139
|
"caniuse-lite": "^1.0.30001770",
|
|
135
140
|
"chai-as-promised": "^8.0.2",
|
|
@@ -138,8 +143,9 @@
|
|
|
138
143
|
"core-js": "^3.48.0",
|
|
139
144
|
"cpy-cli": "^7.0.0",
|
|
140
145
|
"dotenv-cli": "^11.0.0",
|
|
141
|
-
"eslint": "^
|
|
146
|
+
"eslint": "^9.39.2",
|
|
142
147
|
"eslint-config-prettier": "^10.1.8",
|
|
148
|
+
"eslint-formatter-jslint-xml": "^8.40.0",
|
|
143
149
|
"eslint-import-resolver-exports": "^1.0.0-beta.5",
|
|
144
150
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
145
151
|
"eslint-import-resolver-webpack": "^0.13.10",
|
|
@@ -148,10 +154,10 @@
|
|
|
148
154
|
"eslint-plugin-prettier": "^5.5.5",
|
|
149
155
|
"eslint-plugin-react": "^7.37.5",
|
|
150
156
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
151
|
-
"eslint-plugin-storybook": "^10.2.
|
|
157
|
+
"eslint-plugin-storybook": "^10.2.13",
|
|
152
158
|
"eslint-plugin-unicorn": "^63.0.0",
|
|
153
159
|
"events": "^3.3.0",
|
|
154
|
-
"glob": "^13.0.
|
|
160
|
+
"glob": "^13.0.6",
|
|
155
161
|
"globals": "^17.3.0",
|
|
156
162
|
"html-webpack-plugin": "^5.6.6",
|
|
157
163
|
"http-server": "^14.1.1",
|
|
@@ -170,22 +176,23 @@
|
|
|
170
176
|
"react-dom": "^19.2.4",
|
|
171
177
|
"regenerator-runtime": "^0.14.1",
|
|
172
178
|
"rimraf": "^6.1.3",
|
|
173
|
-
"rollup": "^4.
|
|
179
|
+
"rollup": "^4.59.0",
|
|
174
180
|
"rollup-plugin-clear": "^2.0.7",
|
|
175
181
|
"storage-mock": "^2.1.0",
|
|
176
182
|
"storybook": "10.2.13",
|
|
177
|
-
"stylelint": "^17.
|
|
183
|
+
"stylelint": "^17.4.0",
|
|
178
184
|
"stylelint-config-sass-guidelines": "^13.0.0",
|
|
179
185
|
"svg-inline-loader": "^0.8.2",
|
|
180
186
|
"teamcity-service-messages": "^0.1.14",
|
|
181
187
|
"terser-webpack-plugin": "^5.3.16",
|
|
182
188
|
"typed-css-modules": "^0.9.1",
|
|
183
189
|
"typescript": "~5.9.3",
|
|
184
|
-
"typescript-eslint": "^8.
|
|
190
|
+
"typescript-eslint": "^8.56.1",
|
|
185
191
|
"vitest": "^4.0.18",
|
|
186
192
|
"vitest-teamcity-reporter": "^0.4.1",
|
|
187
|
-
"webpack": "^5.105.
|
|
188
|
-
"webpack-cli": "^6.0.1"
|
|
193
|
+
"webpack": "^5.105.3",
|
|
194
|
+
"webpack-cli": "^6.0.1",
|
|
195
|
+
"xmlappend": "^1.0.4"
|
|
189
196
|
},
|
|
190
197
|
"peerDependencies": {
|
|
191
198
|
"@types/react": ">=18.0.0",
|
|
@@ -240,7 +247,7 @@
|
|
|
240
247
|
"postcss-font-family-system-ui": "^5.0.0",
|
|
241
248
|
"postcss-loader": "^8.2.1",
|
|
242
249
|
"postcss-modules-values-replace": "^4.2.2",
|
|
243
|
-
"postcss-preset-env": "^11.
|
|
250
|
+
"postcss-preset-env": "^11.2.0",
|
|
244
251
|
"react-compiler-runtime": "^1.0.0",
|
|
245
252
|
"react-movable": "^3.4.1",
|
|
246
253
|
"react-virtualized": "^9.22.6",
|