@gravity-ui/page-constructor 4.49.1 → 4.50.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 (34) hide show
  1. package/build/cjs/blocks/FilterBlock/FilterBlock.css +3 -0
  2. package/build/cjs/blocks/FilterBlock/FilterBlock.js +1 -1
  3. package/build/cjs/components/IconWrapper/IconWrapper.css +24 -0
  4. package/build/cjs/components/IconWrapper/IconWrapper.d.ts +4 -0
  5. package/build/cjs/components/IconWrapper/IconWrapper.js +20 -0
  6. package/build/cjs/components/index.d.ts +1 -0
  7. package/build/cjs/components/index.js +3 -1
  8. package/build/cjs/constructor-items.d.ts +1 -1
  9. package/build/cjs/models/constructor-items/sub-blocks.d.ts +9 -1
  10. package/build/cjs/sub-blocks/BasicCard/BasicCard.css +0 -23
  11. package/build/cjs/sub-blocks/BasicCard/BasicCard.js +6 -9
  12. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.css +3 -0
  13. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  14. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.js +15 -7
  15. package/build/cjs/text-transform/config.js +12 -0
  16. package/build/esm/blocks/FilterBlock/FilterBlock.css +3 -0
  17. package/build/esm/blocks/FilterBlock/FilterBlock.js +1 -1
  18. package/build/esm/components/IconWrapper/IconWrapper.css +24 -0
  19. package/build/esm/components/IconWrapper/IconWrapper.d.ts +5 -0
  20. package/build/esm/components/IconWrapper/IconWrapper.js +18 -0
  21. package/build/esm/components/index.d.ts +1 -0
  22. package/build/esm/components/index.js +1 -0
  23. package/build/esm/constructor-items.d.ts +1 -1
  24. package/build/esm/models/constructor-items/sub-blocks.d.ts +9 -1
  25. package/build/esm/sub-blocks/BasicCard/BasicCard.css +0 -23
  26. package/build/esm/sub-blocks/BasicCard/BasicCard.js +4 -7
  27. package/build/esm/sub-blocks/LayoutItem/LayoutItem.css +3 -0
  28. package/build/esm/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  29. package/build/esm/sub-blocks/LayoutItem/LayoutItem.js +16 -8
  30. package/build/esm/text-transform/config.js +12 -0
  31. package/package.json +1 -1
  32. package/server/models/constructor-items/sub-blocks.d.ts +9 -1
  33. package/server/text-transform/config.js +12 -0
  34. package/widget/index.js +1 -1
@@ -43,4 +43,7 @@ unpredictable css rules order in build */
43
43
  }
44
44
  .row .pc-filter-block__block-container.row {
45
45
  margin: 0px;
46
+ }
47
+ .pc-filter-block__cards-container {
48
+ width: 100%;
46
49
  }
@@ -36,7 +36,7 @@ const FilterBlock = ({ title, description, tags, tagButtonSize, allTag, items, c
36
36
  react_1.default.createElement(grid_1.Col, null,
37
37
  react_1.default.createElement(ButtonTabs_1.default, { className: b('tabs', { centered: centered }), items: tabButtons, activeTab: selectedTag, onSelectTab: setSelectedTag, tabSize: tagButtonSize })))),
38
38
  react_1.default.createElement(grid_1.Row, { className: b('block-container') },
39
- react_1.default.createElement(__1.CardLayoutBlock, { title: "", colSizes: colSizes }, cards.map((card, index) => {
39
+ react_1.default.createElement(__1.CardLayoutBlock, { title: "", colSizes: colSizes, className: b('cards-container') }, cards.map((card, index) => {
40
40
  const key = (0, utils_1.getBlockKey)(card, index);
41
41
  return react_1.default.createElement(ConstructorItem_1.ConstructorItem, { data: card, blockKey: key, key: key });
42
42
  })))));
@@ -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;
@@ -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;
@@ -123,10 +130,11 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
123
130
  }
124
131
  export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
125
132
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
126
- media: MediaProps;
133
+ media?: MediaProps;
127
134
  metaInfo?: string[];
