@cloud-ru/ds-toggles 1.1.5-preview-d50a3da1.0 → 1.1.5-preview-e30f4f90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/cjs/components/Checkbox/Checkbox.js +1 -1
  2. package/dist/cjs/components/Checkbox/styles.module.css +22 -34
  3. package/dist/cjs/components/Favourite/Favourite.js +1 -1
  4. package/dist/cjs/components/Favourite/styles.module.css +18 -30
  5. package/dist/cjs/components/Radio/Radio.js +1 -1
  6. package/dist/cjs/components/Radio/styles.module.css +19 -31
  7. package/dist/cjs/components/Switch/styles.module.css +27 -34
  8. package/dist/cjs/components/ToggleGroup/ToggleGroup.js +4 -1
  9. package/dist/cjs/style.css +86 -129
  10. package/dist/esm/components/Checkbox/Checkbox.js +1 -1
  11. package/dist/esm/components/Checkbox/styles.module.css +22 -34
  12. package/dist/esm/components/Favourite/Favourite.js +1 -1
  13. package/dist/esm/components/Favourite/styles.module.css +18 -30
  14. package/dist/esm/components/Radio/Radio.js +1 -1
  15. package/dist/esm/components/Radio/styles.module.css +19 -31
  16. package/dist/esm/components/Switch/styles.module.css +27 -34
  17. package/dist/esm/components/ToggleGroup/ToggleGroup.js +5 -2
  18. package/dist/esm/style.css +86 -129
  19. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  20. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  21. package/package.json +5 -5
  22. package/src/components/Checkbox/Checkbox.tsx +1 -1
  23. package/src/components/Checkbox/styles.module.scss +1 -15
  24. package/src/components/Favourite/Favourite.tsx +1 -1
  25. package/src/components/Favourite/styles.module.scss +2 -16
  26. package/src/components/Radio/Radio.tsx +1 -1
  27. package/src/components/Radio/styles.module.scss +1 -15
  28. package/src/components/Switch/styles.module.scss +7 -8
  29. package/src/components/ToggleGroup/ToggleGroup.tsx +6 -4
@@ -65,7 +65,7 @@ $sizes: 'xs', 's';
65
65
  $outlineWidth: base.$sn-primitive-strokeWeight-strokeSemiBold;
66
66
 
67
67
  outline: $outlineWidth solid base.$sn-theme-color-available-complementary;
68
- outline-offset: var(--focus-offset);
68
+ outline-offset: $outlineWidth;
69
69
  }
70
70
  }
71
71
  }
@@ -115,13 +115,6 @@ $sizes: 'xs', 's';
115
115
  }
116
116
 
117
117
  .framing {
118
-
119
- // Кольцо фокуса по границе контейнера (Figma `focusedFrame/regular/outside`).
120
- $containerWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'container', 'min-width');
121
- $framingWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-width');
122
-
123
- --focus-offset: calc((#{$containerWidth} - #{$framingWidth}) / 2);
124
-
125
118
  width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-width');
126
119
  height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-height');
127
120
 
@@ -129,13 +122,6 @@ $sizes: 'xs', 's';
129
122
  @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing');
130
123
  }
131
124
 
132
- // Размер спиннера — токен toggles, а не `density.icon.*` из @cloud-ru/ds-loader; по макету шире рамки, не ужимается.
133
- .spinner {
134
- flex-shrink: 0;
135
- width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'flag', 'surface', 'loaderSpinner', 'width');
136
- height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'flag', 'surface', 'loaderSpinner', 'height');
137
- }
138
-
139
125
  .flag {
140
126
  @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'flag');
141
127
  }
@@ -34,7 +34,7 @@ function Icon({
34
34
  disabled,
35
35
  }: Required<Pick<FavouriteProps, 'checked' | 'loading' | 'size' | 'disabled'>> & { variant: FavouriteIcon }) {
36
36
  if (loading) {
37
- return <Spinner size={SPINNER_SIZE_MAP[size]} className={styles.spinner} />;
37
+ return <Spinner size={SPINNER_SIZE_MAP[size]} />;
38
38
  }
39
39
 
40
40
  const iconSize = getIconSize(size);
@@ -96,24 +96,10 @@ $sizes: 'xs', 's';
96
96
  }
97
97
 
98
98
  .framing {
99
-
100
- // Кольцо фокуса по границе контейнера (Figma `focusedFrame/regular/outside`).
101
- $containerWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'container', 'min-width');
102
- $framingWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-width');
103
-
104
- --focus-offset: calc((#{$containerWidth} - #{$framingWidth}) / 2);
99
+ @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing');
105
100
 
106
101
  width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-width');
107
102
  height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'min-height');
108
-
109
- @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing');
110
- }
111
-
112
- // Размер спиннера — токен toggles, а не `density.icon.*` из @cloud-ru/ds-loader; по макету шире рамки, не ужимается.
113
- .spinner {
114
- flex-shrink: 0;
115
- width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'flag', 'surface', 'loaderSpinner', 'width');
116
- height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'checkbox', 'framing', 'flag', 'surface', 'loaderSpinner', 'height');
117
103
  }
118
104
 
119
105
  .flag {
@@ -146,7 +132,7 @@ $sizes: 'xs', 's';
146
132
  &[data-focusvisible='true'] {
147
133
  .framing {
148
134
  outline: base.$sn-primitive-strokeWeight-strokeSemiBold solid base.$sn-theme-color-available-complementary;
149
- outline-offset: var(--focus-offset);
135
+ outline-offset: base.$sn-primitive-strokeWeight-strokeSemiBold;
150
136
  }
151
137
  }
152
138
  }
