@gravity-ui/page-constructor 4.49.2 → 4.51.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 (37) hide show
  1. package/build/cjs/components/IconWrapper/IconWrapper.css +24 -0
  2. package/build/cjs/components/IconWrapper/IconWrapper.d.ts +4 -0
  3. package/build/cjs/components/IconWrapper/IconWrapper.js +20 -0
  4. package/build/cjs/components/index.d.ts +1 -0
  5. package/build/cjs/components/index.js +3 -1
  6. package/build/cjs/constructor-items.d.ts +1 -1
  7. package/build/cjs/models/constructor-items/blocks.d.ts +2 -2
  8. package/build/cjs/models/constructor-items/common.d.ts +1 -0
  9. package/build/cjs/models/constructor-items/sub-blocks.d.ts +12 -3
  10. package/build/cjs/sub-blocks/BannerCard/BannerCard.css +3 -0
  11. package/build/cjs/sub-blocks/BannerCard/BannerCard.js +3 -3
  12. package/build/cjs/sub-blocks/BasicCard/BasicCard.css +0 -23
  13. package/build/cjs/sub-blocks/BasicCard/BasicCard.js +6 -9
  14. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.css +3 -0
  15. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  16. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.js +15 -7
  17. package/build/esm/components/IconWrapper/IconWrapper.css +24 -0
  18. package/build/esm/components/IconWrapper/IconWrapper.d.ts +5 -0
  19. package/build/esm/components/IconWrapper/IconWrapper.js +18 -0
  20. package/build/esm/components/index.d.ts +1 -0
  21. package/build/esm/components/index.js +1 -0
  22. package/build/esm/constructor-items.d.ts +1 -1
  23. package/build/esm/models/constructor-items/blocks.d.ts +2 -2
  24. package/build/esm/models/constructor-items/common.d.ts +1 -0
  25. package/build/esm/models/constructor-items/sub-blocks.d.ts +12 -3
  26. package/build/esm/sub-blocks/BannerCard/BannerCard.css +3 -0
  27. package/build/esm/sub-blocks/BannerCard/BannerCard.js +3 -3
  28. package/build/esm/sub-blocks/BasicCard/BasicCard.css +0 -23
  29. package/build/esm/sub-blocks/BasicCard/BasicCard.js +4 -7
  30. package/build/esm/sub-blocks/LayoutItem/LayoutItem.css +3 -0
  31. package/build/esm/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  32. package/build/esm/sub-blocks/LayoutItem/LayoutItem.js +16 -8
  33. package/package.json +1 -1
  34. package/server/models/constructor-items/blocks.d.ts +2 -2
  35. package/server/models/constructor-items/common.d.ts +1 -0
  36. package/server/models/constructor-items/sub-blocks.d.ts +12 -3
  37. package/widget/index.js +1 -1
@@ -0,0 +1,24 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-icon-wrapper {
4
+ display: flex;
5
+ flex-direction: column;
6
+ }
7
+ .pc-icon-wrapper_icon-position_left {
8
+ flex-direction: row;
9
+ }
10
+ .pc-icon-wrapper__icon {
11
+ max-width: 100%;
12
+ margin-bottom: 12px;
13
+ height: 32px;
14
+ object-fit: contain;
15
+ display: block;
16
+ }
17
+ .pc-icon-wrapper__icon_icon-position_left {
18
+ height: 22px;
19
+ width: 22px;
20
+ margin: 1px 12px 1px 0px;
21
+ }
22
+ .pc-icon-wrapper_content_left.pc-icon-wrapper_content_left {
23
+ flex: 1 0 0;
24
+ }
@@ -0,0 +1,4 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { IconWrapperProps } from '../../models';
3
+ declare const IconWrapper: (props: PropsWithChildren<IconWrapperProps>) => JSX.Element;
4
+ export default IconWrapper;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const utils_1 = require("../../utils");
6
+ const Image_1 = tslib_1.__importDefault(require("../Image/Image"));
7
+ const utils_2 = require("../Media/Image/utils");
8
+ const b = (0, utils_1.block)('icon-wrapper');
9
+ const IconWrapper = (props) => {
10
+ const { icon, children } = props;
11
+ if (!icon) {
12
+ return react_1.default.createElement(react_1.Fragment, null, children);
13
+ }
14
+ const iconProps = (0, utils_2.getMediaImage)(icon.value);
15
+ const iconPosition = icon === null || icon === void 0 ? void 0 : icon.position;
16
+ return (react_1.default.createElement("div", { className: b({ ['icon-position']: iconPosition }) },
17
+ iconProps && (react_1.default.createElement(Image_1.default, Object.assign({}, iconProps, { className: b('icon', { ['icon-position']: iconPosition }) }))),
18
+ react_1.default.createElement("div", { className: b({ ['content']: iconPosition }) }, children)));
19
+ };
20
+ exports.default = IconWrapper;
@@ -36,5 +36,6 @@ export { default as MetaInfo } from './MetaInfo/MetaInfo';
36
36
  export { default as FullscreenMedia } from './FullscreenMedia/FullscreenMedia';
37
37
  export { default as ContentList } from './ContentList/ContentList';
38
38
  export { default as InnerForm } from './InnerForm/InnerForm';
