@jetbrains/ring-ui 7.0.32 → 7.0.34

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.
@@ -5,11 +5,13 @@
5
5
  object-fit: cover;
6
6
  object-position: center;
7
7
 
8
- /* This is a "graceful degradation" fallback, while the real value is controlled by JS */
9
-
10
8
  border-radius: var(--ring-border-radius);
11
9
  }
12
10
 
11
+ .round {
12
+ border-radius: 50%;
13
+ }
14
+
13
15
  .avatarShadow {
14
16
  /* See https://stackoverflow.com/questions/21414925/why-doesnt-inset-box-shadow-work-over-images */
15
17
 
@@ -22,7 +22,7 @@ switch (content) {
22
22
  props.push('username="Samuel Morse"');
23
23
  break;
24
24
  case 'label':
25
- props.push('info="5"');
25
+ props.push(`info="${instance.findText('Content').textContent}"`);
26
26
  break;
27
27
  case 'icon':
28
28
  imports.push(
@@ -34,9 +34,7 @@ export default class Avatar extends PureComponent {
34
34
  }
35
35
  const sizeString = `${size}px`;
36
36
  const subavatarSizeString = `${subavatarSize}px`;
37
- const borderRadius = size <= Size.Size18 ? 'var(--ring-border-radius-small)' : 'var(--ring-border-radius)';
38
37
  const styleObj = {
39
- borderRadius: round ? '50%' : borderRadius,
40
38
  height: sizeString,
41
39
  width: sizeString,
42
40
  ...style,
@@ -47,8 +45,11 @@ export default class Avatar extends PureComponent {
47
45
  width: subavatarSizeString,
48
46
  ...style,
49
47
  };
48
+ const classes = classNames(styles.avatar, this.props.className, {
49
+ [styles.round]: round,
50
+ });
50
51
  if (!url || this.state.errorUrl === url) {
51
- return (_jsxs("span", { ...restProps, "data-test": "avatar", className: classNames(styles.avatar, this.props.className, {
52
+ return (_jsxs("span", { ...restProps, "data-test": "avatar", className: classNames(classes, {
52
53
  [styles.empty]: username == null && info == null,
53
54
  }), style: styleObj, children: [username != null && _jsx(FallbackAvatar, { size: size, round: round, username: username }), info != null && _jsx(AvatarInfo, { size: size, children: info })] }));
54
55
  }
@@ -71,10 +72,10 @@ export default class Avatar extends PureComponent {
71
72
  subavatarSizeString,
72
73
  };
73
74
  subavatarSrc = skipParams ? subavatar : encodeURL(urlStart, queryParams);
74
- return (_jsxs("div", { children: [_jsx("img", { ...restProps, onError: this.handleError, onLoad: this.handleSuccess, className: classNames(styles.avatar, styles.avatarShadow, this.props.className), style: styleObj, src: src, alt: "User avatar" }), _jsx("img", { ...restProps, "data-test": "avatar", onError: this.handleError, onLoad: this.handleSuccess, className: classNames(styles.subavatar), style: styleObjGroup, src: subavatarSrc, alt: "Subavatar" })] }));
75
+ return (_jsxs("div", { children: [_jsx("img", { ...restProps, onError: this.handleError, onLoad: this.handleSuccess, className: classNames(classes, styles.avatarShadow), style: styleObj, src: src, alt: "User avatar" }), _jsx("img", { ...restProps, "data-test": "avatar", onError: this.handleError, onLoad: this.handleSuccess, className: classNames(styles.subavatar), style: styleObjGroup, src: subavatarSrc, alt: "Subavatar" })] }));
75
76
  }
76
77
  else {
77
- return (_jsx("img", { ...restProps, "data-test": "avatar", onError: this.handleError, onLoad: this.handleSuccess, className: classNames(styles.avatar, styles.avatarShadow, this.props.className), style: styleObj, src: src, alt: "User avatar" }));
78
+ return (_jsx("img", { ...restProps, "data-test": "avatar", onError: this.handleError, onLoad: this.handleSuccess, className: classNames(classes, styles.avatarShadow), style: styleObj, src: src, alt: "User avatar" }));
78
79
  }
79
80
  }
80
81
  }
@@ -37,29 +37,23 @@
37
37
  .item {
38
38
  position: relative;
39
39
 
40
- margin-left: calc(var(--ring-avatar-stack-offset) * -1);
40
+ margin: -1px;
41
+ margin-left: calc(var(--ring-avatar-stack-offset) * -1 - 1px);
42
+ padding: 1px;
41
43
 
42
44
  transition: transform var(--ring-fast-ease);
43
45
  mask-image: var(--ring-avatar-stack-mask-image);
44
- mask-position: calc(var(--ring-avatar-stack-offset) - 4px) -1px;
46
+ mask-position: calc(var(--ring-avatar-stack-offset) - 3px) 0;
45
47
  mask-repeat: no-repeat;
46
48
 
49
+ border-radius: calc(var(--ring-border-radius) + 1px);
47
50
 
48
- /* make the gaps hoverable */
49
- &::before {
50
- position: absolute;
51
- top: 0;
52
- right: -1px;
53
- bottom: 0;
54
- left: -1px;
55
-
56
- content: '';
57
- }
51
+ background-color: var(--ring-content-background-color);
58
52
  }
59
53
 
60
54
  .item:nth-child(1) {
61
55
  --ring-avatar-stack-index: 0;
62
- --ring-avatar-stack-offset: 0;
56
+ --ring-avatar-stack-offset: 0px;
63
57
 
64
58
  mask: none;
65
59
  }
@@ -0,0 +1,33 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI?node-id=5990-752
2
+ const figma = require('figma');
3
+
4
+ const instance = figma.selectedInstance;
5
+ const sizeString = instance.getString('Size');
6
+ const [sizeSubstring] = sizeString.match(/\d+/) ?? [];
7
+ const size = parseInt(sizeSubstring, 10);
8
+ const children = instance.findConnectedInstances(() => true);
9
+
10
+ const imports = ["import AvatarStack from '@jetbrains/ring-ui/components/avatar-stack/avatar-stack'"];
11
+ const props = [];
12
+
13
+ const DEFAULT_SIZE = 20;
14
+ const isDefaultSize = size === DEFAULT_SIZE;
15
+ if (!isDefaultSize) {
16
+ props.push(`size={Size.Size${size}}`);
17
+ }
18
+
19
+ const renderedChildren = children.map(child => {
20
+ const {example} = child.executeTemplate();
21
+ const [childImports, code] = example[0].code.split('\n\n');
22
+ return {imports: childImports, code};
23
+ });
24
+
25
+ export default {
26
+ id: 'avatar-stack',
27
+ example: figma.code`${imports.join('\n')}
28
+ ${renderedChildren[0].imports}
29
+
30
+ <AvatarStack ${props.map(prop => `${prop} `).join('')}>
31
+ ${renderedChildren.map(({code}) => code).join('\n ')}
32
+ </AvatarStack>`,
33
+ };
@@ -9,7 +9,7 @@ export default function AvatarStack({ children, className, size = Size.Size20, e
9
9
  const [dropdownOpen, setDropdownOpen] = useState(false);
10
10
  return (_jsxs("div", { className: classNames(styles.avatarStack, className, styles[`size${size}`], {
11
11
  [styles.hovered]: dropdownOpen,
12
- }), ...restProps, children: [Children.map(children, (child, index) => (_jsx("div", { className: styles.item, style: { '--ring-avatar-stack-index': index }, children: child }))), extraItems?.length ? (_jsx(DropdownMenu, { hoverMode: true, hoverShowTimeOut: 10, onShow: () => setDropdownOpen(true), onHide: () => setDropdownOpen(false), className: styles.extra, style: {
12
+ }), ...restProps, style: { height: size, ...restProps.style }, children: [Children.map(children, (child, index) => (_jsx("div", { className: styles.item, style: { '--ring-avatar-stack-index': index }, children: child }))), extraItems?.length ? (_jsx(DropdownMenu, { hoverMode: true, hoverShowTimeOut: 10, onShow: () => setDropdownOpen(true), onHide: () => setDropdownOpen(false), className: styles.extra, style: {
13
13
  width: size,
14
14
  height: size,
15
15
  '--ring-avatar-stack-index': Children.count(children),
@@ -1,3 +1,3 @@
1
- <svg width="56px" height="56px" xmlns="http://www.w3.org/2000/svg">
2
- <path fill="black" d="M 0 0 a 5 5 0 0 1 5 5 V 51 a 5 5 0 0 1 -5 5 H 56 V 0"/>
1
+ <svg width="58px" height="58px" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill="black" d="M 0 0 a 5 5 0 0 1 5 5 V 53 a 5 5 0 0 1 -5 5 H 58 V 0"/>
3
3
  </svg>
@@ -0,0 +1,31 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI?node-id=460%3A2730
2
+ const figma = require('figma');
3
+
4
+ const instance = figma.selectedInstance;
5
+
6
+ const imports = [
7
+ "import Breadcrumbs from '@jetbrains/ring-ui/components/breadcrumbs/breadcrumbs'",
8
+ "import Link from '@jetbrains/ring-ui/components/link/link'",
9
+ ];
10
+
11
+ const children = instance
12
+ .findLayers(() => true)
13
+ .map(layer => layer.textContent)
14
+ .filter(text => text !== '/');
15
+
16
+ export default {
17
+ id: 'breadcrumbs',
18
+ example: figma.code`${imports.join('\n')}
19
+
20
+ <Breadcrumbs>
21
+ ${children
22
+ .map((text, index) => {
23
+ const props = [`href="/page${index + 1}"`];
24
+ if (index === children.length - 1) {
25
+ props.push('active');
26
+ }
27
+ return `<Link ${props.map(prop => `${prop} `).join('')}>${text}</Link>`;
28
+ })
29
+ .join('\n ')}
30
+ </Breadcrumbs>`,
31
+ };
@@ -1,3 +1,4 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI?node-id=9954-528
1
2
  const figma = require('figma');
2
3
 
3
4
  const instance = figma.selectedInstance;
@@ -42,7 +43,7 @@ switch (variant) {
42
43
  default:
43
44
  }
44
45
 
45
- let children = 'Button';
46
+ const children = instance.findLayers(() => true)[0].findText('Button').textContent;
46
47
  const use12pxIcon = size === 'S' && variant !== 'Text';
47
48
  let useButtonGroup = false;
48
49
  switch (type) {
@@ -54,7 +55,6 @@ switch (type) {
54
55
  props.push('icon={downloadIcon}');
55
56
  break;
56
57
  case 'Icon':
57
- children = null;
58
58
  imports.push(`import addIcon from '@jetbrains/icons/add${use12pxIcon ? '-12px' : ''}'`);
59
59
  props.push('icon={addIcon}');
60
60
  break;
@@ -0,0 +1,31 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI-(Internal)?node-id=226-2666
2
+ const figma = require('figma');
3
+
4
+ const instance = figma.selectedInstance;
5
+ const labelType = instance.getString('Label');
6
+ const children = instance.findConnectedInstances(() => true);
7
+ const label = instance.findText('Group description').textContent;
8
+
9
+ const isFormLabel = labelType === 'form';
10
+ const imports = [
11
+ `import ControlLabel${isFormLabel ? ', {LabelType}' : ''} from '@jetbrains/ring-ui/components/control-label/control-label'`,
12
+ ];
13
+ const labelProps = [];
14
+ if (isFormLabel) {
15
+ labelProps.push('type={LabelType.FORM}');
16
+ }
17
+
18
+ const renderedChildren = children.map(child => {
19
+ const {example} = child.executeTemplate();
20
+ const [childImports, code] = example[0].code.split('\n\n');
21
+ return {imports: childImports, code};
22
+ });
23
+
24
+ export default {
25
+ id: 'checkbox-group',
26
+ example: figma.code`${imports.join('\n')}
27
+ ${renderedChildren[0].imports}
28
+
29
+ <ControlLabel ${labelProps.map(prop => `${prop} `).join('')}>${label}</ControlLabel>
30
+ ${renderedChildren.map(({code}) => code).join('\n<br />\n')}`,
31
+ };
@@ -23,6 +23,6 @@ export default class Checkbox extends PureComponent<CheckboxProps> {
23
23
  componentDidUpdate(prevProps: CheckboxProps): void;
24
24
  input?: HTMLInputElement | null;
25
25
  inputRef: (el: HTMLInputElement | null) => void;
26
- composedInputRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: HTMLInputElement | null) => void>;
26
+ composedInputRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: T | null) => void>;
27
27
  render(): import("react/jsx-runtime").JSX.Element;
28
28
  }
@@ -0,0 +1,38 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI?node-id=224%3A1943
2
+ const figma = require('figma');
3
+
4
+ const instance = figma.selectedInstance;
5
+ const selected = instance.getString('Selected');
6
+ const hasLabel = instance.getBoolean('Label');
7
+ const label = instance.findText('Label').textContent;
8
+ const hasHelpText = instance.getBoolean('Help Text');
9
+ const helpText = instance.findText('Description').textContent;
10
+ const state = instance.getString('State');
11
+
12
+ const imports = ["import Checkbox from '@jetbrains/ring-ui/components/checkbox/checkbox'"];
13
+ const props = [];
14
+ switch (selected) {
15
+ case 'selected':
16
+ props.push('defaultChecked');
17
+ break;
18
+ case 'intermediate':
19
+ props.push('indeterminate', 'defaultChecked');
20
+ break;
21
+ default:
22
+ }
23
+ if (hasLabel) {
24
+ props.push(`label="${label}"`);
25
+ }
26
+ if (hasHelpText) {
27
+ props.push(`help="${helpText}"`);
28
+ }
29
+ if (state === 'Disabled') {
30
+ props.push('disabled');
31
+ }
32
+
33
+ export default {
34
+ id: 'checkbox',
35
+ example: figma.code`${imports.join('\n')}
36
+
37
+ <Checkbox ${props.map(prop => `${prop} `).join('')}/>`,
38
+ };
@@ -19,7 +19,7 @@
19
19
  min-height: calc(var(--ring-unit) * 4);
20
20
  padding: calc(var(--ring-unit) - 1px) calc(var(--ring-unit) * 1.5 - 1px);
21
21
 
22
- white-space: nowrap;
22
+ white-space: pre-wrap;
23
23
 
24
24
  color: var(--ring-error-color);
25
25
 
@@ -1,7 +1,7 @@
1
1
  import { PureComponent, ReactElement } from 'react';
2
2
  export type ErrorBubbleProps<P> = Partial<P> & {
3
3
  className?: string | null | undefined;
4
- children: ReactElement<P> | ReactElement<P>[];
4
+ children?: ReactElement<P> | ReactElement<P>[];
5
5
  error?: string | null | undefined;
6
6
  };
7
7
  /**
@@ -0,0 +1,15 @@
1
+ // url=https://www.figma.com/design/HY6d4uE1xxaQXCMG9fe6Y2/RingUI-(Internal)?node-id=1228-2869
2
+ const figma = require('figma');
3
+
4
+ const instance = figma.selectedInstance;
5
+ const error = instance.findLayers(() => true)[0].textContent;
6
+
7
+ const imports = ["import ErrorBubble from '@jetbrains/ring-ui/components/error-bubble/error-bubble'"];
8
+ const props = [`error={\`${error}\``];
9
+
10
+ export default {
11
+ id: 'error-bubble',
12
+ example: figma.code`${imports.join('\n')}
13
+
14
+ <ErrorBubble ${props.map(prop => `${prop} `).join('')}/>`,
15
+ };
@@ -11,6 +11,7 @@ export default class ErrorBubble extends PureComponent {
11
11
  render() {
12
12
  const { children, className, ...restProps } = this.props;
13
13
  const errorBubbleClasses = classNames(styles.errorBubble, className);
14
- return (_jsxs("div", { className: styles.errorBubbleWrapper, "data-test": "ring-error-bubble-wrapper", children: [Children.map(children, (child) => cloneElement(child, { ...child.props, ...restProps })), restProps.error && (_jsx(Popup, { trapFocus: false, className: styles.errorBubblePopup, hidden: false, attached: false, directions: [Directions.RIGHT_CENTER, Directions.RIGHT_BOTTOM, Directions.RIGHT_TOP], children: _jsx("div", { className: errorBubbleClasses, "data-test": "ring-error-bubble", children: restProps.error }) }))] }));
14
+ return (_jsxs("div", { className: styles.errorBubbleWrapper, "data-test": "ring-error-bubble-wrapper", children: [children &&
15
+ Children.map(children, (child) => cloneElement(child, { ...child.props, ...restProps })), restProps.error && (_jsx(Popup, { trapFocus: false, className: styles.errorBubblePopup, hidden: false, attached: false, directions: [Directions.RIGHT_CENTER, Directions.RIGHT_BOTTOM, Directions.RIGHT_TOP], children: _jsx("div", { className: errorBubbleClasses, "data-test": "ring-error-bubble", children: restProps.error }) }))] }));
15
16
  }
16
17
  }
@@ -39,18 +39,26 @@
39
39
  --ring-main-hover-color: rgb(var(--ring-main-hover-components)); /* #3369d6 */
40
40
  --ring-main-success-components: 32, 138, 60;
41
41
  --ring-main-success-color: rgb(var(--ring-main-success-components)); /* #208A3C */
42
- --ring-main-success-hover-components: 31, 128, 57;
43
- --ring-main-success-hover-color: rgb(var(--ring-main-success-hover-components)); /* #1F8039 */
42
+ --ring-main-success-hover-components: 31, 117, 54;
43
+ --ring-main-success-hover-color: rgb(var(--ring-main-success-hover-components)); /* #1F7536 */
44
44
  --ring-main-error-components: 204, 54, 69;
45
45
  --ring-main-error-color: rgb(var(--ring-main-error-components)); /* #CC3645 */
46
- --ring-main-error-hover-components: 188, 48, 62;
47
- --ring-main-error-hover-color: rgb(var(--ring-main-error-hover-components)); /* #BC303E */
46
+ --ring-main-error-hover-components: 173, 43, 56;
47
+ --ring-main-error-hover-color: rgb(var(--ring-main-error-hover-components)); /* #AD2B38 */
48
+ --ring-main-warning-components: 229, 109, 23;
49
+ --ring-main-warning-color: rgb(var(--ring-main-warning-components)); /* #E56D17 */
50
+ --ring-main-warning-hover-components: 206, 97, 23;
51
+ --ring-main-warning-hover-color: rgb(var(--ring-main-warning-hover-components)); /* #CE6117 */
48
52
  --ring-icon-error-components: 204, 54, 69;
49
53
  --ring-icon-error-color: rgb(var(--ring-icon-error-components)); /* #CC3645 */ /* TODO: remove in 8.0 in favor of --ring-error-color */
50
- --ring-icon-warning-components: 164, 103, 4;
51
- --ring-icon-warning-color: rgb(var(--ring-icon-warning-components)); /* #A46704 */ /* TODO: remove in 8.0 in favor of --ring-warning-color */
52
- --ring-icon-success-components: 31, 117, 54;
53
- --ring-icon-success-color: rgb(var(--ring-icon-success-components)); /* #1F7536 */ /* TODO: remove in 8.0 in favor of --ring-success-color */
54
+ --ring-icon-warning-components: 229, 109, 23;
55
+ --ring-icon-warning-color: rgb(var(--ring-icon-warning-components)); /* #E56D17 */
56
+ --ring-icon-success-components: 32, 138, 60;
57
+ --ring-icon-success-color: rgb(var(--ring-icon-success-components)); /* #208A3C */
58
+ --ring-icon-highlight-components: 255, 175, 15;
59
+ --ring-icon-highlight-color: rgb(var(--ring-icon-highlight-components)); /* #FFAF0F */
60
+ --ring-icon-highlight-hover-components: 223, 147, 3;
61
+ --ring-icon-highlight-hover-color: rgb(var(--ring-icon-highlight-hover-components)); /* #DF9303 */
54
62
  --ring-pale-control-components: 194, 214, 252;
55
63
  --ring-pale-control-color: rgb(var(--ring-pale-control-components)); /* #C2D6FC */
56
64
  --ring-popup-border-components: 0, 28, 54;
@@ -81,10 +89,10 @@
81
89
  --ring-link-hover-color: rgb(var(--ring-link-hover-components)); /* #223C72 */
82
90
  --ring-error-components: 204, 54, 69;
83
91
  --ring-error-color: rgb(var(--ring-error-components)); /* #CC3645 */
84
- --ring-warning-components: 164, 103, 4;
85
- --ring-warning-color: rgb(var(--ring-warning-components)); /* #A46704 */
92
+ --ring-warning-components: 184, 85, 22;
93
+ --ring-warning-color: rgb(var(--ring-warning-components)); /* #B85516 */ /* Prefer using warning icon + regular text color */
86
94
  --ring-success-components: 31, 117, 54;
87
- --ring-success-color: rgb(var(--ring-success-components)); /* #1F7536 */
95
+ --ring-success-color: rgb(var(--ring-success-components)); /* #1F7536 */ /* Prefer using success icon + regular text color */
88
96
  --ring-text-components: 39, 40, 46;
89
97
  --ring-text-color: rgb(var(--ring-text-components)); /* #27282E */
90
98
  --ring-active-text-color: var(--ring-text-color);
@@ -117,8 +125,10 @@
117
125
  --ring-tag-hover-background-color: rgb(var(--ring-tag-hover-background-components)); /* #D3D5DB */
118
126
  --ring-removed-background-components: 250, 212, 216;
119
127
  --ring-removed-background-color: rgb(var(--ring-removed-background-components)); /* #FAD4D8 */
120
- --ring-warning-background-components: 255, 241, 209;
121
- --ring-warning-background-color: rgb(var(--ring-warning-background-components)); /* #FFF1D1 */
128
+ --ring-warning-background-components: 252, 230, 214;
129
+ --ring-warning-background-color: rgb(var(--ring-warning-background-components)); /* #FCE6D6 */
130
+ --ring-highlight-background-components: 255, 241, 209;
131
+ --ring-highlight-background-color: rgb(var(--ring-highlight-background-components)); /* #FFF1D1 */
122
132
  --ring-added-background-components: 197, 229, 204;
123
133
  --ring-added-background-color: rgb(var(--ring-added-background-components)); /* #C5E5CC */
124
134
  --ring-disabled-background-components: 247, 248, 250;
@@ -133,10 +143,12 @@
133
143
  --ring-table-loader-background-color: rgba(var(--ring-content-background-components), 0.5); /* #FFFFFF50 */
134
144
  --ring-removed-subtle-background-components: 255, 247, 247;
135
145
  --ring-removed-subtle-background-color: rgb(var(--ring-removed-subtle-background-components)); /* #FFF7F7 */
136
- --ring-warning-subtle-background-components: 255, 250, 235;
137
- --ring-warning-subtle-background-color: rgb(var(--ring-warning-subtle-background-components)); /* #FFFAEB */
138
- --ring-added-subtle-background-components: 242, 252, 243;
139
- --ring-added-subtle-background-color: rgb(var(--ring-added-subtle-background-components)); /* #F2FCF3 */
146
+ --ring-warning-subtle-background-components: 255, 244, 235;
147
+ --ring-warning-subtle-background-color: rgb(var(--ring-warning-subtle-background-components)); /* #FFF4EB */
148
+ --ring-highlight-subtle-background-components: 255, 246, 222;
149
+ --ring-highlight-subtle-background-color: rgb(var(--ring-highlight-subtle-background-components)); /* #FFF6DE */
150
+ --ring-added-subtle-background-components: 230, 247, 233;
151
+ --ring-added-subtle-background-color: rgb(var(--ring-added-subtle-background-components)); /* #E6F7E9 */
140
152
 
141
153
  /* Code */
142
154
  --ring-code-background-color: var(--ring-content-background-color);
@@ -35,16 +35,24 @@
35
35
  --ring-main-success-color: rgb(var(--ring-main-success-components)); /* #57965C */
36
36
  --ring-main-success-hover-components: 78, 128, 82;
37
37
  --ring-main-success-hover-color: rgb(var(--ring-main-success-hover-components)); /* #4E8052 */
38
- --ring-main-error-components: 189, 87, 87;
39
- --ring-main-error-color: rgb(var(--ring-main-error-components)); /* #BD5757 */
40
- --ring-main-error-hover-components: 156, 78, 78;
41
- --ring-main-error-hover-color: rgb(var(--ring-main-error-hover-components)); /* #9C4E4E */
38
+ --ring-main-error-components: 219, 92, 92;
39
+ --ring-main-error-color: rgb(var(--ring-main-error-components)); /* #DB5C5C */
40
+ --ring-main-error-hover-components: 189, 87, 87;
41
+ --ring-main-error-hover-color: rgb(var(--ring-main-error-hover-components)); /* #BD5757 */
42
+ --ring-main-warning-components: 224, 136, 85;
43
+ --ring-main-warning-color: rgb(var(--ring-main-warning-components)); /* #E08855 */
44
+ --ring-main-warning-hover-components: 199, 125, 85;
45
+ --ring-main-warning-hover-color: rgb(var(--ring-main-warning-hover-components)); /* #C77D55 */
42
46
  --ring-icon-error-components: 227, 119, 116;
43
47
  --ring-icon-error-color: rgb(var(--ring-icon-error-components)); /* #E37774 */ /* TODO: remove in 8.0 in favor of --ring-error-color */
44
- --ring-icon-warning-components: 242, 197, 92;
45
- --ring-icon-warning-color: rgb(var(--ring-icon-warning-components)); /* #F2C55C */ /* TODO: remove in 8.0 in favor of --ring-warning-color */
46
- --ring-icon-success-components: 115, 189, 121;
47
- --ring-icon-success-color: rgb(var(--ring-icon-success-components)); /* #73BD79 */ /* TODO: remove in 8.0 in favor of --ring-success-color */
48
+ --ring-icon-warning-components: 224, 136, 85;
49
+ --ring-icon-warning-color: rgb(var(--ring-icon-warning-components)); /* #E08855 */
50
+ --ring-icon-success-components: 95, 173, 101;
51
+ --ring-icon-success-color: rgb(var(--ring-icon-success-components)); /* #5FAD65 */
52
+ --ring-icon-highlight-components: 214, 174, 88;
53
+ --ring-icon-highlight-color: rgb(var(--ring-icon-highlight-components)); /* #D6AE58 */
54
+ --ring-icon-highlight-hover-components: 186, 151, 82;
55
+ --ring-icon-highlight-hover-color: rgb(var(--ring-icon-highlight-hover-components)); /* #BA9752 */
48
56
  --ring-popup-border-components: 57, 59, 64;
49
57
  --ring-popup-border-color: rgb(var(--ring-popup-border-components)); /* #393B40 */
50
58
  --ring-popup-shadow-color: rgba(0, 0, 0, 0.31);
@@ -69,10 +77,10 @@
69
77
  --ring-link-hover-color: rgb(var(--ring-link-hover-components)); /* #6B9BFA */
70
78
  --ring-error-components: 227, 119, 116;
71
79
  --ring-error-color: rgb(var(--ring-error-components)); /* #E37774 */
72
- --ring-warning-components: 242, 197, 92;
73
- --ring-warning-color: rgb(var(--ring-warning-components)); /* #F2C55C */
74
- --ring-success-components: 115, 189, 121;
75
- --ring-success-color: rgb(var(--ring-success-components)); /* #73BD79 */
80
+ --ring-warning-components: 224, 136, 85;
81
+ --ring-warning-color: rgb(var(--ring-warning-components)); /* #E08855 */ /* Prefer using warning icon + regular text color */
82
+ --ring-success-components: 95, 173, 101;
83
+ --ring-success-color: rgb(var(--ring-success-components)); /* #5FAD65 */ /* Prefer using success icon + regular text color */
76
84
  --ring-text-components: 223, 225, 229;
77
85
  --ring-text-color: rgb(var(--ring-text-components)); /* #DFE1E5 */
78
86
  --ring-active-text-components: 255, 255, 255;
@@ -104,8 +112,10 @@
104
112
  --ring-tag-hover-background-color: rgb(var(--ring-tag-hover-background-components)); /* #393B40 */
105
113
  --ring-removed-background-components: 94, 56, 56;
106
114
  --ring-removed-background-color: rgb(var(--ring-removed-background-components)); /* #5E3838 */
107
- --ring-warning-background-components: 94, 77, 51;
108
- --ring-warning-background-color: rgb(var(--ring-warning-background-components)); /* #5E4D33 */
115
+ --ring-warning-background-components: 97, 68, 56;
116
+ --ring-warning-background-color: rgb(var(--ring-warning-background-components)); /* #614438 */
117
+ --ring-highlight-background-components: 94, 77, 51;
118
+ --ring-highlight-background-color: rgb(var(--ring-highlight-background-components)); /* #5E4D33 */
109
119
  --ring-added-background-components: 55, 82, 57;
110
120
  --ring-added-background-color: rgb(var(--ring-added-background-components)); /* #375239 */
111
121
  --ring-disabled-background-components: 57, 59, 64;
@@ -119,8 +129,10 @@
119
129
  --ring-table-loader-background-color: rgba(var(--ring-content-background-components), 0.5); /* #2B2D3050 */
120
130
  --ring-removed-subtle-background-components: 64, 41, 41;
121
131
  --ring-removed-subtle-background-color: rgb(var(--ring-removed-subtle-background-components)); /* #402929 */
122
- --ring-warning-subtle-background-components: 61, 50, 35;
123
- --ring-warning-subtle-background-color: rgb(var(--ring-warning-subtle-background-components)); /* #3D3223 */
132
+ --ring-warning-subtle-background-components: 69, 50, 43;
133
+ --ring-warning-subtle-background-color: rgb(var(--ring-warning-subtle-background-components)); /* #45322B */
134
+ --ring-highlight-subtle-background-components: 61, 50, 35;
135
+ --ring-highlight-subtle-background-color: rgb(var(--ring-highlight-subtle-background-components)); /* #3D3223 */
124
136
  --ring-added-subtle-background-components: 37, 54, 39;
125
137
  --ring-added-subtle-background-color: rgb(var(--ring-added-subtle-background-components)); /* #253627 */
126
138
 
@@ -29,6 +29,7 @@ export interface InputBaseProps {
29
29
  onClear?: ((e: React.MouseEvent<HTMLButtonElement>) => void) | null | undefined;
30
30
  icon?: string | ComponentType | null | undefined;
31
31
  height?: ControlsHeight | undefined;
32
+ beforeInput?: ReactNode;
32
33
  afterInput?: ReactNode;
33
34
  translations?: InputTranslations | null | undefined;
34
35
  }
@@ -64,7 +65,7 @@ export declare class Input extends PureComponent<InputProps> {
64
65
  stretch(el: HTMLElement | null | undefined): void;
65
66
  adapt(): void;
66
67
  inputRef: (el: HTMLInputElement | HTMLTextAreaElement | null) => void;
67
- composedInputRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement | HTMLTextAreaElement> | undefined)[]) => (value: HTMLInputElement | HTMLTextAreaElement | null) => void>;
68
+ composedInputRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement | HTMLTextAreaElement> | undefined)[]) => (value: T | null) => void>;
68
69
  clear: (e: React.MouseEvent<HTMLButtonElement>) => void;
69
70
  handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
70
71
  handleTextareaChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
@@ -93,7 +93,7 @@ export class Input extends PureComponent {
93
93
  // Modifiers
94
94
  size, multiline, borderless,
95
95
  // Props
96
- label, labelType, error, help, className, inputClassName, children, value, onClear, disabled, inputRef, onChange, enableShortcuts, id, placeholder, icon, translations, height = this.context, afterInput, ...restProps } = this.props;
96
+ label, labelType, error, help, className, inputClassName, children, value, onClear, disabled, inputRef, onChange, enableShortcuts, id, placeholder, icon, translations, height = this.context, beforeInput, afterInput, ...restProps } = this.props;
97
97
  const { empty } = this.state;
98
98
  const clearable = !!onClear;
99
99
  const classes = classNames(className, styles.outerContainer, [styles[`size${size}`]], [styles[`height${height}`]], {
@@ -116,7 +116,7 @@ export class Input extends PureComponent {
116
116
  'aria-label': typeof label === 'string' && label ? label : placeholder,
117
117
  'data-enabled-shortcuts': Array.isArray(enableShortcuts) ? enableShortcuts.join(',') : null,
118
118
  };
119
- return (_jsx(I18nContext.Consumer, { children: ({ translate }) => (_jsxs("div", { className: classes, "data-test": "ring-input", children: [label && (_jsx(ControlLabel, { htmlFor: this.getId(), disabled: disabled, type: labelType, children: label })), _jsxs("div", { className: styles.container, children: [icon && _jsx(Icon, { glyph: icon, className: styles.icon }), multiline ? (_jsx("textarea", { onChange: this.handleTextareaChange, rows: 1, ...commonProps, ...restProps })) : (_jsx("input", { onChange: this.handleInputChange, ...commonProps, ...restProps })), clearable && !disabled && (_jsx(Button, { title: translations?.clear ?? translate('clear'), "data-test": "ring-input-clear", className: styles.clear, icon: closeIcon, onClick: this.clear })), afterInput] }), error ? (_jsx("div", { className: styles.errorText, children: error })) : (help && _jsx(ControlHelp, { className: styles.helpText, children: help }))] })) }));
119
+ return (_jsx(I18nContext.Consumer, { children: ({ translate }) => (_jsxs("div", { className: classes, "data-test": "ring-input", children: [label && (_jsx(ControlLabel, { htmlFor: this.getId(), disabled: disabled, type: labelType, children: label })), _jsxs("div", { className: styles.container, children: [icon && _jsx(Icon, { glyph: icon, className: styles.icon }), beforeInput, multiline ? (_jsx("textarea", { onChange: this.handleTextareaChange, rows: 1, ...commonProps, ...restProps })) : (_jsx("input", { onChange: this.handleInputChange, ...commonProps, ...restProps })), clearable && !disabled && (_jsx(Button, { title: translations?.clear ?? translate('clear'), "data-test": "ring-input-clear", className: styles.clear, icon: closeIcon, onClick: this.clear })), afterInput] }), error ? (_jsx("div", { className: styles.errorText, children: error })) : (help && _jsx(ControlHelp, { className: styles.helpText, children: help }))] })) }));
120
120
  }
121
121
  }
122
122
  export default Input;
@@ -262,7 +262,7 @@ export default class Select<T = unknown> extends Component<SelectProps<T>, Selec
262
262
  private _getAvatar;
263
263
  filter?: HTMLInputElement | null;
264
264
  filterRef: (el: HTMLInputElement | null) => void;
265
- composedFilterRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: HTMLInputElement | null) => void>;
265
+ composedFilterRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: T_1 | null) => void>;
266
266
  getShortcutsMap(): {
267
267
  enter: () => true | undefined;
268
268
  esc: (event: KeyboardEvent) => boolean | undefined;
@@ -126,7 +126,7 @@ export default class SelectPopup<T = unknown> extends PureComponent<SelectPopupP
126
126
  list?: List<T> | null;
127
127
  listRef: (el: List<T> | null) => void;
128
128
  filterRef: (el: HTMLInputElement | null) => void;
129
- composedFilterRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: HTMLInputElement | null) => void>;
129
+ composedFilterRef: import("memoize-one").MemoizedFn<(...refs: (Ref<HTMLInputElement> | undefined)[]) => (value: T_1 | null) => void>;
130
130
  shortcutsScope: string;
131
131
  shortcutsMap: {
132
132
  tab: (event: Event) => void;
@@ -55,7 +55,7 @@ export default class Row<T extends SelectionItem> extends PureComponent<RowProps
55
55
  onDoubleClick: () => void;
56
56
  row?: HTMLElement | null;
57
57
  rowRef: (el: HTMLElement | null) => void;
58
- composedRowRef: import("memoize-one").MemoizedFn<(...refs: (React.Ref<HTMLElement> | undefined)[]) => (value: HTMLElement | null) => void>;
58
+ composedRowRef: import("memoize-one").MemoizedFn<(...refs: (React.Ref<HTMLElement> | undefined)[]) => (value: T_1 | null) => void>;
59
59
  render(): import("react/jsx-runtime").JSX.Element;
60
60
  }
61
61
  export type RowAttrs<T extends SelectionItem> = React.JSX.LibraryManagedAttributes<typeof Row, RowProps<T>>;
@@ -50,7 +50,7 @@ export interface TableProps<T extends SelectionItem> extends FocusSensorAddProps
50
50
  stickyHeaderOffset?: string | undefined;
51
51
  renderEmpty?: (() => ReactNode) | null | undefined;
52
52
  RowComponent: typeof Row;
53
- customLoader?: ((loaderClassName?: string) => ReactNode) | null | undefined;
53
+ renderLoader?: ((loaderClassName?: string) => ReactNode) | null | undefined;
54
54
  }
55
55
  /**
56
56
  * Interactive table with selection and keyboard navigation support.
@@ -109,7 +109,7 @@ export class Table extends PureComponent {
109
109
  window.scrollTo(scrollX, scrollY);
110
110
  };
111
111
  render() {
112
- const { data, selection, columns, caption, getItemKey, selectable, focused, isItemSelectable, getItemLevel, getItemClassName, getMetaColumnClassName, getItemDataTest, draggable, alwaysShowDragHandle, dragHandleTitle, loading, onSort, sortKey, sortOrder, loaderClassName, stickyHeader, stickyHeaderOffset, isItemCollapsible, isParentCollapsible, isItemCollapsed, onItemCollapse, onItemExpand, isDisabledSelectionVisible, getCheckboxTooltip, onItemDoubleClick, onItemClick, renderEmpty, RowComponent, customLoader, } = this.props;
112
+ const { data, selection, columns, caption, getItemKey, selectable, focused, isItemSelectable, getItemLevel, getItemClassName, getMetaColumnClassName, getItemDataTest, draggable, alwaysShowDragHandle, dragHandleTitle, loading, onSort, sortKey, sortOrder, loaderClassName, stickyHeader, stickyHeaderOffset, isItemCollapsible, isParentCollapsible, isItemCollapsed, onItemCollapse, onItemExpand, isDisabledSelectionVisible, getCheckboxTooltip, onItemDoubleClick, onItemClick, renderEmpty, RowComponent, renderLoader, } = this.props;
113
113
  // NOTE: Do not construct new object per render because it causes all rows rerendering
114
114
  const columnsArray = typeof columns === 'function' ? columns(null) : columns;
115
115
  const headerProps = {
@@ -152,7 +152,7 @@ export class Table extends PureComponent {
152
152
  const row = (_createElement(RowComponent, { innerRef: ref, level: getItemLevel(value), item: value, showFocus: selection.isFocused(value), autofocus: selection.isFocused(value), focused: focused && selection.isFocused(value), selectable: selectable && isItemSelectable(value), selected: selectable && selection.isSelected(value), onFocus: this.onRowFocus, onSelect: this.onRowSelect, onDoubleClick: onItemDoubleClick, onClick: onItemClick, collapsible: isItemCollapsible(value), parentCollapsible: isParentCollapsible(value), collapsed: isItemCollapsed(value), onCollapse: onItemCollapse, onExpand: onItemExpand, showDisabledSelection: isDisabledSelectionVisible(value), checkboxTooltip: getCheckboxTooltip(value), className: classNames(getItemClassName(value), { [style.draggingRow]: isDragged }), metaColumnClassName: getMetaColumnClassName(value), draggable: draggable, alwaysShowDragHandle: alwaysShowDragHandle, dragHandleTitle: dragHandleTitle, columns: columns, "data-test": getItemDataTest(value), ...restProps, key: restProps.key ?? getItemKey(value) }));
153
153
  return isDragged ? (_jsx("table", { style: { ...props.style }, className: style.draggingTable, children: _jsx("tbody", { children: row }) })) : (row);
154
154
  };
155
- return (_jsxs("div", { className: wrapperClasses, "data-test": "ring-table-wrapper", ref: this.props.innerRef, children: [focused && _jsx(Shortcuts, { map: this.props.shortcutsMap, scope: this.state.shortcutsScope }), _jsx("div", { role: "presentation", onMouseDown: this.onMouseDown, children: draggable ? (_jsx(List, { values: data, renderList: renderList, renderItem: renderItem, onChange: this.onSortEnd })) : (renderList({ children: data.map((value, index) => renderItem({ value, index })) })) }), loading && (_jsx("div", { className: style.loadingOverlay, children: customLoader ? customLoader(loaderClassName) : _jsx(Loader, { className: loaderClassName }) }))] }));
155
+ return (_jsxs("div", { className: wrapperClasses, "data-test": "ring-table-wrapper", ref: this.props.innerRef, children: [focused && _jsx(Shortcuts, { map: this.props.shortcutsMap, scope: this.state.shortcutsScope }), _jsx("div", { role: "presentation", onMouseDown: this.onMouseDown, children: draggable ? (_jsx(List, { values: data, renderList: renderList, renderItem: renderItem, onChange: this.onSortEnd })) : (renderList({ children: data.map((value, index) => renderItem({ value, index })) })) }), loading && (_jsx("div", { className: style.loadingOverlay, children: renderLoader ? renderLoader(loaderClassName) : _jsx(Loader, { className: loaderClassName }) }))] }));
156
156
  }
157
157
  }
158
158
  const getContainer = () => disableHoverHOC(selectionShortcutsHOC(focusSensorHOC(Table)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jetbrains/ring-ui",
3
- "version": "7.0.32",
3
+ "version": "7.0.34",
4
4
  "description": "JetBrains UI library",
5
5
  "author": {
6
6
  "name": "JetBrains"
@@ -90,7 +90,7 @@
90
90
  "@babel/plugin-syntax-import-assertions": "^7.26.0",
91
91
  "@csstools/css-parser-algorithms": "^3.0.4",
92
92
  "@csstools/stylelint-no-at-nest-rule": "^4.0.0",
93
- "@eslint/compat": "^1.2.6",
93
+ "@eslint/compat": "^1.2.7",
94
94
  "@eslint/eslintrc": "^3.2.0",
95
95
  "@eslint/js": "^9.20.0",
96
96
  "@figma/code-connect": "^1.3.1",
@@ -98,28 +98,28 @@
98
98
  "@jetbrains/logos": "3.0.0-canary.734b213.0",
99
99
  "@jetbrains/rollup-css-plugin": "./packages/rollup-css-plugin",
100
100
  "@jetbrains/stylelint-config": "^4.0.2",
101
- "@primer/octicons": "^19.15.0",
101
+ "@primer/octicons": "^19.15.1",
102
102
  "@rollup/plugin-babel": "^6.0.4",
103
103
  "@rollup/plugin-json": "^6.1.0",
104
104
  "@rollup/plugin-node-resolve": "^16.0.0",
105
105
  "@rollup/plugin-replace": "^6.0.2",
106
- "@storybook/addon-a11y": "8.5.6",
107
- "@storybook/addon-docs": "8.5.6",
108
- "@storybook/addon-essentials": "8.5.6",
109
- "@storybook/addon-themes": "^8.5.6",
110
- "@storybook/components": "8.5.6",
106
+ "@storybook/addon-a11y": "8.6.4",
107
+ "@storybook/addon-docs": "8.6.4",
108
+ "@storybook/addon-essentials": "8.6.4",
109
+ "@storybook/addon-themes": "^8.6.4",
110
+ "@storybook/components": "8.6.4",
111
111
  "@storybook/csf": "^0.1.13",
112
- "@storybook/manager-api": "8.5.6",
113
- "@storybook/preview-api": "8.5.6",
114
- "@storybook/react": "8.5.6",
115
- "@storybook/react-webpack5": "8.5.6",
116
- "@storybook/test-runner": "^0.21.1",
117
- "@storybook/theming": "8.5.6",
112
+ "@storybook/manager-api": "8.6.4",
113
+ "@storybook/preview-api": "8.6.4",
114
+ "@storybook/react": "8.6.4",
115
+ "@storybook/react-webpack5": "8.6.4",
116
+ "@storybook/test-runner": "^0.22.0",
117
+ "@storybook/theming": "8.6.4",
118
118
  "@testing-library/dom": "^10.4.0",
119
119
  "@testing-library/react": "^16.2.0",
120
120
  "@testing-library/user-event": "^14.6.1",
121
- "@types/chai": "^5.0.1",
122
- "@types/chai-as-promised": "^8.0.1",
121
+ "@types/chai": "^5.2.0",
122
+ "@types/chai-as-promised": "^8.0.2",
123
123
  "@types/chai-dom": "0.0.10",
124
124
  "@types/chai-enzyme": "^0.6.13",
125
125
  "@types/enzyme": "^3.10.18",
@@ -127,39 +127,39 @@
127
127
  "@types/markdown-it": "^14.1.2",
128
128
  "@types/react": "^18.3.12",
129
129
  "@types/react-dom": "^18.3.1",
130
- "@types/sinon": "^17.0.3",
130
+ "@types/sinon": "^17.0.4",
131
131
  "@types/sinon-chai": "^4.0.0",
132
132
  "@types/webpack-env": "^1.18.8",
133
133
  "@vitejs/plugin-react": "^4.3.4",
134
- "@vitest/eslint-plugin": "^1.1.31",
134
+ "@vitest/eslint-plugin": "^1.1.36",
135
135
  "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0",
136
- "acorn": "^8.14.0",
136
+ "acorn": "^8.14.1",
137
137
  "axe-playwright": "^2.1.0",
138
138
  "babel-plugin-require-context-hook": "^1.0.0",
139
- "caniuse-lite": "^1.0.30001700",
139
+ "caniuse-lite": "^1.0.30001702",
140
140
  "chai": "^5.2.0",
141
141
  "chai-as-promised": "^8.0.1",
142
142
  "chai-dom": "^1.10.0",
143
143
  "chai-enzyme": "1.0.0-beta.1",
144
144
  "cheerio": "^1.0.0-rc.12",
145
- "chromatic": "^11.25.2",
146
- "core-js": "^3.40.0",
145
+ "chromatic": "^11.27.0",
146
+ "core-js": "^3.41.0",
147
147
  "cpy-cli": "^5.0.0",
148
148
  "dotenv-cli": "^8.0.0",
149
149
  "enzyme": "^3.11.0",
150
- "eslint": "^9.20.1",
151
- "eslint-config-prettier": "^10.0.1",
150
+ "eslint": "^9.21.0",
151
+ "eslint-config-prettier": "^10.1.1",
152
152
  "eslint-formatter-jslint-xml": "^8.40.0",
153
153
  "eslint-import-resolver-webpack": "^0.13.10",
154
154
  "eslint-plugin-import": "^2.31.0",
155
155
  "eslint-plugin-jsx-a11y": "^6.10.2",
156
156
  "eslint-plugin-prettier": "^5.2.3",
157
157
  "eslint-plugin-react": "^7.37.4",
158
- "eslint-plugin-react-hooks": "^5.1.0",
159
- "eslint-plugin-storybook": "^0.11.3",
158
+ "eslint-plugin-react-hooks": "^5.2.0",
159
+ "eslint-plugin-storybook": "^0.11.4",
160
160
  "events": "^3.3.0",
161
161
  "glob": "^11.0.1",
162
- "globals": "^15.15.0",
162
+ "globals": "^16.0.0",
163
163
  "html-webpack-plugin": "^5.6.3",
164
164
  "http-server": "^14.1.1",
165
165
  "husky": "^9.1.7",
@@ -171,26 +171,26 @@
171
171
  "markdown-it": "^14.1.0",
172
172
  "merge-options": "^3.0.4",
173
173
  "pinst": "^3.0.0",
174
- "prettier": "^3.5.1",
174
+ "prettier": "^3.5.3",
175
175
  "raw-loader": "^4.0.2",
176
176
  "react": "^18.3.1",
177
177
  "react-dom": "^18.3.1",
178
178
  "react-test-renderer": "^19.0.0",
179
179
  "regenerator-runtime": "^0.14.1",
180
180
  "rimraf": "^6.0.1",
181
- "rollup": "^4.34.8",
181
+ "rollup": "^4.34.9",
182
182
  "rollup-plugin-clear": "^2.0.7",
183
183
  "sinon": "^19.0.2",
184
184
  "sinon-chai": "^4.0.0",
185
185
  "storage-mock": "^2.1.0",
186
- "storybook": "8.5.6",
187
- "stylelint": "^16.14.1",
186
+ "storybook": "8.6.4",
187
+ "stylelint": "^16.15.0",
188
188
  "svg-inline-loader": "^0.8.2",
189
189
  "teamcity-service-messages": "^0.1.14",
190
- "terser-webpack-plugin": "^5.3.11",
191
- "typescript": "~5.7.3",
192
- "typescript-eslint": "^8.24.1",
193
- "vitest": "^3.0.5",
190
+ "terser-webpack-plugin": "^5.3.14",
191
+ "typescript": "~5.8.2",
192
+ "typescript-eslint": "^8.26.0",
193
+ "vitest": "^3.0.8",
194
194
  "vitest-teamcity-reporter": "^0.3.1",
195
195
  "wallaby-webpack": "^3.9.16",
196
196
  "webpack": "^5.98.0",
@@ -220,13 +220,13 @@
220
220
  "@babel/core": "^7.26.9",
221
221
  "@babel/preset-typescript": "^7.26.0",
222
222
  "@jetbrains/babel-preset-jetbrains": "^2.4.0",
223
- "@jetbrains/icons": "^5.6.0",
223
+ "@jetbrains/icons": "^5.7.0",
224
224
  "@jetbrains/postcss-require-hover": "^0.1.3",
225
225
  "@types/combokeys": "^2.4.9",
226
226
  "@types/element-resize-detector": "^1.1.6",
227
- "@types/react-virtualized": "9.22.0",
227
+ "@types/react-virtualized": "9.22.2",
228
228
  "@types/util-deprecate": "^1.0.4",
229
- "babel-loader": "9.2.1",
229
+ "babel-loader": "10.0.0",
230
230
  "babel-plugin-transform-define": "^2.1.4",
231
231
  "browserslist": "^4.24.4",
232
232
  "change-case": "^4.1.1",
@@ -244,14 +244,14 @@
244
244
  "highlight.js": "^10.7.2",
245
245
  "just-debounce-it": "^3.2.0",
246
246
  "memoize-one": "^6.0.0",
247
- "postcss": "^8.5.2",
247
+ "postcss": "^8.5.3",
248
248
  "postcss-calc": "^10.1.1",
249
249
  "postcss-flexbugs-fixes": "^5.0.2",
250
250
  "postcss-font-family-system-ui": "^5.0.0",
251
251
  "postcss-loader": "^8.1.1",
252
252
  "postcss-modules-values-replace": "^4.2.0",
253
- "postcss-preset-env": "^10.1.4",
254
- "react-movable": "^3.4.0",
253
+ "postcss-preset-env": "^10.1.5",
254
+ "react-movable": "^3.4.1",
255
255
  "react-virtualized": "^9.22.6",
256
256
  "react-waypoint": "^10.3.0",
257
257
  "scrollbar-width": "^3.1.1",