@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';
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,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sizeToEmblemSize = sizeToEmblemSize;
4
+ exports.isEmblemPicture = isEmblemPicture;
5
+ const icon_predefined_1 = require("@cloud-ru/ds-icon-predefined");
6
+ const constants_1 = require("../../constants");
7
+ /**
8
+ * Эмблема масштабируется вместе с карточкой (как в продуктовом ките):
9
+ * размер `IconPredefined` выводится из `size` карточки, а не задаётся снаружи.
10
+ */
11
+ function sizeToEmblemSize(size) {
12
+ switch (size) {
13
+ case constants_1.SIZE.S:
14
+ return icon_predefined_1.SIZE.M;
15
+ case constants_1.SIZE.L:
16
+ return icon_predefined_1.SIZE['5XL'];
17
+ case constants_1.SIZE.M:
18
+ default:
19
+ return icon_predefined_1.SIZE.L;
20
+ }
21
+ }
22
+ function isEmblemPicture(emblem) {
23
+ return 'src' in emblem;
24
+ }
@@ -0,0 +1,7 @@
1
+ import { ToggleGroupProps } from '../../types';
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,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ToggleGroup = ToggleGroup;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const toggles_1 = require("@cloud-ru/ds-toggles");
9
+ const utils_1 = require("@cloud-ru/ds-utils");
10
+ const classnames_1 = __importDefault(require("classnames"));
11
+ const constants_1 = require("../../constants");
12
+ const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
13
+ /**
14
+ * ToggleGroup — провайдер выбора + grid-раскладка карточек `ToggleCard`.
15
+ * Состояние (controlled/uncontrolled, single/multiple) держит `@cloud-ru/ds-toggles::ToggleGroup`;
16
+ * обёртка добавляет ориентацию, gap и breakpoint горизонтальной раскладки.
17
+ */
18
+ function ToggleGroup(props) {
19
+ const { children, orientation = constants_1.ORIENTATION.Vertical, gap = constants_1.GAP.S, breakpoint = 0, className, ...rest } = props;
20
+ const restProps = rest;
21
+ const supportProps = (0, utils_1.extractSupportProps)(restProps);
22
+ const groupProps = (0, utils_1.excludeSupportProps)(restProps);
23
+ return ((0, jsx_runtime_1.jsx)(toggles_1.ToggleGroup, { ...groupProps, children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.toggleGroup, className), style: { '--toggle-group-breakpoint': `${breakpoint}px` }, "data-orientation": orientation, "data-gap": gap, "data-test-id": constants_1.TEST_IDS.group, ...supportProps, children: children }) }));
24
+ }
@@ -0,0 +1 @@
1
+ export * from './ToggleGroup';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ToggleGroup"), exports);
@@ -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';
2
+ export * from './ToggleGroup';
3
+ export { useToggleGroup } from '@cloud-ru/ds-toggles';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.useToggleGroup = void 0;
18
+ __exportStar(require("./ToggleCard"), exports);
19
+ __exportStar(require("./ToggleGroup"), exports);
20
+ var toggles_1 = require("@cloud-ru/ds-toggles");
21
+ Object.defineProperty(exports, "useToggleGroup", { enumerable: true, get: function () { return toggles_1.useToggleGroup; } });
@@ -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,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEST_IDS = exports.GAP = exports.ORIENTATION = exports.SIZE = void 0;
4
+ exports.SIZE = {
5
+ S: 's',
6
+ M: 'm',
7
+ L: 'l',
8
+ };
9
+ exports.ORIENTATION = {
10
+ Horizontal: 'horizontal',
11
+ Vertical: 'vertical',
12
+ };
13
+ exports.GAP = {
14
+ S: 's',
15
+ M: 'm',
16
+ L: 'l',
17
+ };
18
+ exports.TEST_IDS = {
19
+ card: 'toggle-card',
20
+ cardEmblem: 'toggle-card__emblem',
21
+ cardTitle: 'toggle-card__title',
22
+ cardDescription: 'toggle-card__description',
23
+ promoBadge: 'toggle-card__promo-badge',
24
+ group: 'toggle-group',
25
+ };
@@ -0,0 +1,3 @@
1
+ export * from './components';
2
+ export * from './constants';
3
+ export * from './types';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./components"), exports);
18
+ __exportStar(require("./constants"), exports);
19
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -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';
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { ToggleCardProps } from '../../types.js';
2
+ /**
3
+ * ToggleCard — кликабельная карточка выбора. Работает внутри `ToggleGroup`:
4
+ * клик / Enter / Space по карточке переключает её значение в контексте группы.
5
+ * Визуальный chrome (acrylic-фон, state-layer выбора, outline, focus-ring)
6
+ * приходит из `@cloud-ru/ds-card`; карточка добавляет раскладку контента и клавиатуру.
7
+ */
8
+ export declare function ToggleCard({ title, value, description, emblem, promoBadge, size, truncate, disabled, className, ...rest }: ToggleCardProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, VIEW } from '@cloud-ru/ds-card';
3
+ import { IconPredefined } from '@cloud-ru/ds-icon-predefined';
4
+ import { PromoTag } from '@cloud-ru/ds-promo-tag';
5
+ import { useToggleGroup } from '@cloud-ru/ds-toggles';
6
+ import { TruncateString } from '@cloud-ru/ds-truncate-string';
7
+ import { extractSupportProps } from '@cloud-ru/ds-utils';
8
+ import cn from 'classnames';
9
+ import { SIZE, TEST_IDS } from '../../constants.js';
10
+ import styles from './styles.module.css';
11
+ import { isEmblemPicture, sizeToEmblemSize } from './utils.js';
12
+ const TRUNCATE_DEFAULTS = { title: 1, description: 2 };
13
+ /**
14
+ * ToggleCard — кликабельная карточка выбора. Работает внутри `ToggleGroup`:
15
+ * клик / Enter / Space по карточке переключает её значение в контексте группы.
16
+ * Визуальный chrome (acrylic-фон, state-layer выбора, outline, focus-ring)
17
+ * приходит из `@cloud-ru/ds-card`; карточка добавляет раскладку контента и клавиатуру.
18
+ */
19
+ export function ToggleCard({ title, value, description, emblem, promoBadge, size = SIZE.M, truncate, disabled = false, className, ...rest }) {
20
+ const { isChecked, handleClick, multipleSelection } = useToggleGroup({ value });
21
+ const handleKeyDown = e => {
22
+ if (disabled)
23
+ return;
24
+ if (e.code === 'Enter' || e.code === 'Space') {
25
+ e.preventDefault();
26
+ handleClick();
27
+ }
28
+ };
29
+ // `?? DEFAULT` вместо spread: явный `truncate={{ description: undefined }}`
30
+ // (сборка объекта из optional-переменной) не должен перетирать дефолт.
31
+ const maxLines = {
32
+ title: truncate?.title ?? TRUNCATE_DEFAULTS.title,
33
+ description: truncate?.description ?? TRUNCATE_DEFAULTS.description,
34
+ };
35
+ return (_jsxs(Card, { className: cn(styles.card, className), view: VIEW.Outline, radius: size, checked: isChecked, disabled: disabled, role: multipleSelection ? 'checkbox' : 'radio', "aria-checked": isChecked, onClick: !disabled ? handleClick : undefined, onKeyDown: handleKeyDown, "data-test-id": TEST_IDS.card, ...extractSupportProps(rest), children: [promoBadge && (_jsx("div", { className: styles.promoBadge, "data-size": size, "data-test-id": TEST_IDS.promoBadge, children: _jsx(PromoTag, { ...(typeof promoBadge === 'string' ? { label: promoBadge } : promoBadge), roleAppearance: 'decor' }) })), _jsxs("div", { className: styles.content, "data-size": size, children: [emblem && (_jsx("span", { className: styles.emblem, "data-test-id": TEST_IDS.cardEmblem, "aria-hidden": isEmblemPicture(emblem) ? undefined : true, children: isEmblemPicture(emblem) ? (_jsx("img", { className: styles.picture, src: emblem.src, alt: emblem.alt, "data-size": sizeToEmblemSize(size) })) : (_jsx(IconPredefined, { ...emblem, size: sizeToEmblemSize(size), background: emblem.background ?? false })) })), _jsxs("div", { className: styles.textContent, children: [_jsx("span", { className: styles.title, "data-test-id": TEST_IDS.cardTitle, children: _jsx(TruncateString, { text: title, maxLines: maxLines.title }) }), description && (_jsx("span", { className: styles.description, "data-test-id": TEST_IDS.cardDescription, children: _jsx(TruncateString, { text: description, maxLines: maxLines.description }) }))] })] })] }));
36
+ }
@@ -0,0 +1 @@
1
+ export * from './ToggleCard.js';
@@ -0,0 +1 @@
1
+ export * from './ToggleCard.js';