39
+ export { default as IconWrapper } from './IconWrapper/IconWrapper';
39
40
  export type { RouterLinkProps } from './RouterLink/RouterLink';
40
41
  export type { ImageBaseProps } from './ImageBase/ImageBase';
@@ -3,7 +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.InnerForm = exports.ContentList = exports.FullscreenMedia = exports.MetaInfo = exports.HTML = exports.RouterLink = exports.Author = exports.OverflowScroller = exports.Control = exports.YandexForm = exports.YFMWrapper = exports.VideoBlock = exports.UnpublishedLabel = exports.ToggleArrow = exports.Title = exports.Table = exports.ReactPlayer = exports.OutsideClick = exports.Media = exports.Links = exports.Link = exports.ImageBase = exports.Image = exports.HeaderBreadcrumbs = exports.FullWidthBackground = exports.FullscreenImage = exports.Foldable = exports.FileLink = exports.ErrorWrapper = exports.CardBase = exports.Button = exports.BlockBase = exports.BalancedMasonry = exports.BackLink = exports.BackgroundMedia = exports.BackgroundImage = exports.AnimateBlock = exports.Anchor = void 0;
6
+ exports.IconWrapper = exports.InnerForm = exports.ContentList = exports.FullscreenMedia = exports.MetaInfo = exports.HTML = exports.RouterLink = exports.Author = exports.OverflowScroller = exports.Control = exports.YandexForm = exports.YFMWrapper = exports.VideoBlock = exports.UnpublishedLabel = exports.ToggleArrow = exports.Title = exports.Table = exports.ReactPlayer = exports.OutsideClick = exports.Media = exports.Links = exports.Link = exports.ImageBase = exports.Image = exports.HeaderBreadcrumbs = exports.FullWidthBackground = exports.FullscreenImage = exports.Foldable = exports.FileLink = exports.ErrorWrapper = exports.CardBase = exports.Button = exports.BlockBase = exports.BalancedMasonry = exports.BackLink = exports.BackgroundMedia = exports.BackgroundImage = exports.AnimateBlock = exports.Anchor = void 0;
7
7
  var Anchor_1 = require("./Anchor/Anchor");
8
8
  Object.defineProperty(exports, "Anchor", { enumerable: true, get: function () { return __importDefault(Anchor_1).default; } });
9
9
  var AnimateBlock_1 = require("./AnimateBlock/AnimateBlock");
@@ -80,3 +80,5 @@ var ContentList_1 = require("./ContentList/ContentList");
80
80
  Object.defineProperty(exports, "ContentList", { enumerable: true, get: function () { return __importDefault(ContentList_1).default; } });
81
81
  var InnerForm_1 = require("./InnerForm/InnerForm");
82
82
  Object.defineProperty(exports, "InnerForm", { enumerable: true, get: function () { return __importDefault(InnerForm_1).default; } });
83
+ var IconWrapper_1 = require("./IconWrapper/IconWrapper");
84
+ Object.defineProperty(exports, "IconWrapper", { enumerable: true, get: function () { return __importDefault(IconWrapper_1).default; } });
@@ -24,7 +24,7 @@ export declare const subBlockMap: {
24
24
  "price-detailed": (props: import("./models").PriceDetailedProps) => JSX.Element;
25
25
  "media-card": ({ border, analyticsEvents, ...mediaProps }: import("./models").MediaCardProps) => JSX.Element;
26
26
  "banner-card": (props: import("./models").BannerCardProps) => JSX.Element;
27
- "layout-item": ({ content: { links, ...content }, metaInfo, media, border, fullscreen, className, analyticsEvents, }: import("./models").LayoutItemProps) => JSX.Element;
27
+ "layout-item": ({ content: { links, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, }: import("./models").LayoutItemProps) => JSX.Element;
28
28
  "background-card": (props: import("./models").BackgroundCardProps) => JSX.Element;
29
29
  "basic-card": (props: import("./models").BasicCardProps) => JSX.Element;
30
30
  content: (props: import("./sub-blocks/Content/Content").ContentProps) => JSX.Element;
@@ -3,7 +3,7 @@ import { ButtonSize } from '@gravity-ui/uikit';
3
3
  import { GridColumnSize, GridColumnSizesType, IndentValue } from '../../grid/types';
4
4
  import { ThemeSupporting } from '../../utils';
5
5
  import { AnalyticsEventsBase } from '../common';
6
- import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, CardBorder, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, ImageProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, WithBorder, YandexFormProps } from './common';
6
+ import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, CardBorder, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, ImageProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, MediaView, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, WithBorder, YandexFormProps } from './common';
7
7
  import { BannerCardProps, HubspotFormProps, SubBlock, SubBlockModels } from './sub-blocks';
