@cloud-ru/ds-uikit-product-toggles-predefined 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/README.md +251 -0
  4. package/dist/cjs/components/ToggleCard/ToggleCard.d.ts +8 -0
  5. package/dist/cjs/components/ToggleCard/ToggleCard.js +42 -0
  6. package/dist/cjs/components/ToggleCard/index.d.ts +1 -0
  7. package/dist/cjs/components/ToggleCard/index.js +17 -0
  8. package/dist/cjs/components/ToggleCard/styles.module.css +143 -0
  9. package/dist/cjs/components/ToggleCard/utils.d.ts +8 -0
  10. package/dist/cjs/components/ToggleCard/utils.js +24 -0
  11. package/dist/cjs/components/ToggleGroup/ToggleGroup.d.ts +7 -0
  12. package/dist/cjs/components/ToggleGroup/ToggleGroup.js +24 -0
  13. package/dist/cjs/components/ToggleGroup/index.d.ts +1 -0
  14. package/dist/cjs/components/ToggleGroup/index.js +17 -0
  15. package/dist/cjs/components/ToggleGroup/styles.module.css +17 -0
  16. package/dist/cjs/components/index.d.ts +3 -0
  17. package/dist/cjs/components/index.js +21 -0
  18. package/dist/cjs/constants.d.ts +22 -0
  19. package/dist/cjs/constants.js +25 -0
  20. package/dist/cjs/index.d.ts +3 -0
  21. package/dist/cjs/index.js +19 -0
  22. package/dist/cjs/package.json +3 -0
  23. package/dist/cjs/style.css +160 -0
  24. package/dist/cjs/types.d.ts +61 -0
  25. package/dist/cjs/types.js +2 -0
  26. package/dist/esm/components/ToggleCard/ToggleCard.d.ts +8 -0
  27. package/dist/esm/components/ToggleCard/ToggleCard.js +36 -0
  28. package/dist/esm/components/ToggleCard/index.d.ts +1 -0
  29. package/dist/esm/components/ToggleCard/index.js +1 -0
  30. package/dist/esm/components/ToggleCard/styles.module.css +143 -0
  31. package/dist/esm/components/ToggleCard/utils.d.ts +8 -0
  32. package/dist/esm/components/ToggleCard/utils.js +20 -0
  33. package/dist/esm/components/ToggleGroup/ToggleGroup.d.ts +7 -0
  34. package/dist/esm/components/ToggleGroup/ToggleGroup.js +18 -0
  35. package/dist/esm/components/ToggleGroup/index.d.ts +1 -0
  36. package/dist/esm/components/ToggleGroup/index.js +1 -0
  37. package/dist/esm/components/ToggleGroup/styles.module.css +17 -0
  38. package/dist/esm/components/index.d.ts +3 -0
  39. package/dist/esm/components/index.js +3 -0
  40. package/dist/esm/constants.d.ts +22 -0
  41. package/dist/esm/constants.js +22 -0
  42. package/dist/esm/index.d.ts +3 -0
  43. package/dist/esm/index.js +3 -0
  44. package/dist/esm/style.css +160 -0
  45. package/dist/esm/types.d.ts +61 -0
  46. package/dist/esm/types.js +1 -0
  47. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  48. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  49. package/package.json +47 -0
  50. package/src/components/ToggleCard/ToggleCard.tsx +102 -0
  51. package/src/components/ToggleCard/index.ts +1 -0
  52. package/src/components/ToggleCard/styles.module.scss +150 -0
  53. package/src/components/ToggleCard/utils.ts +24 -0
  54. package/src/components/ToggleGroup/ToggleGroup.tsx +36 -0
  55. package/src/components/ToggleGroup/index.ts +1 -0
  56. package/src/components/ToggleGroup/styles.module.scss +28 -0
  57. package/src/components/index.ts +4 -0
  58. package/src/constants.ts +25 -0
  59. package/src/index.ts +3 -0
  60. package/src/types.ts +69 -0
