@sima-land/moleculas 12.3.3 → 13.1.2

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 (66) hide show
  1. package/common/components/adult-block/{adult-block.d.ts → index.d.ts} +1 -2
  2. package/common/components/adult-block/{adult-block.js → index.js} +2 -1
  3. package/common/components/badge-list/badge-list.module.scss +0 -1
  4. package/common/components/badge-list/index.d.ts +2 -6
  5. package/common/components/badge-list/index.js +26 -5
  6. package/common/components/product-info/index.d.ts +11 -49
  7. package/common/components/product-info/index.js +24 -35
  8. package/common/components/product-info/parts.d.ts +41 -0
  9. package/common/components/product-info/parts.js +176 -0
  10. package/common/components/product-info/product-info.module.scss +159 -28
  11. package/common/components/product-info/types.d.ts +5 -0
  12. package/common/components/product-info/types.js +2 -0
  13. package/common/components/product-info/utils.d.ts +3 -0
  14. package/{mobile/components/product-slider → common/components/product-info}/utils.js +2 -2
  15. package/common/icons/eighteen-plus.svg +3 -1
  16. package/desktop/components/item-image/index.d.ts +1 -1
  17. package/desktop/components/item-image/index.js +5 -3
  18. package/desktop/components/person-modal/index.d.ts +0 -1
  19. package/desktop/components/person-modal/index.js +0 -1
  20. package/desktop/components/product-card/index.d.ts +11 -24
  21. package/desktop/components/product-card/index.js +47 -31
  22. package/desktop/components/product-card/product-card.module.scss +7 -48
  23. package/desktop/components/product-carousel/hover-card.d.ts +1 -4
  24. package/desktop/components/product-carousel/hover-card.js +18 -6
  25. package/desktop/components/product-carousel/index.d.ts +5 -9
  26. package/desktop/components/product-carousel/index.js +28 -25
  27. package/desktop/components/product-carousel/utils.js +4 -1
  28. package/mobile/components/garland-calculator-button/garland-calculator-button.module.scss +32 -3
  29. package/mobile/components/garland-calculator-button/index.d.ts +2 -3
  30. package/mobile/components/garland-calculator-button/index.js +9 -14
  31. package/mobile/components/item-image/index.d.ts +4 -4
  32. package/mobile/components/item-image/index.js +9 -10
  33. package/mobile/components/person-screen/index.d.ts +3 -3
  34. package/mobile/components/person-screen/index.js +16 -14
  35. package/mobile/components/product-actions-alert/index.d.ts +2 -5
  36. package/mobile/components/product-actions-alert/index.js +2 -5
  37. package/mobile/components/product-slider/index.d.ts +6 -9
  38. package/mobile/components/product-slider/index.js +14 -11
  39. package/mobile/components/product-slider/{item.module.scss → product-slider.module.scss} +1 -12
  40. package/mobile/components/pseudo-input/index.d.ts +5 -8
  41. package/mobile/components/pseudo-input/index.js +21 -10
  42. package/mobile/components/pseudo-input/pseudo-input.module.scss +6 -9
  43. package/mobile/components/select-screen/index.d.ts +11 -2
  44. package/mobile/components/select-screen/index.js +46 -12
  45. package/mobile/components/select-screen/select-screen.module.scss +3 -1
  46. package/package.json +3 -3
  47. package/common/__fixtures__/list-item.d.ts +0 -53
  48. package/common/__fixtures__/list-item.js +0 -107
  49. package/common/helpers/get-contained-items.d.ts +0 -7
  50. package/common/helpers/get-contained-items.js +0 -18
  51. package/common/icons/filled-rate.svg +0 -3
  52. package/common/icons/full-left-arrow.svg +0 -1
  53. package/common/icons/full-right-arrow.svg +0 -1
  54. package/common/icons/grid-small.svg +0 -11
  55. package/common/icons/grid.svg +0 -6
  56. package/common/icons/list.svg +0 -5
  57. package/common/icons/page.svg +0 -1
  58. package/common/icons/step-arrows.svg +0 -4
  59. package/common/icons/triple-dots.svg +0 -3
  60. package/common/icons/white-spinner.svg +0 -3
  61. package/desktop/components/breadcrumbs/items.d.ts +0 -3
  62. package/desktop/components/breadcrumbs/items.js +0 -157
  63. package/mobile/components/garland-calculator-button/tree-in-circle.svg +0 -6
  64. package/mobile/components/product-slider/item.d.ts +0 -18
  65. package/mobile/components/product-slider/item.js +0 -58
  66. package/mobile/components/product-slider/utils.d.ts +0 -4
