@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.
- package/build/cjs/components/IconWrapper/IconWrapper.css +24 -0
- package/build/cjs/components/IconWrapper/IconWrapper.d.ts +4 -0
- package/build/cjs/components/IconWrapper/IconWrapper.js +20 -0
- package/build/cjs/components/index.d.ts +1 -0
- package/build/cjs/components/index.js +3 -1
- package/build/cjs/constructor-items.d.ts +1 -1
- package/build/cjs/models/constructor-items/blocks.d.ts +2 -2
- package/build/cjs/models/constructor-items/common.d.ts +1 -0
- package/build/cjs/models/constructor-items/sub-blocks.d.ts +12 -3
- package/build/cjs/sub-blocks/BannerCard/BannerCard.css +3 -0
- package/build/cjs/sub-blocks/BannerCard/BannerCard.js +3 -3
- package/build/cjs/sub-blocks/BasicCard/BasicCard.css +0 -23
- package/build/cjs/sub-blocks/BasicCard/BasicCard.js +6 -9
- package/build/cjs/sub-blocks/LayoutItem/LayoutItem.css +3 -0
- package/build/cjs/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
- package/build/cjs/sub-blocks/LayoutItem/LayoutItem.js +15 -7
- package/build/esm/components/IconWrapper/IconWrapper.css +24 -0
- package/build/esm/components/IconWrapper/IconWrapper.d.ts +5 -0
- package/build/esm/components/IconWrapper/IconWrapper.js +18 -0
- package/build/esm/components/index.d.ts +1 -0
- package/build/esm/components/index.js +1 -0
- package/build/esm/constructor-items.d.ts +1 -1
- package/build/esm/models/constructor-items/blocks.d.ts +2 -2
- package/build/esm/models/constructor-items/common.d.ts +1 -0
- package/build/esm/models/constructor-items/sub-blocks.d.ts +12 -3
- package/build/esm/sub-blocks/BannerCard/BannerCard.css +3 -0
- package/build/esm/sub-blocks/BannerCard/BannerCard.js +3 -3
- package/build/esm/sub-blocks/BasicCard/BasicCard.css +0 -23
- package/build/esm/sub-blocks/BasicCard/BasicCard.js +4 -7
- package/build/esm/sub-blocks/LayoutItem/LayoutItem.css +3 -0
- package/build/esm/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
- package/build/esm/sub-blocks/LayoutItem/LayoutItem.js +16 -8
- package/package.json +1 -1
- package/server/models/constructor-items/blocks.d.ts +2 -2
- package/server/models/constructor-items/common.d.ts +1 -0
- package/server/models/constructor-items/sub-blocks.d.ts +12 -3
- 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,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?:
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
12
|
-
const
|
|
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(
|
|
21
|
-
|
|
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;
|
|
@@ -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
|
-
|
|
13
|
-
|
|
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(
|
|
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,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?:
|
|
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
|
|
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:
|
|
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
|
|
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(
|
|
20
|
-
|
|
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;
|
|
@@ -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 {
|
|
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
|
-
|
|
12
|
-
|
|
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(
|
|
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;
|