@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.
@@ -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 = null;
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 = null;
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 = null;
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;
@@ -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 (!this.virtualizedList &&
135
- !this.props.disableScrollToActive &&
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={() => { }} scrollToIndex={!this.props.disableScrollToActive &&
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
- query: string | null | undefined;
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
- historyStack: HistoryEntry[];
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
- // An array of {query: string; caret: number}[]
167
- historyStack = [];
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
- this._pushHistory(state);
321
+ if (!undoOrRedo && 'query' in state) {
322
+ this._pushHistory(state.query);
323
+ }
319
324
  resolve?.();
320
325
  });
321
326
  };
322
- _pushHistory(state) {
323
- const queryIsSet = 'query' in state;
324
- const queryIsSame = this.historyStack[0]?.query === state.query;
325
- if (queryIsSet && !queryIsSame) {
326
- this.historyStack.unshift({
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
- const previous = this.historyStack.splice(0, 2)[1];
334
- if (!previous) {
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
- this.setState({ query: previous.query }, () => {
338
- this.caret?.setPosition(previous.caret);
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
- let renderMore = children.some(tab => tab.props.alwaysHidden);
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.title) {
30
+ if (Tooltip.isShow(this.props)) {
28
31
  this.addListeners();
29
32
  }
30
33
  }
31
34
  componentDidUpdate(prevProps) {
32
- if (!prevProps.title && this.props.title) {
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 (prevProps.title && !this.props.title) {
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
- const { delay, title } = this.props;
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' && !!title ? { 'aria-label': title, role: 'tooltip' } : {};
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.96",
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.3",
107
+ "@eslint/eslintrc": "^3.3.4",
103
108
  "@eslint/js": "^10.0.1",
104
- "@figma/code-connect": "^1.3.13",
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.8",
116
- "@storybook/addon-docs": "^10.2.8",
117
- "@storybook/addon-themes": "^10.2.8",
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.8",
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.15.0",
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": "^10.0.1",
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.8",
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.3",
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.57.1",
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.3.0",
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.55.0",
190
+ "typescript-eslint": "^8.56.1",
185
191
  "vitest": "^4.0.18",
186
192
  "vitest-teamcity-reporter": "^0.4.1",
187
- "webpack": "^5.105.2",
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.1.3",
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",