@@ -13,5 +13,4 @@ export interface AdultBlockProps {
13
13
  * @param props.marginTop Отступ сверху.
14
14
  * @return Элемент.
15
15
  */
16
- declare const AdultBlock: ({ isAuthUser, onClick, marginTop }: AdultBlockProps) => JSX.Element;
17
- export default AdultBlock;
16
+ export declare const AdultBlock: ({ isAuthUser, onClick, marginTop }: AdultBlockProps) => JSX.Element;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AdultBlock = void 0;
6
7
  const react_1 = __importDefault(require("react"));
7
8
  const box_1 = require("@sima-land/ui-nucleons/box");
8
9
  const text_1 = require("@sima-land/ui-nucleons/text");
@@ -36,4 +37,4 @@ const AdultBlock = ({ isAuthUser, onClick, marginTop = 0 }) => {
36
37
  react_1.default.createElement(link_1.Link, { onClick: onClick, pseudo: true },
37
38
  react_1.default.createElement(text_1.Text, { size: 16, weight: 600, lineHeight: 32 }, actualTextBlocks.action)))));
38
39
  };
39
- exports.default = AdultBlock;
40
+ exports.AdultBlock = AdultBlock;
@@ -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
 
@@ -1,8 +1,7 @@
1
1
  import React from 'react';
2
- import { BadgeProps } from '../badge';
3
2
  export interface BadgeListProps {
4
3
  /** Список данных для шильдиков. */
5
- items?: BadgeProps[];
4
+ children?: React.ReactNode;
6
5
  /** CSS-класс корневого элемента. */
7
6
  className?: string;
8
7
  /** Стили корневого элемента. */
@@ -15,7 +14,4 @@ export interface BadgeListProps {
15
14
  * @param props Свойства компонента.
16
15
  * @return Элемент.
17
16
  */
18
- export declare const BadgeList: {
19
- ({ items, className, lineLimit, style }: BadgeListProps): JSX.Element;
20
- Item: ({ className, color, fields, href, style, "data-testid": testId, ...restProps }: BadgeProps) => JSX.Element;
21
- };
17
+ export declare const BadgeList: ({ children, className, lineLimit, style }: BadgeListProps) => JSX.Element;
@@ -1,10 +1,29 @@
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
+ };
2
21
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
23
  };
5
24
  Object.defineProperty(exports, "__esModule", { value: true });
6
25
  exports.BadgeList = void 0;
7
- const react_1 = __importDefault(require("react"));
26
+ const react_1 = __importStar(require("react"));
8
27
  const badge_1 = require("../badge");
9
28
  const bind_1 = __importDefault(require("classnames/bind"));
10
29
  const badge_list_module_scss_1 = __importDefault(require("./badge-list.module.scss"));
@@ -14,8 +33,10 @@ const cx = bind_1.default.bind(badge_list_module_scss_1.default);
14
33
  * @param props Свойства компонента.
15
34
  * @return Элемент.
16
35
  */