@@ -0,0 +1,143 @@
1
+ @charset "UTF-8";
2
+ .card{
3
+ cursor:pointer;
4
+ }
5
+ .card[data-disabled]{
6
+ cursor:not-allowed;
7
+ }
8
+
9
+ .promoBadge{
10
+ pointer-events:none;
11
+ position:absolute;
12
+ z-index:1;
13
+ top:0;
14
+ right:0;
15
+ display:flex;
16
+ box-sizing:border-box;
17
+ }
18
+ .promoBadge[data-size=s]{
19
+ padding-top:var(--sn-card-anatomy-radius-s-container-badge-paddingTop, var(--sn-primitive-dimension-4, 4px));
20
+ padding-right:var(--sn-card-anatomy-radius-s-container-badge-paddingLeft, var(--sn-primitive-dimension-4, 4px));
21
+ }
22
+ .promoBadge[data-size=m]{
23
+ padding-top:var(--sn-card-anatomy-radius-m-container-badge-paddingTop, var(--sn-primitive-dimension-6, 6px));
24
+ padding-right:var(--sn-card-anatomy-radius-m-container-badge-paddingLeft, var(--sn-primitive-dimension-6, 6px));
25
+ }
26
+ .promoBadge[data-size=l]{
27
+ padding-top:var(--sn-card-anatomy-radius-l-container-badge-paddingTop, var(--sn-primitive-dimension-8, 8px));
28
+ padding-right:var(--sn-card-anatomy-radius-l-container-badge-paddingLeft, var(--sn-primitive-dimension-8, 8px));
29
+ }
30
+
31
+ .content{
32
+ display:flex;
33
+ align-items:center;
34
+ box-sizing:border-box;
35
+ width:100%;
36
+ }
37
+ .content[data-size=s]{
38
+ gap:var(--sn-density-spacing-interval-xs, var(--sn-primitive-dimension-4, 4px));
39
+ padding:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
40
+ }
41
+ .content[data-size=m]{
42
+ gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
43
+ padding:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
44
+ }
45
+ .content[data-size=l]{
46
+ gap:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
47
+ padding:var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-24, 24px));
48
+ }
49
+
50
+ .emblem{
51
+ display:inline-flex;
52
+ flex-shrink:0;
53
+ align-items:center;
54
+ justify-content:center;
55
+ }
56
+
57
+ .picture{
58
+ overflow:hidden;
59
+ box-sizing:border-box;
60
+ -o-object-fit:cover;
61
+ object-fit:cover;
62
+ }
63
+ .picture[data-size=m]{
64
+ width:var(--sn-iconPredefined-anatomy-size-m-square, var(--sn-primitive-dimension-32, 32px));
65
+ height:var(--sn-iconPredefined-anatomy-size-m-square, var(--sn-primitive-dimension-32, 32px));
66
+ border-radius:var(--sn-iconPredefined-anatomy-size-m-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
67
+ }
68
+ .picture[data-size=l]{
69
+ width:var(--sn-iconPredefined-anatomy-size-l-square, var(--sn-primitive-dimension-40, 40px));
70
+ height:var(--sn-iconPredefined-anatomy-size-l-square, var(--sn-primitive-dimension-40, 40px));
71
+ border-radius:var(--sn-iconPredefined-anatomy-size-l-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
72
+ }
73
+ .picture[data-size="5xl"]{
74
+ width:var(--sn-iconPredefined-anatomy-size-5xl-square, var(--sn-primitive-dimension-80, 80px));
75
+ height:var(--sn-iconPredefined-anatomy-size-5xl-square, var(--sn-primitive-dimension-80, 80px));
76
+ border-radius:var(--sn-iconPredefined-anatomy-size-5xl-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
77
+ }
78
+
79
+ .textContent{
80
+ display:flex;
81
+ flex:1 0 0;
82
+ flex-direction:column;
83
+ align-items:flex-start;
84
+ min-width:0;
85
+ }
86
+
87
+ .title{
88
+ width:100%;
89
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
90
+ }
91
+ .content[data-size=s] .title{
92
+ font-family:var(--sn-regular-title-s-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
93
+ font-weight:var(--sn-regular-title-s-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-s, var(--sn-brand-font-fontWeight-light-regular-title-s, var(--sn-primitive-font-fontWeightValue-600, 600))));
94
+ line-height:var(--sn-regular-title-s-lineHeight, var(--sn-density-typography-roleTitle-lineHeightS, var(--sn-primitive-font-lineHeight-by14, 20px)));
95
+ font-size:var(--sn-regular-title-s-fontSize, var(--sn-density-typography-roleTitle-fontSizeS, var(--sn-primitive-font-fontSize-14, 14px)));
96
+ letter-spacing:var(--sn-regular-title-s-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
97
+ paragraph-spacing:var(--sn-regular-title-s-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
98
+ }
99
+ .content[data-size=m] .title{
100
+ font-family:var(--sn-regular-title-m-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
101
+ font-weight:var(--sn-regular-title-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-m, var(--sn-brand-font-fontWeight-light-regular-title-m, var(--sn-primitive-font-fontWeightValue-600, 600))));
102
+ line-height:var(--sn-regular-title-m-lineHeight, var(--sn-density-typography-roleTitle-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
103
+ font-size:var(--sn-regular-title-m-fontSize, var(--sn-density-typography-roleTitle-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
104
+ letter-spacing:var(--sn-regular-title-m-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
105
+ paragraph-spacing:var(--sn-regular-title-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
106
+ }
107
+ .content[data-size=l] .title{
108
+ font-family:var(--sn-regular-title-l-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
109
+ font-weight:var(--sn-regular-title-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-l, var(--sn-brand-font-fontWeight-light-regular-title-l, var(--sn-primitive-font-fontWeightValue-600, 600))));
110
+ line-height:var(--sn-regular-title-l-lineHeight, var(--sn-density-typography-roleTitle-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
111
+ font-size:var(--sn-regular-title-l-fontSize, var(--sn-density-typography-roleTitle-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
112
+ letter-spacing:var(--sn-regular-title-l-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
113
+ paragraph-spacing:var(--sn-regular-title-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize20, 10px));
114
+ }
115
+
116
+ .description{
117
+ width:100%;
118
+ color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
119
+ }
120
+ .content[data-size=s] .description{
121
+ font-family:var(--sn-regular-body-m-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
122
+ font-weight:var(--sn-regular-body-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-m, var(--sn-brand-font-fontWeight-light-regular-body-m, var(--sn-primitive-font-fontWeightValue-400, 400))));
123
+ line-height:var(--sn-regular-body-m-lineHeight, var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
124
+ font-size:var(--sn-regular-body-m-fontSize, var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
125
+ letter-spacing:var(--sn-regular-body-m-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
126
+ paragraph-spacing:var(--sn-regular-body-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
127
+ }
128
+ .content[data-size=m] .description{
129
+ font-family:var(--sn-regular-body-m-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
130
+ font-weight:var(--sn-regular-body-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-m, var(--sn-brand-font-fontWeight-light-regular-body-m, var(--sn-primitive-font-fontWeightValue-400, 400))));
131
+ line-height:var(--sn-regular-body-m-lineHeight, var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
132
+ font-size:var(--sn-regular-body-m-fontSize, var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
133
+ letter-spacing:var(--sn-regular-body-m-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
134
+ paragraph-spacing:var(--sn-regular-body-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
135
+ }
136
+ .content[data-size=l] .description{
137
+ font-family:var(--sn-regular-body-l-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
138
+ font-weight:var(--sn-regular-body-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-l, var(--sn-brand-font-fontWeight-light-regular-body-l, var(--sn-primitive-font-fontWeightValue-400, 400))));
139
+ line-height:var(--sn-regular-body-l-lineHeight, var(--sn-density-typography-roleBody-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
140
+ font-size:var(--sn-regular-body-l-fontSize, var(--sn-density-typography-roleBody-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
141
+ letter-spacing:var(--sn-regular-body-l-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
142
+ paragraph-spacing:var(--sn-regular-body-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
143
+ }
@@ -0,0 +1,8 @@
1
+ import { Size as IconSize } from '@cloud-ru/ds-icon-predefined';
2
+ import { Emblem, EmblemPicture, Size } from '../../types.js';
3
+ /**
4
+ * Эмблема масштабируется вместе с карточкой (как в продуктовом ките):
5
+ * размер `IconPredefined` выводится из `size` карточки, а не задаётся снаружи.
6
+ */
7
+ export declare function sizeToEmblemSize(size: Size): IconSize;
8
+ export declare function isEmblemPicture(emblem: Emblem): emblem is EmblemPicture;
@@ -0,0 +1,20 @@
1
+ import { SIZE as ICON_SIZE } from '@cloud-ru/ds-icon-predefined';
2
+ import { SIZE } from '../../constants.js';
3
+ /**
4
+ * Эмблема масштабируется вместе с карточкой (как в продуктовом ките):
5
+ * размер `IconPredefined` выводится из `size` карточки, а не задаётся снаружи.
6
+ */
7
+ export function sizeToEmblemSize(size) {
8
+ switch (size) {
9
+ case SIZE.S:
10
+ return ICON_SIZE.M;
11
+ case SIZE.L:
12
+ return ICON_SIZE['5XL'];
13
+ case SIZE.M:
14
+ default:
15
+ return ICON_SIZE.L;
16
+ }
17
+ }
18
+ export function isEmblemPicture(emblem) {
19
+ return 'src' in emblem;
20
+ }
@@ -0,0 +1,7 @@
1
+ import { ToggleGroupProps } from '../../types.js';
2
+ /**
3
+ * ToggleGroup — провайдер выбора + grid-раскладка карточек `ToggleCard`.
4
+ * Состояние (controlled/uncontrolled, single/multiple) держит `@cloud-ru/ds-toggles::ToggleGroup`;
5
+ * обёртка добавляет ориентацию, gap и breakpoint горизонтальной раскладки.
6
+ */
7
+ export declare function ToggleGroup(props: ToggleGroupProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ToggleGroup as ToggleGroupBase } from '@cloud-ru/ds-toggles';
3
+ import { excludeSupportProps, extractSupportProps } from '@cloud-ru/ds-utils';
4
+ import cn from 'classnames';
5
+ import { GAP, ORIENTATION, TEST_IDS } from '../../constants.js';
6
+ import styles from './styles.module.css';
7
+ /**
8
+ * ToggleGroup — провайдер выбора + grid-раскладка карточек `ToggleCard`.
9
+ * Состояние (controlled/uncontrolled, single/multiple) держит `@cloud-ru/ds-toggles::ToggleGroup`;
10
+ * обёртка добавляет ориентацию, gap и breakpoint горизонтальной раскладки.
11
+ */
12
+ export function ToggleGroup(props) {
13
+ const { children, orientation = ORIENTATION.Vertical, gap = GAP.S, breakpoint = 0, className, ...rest } = props;
14
+ const restProps = rest;
15
+ const supportProps = extractSupportProps(restProps);
16
+ const groupProps = excludeSupportProps(restProps);
17
+ return (_jsx(ToggleGroupBase, { ...groupProps, children: _jsx("div", { className: cn(styles.toggleGroup, className), style: { '--toggle-group-breakpoint': `${breakpoint}px` }, "data-orientation": orientation, "data-gap": gap, "data-test-id": TEST_IDS.group, ...supportProps, children: children }) }));
18
+ }
@@ -0,0 +1 @@
1
+ export * from './ToggleGroup.js';
@@ -0,0 +1 @@
1
+ export * from './ToggleGroup.js';
@@ -0,0 +1,17 @@
1
+ @charset "UTF-8";
2
+ .toggleGroup{
3
+ display:grid;
4
+ }
5
+ .toggleGroup[data-gap=s]{
6
+ gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
7
+ }
8
+ .toggleGroup[data-gap=m]{
9
+ gap:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
10
+ }
11
+ .toggleGroup[data-gap=l]{
12
+ gap:var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-24, 24px));
13
+ }
14
+ .toggleGroup[data-orientation=horizontal]{
15
+ grid-auto-rows:1fr;
16
+ grid-template-columns:repeat(auto-fit, minmax(var(--toggle-group-breakpoint, 0), 1fr));
17
+ }
@@ -0,0 +1,3 @@
1
+ export * from './ToggleCard/index.js';
2
+ export * from './ToggleGroup/index.js';
3
+ export { useToggleGroup } from '@cloud-ru/ds-toggles';
@@ -0,0 +1,3 @@
1
+ export * from './ToggleCard/index.js';
2
+ export * from './ToggleGroup/index.js';
3
+ export { useToggleGroup } from '@cloud-ru/ds-toggles';
@@ -0,0 +1,22 @@
1
+ export declare const SIZE: {
2
+ readonly S: "s";
3
+ readonly M: "m";
4
+ readonly L: "l";
5
+ };
6
+ export declare const ORIENTATION: {
7
+ readonly Horizontal: "horizontal";
8
+ readonly Vertical: "vertical";
9
+ };
10
+ export declare const GAP: {
11
+ readonly S: "s";
12
+ readonly M: "m";
13
+ readonly L: "l";
14
+ };
15
+ export declare const TEST_IDS: {
16
+ readonly card: "toggle-card";
17
+ readonly cardEmblem: "toggle-card__emblem";
18
+ readonly cardTitle: "toggle-card__title";
19
+ readonly cardDescription: "toggle-card__description";
20
+ readonly promoBadge: "toggle-card__promo-badge";
21
+ readonly group: "toggle-group";
22
+ };
@@ -0,0 +1,22 @@
1
+ export const SIZE = {
2
+ S: 's',
3
+ M: 'm',
4
+ L: 'l',
5
+ };
6
+ export const ORIENTATION = {
7
+ Horizontal: 'horizontal',
8
+ Vertical: 'vertical',
9
+ };
10
+ export const GAP = {
11
+ S: 's',
12
+ M: 'm',
13
+ L: 'l',
14
+ };
15
+ export const TEST_IDS = {
16
+ card: 'toggle-card',
17
+ cardEmblem: 'toggle-card__emblem',
18
+ cardTitle: 'toggle-card__title',
19
+ cardDescription: 'toggle-card__description',
20
+ promoBadge: 'toggle-card__promo-badge',
21
+ group: 'toggle-group',
22
+ };
@@ -0,0 +1,3 @@
1
+ export * from './components/index.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
@@ -0,0 +1,3 @@
1
+ export * from './components/index.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
@@ -0,0 +1,160 @@
1
+ @charset "UTF-8";
2
+ .card{
3
+ cursor:pointer;
4
+ }
5
+ .card[data-disabled]{
6
+ cursor:not-allowed;
7
+ }
8
+
9
+ .promoBadge{
10
+ pointer-events:none;
11
+ position:absolute;
12
+ z-index:1;
13
+ top:0;
14
+ right:0;
15
+ display:flex;
16
+ box-sizing:border-box;
17
+ }
18
+ .promoBadge[data-size=s]{
19
+ padding-top:var(--sn-card-anatomy-radius-s-container-badge-paddingTop, var(--sn-primitive-dimension-4, 4px));
20
+ padding-right:var(--sn-card-anatomy-radius-s-container-badge-paddingLeft, var(--sn-primitive-dimension-4, 4px));
21
+ }
22
+ .promoBadge[data-size=m]{
23
+ padding-top:var(--sn-card-anatomy-radius-m-container-badge-paddingTop, var(--sn-primitive-dimension-6, 6px));
24
+ padding-right:var(--sn-card-anatomy-radius-m-container-badge-paddingLeft, var(--sn-primitive-dimension-6, 6px));
25
+ }
26
+ .promoBadge[data-size=l]{
27
+ padding-top:var(--sn-card-anatomy-radius-l-container-badge-paddingTop, var(--sn-primitive-dimension-8, 8px));
28
+ padding-right:var(--sn-card-anatomy-radius-l-container-badge-paddingLeft, var(--sn-primitive-dimension-8, 8px));
29
+ }
30
+
31
+ .content{
32
+ display:flex;
33
+ align-items:center;
34
+ box-sizing:border-box;
35
+ width:100%;
36
+ }
37
+ .content[data-size=s]{
38
+ gap:var(--sn-density-spacing-interval-xs, var(--sn-primitive-dimension-4, 4px));
39
+ padding:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
40
+ }
41
+ .content[data-size=m]{
42
+ gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
43
+ padding:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
44
+ }
45
+ .content[data-size=l]{
46
+ gap:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
47
+ padding:var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-24, 24px));
48
+ }
49
+
50
+ .emblem{
51
+ display:inline-flex;
52
+ flex-shrink:0;
53
+ align-items:center;
54
+ justify-content:center;
55
+ }
56
+
57
+ .picture{
58
+ overflow:hidden;
59
+ box-sizing:border-box;
60
+ -o-object-fit:cover;
61
+ object-fit:cover;
62
+ }
63
+ .picture[data-size=m]{
64
+ width:var(--sn-iconPredefined-anatomy-size-m-square, var(--sn-primitive-dimension-32, 32px));
65
+ height:var(--sn-iconPredefined-anatomy-size-m-square, var(--sn-primitive-dimension-32, 32px));
66
+ border-radius:var(--sn-iconPredefined-anatomy-size-m-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
67
+ }
68
+ .picture[data-size=l]{
69
+ width:var(--sn-iconPredefined-anatomy-size-l-square, var(--sn-primitive-dimension-40, 40px));
70
+ height:var(--sn-iconPredefined-anatomy-size-l-square, var(--sn-primitive-dimension-40, 40px));
71
+ border-radius:var(--sn-iconPredefined-anatomy-size-l-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
72
+ }
73
+ .picture[data-size="5xl"]{
74
+ width:var(--sn-iconPredefined-anatomy-size-5xl-square, var(--sn-primitive-dimension-80, 80px));
75
+ height:var(--sn-iconPredefined-anatomy-size-5xl-square, var(--sn-primitive-dimension-80, 80px));
76
+ border-radius:var(--sn-iconPredefined-anatomy-size-5xl-rounded-borderRadius, var(--sn-primitive-dimension-full, 10000px));
77
+ }
78
+
79
+ .textContent{
80
+ display:flex;
81
+ flex:1 0 0;
82
+ flex-direction:column;
83
+ align-items:flex-start;
84
+ min-width:0;
85
+ }
86
+
87
+ .title{
88
+ width:100%;
89
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
90
+ }
91
+ .content[data-size=s] .title{
92
+ font-family:var(--sn-regular-title-s-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
93
+ font-weight:var(--sn-regular-title-s-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-s, var(--sn-brand-font-fontWeight-light-regular-title-s, var(--sn-primitive-font-fontWeightValue-600, 600))));
94
+ line-height:var(--sn-regular-title-s-lineHeight, var(--sn-density-typography-roleTitle-lineHeightS, var(--sn-primitive-font-lineHeight-by14, 20px)));
95
+ font-size:var(--sn-regular-title-s-fontSize, var(--sn-density-typography-roleTitle-fontSizeS, var(--sn-primitive-font-fontSize-14, 14px)));
96
+ letter-spacing:var(--sn-regular-title-s-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
97
+ paragraph-spacing:var(--sn-regular-title-s-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
98
+ }
99
+ .content[data-size=m] .title{
100
+ font-family:var(--sn-regular-title-m-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
101
+ font-weight:var(--sn-regular-title-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-m, var(--sn-brand-font-fontWeight-light-regular-title-m, var(--sn-primitive-font-fontWeightValue-600, 600))));
102
+ line-height:var(--sn-regular-title-m-lineHeight, var(--sn-density-typography-roleTitle-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
103
+ font-size:var(--sn-regular-title-m-fontSize, var(--sn-density-typography-roleTitle-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
104
+ letter-spacing:var(--sn-regular-title-m-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
105
+ paragraph-spacing:var(--sn-regular-title-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
106
+ }
107
+ .content[data-size=l] .title{
108
+ font-family:var(--sn-regular-title-l-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
109
+ font-weight:var(--sn-regular-title-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-l, var(--sn-brand-font-fontWeight-light-regular-title-l, var(--sn-primitive-font-fontWeightValue-600, 600))));
110
+ line-height:var(--sn-regular-title-l-lineHeight, var(--sn-density-typography-roleTitle-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
111
+ font-size:var(--sn-regular-title-l-fontSize, var(--sn-density-typography-roleTitle-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
112
+ letter-spacing:var(--sn-regular-title-l-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
113
+ paragraph-spacing:var(--sn-regular-title-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize20, 10px));
114
+ }
115
+
116
+ .description{
117
+ width:100%;
118
+ color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
119
+ }
120
+ .content[data-size=s] .description{
121
+ font-family:var(--sn-regular-body-m-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
122
+ font-weight:var(--sn-regular-body-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-m, var(--sn-brand-font-fontWeight-light-regular-body-m, var(--sn-primitive-font-fontWeightValue-400, 400))));
123
+ line-height:var(--sn-regular-body-m-lineHeight, var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
124
+ font-size:var(--sn-regular-body-m-fontSize, var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
125
+ letter-spacing:var(--sn-regular-body-m-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
126
+ paragraph-spacing:var(--sn-regular-body-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
127
+ }
128
+ .content[data-size=m] .description{
129
+ font-family:var(--sn-regular-body-m-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
130
+ font-weight:var(--sn-regular-body-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-m, var(--sn-brand-font-fontWeight-light-regular-body-m, var(--sn-primitive-font-fontWeightValue-400, 400))));
131
+ line-height:var(--sn-regular-body-m-lineHeight, var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
132
+ font-size:var(--sn-regular-body-m-fontSize, var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
133
+ letter-spacing:var(--sn-regular-body-m-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
134
+ paragraph-spacing:var(--sn-regular-body-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
135
+ }
136
+ .content[data-size=l] .description{
137
+ font-family:var(--sn-regular-body-l-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
138
+ font-weight:var(--sn-regular-body-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-l, var(--sn-brand-font-fontWeight-light-regular-body-l, var(--sn-primitive-font-fontWeightValue-400, 400))));
139
+ line-height:var(--sn-regular-body-l-lineHeight, var(--sn-density-typography-roleBody-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
140
+ font-size:var(--sn-regular-body-l-fontSize, var(--sn-density-typography-roleBody-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
141
+ letter-spacing:var(--sn-regular-body-l-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
142
+ paragraph-spacing:var(--sn-regular-body-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
143
+ }
144
+ @charset "UTF-8";
145
+ .toggleGroup{
146
+ display:grid;
147
+ }
148
+ .toggleGroup[data-gap=s]{
149
+ gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
150
+ }
151
+ .toggleGroup[data-gap=m]{
152
+ gap:var(--sn-density-spacing-interval-m, var(--sn-primitive-dimension-16, 16px));
153
+ }
154
+ .toggleGroup[data-gap=l]{
155
+ gap:var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-24, 24px));
156
+ }
157
+ .toggleGroup[data-orientation=horizontal]{
158
+ grid-auto-rows:1fr;
159
+ grid-template-columns:repeat(auto-fit, minmax(var(--toggle-group-breakpoint, 0), 1fr));
160
+ }
@@ -0,0 +1,61 @@
1
+ import { IconPredefinedProps } from '@cloud-ru/ds-icon-predefined';
2
+ import { PromoTagProps } from '@cloud-ru/ds-promo-tag';
3
+ import { ToggleGroupProps as ToggleGroupPropsDs } from '@cloud-ru/ds-toggles';
4
+ import { ValueOf, WithSupportProps } from '@cloud-ru/ds-utils';
5
+ import { ReactNode } from 'react';
6
+ import { GAP, ORIENTATION, SIZE } from './constants.js';
7
+ export type Size = ValueOf<typeof SIZE>;
8
+ export type Orientation = ValueOf<typeof ORIENTATION>;
9
+ export type Gap = ValueOf<typeof GAP>;
10
+ export type EmblemPicture = {
11
+ /** URL картинки-эмблемы */
12
+ src: string;
13
+ /** Альтернативный текст картинки */
14
+ alt: string;
15
+ };
16
+ export type EmblemIcon = Pick<IconPredefinedProps, 'icon' | 'appearance' | 'background' | 'shape'>;
17
+ /** Эмблема карточки: параметры встроенного `IconPredefined` либо картинка (`src` / `alt`). */
18
+ export type Emblem = EmblemPicture | EmblemIcon;
19
+ export type ToggleCardProps = WithSupportProps<{
20
+ /** Заголовок карточки */
21
+ title: string;
22
+ /** Значение карточки в контексте `ToggleGroup` */
23
+ value: string;
24
+ /** Основной текст под заголовком */
25
+ description?: string;
26
+ /**
27
+ * Ведущая эмблема. Передаются только параметры — сам `IconPredefined`
28
+ * встроен в компонент; `size` эмблемы выводится из `size` карточки.
29
+ */
30
+ emblem?: Emblem;
31
+ /** Промо-бейдж в правом верхнем углу карточки */
32
+ promoBadge?: Pick<PromoTagProps, 'label' | 'appearance'> | string;
33
+ /** Размер карточки — масштабирует padding, gap, типографику и `radius` контейнера `@cloud-ru/ds-card` */
34
+ size?: Size;
35
+ /**
36
+ * Максимальное число строк до обрезки.
37
+ * @default '{ title: 1; description: 2; }'
38
+ */
39
+ truncate?: {
40
+ /** Максимум строк заголовка */
41
+ title?: number;
42
+ /** Максимум строк содержимого */
43
+ description?: number;
44
+ };
45
+ /** Заблокированное состояние: интерактив отключён */
46
+ disabled?: boolean;
47
+ /** CSS-класс корневого элемента */
48
+ className?: string;
49
+ }>;
50
+ export type ToggleGroupProps = ToggleGroupPropsDs & WithSupportProps<{
51
+ /** Дочерние карточки `ToggleCard` */
52
+ children?: ReactNode;
53
+ /** Направление раскладки */
54
+ orientation?: Orientation;
55
+ /** Расстояние между карточками */
56
+ gap?: Gap;
57
+ /** Минимальная ширина карточки для горизонтальной раскладки (px) */
58
+ breakpoint?: number;
59
+ /** CSS-класс корневого элемента */
60
+ className?: string;
61
+ }>;
@@ -0,0 +1 @@
1
+ export {};