@sima-land/moleculas 13.0.0 → 13.1.3

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.
@@ -3,7 +3,6 @@
3
3
  flex-wrap: wrap;
4
4
  line-height: 1;
5
5
  position: relative;
6
- z-index: 2;
7
6
  overflow: hidden;
8
7
  }
9
8
 
@@ -6,10 +6,20 @@
6
6
  max-width: 100%;
7
7
  margin-bottom: 8px;
8
8
  overflow: hidden;
9
- aspect-ratio: 1 / 1;
9
+
10
+ // формируем соотношение сторон 1 / 1
11
+ &::before {
12
+ content: '';
13
+ display: block;
14
+ padding-top: 100%;
15
+ pointer-events: none;
16
+ }
10
17
  }
11
18
 
12
19
  .image-link {
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
13
23
  display: block;
14
24
  height: 100%;
15
25
  }
@@ -19,12 +29,10 @@
19
29
  object-fit: contain;
20
30
  width: 100%;
21
31
  height: 100%;
22
- &:not(.adult) {
32
+ &.adult {
23
33
  position: absolute;
24
34
  top: 0;
25
35
  left: 0;
26
- }
27
- &.adult {
28
36
  opacity: 0.2;
29
37
  filter: blur(24px);
30
38
  pointer-events: none;
@@ -2,22 +2,35 @@
2
2
  import React, { Component } from 'react';
3
3
  import { ModifierButtonProps, Modifier } from '../button';
4
4
  declare type ModifierPredicate<T> = (item: Modifier) => T;
5
- interface State {
5
+ interface ModifiersGroupState {
6
6
  needShowAll: boolean;
7
7
  hasHiddenNodes: boolean;
8
8
  lastVisibleChildIndex: number | null;
9
9
  }
10
10
  export interface ModifiersGroupProps {
11
+ /** Список модификаторов. */
11
12
  items?: Modifier[];
13
+ /** Флаг необходимости отображения всех модификаторов. */
14
+ needShowAll?: boolean;
15
+ /** Будет вызвана при выборе модификатора, получит сам модификатор. */
12
16
  onSelectItem?: (item: Modifier, selected: boolean) => void;
17
+ /** Возвращает тип модификатора ("text" или "image", по умолчанию "text"). */
13
18
  getItemType?: ModifierPredicate<ModifierButtonProps['type']>;
19
+ /** Возвращает число с количеством модификатора (по умолчанию свойство "count"). */
14
20
  getItemCount?: ModifierPredicate<number>;
21
+ /** Возвращает цвет модификатора (по умолчанию свойство "color"). */
15
22
  getItemColor?: ModifierPredicate<string>;
23
+ /** Возвращает содержимое модификатора (по умолчанию свойство "content"). */
16
24
  getItemContent?: ModifierPredicate<string>;
25
+ /** Показывает, выбран ли модификатор (по умолчанию свойство "selected"). */
17
26
  isSelectedItem?: ModifierPredicate<boolean>;
27
+ /** Возвращает URL изображения модификатора (по умолчанию свойство "image"). */
18
28
  getItemImage?: ModifierPredicate<string>;
29
+ /** Имеет ли товар уценку. */
19
30
  isMarkdown?: ModifierPredicate<boolean>;
31
+ /** Сработает при нажатии на кнопку отображения всех модификаторов. */
20
32
  onClickShowAll?: () => void;
33
+ /** Идентификатор для систем автоматизированного тестирования. */
21
34
  'data-testid'?: string;
22
35
  }
23
36
  /**
@@ -27,24 +40,12 @@ export interface ModifiersGroupProps {
27
40
  */
28
41
  export declare const createHiddenNodeIndexFinder: (container: HTMLElement) => (childNode: HTMLElement) => boolean;
29
42
  /**
30
- * Возвращает компонент списка модификаторов.
31
- * @param {Object} props Свойства компонента.
32
- * @param {Array} props.items Список модификаторов.
33
- * @param {Function} [props.getItemType] Возвращает тип модификатора ("text" или "image", по умолчанию "text").
34
- * @param {Function} [props.getItemCount] Возвращает число с количеством модификатора (по умолчанию свойство "count").
35
- * @param {Function} [props.getItemColor] Возвращает цвет модификатора (по умолчанию свойство "color").
36
- * @param {Function} [props.getItemContent] Возвращает содержимое модификатора (по умолчанию свойство "content").
37
- * @param {Function} [props.isSelectedItem] Показывает, выбран ли модификатор (по умолчанию свойство "selected").
38
- * @param {Function} [props.onSelectItem] Будет вызвана при выборе модификатора, получит сам модификатор.
39
- * @param {Function} [props.getItemImage] Возвращает URL изображения модификатора (по умолчанию свойство "image").
40
- * @param {boolean} [props.needShowAll] Флаг необходимости отображения всех модификаторов.
41
- * @param {Function} [props.onClickShowAll] Сработает при нажатии на кнопку отображения всех модификаторов.
42
- * @param {Function} [props.isMarkdown] Имеет ли товар уценку.
43
+ * Компонент списка модификаторов.
43
44
  */
44
- export declare class ModifiersGroup extends Component<ModifiersGroupProps, State> {
45
+ export declare class ModifiersGroup extends Component<ModifiersGroupProps, ModifiersGroupState> {
45
46
  removeGlobalListener: any;
46
47
  state: {
47
- needShowAll: any;
48
+ needShowAll: boolean;
48
49
  hasHiddenNodes: boolean;
49
50
  lastVisibleChildIndex: null;
50
51
  };
@@ -56,19 +56,7 @@ const defaultIsSelectedItem = (0, prop_1.default)('selected');
56
56
  const defaultGetItemImage = (0, prop_1.default)('image');
57
57
  const defaultGetIsMarkdown = (0, prop_1.default)('isMarkdown');
58
58
  /**
59
- * Возвращает компонент списка модификаторов.
60
- * @param {Object} props Свойства компонента.
61
- * @param {Array} props.items Список модификаторов.
62
- * @param {Function} [props.getItemType] Возвращает тип модификатора ("text" или "image", по умолчанию "text").
63
- * @param {Function} [props.getItemCount] Возвращает число с количеством модификатора (по умолчанию свойство "count").
64
- * @param {Function} [props.getItemColor] Возвращает цвет модификатора (по умолчанию свойство "color").
65
- * @param {Function} [props.getItemContent] Возвращает содержимое модификатора (по умолчанию свойство "content").
66
- * @param {Function} [props.isSelectedItem] Показывает, выбран ли модификатор (по умолчанию свойство "selected").
67
- * @param {Function} [props.onSelectItem] Будет вызвана при выборе модификатора, получит сам модификатор.
68
- * @param {Function} [props.getItemImage] Возвращает URL изображения модификатора (по умолчанию свойство "image").
69
- * @param {boolean} [props.needShowAll] Флаг необходимости отображения всех модификаторов.
70
- * @param {Function} [props.onClickShowAll] Сработает при нажатии на кнопку отображения всех модификаторов.
71
- * @param {Function} [props.isMarkdown] Имеет ли товар уценку.
59
+ * Компонент списка модификаторов.
72
60
  */
73
61
  class ModifiersGroup extends react_1.Component {
74
62
  constructor() {
@@ -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) => (react_1.default.createElement(plate_1.Plate, Object.assign({}, props, { 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' }))));
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: 1,
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 && callback && callback();
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 = __importDefault(require("react"));
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
- onClose && react_1.default.createElement(screen_1.Screen.Header, { onClose: onClose }),
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(layout_1.MobileLayout, { disabledOn: ['mxs', 'ms'] },
30
- react_1.default.createElement("div", { className: select_screen_module_scss_1.default.container }, (0, lodash_1.map)(items, (item, index) => {
31
- const isSelected = Boolean(isItemSelected(item));
32
- return (react_1.default.createElement("button", { key: index, className: select_screen_module_scss_1.default.item, onClick: () => onItemClick && onItemClick(item) },
33
- displayItem(item, { getItemName, isSelected }),
34
- isSelected && react_1.default.createElement(check_1.default, { fill: colors_1.COLORS.get('gray87') })));
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/moleculas",
3
- "version": "13.0.0",
3
+ "version": "13.1.3",
4
4
  "repository": "ssh://git@github.com:sima-land/moleculas.git",
5
5
  "author": "www.sima-land.ru team",
6
6
  "license": "Apache-2.0",