17
- const BadgeList = ({ items, className, lineLimit, style }) => (react_1.default.createElement("div", { className: cx('root', className, lineLimit && 'line-limit'), style: lineLimit ? Object.assign(Object.assign({}, style), { '--line-limit': lineLimit }) : style }, Array.isArray(items) &&
18
- items.length > 0 &&
19
- items.map((itemProps, index) => react_1.default.createElement(badge_1.Badge, Object.assign({ key: index, className: cx('item') }, itemProps)))));
36
+ const BadgeList = ({ children, className, lineLimit, style }) => (react_1.default.createElement("div", { className: cx('root', className, lineLimit && 'line-limit'), style: lineLimit ? Object.assign(Object.assign({}, style), { '--line-limit': lineLimit }) : style }, react_1.Children.toArray(children).reduce((list, item) => {
37
+ (0, react_1.isValidElement)(item) &&
38
+ item.type === badge_1.Badge &&
39
+ list.push((0, react_1.cloneElement)(item, { className: cx('item', item.props.className) }));
40
+ return list;
41
+ }, [])));
20
42
  exports.BadgeList = BadgeList;
21
- exports.BadgeList.Item = badge_1.Badge;
@@ -1,49 +1,11 @@
1
- import React from 'react';
2
- import { BadgeProps } from '../badge';
3
- export interface ProductData {
4
- /** Ссылка на товар. */
5
- url: string;
6
- /** Название товара. */
7
- name?: string;
8
- /** Ссылка на картинку. */
9
- imageSrc?: string;
10
- /** Альтернативный текст картинки. */
11
- imageAlt?: string;
12
- /** Цена товара. */
13
- price: number;
14
- /** Старая цена товара. */
15
- oldPrice?: number;
16
- /** Графема валюты. */
17
- currencyGrapheme?: string;
18
- /** Список шильдиков. */
19
- badges?: BadgeProps[];
20
- /** Торговая марка. */
21
- trademark?: {
22
- name: string;
23
- url: string;
24
- };
25
- }
26
- export interface ProductInfoProps {
27
- /** Данные товара. */
28
- data: ProductData;
29
- /** Содержимое. */
30
- children?: React.ReactNode;
31
- /** Обработчик клика по ссылке на товар. */
32
- onLinkClick?: React.MouseEventHandler<HTMLAnchorElement>;
33
- }
34
- export interface ProductInfoComponent {
35
- (props: ProductInfoProps): JSX.Element;
36
- OnImage: typeof OnImage;
37
- }
38
- /**
39
- * Компонент-слот для вывода контента над изображением.
40
- * @param props Свойства.
41
- * @return Элемент.
42
- */
43
- export declare const OnImage: React.FC;
44
- /**
45
- * Компонент элемента карусели рекомендаций.
46
- * @param props Свойства компонента.
47
- * @return Элемент.
48
- */
49
- export declare const ProductInfo: ProductInfoComponent;
1
+ /// <reference types="react" />
2
+ import { ProductInfoProps } from './types';
3
+ import { Parts } from './parts';
4
+ export type { ProductInfoProps };
5
+ export declare const UNAVAILABLE_REASON: {
6
+ readonly notEnough: "Нет в наличии";
7
+ readonly unavailableInRegion: "Товар недоступен в вашем регионе";
8
+ readonly onlyForLegalEntities: "Товар доступен только для юридических лиц";
9
+ };
10
+ export declare const ProductInfo: ({ restriction, children }: ProductInfoProps) => JSX.Element;
11
+ export { Parts };
@@ -3,43 +3,32 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ProductInfo = exports.OnImage = void 0;
6
+ exports.Parts = exports.ProductInfo = exports.UNAVAILABLE_REASON = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
- const link_1 = require("@sima-land/ui-nucleons/link");
9
- const price_1 = require("@sima-land/ui-nucleons/price");
10
8
  const define_slots_1 = require("@sima-land/ui-nucleons/helpers/define-slots");