8
8
  export declare enum BlockType {
9
9
  PromoFeaturesBlock = "promo-features-block",
@@ -108,7 +108,7 @@ export interface HeaderBlockProps {
108
108
  offset?: HeaderOffset;
109
109
  image?: ThemedImage;
110
110
  video?: ThemedMediaVideoProps;
111
- mediaView?: 'fit' | 'full';
111
+ mediaView?: MediaView;
112
112
  background?: ThemedHeaderBlockBackground;
113
113
  theme?: 'light' | 'dark';
114
114
  verticalOffset?: '0' | 's' | 'm' | 'l' | 'xl';
@@ -293,6 +293,7 @@ export interface TitleItemBaseProps {
293
293
  custom?: string | ReactNode;
294
294
  onClick?: () => void;
295
295
  }
296
+ export type MediaView = 'fit' | 'full';
296
297
  export type MediaBorder = 'shadow' | 'line' | 'none';
297
298
  export type CardBorder = MediaBorder;
298
299
  export interface CardBaseProps {
@@ -3,7 +3,7 @@ import { ThemeSupporting } from '../../utils';
3
3
  import { HubspotEventData, HubspotEventHandlers } from '../../utils/hubspot';
4
4
  import { AnalyticsEventsBase, PixelEvent } from '../common';
5
5
  import { ContentBlockProps } from './blocks';
6
- import { AuthorItem, ButtonPixel, ButtonProps, CardBaseProps, ContentTheme, DividerSize, ImageObjectProps, ImageProps, LinkProps, MediaProps, PriceDetailedProps, TextTheme, Themable, ThemedImage } from './common';
6
+ import { AuthorItem, ButtonPixel, ButtonProps, CardBaseProps, ContentTheme, DividerSize, ImageObjectProps, ImageProps, LinkProps, MediaProps, MediaView, PriceDetailedProps, TextTheme, Themable, ThemedImage } from './common';
7
7
  export declare enum SubBlockType {
8
8
  Divider = "divider",
9
9
  Quote = "quote",
@@ -28,6 +28,13 @@ export declare enum IconPosition {
28
28
  Top = "top",
29
29
  Left = "left"
30
30
  }
31
+ export interface PositionedIcon {
32
+ value: ImageProps;
33
+ position?: IconPosition;
34
+ }
35
+ export interface IconWrapperProps {
36
+ icon?: PositionedIcon;
37
+ }
31
38
  export declare const SubBlockTypes: SubBlockType[];
32
39
  export interface DividerProps {
33
40
  size?: DividerSize;
@@ -106,7 +113,8 @@ export interface BannerCardProps {
106
113
  disableCompress?: boolean;
107
114
  color?: ThemeSupporting<string>;
108
115
  theme?: TextTheme;
109
- button: Pick<ButtonProps, 'text' | 'url' | 'target'>;
116
+ button: Pick<ButtonProps, 'text' | 'url' | 'target' | 'theme'>;
117
+ mediaView?: MediaView;
110
118
  }
111
119
  export interface MediaCardProps extends MediaProps, AnalyticsEventsBase, CardBaseProps {
112
120
  }
@@ -123,10 +131,11 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
123
131
  }
124
132
  export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
125
133
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
126
- media: MediaProps;
134
+ media?: MediaProps;
127
135
  metaInfo?: string[];
128
136
  border?: boolean;
129
137
  fullscreen?: boolean;
138
+ icon?: PositionedIcon;
130
139
  }
131
140
  export type DividerModel = {
132
141
  type: SubBlockType.Divider;
@@ -87,6 +87,9 @@ unpredictable css rules order in build */
87
87
  object-fit: cover;
88
88
  object-position: left;
89
89
  }
90
+ .pc-banner-card_media-view_fit .pc-banner-card__image img {
91
+ object-fit: contain;
92
+ }
90
93
  @media (max-width: 576px) {
91
94
  .pc-banner-card__image {
92
95
  display: none;
@@ -8,13 +8,13 @@ const theme_1 = require("../../context/theme");
8
8
  const utils_1 = require("../../utils");
9
9
  const b = (0, utils_1.block)('banner-card');
10
10
  const BannerCard = (props) => {
11
- const { title, subtitle, button: { url, text, target }, color, theme: textTheme = 'light', image, disableCompress, } = props;
11
+ const { title, subtitle, button: { url, text, target, theme: buttonTheme = 'raised' }, color, theme: textTheme = 'light', image, disableCompress, mediaView = 'full', } = props;
12
12
  const theme = (0, theme_1.useTheme)();
13
13
  const contentStyle = {};
14
14
  if (color) {
15
15
  contentStyle.backgroundColor = (0, utils_1.getThemedValue)(color, theme);
16
16
  }
17
- return (react_1.default.createElement("div", { className: b({ theme: textTheme }) },
17
+ return (react_1.default.createElement("div", { className: b({ theme: textTheme, ['media-view']: mediaView }) },
18
18
  react_1.default.createElement("div", { className: b('content'), style: contentStyle },
19
19
  react_1.default.createElement("div", { className: b('info') },
20
20
  react_1.default.createElement("div", { className: b('text') },
@@ -22,7 +22,7 @@ const BannerCard = (props) => {
22
22
  react_1.default.createElement(components_1.HTML, null, title)),
23
23
  subtitle && (react_1.default.createElement(components_1.YFMWrapper, { className: b('subtitle'), content: subtitle, modifiers: { constructor: true } }))),
24
24
  react_1.default.createElement(components_1.RouterLink, { href: url },
25
- react_1.default.createElement(components_1.Button, { className: b('button'), theme: "raised", size: "xl", text: text, url: url, target: target }))),
25
+ react_1.default.createElement(components_1.Button, { className: b('button'), theme: buttonTheme, size: "xl", text: text, url: url, target: target }))),
26
26
  react_1.default.createElement(components_1.BackgroundImage, { className: b('image'), src: (0, utils_1.getThemedValue)(image, theme), disableCompress: disableCompress }))));
27
27
  };
28
28
  exports.BannerCard = BannerCard;
@@ -2,27 +2,4 @@
2
2
  unpredictable css rules order in build */
3
3
  .pc-basic-card.pc-basic-card {
4
4
  min-height: auto;
5
- }
6
-
7
- .pc-basic-card__icon {
8
- max-width: 100%;
9
- margin-bottom: 12px;
10
- height: 32px;
11
- object-fit: contain;
12
- display: block;
13
- }
14
- .pc-basic-card__icon_icon-position_left {
15
- height: 22px;
16
- width: 22px;
17
- margin: 1px 12px 1px 0px;
18
- }
19
- .pc-basic-card__content {
20
- display: flex;
21
- flex-direction: column;
22
- }
23
- .pc-basic-card__content_icon-position_left {
24
- flex-direction: row;
25
- }
26
- .pc-basic-card_content-layout_left.pc-basic-card_content-layout_left {
27
- flex: 1 0 0;
28
5
  }
@@ -3,22 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
- const __1 = require("../");
7
6
  const CardBase_1 = tslib_1.__importDefault(require("../../components/CardBase/CardBase"));
8
- const Image_1 = tslib_1.__importDefault(require("../../components/Image/Image"));
9
- const utils_1 = require("../../components/Media/Image/utils");
7
+ const IconWrapper_1 = tslib_1.__importDefault(require("../../components/IconWrapper/IconWrapper"));
10
8
  const sub_blocks_1 = require("../../models/constructor-items/sub-blocks");
11
- const utils_2 = require("../../utils");
12
- const b = (0, utils_2.block)('basic-card');
9
+ const utils_1 = require("../../utils");
10
+ const Content_1 = tslib_1.__importDefault(require("../Content/Content"));
11
+ const b = (0, utils_1.block)('basic-card');
13
12
  const BasicCard = (props) => {
14
13
  const { title, text, icon, additionalInfo, links, buttons, iconPosition = sub_blocks_1.IconPosition.Top } = props, cardParams = tslib_1.__rest(props, ["title", "text", "icon", "additionalInfo", "links", "buttons", "iconPosition"]);
15
- const iconProps = icon && (0, utils_1.getMediaImage)(icon);
16
14
  const titleId = (0, uikit_1.useUniqId)();
17
15
  const descriptionId = (0, uikit_1.useUniqId)();
18
16
  return (react_1.default.createElement(CardBase_1.default, Object.assign({ className: b() }, cardParams, { extraProps: { 'aria-describedby': descriptionId, 'aria-labelledby': titleId } }),
19
17
  react_1.default.createElement(CardBase_1.default.Content, null,
20
- react_1.default.createElement("div", { className: b('content', { ['icon-position']: iconPosition }) },
21
- iconProps && (react_1.default.createElement(Image_1.default, Object.assign({}, iconProps, { className: b('icon', { ['icon-position']: iconPosition }) }))),
22
- react_1.default.createElement(__1.Content, { title: title, titleId: titleId, text: text, textId: descriptionId, additionalInfo: additionalInfo, links: links, buttons: buttons, colSizes: { all: 12, md: 12 }, size: "s", className: b({ ['content-layout']: iconPosition }) })))));
18
+ react_1.default.createElement(IconWrapper_1.default, { icon: icon ? { value: icon, position: iconPosition } : undefined },
19
+ react_1.default.createElement(Content_1.default, { title: title, titleId: titleId, text: text, textId: descriptionId, additionalInfo: additionalInfo, links: links, buttons: buttons, size: "s", colSizes: { all: 12, md: 12 } })))));
23
20
  };
24
21
  exports.default = BasicCard;
@@ -13,4 +13,7 @@ unpredictable css rules order in build */
13
13
  }
14
14
  .pc-layout-item__content {
15
15
  margin: 16px 16px 0 0;
16
+ }
17
+ .pc-layout-item__content_no-media {
18
+ margin: 0;
16
19
  }
@@ -1,3 +1,3 @@
1
1
  import { LayoutItemProps } from '../../models';
2
- declare const LayoutItem: ({ content: { links, ...content }, metaInfo, media, border, fullscreen, className, analyticsEvents, }: LayoutItemProps) => JSX.Element;
2
+ declare const LayoutItem: ({ content: { links, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, }: LayoutItemProps) => JSX.Element;
3
3
  export default LayoutItem;
@@ -2,20 +2,28 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
- const __1 = require("..");
6
5
  const components_1 = require("../../components");
7
6
  const utils_1 = require("../../utils");
7
+ const Content_1 = tslib_1.__importDefault(require("../Content/Content"));
8
8
  const utils_2 = require("./utils");
9
9
  const b = (0, utils_1.block)('layout-item');
10
10
  const LayoutItem = (_a) => {
11
- var _b = _a.content, { links } = _b, content = tslib_1.__rest(_b, ["links"]), { metaInfo, media, border, fullscreen, className, analyticsEvents } = _a;
12
- return (react_1.default.createElement("div", { className: b(null, className) },
13
- fullscreen && (0, utils_2.hasFullscreen)(media) ? (react_1.default.createElement(components_1.FullscreenMedia, { showFullscreenIcon: (0, utils_2.showFullscreenIcon)(media) }, (_a = {}) => {
11
+ var _b = _a.content, { links } = _b, content = tslib_1.__rest(_b, ["links"]), { metaInfo, media, border, fullscreen, icon, className, analyticsEvents } = _a;
12
+ const contentProps = Object.assign(Object.assign({}, content), { links: (0, utils_2.getLayoutItemLinks)(links), size: 's', colSizes: { all: 12, md: 12 } });
13
+ const renderMedia = () => {
14
+ if (!media) {
15
+ return null;
16
+ }
17
+ return fullscreen && (0, utils_2.hasFullscreen)(media) ? (react_1.default.createElement(components_1.FullscreenMedia, { showFullscreenIcon: (0, utils_2.showFullscreenIcon)(media) }, (_a = {}) => {
14
18
  var { className: mediaClassName, fullscreen: _fullscreen } = _a, fullscreenMediaProps = tslib_1.__rest(_a, ["className", "fullscreen"]);
15
19
  return (react_1.default.createElement(components_1.Media, Object.assign({}, media, fullscreenMediaProps, { className: b('media', { border }, mediaClassName), analyticsEvents: analyticsEvents })));
16
- })) : (react_1.default.createElement(components_1.Media, Object.assign({}, media, { className: b('media', { border }), analyticsEvents: analyticsEvents }))),
20
+ })) : (react_1.default.createElement(components_1.Media, Object.assign({}, media, { className: b('media', { border }), analyticsEvents: analyticsEvents })));
21
+ };
22
+ return (react_1.default.createElement("div", { className: b(null, className) },
23
+ renderMedia(),
17
24
  metaInfo && react_1.default.createElement(components_1.MetaInfo, { items: metaInfo, className: b('meta-info') }),
18
- react_1.default.createElement("div", { className: b('content') },
19
- react_1.default.createElement(__1.Content, Object.assign({}, content, { links: (0, utils_2.getLayoutItemLinks)(links), size: "s", colSizes: { all: 12, md: 12 } })))));
25
+ react_1.default.createElement("div", { className: b('content', { 'no-media': !media }) },
26
+ react_1.default.createElement(components_1.IconWrapper, { icon: icon },
27
+ react_1.default.createElement(Content_1.default, Object.assign({}, contentProps))))));
20
28
  };
21
29
  exports.default = LayoutItem;
@@ -0,0 +1,24 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-icon-wrapper {
4
+ display: flex;
5
+ flex-direction: column;
6
+ }
7
+ .pc-icon-wrapper_icon-position_left {
8
+ flex-direction: row;
9
+ }
10
+ .pc-icon-wrapper__icon {
11
+ max-width: 100%;
12
+ margin-bottom: 12px;
13
+ height: 32px;
14
+ object-fit: contain;
15
+ display: block;
16
+ }
17
+ .pc-icon-wrapper__icon_icon-position_left {
18
+ height: 22px;
19
+ width: 22px;
20
+ margin: 1px 12px 1px 0px;
21
+ }
22
+ .pc-icon-wrapper_content_left.pc-icon-wrapper_content_left {
23
+ flex: 1 0 0;
24
+ }
@@ -0,0 +1,5 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { IconWrapperProps } from '../../models';
3
+ import './IconWrapper.css';
4
+ declare const IconWrapper: (props: PropsWithChildren<IconWrapperProps>) => JSX.Element;
5
+ export default IconWrapper;
@@ -0,0 +1,18 @@
1
+ import React, { Fragment } from 'react';
2
+ import { block } from '../../utils';
3
+ import Image from '../Image/Image';
4
+ import { getMediaImage } from '../Media/Image/utils';
5
+ import './IconWrapper.css';
6
+ const b = block('icon-wrapper');
7
+ const IconWrapper = (props) => {
8
+ const { icon, children } = props;
9
+ if (!icon) {
10
+ return React.createElement(Fragment, null, children);
11
+ }
12
+ const iconProps = getMediaImage(icon.value);
13
+ const iconPosition = icon === null || icon === void 0 ? void 0 : icon.position;
14
+ return (React.createElement("div", { className: b({ ['icon-position']: iconPosition }) },
15
+ iconProps && (React.createElement(Image, Object.assign({}, iconProps, { className: b('icon', { ['icon-position']: iconPosition }) }))),
16
+ React.createElement("div", { className: b({ ['content']: iconPosition }) }, children)));
17
+ };
18
+ export default IconWrapper;
@@ -36,5 +36,6 @@ export { default as MetaInfo } from './MetaInfo/MetaInfo';
36
36
  export { default as FullscreenMedia } from './FullscreenMedia/FullscreenMedia';
37
37
  export { default as ContentList } from './ContentList/ContentList';
38
38
  export { default as InnerForm } from './InnerForm/InnerForm';
39
+ export { default as IconWrapper } from './IconWrapper/IconWrapper';
39
40
  export type { RouterLinkProps } from './RouterLink/RouterLink';
40
41
  export type { ImageBaseProps } from './ImageBase/ImageBase';
@@ -36,3 +36,4 @@ export { default as MetaInfo } from './MetaInfo/MetaInfo';
36
36
  export { default as FullscreenMedia } from './FullscreenMedia/FullscreenMedia';
37
37
  export { default as ContentList } from './ContentList/ContentList';
38
38
  export { default as InnerForm } from './InnerForm/InnerForm';
39
+ export { default as IconWrapper } from './IconWrapper/IconWrapper';
@@ -24,7 +24,7 @@ export declare const subBlockMap: {
24
24
  "price-detailed": (props: import("./models").PriceDetailedProps) => JSX.Element;
25
25
  "media-card": ({ border, analyticsEvents, ...mediaProps }: import("./models").MediaCardProps) => JSX.Element;
26
26
  "banner-card": (props: import("./models").BannerCardProps) => JSX.Element;
27
- "layout-item": ({ content: { links, ...content }, metaInfo, media, border, fullscreen, className, analyticsEvents, }: import("./models").LayoutItemProps) => JSX.Element;
27
+ "layout-item": ({ content: { links, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, }: import("./models").LayoutItemProps) => JSX.Element;
28
28
  "background-card": (props: import("./models").BackgroundCardProps) => JSX.Element;
29
29
  "basic-card": (props: import("./models").BasicCardProps) => JSX.Element;
30
30
  content: (props: import("./sub-blocks/Content/Content").ContentProps) => JSX.Element;
@@ -3,7 +3,7 @@ import { ButtonSize } from '@gravity-ui/uikit';
3
3
  import { GridColumnSize, GridColumnSizesType, IndentValue } from '../../grid/types';
4
4
  import { ThemeSupporting } from '../../utils';
5
5
  import { AnalyticsEventsBase } from '../common';
6
- import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, CardBorder, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, ImageProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, WithBorder, YandexFormProps } from './common';
6
+ import { AnchorProps, Animatable, BackgroundImageProps, ButtonProps, CardBorder, ContentSize, ContentTextSize, ContentTheme, FileLinkProps, HeaderBreadCrumbsProps, HeaderImageSize, HeaderOffset, HeaderWidth, ImageDeviceProps, ImageProps, Justify, LegendTableMarkerType, LinkProps, MapProps, MediaDirection, MediaProps, MediaView, TextSize, TextTheme, ThemedImage, ThemedMediaProps, ThemedMediaVideoProps, TitleItemBaseProps, TitleItemProps, WithBorder, YandexFormProps } from './common';
7
7
  import { BannerCardProps, HubspotFormProps, SubBlock, SubBlockModels } from './sub-blocks';
8
8
  export declare enum BlockType {
9
9
  PromoFeaturesBlock = "promo-features-block",
@@ -108,7 +108,7 @@ export interface HeaderBlockProps {
108
108
  offset?: HeaderOffset;
109
109
  image?: ThemedImage;
110
110
  video?: ThemedMediaVideoProps;
111
- mediaView?: 'fit' | 'full';
111
+ mediaView?: MediaView;
112
112
  background?: ThemedHeaderBlockBackground;
113
113
  theme?: 'light' | 'dark';
114
114
  verticalOffset?: '0' | 's' | 'm' | 'l' | 'xl';
@@ -293,6 +293,7 @@ export interface TitleItemBaseProps {
293
293
  custom?: string | ReactNode;
294
294
  onClick?: () => void;
295
295
  }
296
+ export type MediaView = 'fit' | 'full';
296
297
  export type MediaBorder = 'shadow' | 'line' | 'none';
297
298
  export type CardBorder = MediaBorder;
298
299
  export interface CardBaseProps {
@@ -3,7 +3,7 @@ import { ThemeSupporting } from '../../utils';
3
3
  import { HubspotEventData, HubspotEventHandlers } from '../../utils/hubspot';
4
4
  import { AnalyticsEventsBase, PixelEvent } from '../common';
5
5
  import { ContentBlockProps } from './blocks';
6
- import { AuthorItem, ButtonPixel, ButtonProps, CardBaseProps, ContentTheme, DividerSize, ImageObjectProps, ImageProps, LinkProps, MediaProps, PriceDetailedProps, TextTheme, Themable, ThemedImage } from './common';
6
+ import { AuthorItem, ButtonPixel, ButtonProps, CardBaseProps, ContentTheme, DividerSize, ImageObjectProps, ImageProps, LinkProps, MediaProps, MediaView, PriceDetailedProps, TextTheme, Themable, ThemedImage } from './common';
7
7
  export declare enum SubBlockType {
8
8
  Divider = "divider",
9
9
  Quote = "quote",
@@ -28,6 +28,13 @@ export declare enum IconPosition {
28
28
  Top = "top",
29
29
  Left = "left"
30
30
  }
31
+ export interface PositionedIcon {
32
+ value: ImageProps;
33
+ position?: IconPosition;
34
+ }
35
+ export interface IconWrapperProps {
36
+ icon?: PositionedIcon;
37
+ }
31
38
  export declare const SubBlockTypes: SubBlockType[];
32
39
  export interface DividerProps {
33
40
  size?: DividerSize;
@@ -106,7 +113,8 @@ export interface BannerCardProps {
106
113
  disableCompress?: boolean;
107
114
  color?: ThemeSupporting<string>;
108
115
  theme?: TextTheme;
109
- button: Pick<ButtonProps, 'text' | 'url' | 'target'>;
116
+ button: Pick<ButtonProps, 'text' | 'url' | 'target' | 'theme'>;
117
+ mediaView?: MediaView;
110
118
  }
111
119
  export interface MediaCardProps extends MediaProps, AnalyticsEventsBase, CardBaseProps {
112
120
  }
@@ -123,10 +131,11 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
123
131
  }
124
132
  export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
125
133
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
126
- media: MediaProps;
134
+ media?: MediaProps;
127
135
  metaInfo?: string[];
128
136
  border?: boolean;
129
137
  fullscreen?: boolean;
138
+ icon?: PositionedIcon;
130
139
  }
131
140
  export type DividerModel = {
132
141
  type: SubBlockType.Divider;
@@ -87,6 +87,9 @@ unpredictable css rules order in build */
87
87
  object-fit: cover;
88
88
  object-position: left;
89
89
  }
90
+ .pc-banner-card_media-view_fit .pc-banner-card__image img {
91
+ object-fit: contain;
92
+ }
90
93
  @media (max-width: 576px) {
91
94
  .pc-banner-card__image {
92
95
  display: none;
@@ -5,13 +5,13 @@ import { block, getThemedValue } from '../../utils';
5
5
  import './BannerCard.css';
6
6
  const b = block('banner-card');
7
7
  export const BannerCard = (props) => {
8
- const { title, subtitle, button: { url, text, target }, color, theme: textTheme = 'light', image, disableCompress, } = props;
8
+ const { title, subtitle, button: { url, text, target, theme: buttonTheme = 'raised' }, color, theme: textTheme = 'light', image, disableCompress, mediaView = 'full', } = props;
9
9
  const theme = useTheme();
10
10
  const contentStyle = {};
11
11
  if (color) {
12
12
  contentStyle.backgroundColor = getThemedValue(color, theme);
13
13
  }
14
- return (React.createElement("div", { className: b({ theme: textTheme }) },
14
+ return (React.createElement("div", { className: b({ theme: textTheme, ['media-view']: mediaView }) },
15
15
  React.createElement("div", { className: b('content'), style: contentStyle },
16
16
  React.createElement("div", { className: b('info') },
17
17
  React.createElement("div", { className: b('text') },
@@ -19,7 +19,7 @@ export const BannerCard = (props) => {
19
19
  React.createElement(HTML, null, title)),
20
20
  subtitle && (React.createElement(YFMWrapper, { className: b('subtitle'), content: subtitle, modifiers: { constructor: true } }))),
21
21
  React.createElement(RouterLink, { href: url },
22
- React.createElement(Button, { className: b('button'), theme: "raised", size: "xl", text: text, url: url, target: target }))),
22
+ React.createElement(Button, { className: b('button'), theme: buttonTheme, size: "xl", text: text, url: url, target: target }))),
23
23
  React.createElement(BackgroundImage, { className: b('image'), src: getThemedValue(image, theme), disableCompress: disableCompress }))));
24
24
  };
25
25
  export default BannerCard;
@@ -2,27 +2,4 @@
2
2
  unpredictable css rules order in build */
3
3
  .pc-basic-card.pc-basic-card {
4
4
  min-height: auto;
5
- }
6
-
7
- .pc-basic-card__icon {
8
- max-width: 100%;
9
- margin-bottom: 12px;
10
- height: 32px;
11
- object-fit: contain;
12
- display: block;
13
- }
14
- .pc-basic-card__icon_icon-position_left {
15
- height: 22px;
16
- width: 22px;
17
- margin: 1px 12px 1px 0px;
18
- }
19
- .pc-basic-card__content {
20
- display: flex;
21
- flex-direction: column;
22
- }
23
- .pc-basic-card__content_icon-position_left {
24
- flex-direction: row;
25
- }
26
- .pc-basic-card_content-layout_left.pc-basic-card_content-layout_left {
27
- flex: 1 0 0;
28
5
  }
@@ -1,23 +1,20 @@
1
1
  import { __rest } from "tslib";
2
2
  import React from 'react';
3
3
  import { useUniqId } from '@gravity-ui/uikit';
4
- import { Content } from '../';
5
4
  import CardBase from '../../components/CardBase/CardBase';
6
- import Image from '../../components/Image/Image';
7
- import { getMediaImage } from '../../components/Media/Image/utils';
5
+ import IconWrapper from '../../components/IconWrapper/IconWrapper';
8
6
  import { IconPosition } from '../../models/constructor-items/sub-blocks';
9
7
  import { block } from '../../utils';
8
+ import Content from '../Content/Content';
10
9
  import './BasicCard.css';
11
10
  const b = block('basic-card');
12
11
  const BasicCard = (props) => {
13
12
  const { title, text, icon, additionalInfo, links, buttons, iconPosition = IconPosition.Top } = props, cardParams = __rest(props, ["title", "text", "icon", "additionalInfo", "links", "buttons", "iconPosition"]);
14
- const iconProps = icon && getMediaImage(icon);
15
13
  const titleId = useUniqId();
16
14
  const descriptionId = useUniqId();
17
15
  return (React.createElement(CardBase, Object.assign({ className: b() }, cardParams, { extraProps: { 'aria-describedby': descriptionId, 'aria-labelledby': titleId } }),
18
16
  React.createElement(CardBase.Content, null,
19
- React.createElement("div", { className: b('content', { ['icon-position']: iconPosition }) },
20
- iconProps && (React.createElement(Image, Object.assign({}, iconProps, { className: b('icon', { ['icon-position']: iconPosition }) }))),
21
- React.createElement(Content, { title: title, titleId: titleId, text: text, textId: descriptionId, additionalInfo: additionalInfo, links: links, buttons: buttons, colSizes: { all: 12, md: 12 }, size: "s", className: b({ ['content-layout']: iconPosition }) })))));
17
+ React.createElement(IconWrapper, { icon: icon ? { value: icon, position: iconPosition } : undefined },
18
+ React.createElement(Content, { title: title, titleId: titleId, text: text, textId: descriptionId, additionalInfo: additionalInfo, links: links, buttons: buttons, size: "s", colSizes: { all: 12, md: 12 } })))));
22
19
  };
23
20
  export default BasicCard;
@@ -13,4 +13,7 @@ unpredictable css rules order in build */
13
13
  }
14
14
  .pc-layout-item__content {
15
15
  margin: 16px 16px 0 0;
16
+ }
17
+ .pc-layout-item__content_no-media {
18
+ margin: 0;
16
19
  }
@@ -1,4 +1,4 @@
1
1
  import { LayoutItemProps } from '../../models';
2
2
  import './LayoutItem.css';
3
- declare const LayoutItem: ({ content: { links, ...content }, metaInfo, media, border, fullscreen, className, analyticsEvents, }: LayoutItemProps) => JSX.Element;
3
+ declare const LayoutItem: ({ content: { links, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, }: LayoutItemProps) => JSX.Element;
4
4
  export default LayoutItem;
@@ -1,20 +1,28 @@
1
1
  import { __rest } from "tslib";
2
2
  import React from 'react';
3
- import { Content } from '..';
4
- import { FullscreenMedia, Media, MetaInfo } from '../../components';
3
+ import { FullscreenMedia, IconWrapper, Media, MetaInfo } from '../../components';
5
4
  import { block } from '../../utils';
5
+ import Content from '../Content/Content';
6
6
  import { getLayoutItemLinks, hasFullscreen, showFullscreenIcon } from './utils';
7
7
  import './LayoutItem.css';
8
8
  const b = block('layout-item');
9
9
  const LayoutItem = (_a) => {
10
- var _b = _a.content, { links } = _b, content = __rest(_b, ["links"]), { metaInfo, media, border, fullscreen, className, analyticsEvents } = _a;
11
- return (React.createElement("div", { className: b(null, className) },
12
- fullscreen && hasFullscreen(media) ? (React.createElement(FullscreenMedia, { showFullscreenIcon: showFullscreenIcon(media) }, (_a = {}) => {
10
+ var _b = _a.content, { links } = _b, content = __rest(_b, ["links"]), { metaInfo, media, border, fullscreen, icon, className, analyticsEvents } = _a;
11
+ const contentProps = Object.assign(Object.assign({}, content), { links: getLayoutItemLinks(links), size: 's', colSizes: { all: 12, md: 12 } });
12
+ const renderMedia = () => {
13
+ if (!media) {
14
+ return null;
15
+ }
16
+ return fullscreen && hasFullscreen(media) ? (React.createElement(FullscreenMedia, { showFullscreenIcon: showFullscreenIcon(media) }, (_a = {}) => {
13
17
  var { className: mediaClassName, fullscreen: _fullscreen } = _a, fullscreenMediaProps = __rest(_a, ["className", "fullscreen"]);
14
18
  return (React.createElement(Media, Object.assign({}, media, fullscreenMediaProps, { className: b('media', { border }, mediaClassName), analyticsEvents: analyticsEvents })));
15
- })) : (React.createElement(Media, Object.assign({}, media, { className: b('media', { border }), analyticsEvents: analyticsEvents }))),
19
+ })) : (React.createElement(Media, Object.assign({}, media, { className: b('media', { border }), analyticsEvents: analyticsEvents })));
20
+ };
21
+ return (React.createElement("div", { className: b(null, className) },
22
+ renderMedia(),
16
23
  metaInfo && React.createElement(MetaInfo, { items: metaInfo, className: b('meta-info') }),
17
- React.createElement("div", { className: b('content') },
18
- React.createElement(Content, Object.assign({}, content, { links: getLayoutItemLinks(links), size: "s", colSizes: { all: 12, md: 12 } })))));
24
+ React.createElement("div", { className: b('content', { 'no-media': !media }) },
25
+ React.createElement(IconWrapper, { icon: icon },
26
+ React.createElement(Content, Object.assign({}, contentProps))))));
19
27
  };
20
28
  export default LayoutItem;