@sima-land/moleculas 13.0.0 → 13.1.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.
- package/desktop/components/product-card/index.js +5 -1
- package/desktop/components/product-carousel/index.js +3 -1
- package/desktop/components/product-carousel/utils.js +4 -1
- package/mobile/components/select-screen/index.d.ts +10 -1
- package/mobile/components/select-screen/index.js +56 -11
- package/mobile/components/select-screen/select-screen.module.scss +3 -1
- package/package.json +1 -1
|
@@ -37,9 +37,13 @@ exports.reduceHoverInfo = exports.reduceBaseInfo = exports.ProductCard = exports
|
|
|
37
37
|
const react_1 = __importStar(require("react"));
|
|
38
38
|
const product_info_1 = require("../../../common/components/product-info");
|
|
39
39
|
const plate_1 = require("@sima-land/ui-nucleons/plate");
|
|
40
|
+
const layer_1 = require("@sima-land/ui-nucleons/helpers/layer");
|
|
40
41
|
const classnames_1 = __importDefault(require("classnames"));
|
|
41
42
|
const product_card_module_scss_1 = __importDefault(require("./product-card.module.scss"));
|
|
42
|
-
exports.HoverCard = (0, react_1.forwardRef)((props, ref) =>
|
|
43
|
+
exports.HoverCard = (0, react_1.forwardRef)((props, ref) => {
|
|
44
|
+
const layer = (0, layer_1.useLayer)() + 1;
|
|
45
|
+
return (react_1.default.createElement(plate_1.Plate, Object.assign({}, props, { style: Object.assign(Object.assign({}, props.style), { zIndex: layer }), ref: ref, rounds: 'm', shadow: 'z4', className: (0, classnames_1.default)(product_card_module_scss_1.default.card, props.className), "data-testid": 'product-card:hover-card' })));
|
|
46
|
+
});
|
|
43
47
|
const ProductCard = (_a) => {
|
|
44
48
|
var { children, className } = _a, props = __rest(_a, ["children", "className"]);
|
|
45
49
|
const [hovered, toggle] = (0, react_1.useState)(false);
|
|
@@ -31,6 +31,7 @@ const media_1 = require("@sima-land/ui-nucleons/hooks/media");
|
|
|
31
31
|
const product_info_1 = require("../../../common/components/product-info");
|
|
32
32
|
const bind_1 = __importDefault(require("classnames/bind"));
|
|
33
33
|
const product_carousel_module_scss_1 = __importDefault(require("./product-carousel.module.scss"));
|
|
34
|
+
const layer_1 = require("@sima-land/ui-nucleons/helpers/layer");
|
|
34
35
|
const cx = bind_1.default.bind(product_carousel_module_scss_1.default);
|
|
35
36
|
const getSizeClasses = (size = {}) => [
|
|
36
37
|
`size-xs-${size.xs || 4}`,
|
|
@@ -45,6 +46,7 @@ const getSizeClasses = (size = {}) => [
|
|
|
45
46
|
* @return Элемент.
|
|
46
47
|
*/
|
|
47
48
|
const ProductCarousel = ({ className, itemSize, onInViewport, onNeedRequest, withHoverCard, children, }) => {
|
|
49
|
+
const layer = (0, layer_1.useLayer)();
|
|
48
50
|
const [activeItemIndex, setActiveItemIndex] = (0, react_1.useState)(null);
|
|
49
51
|
const cardShow = (0, utils_1.useAllowFlag)();
|
|
50
52
|
const needBigArrows = (0, media_1.useMedia)('(min-width: 1600px)');
|
|
@@ -73,7 +75,7 @@ const ProductCarousel = ({ className, itemSize, onInViewport, onNeedRequest, wit
|
|
|
73
75
|
controlProps: {
|
|
74
76
|
size: needBigArrows ? 'l' : 's',
|
|
75
77
|
style: {
|
|
76
|
-
zIndex:
|
|
78
|
+
zIndex: layer + 2,
|
|
77
79
|
top: `${itemWidth / 2}px`,
|
|
78
80
|
},
|
|
79
81
|
},
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.useChildWidth = exports.useAllowFlag = exports.useViewport = void 0;
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const on_1 = __importDefault(require("@sima-land/ui-nucleons/helpers/on"));
|
|
9
|
+
const identity_1 = require("@sima-land/ui-nucleons/hooks/identity");
|
|
9
10
|
/**
|
|
10
11
|
* Вызывает callback когда заданный в ref элемент попал во viewport.
|
|
11
12
|
* @param ref Ref отслеживаемого элемента.
|
|
@@ -13,12 +14,14 @@ const on_1 = __importDefault(require("@sima-land/ui-nucleons/helpers/on"));
|
|
|
13
14
|
* @param options Опции IntersectionObserver.
|
|
14
15
|
*/
|
|
15
16
|
const useViewport = (ref, callback, options) => {
|
|
17
|
+
const callbackRef = (0, identity_1.useIdentityRef)(callback);
|
|
16
18
|
(0, react_1.useEffect)(() => {
|
|
17
19
|
const element = ref.current;
|
|
18
20
|
if (element) {
|
|
19
21
|
const observer = new IntersectionObserver(entries => {
|
|
22
|
+
const fn = callbackRef.current;
|
|
20
23
|
for (const entry of entries) {
|
|
21
|
-
entry.target === element && entry.isIntersecting &&
|
|
24
|
+
entry.target === element && entry.isIntersecting && fn && fn();
|
|
22
25
|
break;
|
|
23
26
|
}
|
|
24
27
|
}, options);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { LayoutProps } from '@sima-land/ui-nucleons/layout';
|
|
2
3
|
export interface SelectScreenProps {
|
|
3
4
|
items?: any[];
|
|
4
5
|
getItemName?: (item: any) => string;
|
|
@@ -8,10 +9,14 @@ export interface SelectScreenProps {
|
|
|
8
9
|
}) => React.ReactNode;
|
|
9
10
|
isItemSelected?: (item: any) => boolean | void;
|
|
10
11
|
onItemClick?: (item: any) => void;
|
|
12
|
+
title?: string;
|
|
13
|
+
subtitle?: string;
|
|
14
|
+
onBack?: () => void;
|
|
11
15
|
onClose?: () => void;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
14
18
|
* Экран выбора опции.
|
|
19
|
+
* @deprecated Вместо SelectScreen используйте SelectScreenLayout и SelectScreenOption вместе с Screen.
|
|
15
20
|
* @param props Свойства. Поддерживаются свойства Screen.
|
|
16
21
|
* @param props.items Список опций.
|
|
17
22
|
* @param props.getItemName Вернет имя опции.
|
|
@@ -20,4 +25,8 @@ export interface SelectScreenProps {
|
|
|
20
25
|
* @param props.onItemClick Сработает при клике на опцию.
|
|
21
26
|
* @return Экран выбора опции.
|
|
22
27
|
*/
|
|
23
|
-
export declare const SelectScreen: ({ items, getItemName, displayItem, isItemSelected, onItemClick, onClose, }: SelectScreenProps) => JSX.Element;
|
|
28
|
+
export declare const SelectScreen: ({ items, getItemName, displayItem, isItemSelected, onItemClick, title, subtitle, onBack, onClose, }: SelectScreenProps) => JSX.Element;
|
|
29
|
+
export declare const SelectScreenLayout: ({ children, ...props }: LayoutProps) => JSX.Element;
|
|
30
|
+
export declare const SelectScreenOption: ({ children, className, selected, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
31
|
+
selected?: boolean | undefined;
|
|
32
|
+
}) => JSX.Element;
|
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
22
|
+
var t = {};
|
|
23
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
24
|
+
t[p] = s[p];
|
|
25
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
26
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
27
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
28
|
+
t[p[i]] = s[p[i]];
|
|
29
|
+
}
|
|
30
|
+
return t;
|
|
31
|
+
};
|
|
2
32
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
33
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
34
|
};
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SelectScreen = void 0;
|
|
7
|
-
const react_1 =
|
|
36
|
+
exports.SelectScreenOption = exports.SelectScreenLayout = exports.SelectScreen = void 0;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
8
38
|
const lodash_1 = require("lodash");
|
|
9
39
|
const prop_1 = __importDefault(require("lodash/fp/prop"));
|
|
10
40
|
const screen_1 = require("@sima-land/ui-nucleons/screen");
|
|
@@ -12,9 +42,11 @@ const text_1 = require("@sima-land/ui-nucleons/text");
|
|
|
12
42
|
const colors_1 = require("@sima-land/ui-nucleons/colors");
|
|
13
43
|
const layout_1 = require("@sima-land/ui-nucleons/layout");
|
|
14
44
|
const check_1 = __importDefault(require("@sima-land/ui-quarks/icons/24x24/Stroked/check"));
|
|
45
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
15
46
|
const select_screen_module_scss_1 = __importDefault(require("./select-screen.module.scss"));
|
|
16
47
|
/**
|
|
17
48
|
* Экран выбора опции.
|
|
49
|
+
* @deprecated Вместо SelectScreen используйте SelectScreenLayout и SelectScreenOption вместе с Screen.
|
|
18
50
|
* @param props Свойства. Поддерживаются свойства Screen.
|
|
19
51
|
* @param props.items Список опций.
|
|
20
52
|
* @param props.getItemName Вернет имя опции.
|
|
@@ -23,19 +55,32 @@ const select_screen_module_scss_1 = __importDefault(require("./select-screen.mod
|
|
|
23
55
|
* @param props.onItemClick Сработает при клике на опцию.
|
|
24
56
|
* @return Экран выбора опции.
|
|
25
57
|
*/
|
|
26
|
-
const SelectScreen = ({ items, getItemName = (0, prop_1.default)('name'), displayItem = displayOption, isItemSelected = lodash_1.noop, onItemClick, onClose, }) => (react_1.default.createElement(screen_1.Screen, null,
|
|
27
|
-
|
|
58
|
+
const SelectScreen = ({ items, getItemName = (0, prop_1.default)('name'), displayItem = displayOption, isItemSelected = lodash_1.noop, onItemClick, title, subtitle, onBack, onClose, }) => (react_1.default.createElement(screen_1.Screen, null,
|
|
59
|
+
react_1.default.createElement(screen_1.Screen.Header, { title: title, subtitle: subtitle, onBack: onBack, onClose: onClose }),
|
|
28
60
|
react_1.default.createElement(screen_1.Screen.Body, null,
|
|
29
|
-
react_1.default.createElement(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}))))));
|
|
61
|
+
react_1.default.createElement(exports.SelectScreenLayout, { style: { padding: '16px 0' } }, (0, lodash_1.map)(items, (item, index) => {
|
|
62
|
+
const isSelected = Boolean(isItemSelected(item));
|
|
63
|
+
return (react_1.default.createElement(exports.SelectScreenOption, { key: index, onClick: () => onItemClick && onItemClick(item) },
|
|
64
|
+
displayItem(item, { getItemName, isSelected }),
|
|
65
|
+
isSelected && react_1.default.createElement(check_1.default, { fill: colors_1.COLORS.get('gray87') })));
|
|
66
|
+
})))));
|
|
36
67
|
exports.SelectScreen = SelectScreen;
|
|
68
|
+
const SelectScreenLayout = (_a) => {
|
|
69
|
+
var { children } = _a, props = __rest(_a, ["children"]);
|
|
70
|
+
return (react_1.default.createElement(layout_1.MobileLayout, Object.assign({}, props, { disabledOn: ['mxs', 'ms'] }),
|
|
71
|
+
react_1.default.createElement("div", { className: select_screen_module_scss_1.default.container }, react_1.Children.toArray(children).filter(x => (0, react_1.isValidElement)(x) && x.type === exports.SelectScreenOption))));
|
|
72
|
+
};
|
|
73
|
+
exports.SelectScreenLayout = SelectScreenLayout;
|
|
74
|
+
const SelectScreenOption = (_a) => {
|
|
75
|
+
var { children, className, selected } = _a, props = __rest(_a, ["children", "className", "selected"]);
|
|
76
|
+
return (react_1.default.createElement("button", Object.assign({}, props, { type: 'button', className: (0, classnames_1.default)(select_screen_module_scss_1.default.item, className), "data-testid": 'select-screen:option' }),
|
|
77
|
+
children,
|
|
78
|
+
selected && react_1.default.createElement(check_1.default, { fill: colors_1.COLORS.get('gray87') })));
|
|
79
|
+
};
|
|
80
|
+
exports.SelectScreenOption = SelectScreenOption;
|
|
37
81
|
/**
|
|
38
82
|
* Выводит опцию в текстовом виде.
|
|
83
|
+
* @deprecated
|
|
39
84
|
* @param item Элемент списка.
|
|
40
85
|
* @param options Опции вывода.
|
|
41
86
|
* @param options.getItemName Вернет имя опции.
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
.container {
|
|
5
5
|
--gutter: 24px;
|
|
6
|
-
padding: 16px 0;
|
|
7
6
|
margin: 0 auto;
|
|
8
7
|
max-width: calc((var(--gutter) * 5) + ((var(--layoutWidth) - (var(--gutter) * 7)) * 6 / 8));
|
|
9
8
|
|
|
@@ -22,6 +21,9 @@
|
|
|
22
21
|
justify-content: space-between;
|
|
23
22
|
width: 100%;
|
|
24
23
|
padding: 16px;
|
|
24
|
+
font-size: 16px;
|
|
25
|
+
line-height: 24px;
|
|
26
|
+
height: 48px;
|
|
25
27
|
margin: 0;
|
|
26
28
|
border: 0;
|
|
27
29
|
outline: 0;
|