@sima-land/moleculas 16.0.0-alpha.31 → 16.0.0-alpha.33
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.
- package/common/components/badge/badge.js +5 -33
- package/common/components/badge/badge.js.map +1 -1
- package/common/components/badge/badge.m.scss +20 -7
- package/common/components/badge/types.d.ts +1 -1
- package/common/components/badge/utils.d.ts +33 -0
- package/common/components/badge/utils.js +113 -0
- package/common/components/badge/utils.js.map +1 -0
- package/desktop/components/product-carousel/product-carousel.d.ts +1 -1
- package/desktop/components/product-carousel/product-carousel.js +10 -2
- package/desktop/components/product-carousel/product-carousel.js.map +1 -1
- package/desktop/components/product-carousel/types.d.ts +2 -0
- package/package.json +2 -2
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.Badge = void 0;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const react_1 = require("react");
|
|
9
|
-
const
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
10
|
const bind_1 = __importDefault(require("classnames/bind"));
|
|
11
11
|
const badge_m_scss_1 = __importDefault(require("./badge.m.scss"));
|
|
12
12
|
const cx = bind_1.default.bind(badge_m_scss_1.default);
|
|
@@ -15,41 +15,13 @@ const cx = bind_1.default.bind(badge_m_scss_1.default);
|
|
|
15
15
|
* @param props Свойства.
|
|
16
16
|
* @return Элемент.
|
|
17
17
|
*/
|
|
18
|
-
exports.Badge = (0, react_1.forwardRef)(function Badge({ className, color, coloring = 'outline', fields, href, style, shape = 'unset', withHoverEffect = Boolean(href), 'data-testid': testId = 'badge', ...restProps }, ref) {
|
|
19
|
-
const iconOnly = fields.length === 1 && fields[0].type === 'svg-url';
|
|
18
|
+
exports.Badge = (0, react_1.forwardRef)(function Badge({ className, color, coloring = 'outline', fields, href, style, shape = 'unset', withHoverEffect = Boolean(href), 'data-testid': testId = 'badge', children, ...restProps }, ref) {
|
|
19
|
+
const iconOnly = fields && fields.length === 1 && fields[0].type === 'svg-url';
|
|
20
20
|
const rootClassName = cx('root', iconOnly && 'icon-only', withHoverEffect && 'with-hover-effect', shape === 'round' && 'shape-round', shape === 'pill' && 'shape-pill', shape !== 'pill' && !iconOnly && 'padding-x-default', shape === 'pill' && !iconOnly && 'padding-x-pill', coloring === 'outline' && 'coloring-outline', coloring === 'fill' && 'coloring-fill', className);
|
|
21
21
|
const rootStyle = {
|
|
22
|
-
'--badge-color': color,
|
|
22
|
+
'--badge-color': (0, utils_1.tokenToCustomProperty)(color),
|
|
23
23
|
...style,
|
|
24
24
|
};
|
|
25
|
-
return ((0, jsx_runtime_1.jsx)("a", { ref: ref, ...restProps, "data-testid": testId, href: href, style: rootStyle, className: rootClassName, children:
|
|
26
|
-
// вложенный span нужен для того чтобы объединить `display: inline-flex` и `text-overflow: ellipsis`
|
|
27
|
-
(0, jsx_runtime_1.jsx)("span", { className: cx('content'), children: fields.reduce((acc, item, i) => {
|
|
28
|
-
let result = null;
|
|
29
|
-
// на данный момент сочетание иконки с другими элементами не предусмотрено макетами - игнорируем
|
|
30
|
-
switch (item.type) {
|
|
31
|
-
case 'text':
|
|
32
|
-
result = item.value;
|
|
33
|
-
break;
|
|
34
|
-
case 'timer':
|
|
35
|
-
result = ((0, jsx_runtime_1.jsx)(timer_1.Timer, { date: item.value, timeout: 1000 * 60, format: formatDistance }, i));
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
acc.push(result);
|
|
39
|
-
i < fields.length - 1 && acc.push(' ');
|
|
40
|
-
return acc;
|
|
41
|
-
}, []) })) }));
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)("a", { ref: ref, ...restProps, "data-testid": testId, href: href, style: rootStyle, className: rootClassName, children: fields ? (0, utils_1.renderFields)(fields) : children }));
|
|
42
26
|
});
|
|
43
|
-
/**
|
|
44
|
-
* Форматирует оставшееся время.
|
|
45
|
-
* @param distance Оставшееся время.
|
|
46
|
-
* @return Отформатированное время.
|
|
47
|
-
*/
|
|
48
|
-
const formatDistance = ({ days, hours, minutes, }) => [toTimePart(days), ...[hours % 24, minutes % 60].map(toTimePart)].join(':');
|
|
49
|
-
/**
|
|
50
|
-
* Форматирует число добавляя нули при необходимости.
|
|
51
|
-
* @param n Число.
|
|
52
|
-
* @return Отформатированное число.
|
|
53
|
-
*/
|
|
54
|
-
const toTimePart = (n) => `${n}`.padStart(2, '0');
|
|
55
27
|
//# sourceMappingURL=badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../../src/common/components/badge/badge.tsx"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../../src/common/components/badge/badge.tsx"],"names":[],"mappings":";;;;;;;AACA,iCAAmC;AACnC,mCAA8D;AAC9D,2DAAyC;AACzC,kEAAoC;AAEpC,MAAM,EAAE,GAAG,cAAU,CAAC,IAAI,CAAC,sBAAM,CAAC,CAAC;AAEnC;;;;GAIG;AACU,QAAA,KAAK,GAAG,IAAA,kBAAU,EAAgC,SAAS,KAAK,CAC3E,EACE,SAAS,EACT,KAAK,EACL,QAAQ,GAAG,SAAS,EACpB,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GAAG,OAAO,EACf,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/B,aAAa,EAAE,MAAM,GAAG,OAAO,EAC/B,QAAQ,EACR,GAAG,SAAS,EACb,EACD,GAAG;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;IAE/E,MAAM,aAAa,GAAG,EAAE,CACtB,MAAM,EACN,QAAQ,IAAI,WAAW,EACvB,eAAe,IAAI,mBAAmB,EACtC,KAAK,KAAK,OAAO,IAAI,aAAa,EAClC,KAAK,KAAK,MAAM,IAAI,YAAY,EAChC,KAAK,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,mBAAmB,EACpD,KAAK,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,gBAAgB,EACjD,QAAQ,KAAK,SAAS,IAAI,kBAAkB,EAC5C,QAAQ,KAAK,MAAM,IAAI,eAAe,EACtC,SAAS,CACV,CAAC;IAEF,MAAM,SAAS,GAAe;QAC5B,eAAe,EAAE,IAAA,6BAAqB,EAAC,KAAK,CAAC;QAC7C,GAAG,KAAK;KACT,CAAC;IAEF,OAAO,CACL,8BACE,GAAG,EAAE,GAAG,KACJ,SAAS,iBACA,MAAM,EACnB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,aAAa,YAEvB,MAAM,CAAC,CAAC,CAAC,IAAA,oBAAY,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,GACvC,CACL,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
$badge-size: 20px;
|
|
2
|
-
$icon-size:
|
|
2
|
+
$icon-size: 16px;
|
|
3
3
|
|
|
4
4
|
.root {
|
|
5
5
|
display: inline-flex;
|
|
@@ -15,15 +15,23 @@ $icon-size: 14px;
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
.padding-x-default {
|
|
18
|
-
|
|
19
|
-
padding-
|
|
20
|
-
|
|
18
|
+
padding-left: 6px;
|
|
19
|
+
padding-right: 6px;
|
|
20
|
+
&.coloring-outline {
|
|
21
|
+
// ВАЖНО: учитываем border
|
|
22
|
+
padding-left: 5px;
|
|
23
|
+
padding-right: 5px;
|
|
24
|
+
}
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
.padding-x-pill {
|
|
24
|
-
|
|
25
|
-
padding-left: 7px;
|
|
28
|
+
padding-left: 8px;
|
|
26
29
|
padding-right: 8px;
|
|
30
|
+
&.coloring-outline {
|
|
31
|
+
// ВАЖНО: учитываем border
|
|
32
|
+
padding-left: 7px;
|
|
33
|
+
padding-right: 7px;
|
|
34
|
+
}
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
.shape-round {
|
|
@@ -74,8 +82,13 @@ $icon-size: 14px;
|
|
|
74
82
|
}
|
|
75
83
|
|
|
76
84
|
.icon {
|
|
77
|
-
display:
|
|
85
|
+
display: block;
|
|
78
86
|
width: $icon-size;
|
|
79
87
|
height: $icon-size;
|
|
80
88
|
line-height: $icon-size;
|
|
81
89
|
}
|
|
90
|
+
|
|
91
|
+
.icon + .content,
|
|
92
|
+
.content + .icon {
|
|
93
|
+
margin-left: 4px;
|
|
94
|
+
}
|
|
@@ -14,7 +14,7 @@ export interface BadgeProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>
|
|
|
14
14
|
/** Как применится цвет. */
|
|
15
15
|
coloring?: 'fill' | 'outline' | 'unset';
|
|
16
16
|
/** Содержимое шильдика. */
|
|
17
|
-
fields
|
|
17
|
+
fields?: Array<BadgeField>;
|
|
18
18
|
/** Форма скруглений. */
|
|
19
19
|
shape?: 'round' | 'pill' | 'unset';
|
|
20
20
|
/** Нужен ли эффект при наведении. */
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { BadgeField } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Если переданное значение является токеном цвета/градиента, вернёт CSS-значение с соответствующей CSS-переменной.
|
|
5
|
+
* Иначе вернет само значение.
|
|
6
|
+
* @param value Значение.
|
|
7
|
+
* @return Значение или undefined.
|
|
8
|
+
*/
|
|
9
|
+
export declare function tokenToCustomProperty(value: string | undefined): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Сформирует содержимое шильдика на основе списка полей.
|
|
12
|
+
* Текстовые поля (type === text | timer) идущие подряд, будут объединены в один span.
|
|
13
|
+
* Между текстовыми полями в span будет вставлен 1 пробел.
|
|
14
|
+
* @param fields Поля.
|
|
15
|
+
* @return СОдержимое шильдика.
|
|
16
|
+
*/
|
|
17
|
+
export declare function renderFields(fields: BadgeField[]): ReactNode[];
|
|
18
|
+
/**
|
|
19
|
+
* Форматирует оставшееся время.
|
|
20
|
+
* @param distance Оставшееся время.
|
|
21
|
+
* @return Отформатированное время.
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatDistance({ days, hours, minutes, }: {
|
|
24
|
+
days: number;
|
|
25
|
+
hours: number;
|
|
26
|
+
minutes: number;
|
|
27
|
+
}): string;
|
|
28
|
+
/**
|
|
29
|
+
* Форматирует число добавляя нули при необходимости.
|
|
30
|
+
* @param n Число.
|
|
31
|
+
* @return Отформатированное число.
|
|
32
|
+
*/
|
|
33
|
+
export declare function toTimePart(n: number): string;
|
|
@@ -0,0 +1,113 @@
|
|
|
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.toTimePart = exports.formatDistance = exports.renderFields = exports.tokenToCustomProperty = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const colors_1 = require("@sima-land/ui-nucleons/colors");
|
|
9
|
+
const gradients_1 = require("@sima-land/ui-nucleons/gradients");
|
|
10
|
+
const timer_1 = require("@sima-land/ui-nucleons/timer");
|
|
11
|
+
const badge_m_scss_1 = __importDefault(require("./badge.m.scss"));
|
|
12
|
+
/**
|
|
13
|
+
* Если переданное значение является токеном цвета/градиента, вернёт CSS-значение с соответствующей CSS-переменной.
|
|
14
|
+
* Иначе вернет само значение.
|
|
15
|
+
* @param value Значение.
|
|
16
|
+
* @return Значение или undefined.
|
|
17
|
+
*/
|
|
18
|
+
function tokenToCustomProperty(value) {
|
|
19
|
+
if (typeof value !== 'string') {
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
if (value.startsWith('color/')) {
|
|
23
|
+
const colorName = value.replace('color/', '');
|
|
24
|
+
if (!colors_1.COLORS.has(colorName)) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return `var(--color-${colorName})`;
|
|
28
|
+
}
|
|
29
|
+
if (value.startsWith('gradient/')) {
|
|
30
|
+
const gradientName = value.replace('gradient/', '');
|
|
31
|
+
if (!gradients_1.GRADIENTS.has(gradientName)) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
return `var(--gradient-${gradientName})`;
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
exports.tokenToCustomProperty = tokenToCustomProperty;
|
|
39
|
+
/**
|
|
40
|
+
* Сформирует содержимое шильдика на основе списка полей.
|
|
41
|
+
* Текстовые поля (type === text | timer) идущие подряд, будут объединены в один span.
|
|
42
|
+
* Между текстовыми полями в span будет вставлен 1 пробел.
|
|
43
|
+
* @param fields Поля.
|
|
44
|
+
* @return СОдержимое шильдика.
|
|
45
|
+
*/
|
|
46
|
+
function renderFields(fields) {
|
|
47
|
+
const result = [];
|
|
48
|
+
let item = null;
|
|
49
|
+
for (const field of fields) {
|
|
50
|
+
if (!item) {
|
|
51
|
+
switch (field.type) {
|
|
52
|
+
case 'text': {
|
|
53
|
+
item = [field.value];
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'timer': {
|
|
57
|
+
item = [(0, jsx_runtime_1.jsx)(timer_1.Timer, { date: field.value, timeout: 1000 * 60, format: formatDistance }, 0)];
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'svg-url': {
|
|
61
|
+
result.push((0, jsx_runtime_1.jsx)("img", { className: badge_m_scss_1.default.icon, src: field.value, alt: '' }, result.length));
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
switch (field.type) {
|
|
68
|
+
case 'text': {
|
|
69
|
+
item.push(' ');
|
|
70
|
+
item.push(field.value);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case 'timer': {
|
|
74
|
+
item.push(' ');
|
|
75
|
+
item.push((0, jsx_runtime_1.jsx)(timer_1.Timer, { date: field.value, timeout: 1000 * 60, format: formatDistance }, item.length));
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'svg-url': {
|
|
79
|
+
// вложенный span нужен для того чтобы объединить `display: inline-flex` и `text-overflow: ellipsis`
|
|
80
|
+
result.push((0, jsx_runtime_1.jsx)("span", { className: badge_m_scss_1.default.content, children: item }, result.length));
|
|
81
|
+
item = null;
|
|
82
|
+
result.push((0, jsx_runtime_1.jsx)("img", { className: badge_m_scss_1.default.icon, src: field.value, alt: '' }, result.length));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (item) {
|
|
89
|
+
result.push((0, jsx_runtime_1.jsx)("span", { className: badge_m_scss_1.default.content, children: item }, result.length));
|
|
90
|
+
item = null;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
exports.renderFields = renderFields;
|
|
95
|
+
/**
|
|
96
|
+
* Форматирует оставшееся время.
|
|
97
|
+
* @param distance Оставшееся время.
|
|
98
|
+
* @return Отформатированное время.
|
|
99
|
+
*/
|
|
100
|
+
function formatDistance({ days, hours, minutes, }) {
|
|
101
|
+
return `${toTimePart(days)}:${toTimePart(hours % 24)}:${toTimePart(minutes % 60)}`;
|
|
102
|
+
}
|
|
103
|
+
exports.formatDistance = formatDistance;
|
|
104
|
+
/**
|
|
105
|
+
* Форматирует число добавляя нули при необходимости.
|
|
106
|
+
* @param n Число.
|
|
107
|
+
* @return Отформатированное число.
|
|
108
|
+
*/
|
|
109
|
+
function toTimePart(n) {
|
|
110
|
+
return `${n}`.padStart(2, '0');
|
|
111
|
+
}
|
|
112
|
+
exports.toTimePart = toTimePart;
|
|
113
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/common/components/badge/utils.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,4 @@ import { ProductCarouselProps } from './types';
|
|
|
4
4
|
* @param props Свойства.
|
|
5
5
|
* @return Элемент.
|
|
6
6
|
*/
|
|
7
|
-
export declare function ProductCarousel({ infinite, className, itemSize, itemProps, onInViewport, onNeedRequest, children, controlProps, itemImageRatio, }: ProductCarouselProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function ProductCarousel({ infinite, className, itemSize, itemProps, onInViewport, onNeedRequest, children, controlProps, itemImageRatio, needRequestOptions, }: ProductCarouselProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -24,12 +24,15 @@ const getSizeClasses = (size) => size && size !== 'unset'
|
|
|
24
24
|
`size-xl-${size.xl || 2}`,
|
|
25
25
|
]
|
|
26
26
|
: [];
|
|
27
|
+
const defaultNeedRequestOptions = {
|
|
28
|
+
rootMargin: '200px 0px 200px 0px',
|
|
29
|
+
};
|
|
27
30
|
/**
|
|
28
31
|
* Карусель рекомендованных товаров.
|
|
29
32
|
* @param props Свойства.
|
|
30
33
|
* @return Элемент.
|
|
31
34
|
*/
|
|
32
|
-
function ProductCarousel({ infinite = true, className, itemSize = { xs: 4, s: 3, m: 2, l: 2, xl: 2 }, itemProps, onInViewport, onNeedRequest, children, controlProps, itemImageRatio = 1, }) {
|
|
35
|
+
function ProductCarousel({ infinite = true, className, itemSize = { xs: 4, s: 3, m: 2, l: 2, xl: 2 }, itemProps, onInViewport, onNeedRequest, children, controlProps, itemImageRatio = 1, needRequestOptions = defaultNeedRequestOptions, }) {
|
|
33
36
|
const layer = (0, helpers_1.useLayer)();
|
|
34
37
|
const needBigArrows = (0, hooks_2.useMedia)('(min-width: 1600px)');
|
|
35
38
|
const rootRef = (0, react_1.useRef)(null);
|
|
@@ -43,7 +46,12 @@ function ProductCarousel({ infinite = true, className, itemSize = { xs: 4, s: 3,
|
|
|
43
46
|
const firstItemRef = (0, react_1.useRef)(null);
|
|
44
47
|
const itemWidth = (0, hooks_1.useClientWidth)(firstItemRef, [items.length]);
|
|
45
48
|
// инициируем загрузку данных, когда компонент почти попал в зону видимости
|
|
46
|
-
const
|
|
49
|
+
const { root, rootMargin, threshold } = needRequestOptions;
|
|
50
|
+
const options = (0, react_1.useMemo)(() => ({
|
|
51
|
+
root,
|
|
52
|
+
rootMargin,
|
|
53
|
+
threshold,
|
|
54
|
+
}), [root, rootMargin, threshold]);
|
|
47
55
|
(0, hooks_2.useIntersection)(rootRef, entry => {
|
|
48
56
|
entry.isIntersecting && onNeedRequest && onNeedRequest();
|
|
49
57
|
}, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-carousel.js","sourceRoot":"","sources":["../../../../src/desktop/components/product-carousel/product-carousel.tsx"],"names":[],"mappings":";;;;;;;AAAA,iCAAiG;AACjG,8DAA2D;AAC3D,iDAAuD;AACvD,wDAAyE;AACzE,0EAAwF;AACxF,4DAA0D;AAE1D,2DAAyC;AACzC,wFAA+C;AAE/C,MAAM,EAAE,GAAG,cAAU,CAAC,IAAI,CAAC,iCAAM,CAAC,CAAC;AAEnC,yCAAyC;AACzC,MAAM,cAAc,GAAG,CAAC,IAAsC,EAAE,EAAE,CAChE,IAAI,IAAI,IAAI,KAAK,OAAO;IACtB,CAAC,CAAC;QACE,WAAW,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;QACzB,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;QACvB,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;QACvB,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;QACvB,WAAW,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;KAC1B;IACH,CAAC,CAAC,EAAE,CAAC;AAET;;;;GAIG;AACH,SAAgB,eAAe,CAAC,EAC9B,QAAQ,GAAG,IAAI,EACf,SAAS,EACT,QAAQ,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAC7C,SAAS,EACT,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,cAAc,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"product-carousel.js","sourceRoot":"","sources":["../../../../src/desktop/components/product-carousel/product-carousel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export interface ProductCarouselProps {
|
|
|
18
18
|
onInViewport?: () => void;
|
|
19
19
|
/** Сработает при попадании карусели в область достаточно близкую к viewport'у. */
|
|
20
20
|
onNeedRequest?: () => void;
|
|
21
|
+
/** Опции области, которая вызовет onNeedRequest. */
|
|
22
|
+
needRequestOptions?: IntersectionObserverInit;
|
|
21
23
|
/** Предоставит свойства для элемента карусели. */
|
|
22
24
|
itemProps?: {
|
|
23
25
|
style?: CSSProperties;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sima-land/moleculas",
|
|
3
3
|
"type": "commonjs",
|
|
4
|
-
"version": "16.0.0-alpha.
|
|
4
|
+
"version": "16.0.0-alpha.33",
|
|
5
5
|
"repository": "ssh://git@github.com:sima-land/moleculas.git",
|
|
6
6
|
"author": "www.sima-land.ru team",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"typescript": "^5.3.3"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@sima-land/ui-nucleons": "^45.0.0-alpha.
|
|
59
|
+
"@sima-land/ui-nucleons": "^45.0.0-alpha.20",
|
|
60
60
|
"@sima-land/ui-quarks": "^5.0.0",
|
|
61
61
|
"react": "^17.0 || ^18.0"
|
|
62
62
|
}
|