@@ -51,7 +51,7 @@ export function Radio({
51
51
  <div className={styles.backgroundStateLayer} data-state='emptyNeutralOnBackground' />
52
52
  <div className={styles.flag}>
53
53
  {loading ? (
54
- <Spinner size={SPINNER_SIZE_MAP[size]} className={styles.spinner} />
54
+ <Spinner size={SPINNER_SIZE_MAP[size]} />
55
55
  ) : (
56
56
  <div className={styles.surface} {...stateDataAttributes} data-text-opacity={checked || undefined} />
57
57
  )}
@@ -57,7 +57,7 @@ $sizes: 'xs', 's';
57
57
  $outlineWidth: base.$sn-primitive-strokeWeight-strokeSemiBold;
58
58
 
59
59
  outline: $outlineWidth solid base.$sn-theme-color-available-complementary;
60
- outline-offset: var(--focus-offset);
60
+ outline-offset: $outlineWidth;
61
61
  }
62
62
  }
63
63
  }
@@ -112,13 +112,6 @@ $sizes: 'xs', 's';
112
112
  }
113
113
 
114
114
  .framing {
115
-
116
- // Кольцо фокуса по границе контейнера (Figma `focusedFrame/regular/outside`).
117
- $containerWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'container', 'min-width');
118
- $framingWidth: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'min-width');
119
-
120
- --focus-offset: calc((#{$containerWidth} - #{$framingWidth}) / 2);
121
-
122
115
  width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'min-width');
123
116
  height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'min-height');
124
117
 
@@ -126,13 +119,6 @@ $sizes: 'xs', 's';
126
119
  @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing');
127
120
  }
128
121
 
129
- // Размер спиннера — токен toggles, а не `density.icon.*` из @cloud-ru/ds-loader; по макету шире рамки, не ужимается.
130
- .spinner {
131
- flex-shrink: 0;
132
- width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'flag', 'surface', 'loaderSpinner', 'width');
133
- height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'flag', 'surface', 'loaderSpinner', 'height');
134
- }
135
-
136
122
  .flag {
137
123
  @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'radio', 'framing', 'flag')
138
124
  }
@@ -7,7 +7,8 @@ $switchAnimationDuration: 0.1s;
7
7
  $iconRevealEasing: cubic-bezier(0.33, 1, 0.68, 1);
8
8
 
9
9
  .spinner {
10
- // Спиннер шире ползунка и выходит за его границы — flex-контейнер не должен его ужимать.
10
+ // По макету спиннер шире ползунка (24 на surface 16) и выходит за его границы,
11
+ // поэтому flex-контейнер не должен его ужимать.
11
12
  flex-shrink: 0;
12
13
  }
13
14
 
@@ -190,12 +191,6 @@ $iconRevealEasing: cubic-bezier(0.33, 1, 0.68, 1);
190
191
  @include base.composite-var(toggles.$toggles, 'anatomy', 'size', $size, 'switch', 'framing', 'flag');
191
192
  }
192
193
 
193
- // Размер спиннера — токен toggles, а не `density.icon.*` из @cloud-ru/ds-loader.
194
- .spinner {
195
- width: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'switch', 'framing', 'flag', 'surface', 'loaderSpinner', 'width');
196
- height: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'switch', 'framing', 'flag', 'surface', 'loaderSpinner', 'height');
197
- }
198
-
199
194
  .framing[data-checked="true"] .flag {
200
195
  $flagTrackWidth: base.simple-var(
201
196
  toggles.$toggles,
@@ -213,9 +208,13 @@ $iconRevealEasing: cubic-bezier(0.33, 1, 0.68, 1);
213
208
 
214
209
  &[data-focusvisible="true"] {
215
210
  .container {
216
- // Кольцо фокуса по границе контейнера (Figma `focusedFrame/regular/outside`).
211
+ // Real offset
217
212
  $offsetWidth: base.$sn-primitive-strokeWeight-strokeSemiBold;
218
213
 
214
+ @if ($size == 'xs') {
215
+ outline-offset: $offsetWidth;
216
+ }
217
+
219
218
  border-radius: base.simple-var(toggles.$toggles, 'anatomy', 'size', $size, 'switch', 'framing', 'border-radius');
220
219
  outline: $offsetWidth solid base.$sn-theme-color-available-complementary;
221
220
  }
@@ -1,5 +1,5 @@
1
1
  import { useUncontrolledProp } from '@cloud-ru/ds-utils';
2
- import { PropsWithChildren, useCallback } from 'react';
2
+ import { PropsWithChildren, useCallback, useMemo } from 'react';
3
3
 
4
4
  import { SELECTION_MODE } from '../../constants';
5
5
  import { ToggleGroupContext } from '../../context';
@@ -65,7 +65,9 @@ export function ToggleGroup({
65
65
  [selectionMode, setValue],
66
66
  );
67
67
 
68
- return (
69
- <ToggleGroupContext.Provider value={{ value, onChange, selectionMode }}>{children}</ToggleGroupContext.Provider>
70
- );
68
+ // Значение провайдера стабильно, пока не меняется состояние: иначе каждый рендер группы
69
+ // перерисовывает всех потребителей контекста (например, все блоки аккордеона).
70
+ const contextValue = useMemo(() => ({ value, onChange, selectionMode }), [value, onChange, selectionMode]);
71
+
72
+ return <ToggleGroupContext.Provider value={contextValue}>{children}</ToggleGroupContext.Provider>;
71
73
  }