11
- const image_overlay_1 = require("../../../desktop/components/gallery-modal/components/image-overlay");
12
- const badge_list_1 = require("../badge-list");
13
- const bind_1 = __importDefault(require("classnames/bind"));
14
- const product_info_module_scss_1 = __importDefault(require("./product-info.module.scss"));
15
- const cx = bind_1.default.bind(product_info_module_scss_1.default);
16
- /**
17
- * Компонент-слот для вывода контента над изображением.
18
- * @param props Свойства.
19
- * @return Элемент.
20
- */
21
- const OnImage = ({ children }) => react_1.default.createElement(react_1.default.Fragment, null, children);
22
- exports.OnImage = OnImage;
23
- /**
24
- * Компонент элемента карусели рекомендаций.
25
- * @param props Свойства компонента.
26
- * @return Элемент.
27
- */
28
- const ProductInfo = ({ data, onLinkClick, children }) => {
29
- const { onImage } = (0, define_slots_1.defineSlots)(children, {
30
- onImage: exports.OnImage,
9
+ const utils_1 = require("./utils");
10
+ const parts_1 = require("./parts");
11
+ Object.defineProperty(exports, "Parts", { enumerable: true, get: function () { return parts_1.Parts; } });
12
+ exports.UNAVAILABLE_REASON = {
13
+ notEnough: 'Нет в наличии',
14
+ unavailableInRegion: 'Товар недоступен в вашем регионе',
15
+ onlyForLegalEntities: 'Товар доступен только для юридических лиц',
16
+ };
17
+ const ProductInfo = ({ restriction, children }) => {
18
+ const { image, badges, prices, title, trademark, footer } = (0, define_slots_1.defineSlots)(children, {
19
+ image: parts_1.Parts.Image,
20
+ badges: parts_1.Parts.Badges,
21
+ prices: parts_1.Parts.Prices,
22
+ title: parts_1.Parts.Title,
23
+ trademark: parts_1.Parts.TrademarkLink,
24
+ footer: parts_1.Parts.Footer,
31
25
  });
32
- return (react_1.default.createElement(react_1.default.Fragment, null,
33
- Boolean(data.imageSrc) && (react_1.default.createElement(image_overlay_1.ImageOverlay, { className: cx('image-overlay') },
34
- react_1.default.createElement("a", { href: data.url, className: cx('image-link'), onClick: onLinkClick, "data-testid": 'product-info:image-link' },
35
- react_1.default.createElement("img", { className: cx('image'), alt: data.imageAlt, src: data.imageSrc })),
36
- onImage && react_1.default.createElement("div", { className: cx('on-image') }, onImage))),
37
- data.badges && data.badges.length > 0 && (react_1.default.createElement(badge_list_1.BadgeList, { items: data.badges, lineLimit: 1, className: cx('badges') })),
38
- Boolean(data.price) && (react_1.default.createElement("div", { className: cx('prices') },
39
- react_1.default.createElement(price_1.Price, { value: data.price, currencyGrapheme: data.currencyGrapheme, className: cx('price') }),
40
- data.oldPrice && (react_1.default.createElement(price_1.Price, { value: data.oldPrice, currencyGrapheme: data.currencyGrapheme, className: cx('old-price'), crossedOut: true })))),
41
- react_1.default.createElement(link_1.Link, { onClick: onLinkClick, className: cx('link'), href: data.url, children: data.name, color: 'gray87', "data-testid": 'product-info:name-link' }),
42
- data.trademark && (react_1.default.createElement(link_1.Link, { className: cx('trademark-link'), href: data.trademark.url, children: data.trademark.name, color: 'brand-blue', "data-testid": 'product-info:trademark-link' }))));
26
+ return (react_1.default.createElement(utils_1.ProductInfoContext.Provider, { value: { restriction } },
27
+ image,
28
+ restriction !== 'adult' && badges,
29
+ prices,
30
+ title,
31
+ !restriction && trademark,
32
+ footer));
43
33
  };
44
34
  exports.ProductInfo = ProductInfo;
45
- exports.ProductInfo.OnImage = exports.OnImage;
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { LinkProps } from '@sima-land/ui-nucleons/link';
3
+ import { StrokedSVGProps } from '@sima-land/ui-nucleons/stroked-svg';
4
+ import { BadgeListProps } from '../badge-list';
5
+ export interface ImageProps {
6
+ src?: string;
7
+ alt?: string;
8
+ href?: string;
9
+ onClick?: React.MouseEventHandler<HTMLAnchorElement>;
10
+ children?: React.ReactNode;
11
+ opacity?: number;
12
+ }
13
+ export declare const Parts: {
14
+ readonly Image: ({ src, alt, href, onClick, children, opacity }: ImageProps) => JSX.Element;
15
+ readonly ImageButton: ({ icon, fill, onClick, hint, "data-testid": testId, }: {
16
+ icon: StrokedSVGProps['component'];
17
+ fill?: string | undefined;
18
+ onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
19
+ hint?: string | undefined;
20
+ 'data-testid'?: string | undefined;
21
+ }) => JSX.Element;
22
+ readonly Badges: (props: BadgeListProps) => JSX.Element;
23
+ readonly Prices: ({ price, oldPrice, currencyGrapheme, unavailableReason, }: {
24
+ price: number;
25
+ oldPrice?: number | undefined;
26
+ currencyGrapheme?: string | undefined;
27
+ unavailableReason?: string | undefined;
28
+ }) => JSX.Element;
29
+ readonly Title: ({ children, href, onClick }: Pick<LinkProps, 'children' | 'href' | 'onClick'>) => JSX.Element;
30
+ readonly TrademarkLink: ({ href, children, onClick, }: Pick<LinkProps, 'href' | 'children' | 'onClick'>) => JSX.Element;
31
+ readonly Footer: React.FC<{}>;
32
+ readonly CartControl: ({ children, stepText, markupText, loading, }: {
33
+ children?: React.ReactNode;
34
+ stepText?: string | undefined;
35
+ markupText?: string | undefined;
36
+ loading?: boolean | undefined;
37
+ }) => JSX.Element;
38
+ readonly AdultConfirmButton: ({ className, ...props }: LinkProps) => JSX.Element;
39
+ readonly WaitListAddButton: ({ className, ...props }: LinkProps) => JSX.Element;
40
+ readonly WaitListAddedLink: ({ className, ...props }: LinkProps) => JSX.Element;
41
+ };
@@ -0,0 +1,176 @@
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
+ };
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Parts = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const link_1 = require("@sima-land/ui-nucleons/link");
39
+ const price_1 = require("@sima-land/ui-nucleons/price");
40
+ const stroked_svg_1 = require("@sima-land/ui-nucleons/stroked-svg");
41
+ const with_hint_1 = require("@sima-land/ui-nucleons/with-hint");
42
+ const image_overlay_1 = require("../../../desktop/components/gallery-modal/components/image-overlay");
43
+ const badge_list_1 = require("../badge-list");
44
+ const utils_1 = require("./utils");
45
+ const eighteen_plus_svg_1 = __importDefault(require("../../icons/eighteen-plus.svg"));
46
+ const bind_1 = __importDefault(require("classnames/bind"));
47
+ const product_info_module_scss_1 = __importDefault(require("./product-info.module.scss"));
48
+ const cx = bind_1.default.bind(product_info_module_scss_1.default);
49
+ /**
50
+ * Кнопка-иконка на изображении.
51
+ * @param props Свойства.
52
+ * @return Элемент.
53
+ */
54
+ const ImageButton = ({ icon, fill, onClick, hint, 'data-testid': testId, }) => {
55
+ const commonProps = {
56
+ role: 'banner',
57
+ component: icon,
58
+ fill,
59
+ strokeWidth: 1.5,
60
+ className: cx('image-button'),
61
+ onClick,
62
+ 'data-testid': testId,
63
+ };
64
+ return hint ? (react_1.default.createElement(with_hint_1.WithHint, { hint: hint, direction: 'left' }, (ref, toggle) => (react_1.default.createElement(stroked_svg_1.StrokedSVG, Object.assign({}, commonProps, { ref: ref, onMouseEnter: () => toggle(true), onMouseLeave: () => toggle(false) }))))) : (react_1.default.createElement(stroked_svg_1.StrokedSVG, Object.assign({}, commonProps)));
65
+ };
66
+ /**
67
+ * Слот - изображение товара.
68
+ * @param props Свойства.
69
+ * @return Элемент.
70
+ */
71
+ const Image = ({ src, alt, href, onClick, children, opacity }) => {
72
+ const { restriction } = (0, react_1.useContext)(utils_1.ProductInfoContext);
73
+ const defaultOpacity = restriction ? 0.4 : undefined;
74
+ return (react_1.default.createElement(image_overlay_1.ImageOverlay, { className: cx('image-overlay') }, restriction === 'adult' ? (react_1.default.createElement(react_1.default.Fragment, null,
75
+ react_1.default.createElement("img", { alt: alt, src: src, className: cx('image', 'adult'), "data-testid": 'product-info:adult-image' }),
76
+ react_1.default.createElement(eighteen_plus_svg_1.default, { className: cx('adult-icon') }))) : (react_1.default.createElement(react_1.default.Fragment, null,
77
+ react_1.default.createElement("a", { href: href, className: cx('image-link'), onClick: onClick, "data-testid": 'product-info:image-link' },
78
+ react_1.default.createElement("img", { alt: alt, src: src, className: cx('image'), style: { opacity: typeof opacity === 'number' ? opacity : defaultOpacity }, "data-testid": 'product-info:image' })),
79
+ children && react_1.default.createElement("div", { className: cx('image-buttons') }, children)))));
80
+ };
81
+ /**
82
+ * Слот для вывода шильдиков.
83
+ * @param props Свойства.
84
+ * @return Элемент.
85
+ */
86
+ const Badges = (props) => react_1.default.createElement(badge_list_1.BadgeList, Object.assign({ className: cx('badges') }, props));
87
+ /**
88
+ * Слот для вывода цен.
89
+ * @param props Свойства.
90
+ * @return Элемент.
91
+ */
92
+ const Prices = ({ price, oldPrice, currencyGrapheme, unavailableReason = 'Товар недоступен', }) => {
93
+ const { restriction } = (0, react_1.useContext)(utils_1.ProductInfoContext);
94
+ return (react_1.default.createElement("div", { className: cx('prices', { 'height-limit': !restriction || restriction === 'adult' }), "data-testid": 'product-info:prices' },
95
+ (!restriction || restriction === 'adult') && (react_1.default.createElement(react_1.default.Fragment, null,
96
+ react_1.default.createElement(price_1.Price, { value: price, currencyGrapheme: currencyGrapheme, className: cx('price'), "data-testid": 'product-info:price' }),
97
+ restriction !== 'adult' && oldPrice && (react_1.default.createElement(price_1.Price, { value: oldPrice, currencyGrapheme: currencyGrapheme, className: cx('old-price'), crossedOut: true, "data-testid": 'product-info:old-price' })))),
98
+ restriction === 'unavailable' && unavailableReason));
99
+ };
100
+ /**
101
+ * Слот для вывода ссылки - названия товара.
102
+ * @param props Свойства.
103
+ * @return Элемент.
104
+ */
105
+ const Title = ({ children, href, onClick }) => {
106
+ const { restriction } = (0, react_1.useContext)(utils_1.ProductInfoContext);
107
+ return restriction === 'adult' ? (react_1.default.createElement("span", { className: cx('adult-info'), "data-testid": 'product-info:adult-warning' }, "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043E \u0432\u044B \u0441\u0442\u0430\u0440\u0448\u0435 18 \u043B\u0435\u0442, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0442\u043E\u0432\u0430\u0440.")) : (react_1.default.createElement(link_1.Link, { onClick: onClick, className: cx('link', 'line-clamp'), href: href, color: 'gray87', "data-testid": 'product-info:name-link' }, children));
108
+ };
109
+ /** Слот для вывода ссылки торговой марки.
110
+ * @param props Свойства.
111
+ * @return Элемент.
112
+ */
113
+ const TrademarkLink = ({ href, children, onClick, }) => (react_1.default.createElement(link_1.Link, { className: cx('trademark-link'), href: href, children: children, onClick: onClick, color: 'brand-blue', "data-testid": 'product-info:trademark-link' }));
114
+ /**
115
+ * Слот - футер.
116
+ * @param props Свойства.
117
+ * @return Элемент.
118
+ */
119
+ const Footer = ({ children }) => (react_1.default.createElement("div", { className: cx('footer'), "data-testid": 'product-info:footer' }, children));
120
+ /**
121
+ * Блок управления корзиной.
122
+ * @param props Свойства.
123
+ * @return Элемент.
124
+ */
125
+ const CartControl = ({ children, stepText, markupText, loading, }) => (react_1.default.createElement("div", { className: cx('control-wrapper', { loading }) },
126
+ react_1.default.createElement("div", { className: cx('control') }, !loading && children),
127
+ (loading || stepText) && (react_1.default.createElement("div", { className: cx('unit-text'), "data-testid": 'product-info:cart-step' }, !loading && stepText)),
128
+ !loading && markupText && (react_1.default.createElement("div", { className: cx('bottom-text'), "data-testid": 'product-info:cart-info' }, markupText))));
129
+ /**
130
+ * Кнопка "подтвердить".
131
+ * @param props Свойства.
132
+ * @return Элемент.
133
+ */
134
+ const AdultConfirmButton = (_a) => {
135
+ var { className } = _a, props = __rest(_a, ["className"]);
136
+ return (react_1.default.createElement(link_1.Link, Object.assign({}, props, { pseudo: true, color: 'brand-blue', className: cx('text-button', className), "data-testid": 'product-info:adult-confirm-button' }), "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C"));
137
+ };
138
+ /**
139
+ * Кнопка "В лист ожидания".
140
+ * @param props Свойства.
141
+ * @return Элемент.
142
+ */
143
+ const WaitListAddButton = (_a) => {
144
+ var { className } = _a, props = __rest(_a, ["className"]);
145
+ return (react_1.default.createElement(link_1.Link, Object.assign({}, props, { pseudo: true, color: 'brand-blue', className: cx('text-button', className), "data-testid": 'product-info:wait-list-add-button' }), "\u0412 \u043B\u0438\u0441\u0442 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F"));
146
+ };
147
+ /**
148
+ * Текст со ссылкой "Товар добавлен в лист ожидания".
149
+ * @param props Свойства.
150
+ * @return Элемент.
151
+ */
152
+ const WaitListAddedLink = (_a) => {
153
+ var { className } = _a, props = __rest(_a, ["className"]);
154
+ return (react_1.default.createElement("span", { className: cx('wait-list-added-text') },
155
+ "\u0422\u043E\u0432\u0430\u0440 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0432",
156
+ ' ',
157
+ react_1.default.createElement(link_1.Link, Object.assign({}, props, { color: 'brand-blue', className: cx('text-button', className), "data-testid": 'product-info:wait-list-added-link' }),
158
+ "\u043B\u0438\u0441\u0442",
159
+ '\u00A0',
160
+ "\u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F")));
161
+ };
162
+ exports.Parts = {
163
+ // основные компоненты-слоты и компоненты-запчасти
164
+ Image,
165
+ ImageButton,
166
+ Badges,
167
+ Prices,
168
+ Title,
169
+ TrademarkLink,
170
+ // компоненты-слоты и компоненты-запчасти, предназначенные для вывода футера (dcе что ниже ссылки на торговую марку)
171
+ Footer,
172
+ CartControl,
173
+ AdultConfirmButton,
174
+ WaitListAddButton,
175
+ WaitListAddedLink,
176
+ };