128
135
  border?: boolean;
129
136
  fullscreen?: boolean;
137
+ icon?: PositionedIcon;
130
138
  }
131
139
  export type DividerModel = {
132
140
  type: SubBlockType.Divider;
@@ -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;
@@ -321,4 +321,16 @@ exports.config = {
321
321
  parser: (0, common_1.createItemsParser)(['text']),
322
322
  },
323
323
  ],
324
+ [models_1.BlockType.FormBlock]: [
325
+ {
326
+ fields: ['textContent'],
327
+ transformer: common_1.yfmTransformer,
328
+ parser: parseContentLayout,
329
+ },
330
+ {
331
+ fields: ['textContent'],
332
+ transformer: common_1.typografTransformer,
333
+ parser: parseContentLayoutTitle,
334
+ },
335
+ ],
324
336
  };
@@ -43,4 +43,7 @@ unpredictable css rules order in build */
43
43
  }
44
44
  .row .pc-filter-block__block-container.row {
45
45
  margin: 0px;
46
+ }
47
+ .pc-filter-block__cards-container {
48
+ width: 100%;
46
49
  }
@@ -34,7 +34,7 @@ const FilterBlock = ({ title, description, tags, tagButtonSize, allTag, items, c
34
34
  React.createElement(Col, null,
35
35
  React.createElement(ButtonTabs, { className: b('tabs', { centered: centered }), items: tabButtons, activeTab: selectedTag, onSelectTab: setSelectedTag, tabSize: tagButtonSize })))),
36
36
  React.createElement(Row, { className: b('block-container') },
37
- React.createElement(CardLayoutBlock, { title: "", colSizes: colSizes }, cards.map((card, index) => {
37
+ React.createElement(CardLayoutBlock, { title: "", colSizes: colSizes, className: b('cards-container') }, cards.map((card, index) => {
38
38
  const key = getBlockKey(card, index);
39
39
  return React.createElement(ConstructorItem, { data: card, blockKey: key, key: key });
40
40
  })))));
@@ -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;
@@ -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;
@@ -123,10 +130,11 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
123
130
  }
124
131
  export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
125
132
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
126
- media: MediaProps;
133
+ media?: MediaProps;
127
134
  metaInfo?: string[];
128
135
  border?: boolean;
129
136
  fullscreen?: boolean;
137
+ icon?: PositionedIcon;
130
138
  }
131
139
  export type DividerModel = {
132
140
  type: SubBlockType.Divider;
@@ -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;
@@ -318,4 +318,16 @@ export const config = {
318
318
  parser: createItemsParser(['text']),
319
319
  },
320
320
  ],
321
+ [BlockType.FormBlock]: [
322
+ {
323
+ fields: ['textContent'],
324
+ transformer: yfmTransformer,
325
+ parser: parseContentLayout,
326
+ },
327
+ {
328
+ fields: ['textContent'],
329
+ transformer: typografTransformer,
330
+ parser: parseContentLayoutTitle,
331
+ },
332
+ ],
321
333
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "4.49.1",
3
+ "version": "4.50.0",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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;
@@ -123,10 +130,11 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
123
130
  }
124
131
  export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
125
132
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
126
- media: MediaProps;
133
+ media?: MediaProps;
127
134
  metaInfo?: string[];
128
135
  border?: boolean;
129
136
  fullscreen?: boolean;
137
+ icon?: PositionedIcon;
130
138
  }
131
139
  export type DividerModel = {
132
140
  type: SubBlockType.Divider;
@@ -331,4 +331,16 @@ exports.config = {
331
331
  parser: (0, common_1.createItemsParser)(['text']),
332
332
  },
333
333
  ],
334
+ [models_1.BlockType.FormBlock]: [
335
+ {
336
+ fields: ['textContent'],
337
+ transformer: common_1.yfmTransformer,
338
+ parser: parseContentLayout,
339
+ },
340
+ {
341
+ fields: ['textContent'],
342
+ transformer: common_1.typografTransformer,
343
+ parser: parseContentLayoutTitle,
344
+ },
345
+ ],
334
346
  };