@gravity-ui/page-constructor 4.54.0 → 4.56.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 (97) hide show
  1. package/build/cjs/blocks/Tabs/Tabs.css +8 -1
  2. package/build/cjs/blocks/Tabs/Tabs.js +3 -2
  3. package/build/cjs/blocks/Tabs/schema.d.ts +4 -0
  4. package/build/cjs/blocks/Tabs/schema.js +4 -1
  5. package/build/cjs/components/Buttons/Buttons.css +11 -0
  6. package/build/cjs/components/Buttons/Buttons.d.ts +12 -0
  7. package/build/cjs/components/Buttons/Buttons.js +18 -0
  8. package/build/cjs/components/CardBase/CardBase.d.ts +2 -3
  9. package/build/cjs/components/CardBase/CardBase.js +5 -6
  10. package/build/cjs/components/Foldable/Foldable.d.ts +3 -3
  11. package/build/cjs/components/Foldable/Foldable.js +4 -3
  12. package/build/cjs/components/Links/Links.css +14 -0
  13. package/build/cjs/components/Links/Links.d.ts +12 -0
  14. package/build/cjs/components/Links/Links.js +18 -0
  15. package/build/cjs/components/index.d.ts +2 -1
  16. package/build/cjs/components/index.js +4 -2
  17. package/build/cjs/constructor-items.d.ts +1 -1
  18. package/build/cjs/models/constructor-items/blocks.d.ts +1 -1
  19. package/build/cjs/models/constructor-items/common.d.ts +4 -0
  20. package/build/cjs/models/constructor-items/sub-blocks.d.ts +4 -4
  21. package/build/cjs/schema/constants.d.ts +12 -0
  22. package/build/cjs/sub-blocks/BackgroundCard/BackgroundCard.js +15 -3
  23. package/build/cjs/sub-blocks/BackgroundCard/schema.d.ts +4 -0
  24. package/build/cjs/sub-blocks/BackgroundCard/schema.js +3 -0
  25. package/build/cjs/sub-blocks/BasicCard/BasicCard.js +17 -8
  26. package/build/cjs/sub-blocks/BasicCard/schema.d.ts +4 -0
  27. package/build/cjs/sub-blocks/BasicCard/schema.js +3 -0
  28. package/build/cjs/sub-blocks/Content/Content.css +0 -22
  29. package/build/cjs/sub-blocks/Content/Content.js +10 -21
  30. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.css +6 -0
  31. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  32. package/build/cjs/sub-blocks/LayoutItem/LayoutItem.js +16 -4
  33. package/build/cjs/sub-blocks/LayoutItem/schema.d.ts +4 -0
  34. package/build/cjs/sub-blocks/LayoutItem/schema.js +3 -0
  35. package/build/cjs/sub-blocks/PriceCard/PriceCard.css +2 -5
  36. package/build/cjs/sub-blocks/PriceCard/PriceCard.js +4 -4
  37. package/build/cjs/sub-blocks/PriceCard/schema.d.ts +4 -0
  38. package/build/cjs/sub-blocks/PriceCard/schema.js +3 -0
  39. package/build/cjs/sub-blocks/renderCardFooterControlsContainer/CardFooterControlsContainer.css +3 -0
  40. package/build/cjs/sub-blocks/renderCardFooterControlsContainer/renderCardFooterControlsContainer.d.ts +3 -0
  41. package/build/cjs/sub-blocks/renderCardFooterControlsContainer/renderCardFooterControlsContainer.js +9 -0
  42. package/build/cjs/utils/renderContentControls/ContentControls.css +6 -0
  43. package/build/cjs/utils/renderContentControls/renderContentControls.d.ts +11 -0
  44. package/build/cjs/utils/renderContentControls/renderContentControls.js +16 -0
  45. package/build/esm/blocks/Tabs/Tabs.css +8 -1
  46. package/build/esm/blocks/Tabs/Tabs.js +3 -2
  47. package/build/esm/blocks/Tabs/schema.d.ts +4 -0
  48. package/build/esm/blocks/Tabs/schema.js +4 -1
  49. package/build/esm/components/Buttons/Buttons.css +11 -0
  50. package/build/esm/components/Buttons/Buttons.d.ts +13 -0
  51. package/build/esm/components/Buttons/Buttons.js +16 -0
  52. package/build/esm/components/CardBase/CardBase.d.ts +2 -3
  53. package/build/esm/components/CardBase/CardBase.js +6 -7
  54. package/build/esm/components/Foldable/Foldable.d.ts +3 -3
  55. package/build/esm/components/Foldable/Foldable.js +5 -4
  56. package/build/esm/components/Links/Links.css +14 -0
  57. package/build/esm/components/Links/Links.d.ts +13 -0
  58. package/build/esm/components/Links/Links.js +16 -0
  59. package/build/esm/components/index.d.ts +2 -1
  60. package/build/esm/components/index.js +2 -1
  61. package/build/esm/constructor-items.d.ts +1 -1
  62. package/build/esm/models/constructor-items/blocks.d.ts +1 -1
  63. package/build/esm/models/constructor-items/common.d.ts +4 -0
  64. package/build/esm/models/constructor-items/sub-blocks.d.ts +4 -4
  65. package/build/esm/schema/constants.d.ts +12 -0
  66. package/build/esm/sub-blocks/BackgroundCard/BackgroundCard.js +15 -3
  67. package/build/esm/sub-blocks/BackgroundCard/schema.d.ts +4 -0
  68. package/build/esm/sub-blocks/BackgroundCard/schema.js +3 -0
  69. package/build/esm/sub-blocks/BasicCard/BasicCard.js +14 -5
  70. package/build/esm/sub-blocks/BasicCard/schema.d.ts +4 -0
  71. package/build/esm/sub-blocks/BasicCard/schema.js +3 -0
  72. package/build/esm/sub-blocks/Content/Content.css +0 -22
  73. package/build/esm/sub-blocks/Content/Content.js +11 -22
  74. package/build/esm/sub-blocks/LayoutItem/LayoutItem.css +6 -0
  75. package/build/esm/sub-blocks/LayoutItem/LayoutItem.d.ts +1 -1
  76. package/build/esm/sub-blocks/LayoutItem/LayoutItem.js +16 -4
  77. package/build/esm/sub-blocks/LayoutItem/schema.d.ts +4 -0
  78. package/build/esm/sub-blocks/LayoutItem/schema.js +3 -0
  79. package/build/esm/sub-blocks/PriceCard/PriceCard.css +2 -5
  80. package/build/esm/sub-blocks/PriceCard/PriceCard.js +5 -5
  81. package/build/esm/sub-blocks/PriceCard/schema.d.ts +4 -0
  82. package/build/esm/sub-blocks/PriceCard/schema.js +3 -0
  83. package/build/esm/sub-blocks/renderCardFooterControlsContainer/CardFooterControlsContainer.css +3 -0
  84. package/build/esm/sub-blocks/renderCardFooterControlsContainer/renderCardFooterControlsContainer.d.ts +3 -0
  85. package/build/esm/sub-blocks/renderCardFooterControlsContainer/renderCardFooterControlsContainer.js +6 -0
  86. package/build/esm/utils/renderContentControls/ContentControls.css +6 -0
  87. package/build/esm/utils/renderContentControls/renderContentControls.d.ts +12 -0
  88. package/build/esm/utils/renderContentControls/renderContentControls.js +14 -0
  89. package/package.json +1 -1
  90. package/server/models/constructor-items/blocks.d.ts +1 -1
  91. package/server/models/constructor-items/common.d.ts +4 -0
  92. package/server/models/constructor-items/sub-blocks.d.ts +4 -4
  93. package/widget/index.js +1 -1
  94. package/build/cjs/components/Link/Links.d.ts +0 -6
  95. package/build/cjs/components/Link/Links.js +0 -13
  96. package/build/esm/components/Link/Links.d.ts +0 -6
  97. package/build/esm/components/Link/Links.js +0 -10
@@ -46,11 +46,18 @@ unpredictable css rules order in build */
46
46
  object-fit: cover;
47
47
  display: block;
48
48
  }
49
- .pc-tabs-block__image, .pc-tabs-block__media {
49
+ .pc-tabs-block__image_border_shadow, .pc-tabs-block__media_border_shadow {
50
50
  box-shadow: 0 2px 8px var(--pc-color-sfx-shadow), 0 4px 24px var(--pc-color-sfx-shadow);
51
51
  overflow-x: hidden;
52
52
  border-radius: var(--pc-border-radius);
53
53
  }
54
+ .pc-tabs-block__image_border_line, .pc-tabs-block__media_border_line {
55
+ border-radius: var(--pc-border-radius);
56
+ border: 1px solid var(--g-color-line-generic);
57
+ }
58
+ .pc-tabs-block__image_border_none, .pc-tabs-block__media_border_none {
59
+ border-radius: var(--pc-border-radius);
60
+ }
54
61
  .pc-tabs-block__caption {
55
62
  font-size: var(--g-text-body-2-font-size);
56
63
  line-height: var(--g-text-body-2-line-height);
@@ -60,15 +60,16 @@ const TabsBlock = ({ items, title, description, animated, tabsColSizes, centered
60
60
  }
61
61
  const showMedia = Boolean((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps);
62
62
  const showText = Boolean(activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.text);
63
+ const border = (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.border) || 'shadow';
63
64
  const textContent = activeTabData && showText && (react_1.default.createElement(TabsTextContent_1.default, { showMedia: showMedia, data: activeTabData, imageProps: imageProps ? imageProps : undefined, isReverse: isReverse, contentSize: contentSize, centered: centered }));
64
65
  const mediaContent = showMedia && (react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 8 }, orders: {
65
66
  all: grid_1.GridColumnOrderClasses.Last,
66
67
  md: grid_1.GridColumnOrderClasses.First,
67
68
  }, className: b('col', { centered: centered }) },
68
69
  react_1.default.createElement("div", { style: { minHeight: mediaVideoHeight || minImageHeight } }, (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) && (react_1.default.createElement("div", { ref: ref },
69
- react_1.default.createElement(Media_1.default, Object.assign({}, (0, utils_2.getThemedValue)(activeTabData.media, theme), { key: activeTab, className: b('media'), playVideo: play, height: mediaVideoHeight || undefined, onImageLoad: handleImageHeight }))))),
70
+ react_1.default.createElement(Media_1.default, Object.assign({}, (0, utils_2.getThemedValue)(activeTabData.media, theme), { key: activeTab, className: b('media', { border }), playVideo: play, height: mediaVideoHeight || undefined, onImageLoad: handleImageHeight }))))),
70
71
  imageProps && (react_1.default.createElement(react_1.Fragment, null,
71
- react_1.default.createElement(FullscreenImage_1.default, Object.assign({}, imageProps, { imageClassName: b('image') })))),
72
+ react_1.default.createElement(FullscreenImage_1.default, Object.assign({}, imageProps, { imageClassName: b('image', { border }) })))),
72
73
  (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.caption) && (react_1.default.createElement("p", { className: b('caption'), id: captionId },
73
74
  react_1.default.createElement(YFMWrapper_1.default, { content: activeTabData.caption, modifiers: { constructor: true }, id: captionId })))));
74
75
  return (react_1.default.createElement(AnimateBlock_1.default, { className: b(), onScroll: () => setPlay(true), animate: animated },
@@ -433,6 +433,10 @@ export declare const tabsItem: {
433
433
  optionName: string;
434
434
  })[];
435
435
  };
436
+ border: {
437
+ type: string;
438
+ enum: string[];
439
+ };
436
440
  title?: {
437
441
  oneOf: ({
438
442
  type: string;
@@ -22,7 +22,10 @@ exports.tabsItem = {
22
22
  properties: common_1.MediaProps,
23
23
  }),
24
24
  //TODO deprecated
25
- link: common_1.LinkProps, image: (0, common_1.withTheme)(schema_1.ImageProps) }),
25
+ link: common_1.LinkProps, image: (0, common_1.withTheme)(schema_1.ImageProps), border: {
26
+ type: 'string',
27
+ enum: ['shadow', 'line', 'none'],
28
+ } }),
26
29
  };
27
30
  exports.TabsBlock = {
28
31
  'tabs-block': {
@@ -0,0 +1,11 @@
1
+ .pc-buttons {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ column-gap: 12px;
5
+ }
6
+ .pc-buttons_size_s {
7
+ row-gap: 8px;
8
+ }
9
+ .pc-buttons_size_l {
10
+ row-gap: 12px;
11
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { ButtonProps, ContentSize } from '../../models';
3
+ type ButtonsProps = {
4
+ className?: string;
5
+ buttons?: ButtonProps[];
6
+ size?: ContentSize;
7
+ titleId?: string;
8
+ qa?: string;
9
+ buttonQa?: string;
10
+ };
11
+ declare const Buttons: React.FC<ButtonsProps>;
12
+ export default Buttons;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const utils_1 = require("../../utils");
6
+ const Button_1 = tslib_1.__importDefault(require("../Button/Button"));
7
+ const b = (0, utils_1.block)('buttons');
8
+ function getButtonSize(size) {
9
+ switch (size) {
10
+ case 's':
11
+ return 'm';
12
+ case 'l':
13
+ default:
14
+ return 'xl';
15
+ }
16
+ }
17
+ const Buttons = ({ className, titleId, buttons, size = 's', qa, buttonQa }) => buttons ? (react_1.default.createElement("div", { className: b({ size }, className), "data-qa": qa }, buttons.map((item) => (react_1.default.createElement(Button_1.default, Object.assign({ className: b('button') }, item, { key: item.url, size: getButtonSize(size), qa: buttonQa, extraProps: Object.assign({ 'aria-describedby': item.urlTitle ? undefined : titleId }, item.extraProps) })))))) : null;
18
+ exports.default = Buttons;
@@ -1,10 +1,9 @@
1
- import React, { HTMLAttributeAnchorTarget, ReactElement } from 'react';
1
+ import React, { HTMLAttributeAnchorTarget, PropsWithChildren } from 'react';
2
2
  import { AnalyticsEventsBase, ButtonPixel, CardBaseProps as CardBaseParams, ImageProps, MetrikaGoal, WithChildren } from '../../models';
3
- export interface CardBaseProps extends AnalyticsEventsBase, CardBaseParams {
3
+ export interface CardBaseProps extends AnalyticsEventsBase, CardBaseParams, PropsWithChildren {
4
4
  className?: string;
5
5
  bodyClassName?: string;
6
6
  contentClassName?: string;
7
- children: ReactElement | ReactElement[];
8
7
  url?: string;
9
8
  urlTitle?: string;
10
9
  target?: HTMLAttributeAnchorTarget;
@@ -36,12 +36,11 @@ const Layout = (props) => {
36
36
  break;
37
37
  }
38
38
  }
39
- if (react_1.Children.count(children) === 1) {
40
- handleChild(children);
41
- }
42
- else {
43
- react_1.Children.forEach(children, handleChild);
44
- }
39
+ react_1.Children.toArray(children).forEach((child) => {
40
+ if ((0, react_1.isValidElement)(child)) {
41
+ handleChild(child);
42
+ }
43
+ });
45
44
  const cardContent = (react_1.default.createElement(react_1.Fragment, null,
46
45
  (header || image) && (react_1.default.createElement(BackgroundImage_1.default, Object.assign({ className: b('header', headerClass) }, (typeof image === 'string' ? { src: image } : image), { qa: qaAttributes.header }),
47
46
  react_1.default.createElement("div", { className: b('header-content') }, header))),
@@ -1,7 +1,7 @@
1
- import { WithChildren } from '../../models';
2
- export interface FoldableProps {
1
+ import { QAProps, WithChildren } from '../../models';
2
+ export interface FoldableProps extends QAProps {
3
3
  isOpened: boolean;
4
4
  className?: string;
5
5
  }
6
- declare const Foldable: ({ isOpened, children, className }: WithChildren<FoldableProps>) => JSX.Element;
6
+ declare const Foldable: ({ isOpened, children, className, qa }: WithChildren<FoldableProps>) => JSX.Element;
7
7
  export default Foldable;
@@ -5,7 +5,8 @@ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const useHeightCalculator_1 = tslib_1.__importDefault(require("../../hooks/useHeightCalculator"));
6
6
  const utils_1 = require("../../utils");
7
7
  const b = (0, utils_1.block)('foldable-block');
8
- const Foldable = ({ isOpened, children, className }) => {
8
+ const Foldable = ({ isOpened, children, className, qa }) => {
9
+ const qaAttributes = (0, utils_1.getQaAttrubutes)(qa);
9
10
  const blockRef = (0, react_1.useRef)(null);
10
11
  const contentRef = (0, react_1.useRef)(null);
11
12
  const contentHeight = (0, useHeightCalculator_1.default)(contentRef);
@@ -14,7 +15,7 @@ const Foldable = ({ isOpened, children, className }) => {
14
15
  blockRef.current.style.height = isOpened && contentHeight ? `${contentHeight}px` : '0';
15
16
  }
16
17
  }, [isOpened, contentHeight]);
17
- return (react_1.default.createElement("div", { ref: blockRef, className: b({ open: isOpened }, className) },
18
- react_1.default.createElement("div", { ref: contentRef, className: b('content-container') }, children)));
18
+ return (react_1.default.createElement("div", { ref: blockRef, className: b({ open: isOpened }, className), "data-qa": qaAttributes.default },
19
+ react_1.default.createElement("div", { ref: contentRef, className: b('content-container'), "data-qa": qaAttributes.container }, children)));
19
20
  };
20
21
  exports.default = Foldable;
@@ -0,0 +1,14 @@
1
+ .pc-links {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: baseline;
5
+ }
6
+ .pc-links__link {
7
+ margin-top: 0px;
8
+ }
9
+ .pc-links_size_s {
10
+ gap: 8px;
11
+ }
12
+ .pc-links_size_l {
13
+ gap: 12px;
14
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { ContentSize, LinkProps } from '../../models';
3
+ type LinksProps = {
4
+ className?: string;
5
+ titleId?: string;
6
+ links?: LinkProps[];
7
+ size?: ContentSize;
8
+ qa?: string;
9
+ linkQa?: string;
10
+ };
11
+ declare const Links: React.FC<LinksProps>;
12
+ export default Links;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const utils_1 = require("../../utils");
6
+ const Link_1 = tslib_1.__importDefault(require("../Link/Link"));
7
+ const b = (0, utils_1.block)('links');
8
+ function getLinkSize(size) {
9
+ switch (size) {
10
+ case 's':
11
+ return 'm';
12
+ case 'l':
13
+ default:
14
+ return 'l';
15
+ }
16
+ }
17
+ const Links = ({ className, titleId, links, size = 's', qa, linkQa }) => links ? (react_1.default.createElement("div", { className: b({ size }, className), "data-qa": qa }, links === null || links === void 0 ? void 0 : links.map((link) => (react_1.default.createElement(Link_1.default, Object.assign({ className: b('link') }, link, { textSize: getLinkSize(size), key: link.url, qa: linkQa, extraProps: Object.assign({ 'aria-describedby': link.urlTitle ? undefined : titleId }, link.extraProps) })))))) : null;
18
+ exports.default = Links;
@@ -6,6 +6,7 @@ export { default as BackLink } from './BackLink/BackLink';
6
6
  export { default as BalancedMasonry } from './BalancedMasonry/BalancedMasonry';
7
7
  export { default as BlockBase } from './BlockBase/BlockBase';
8
8
  export { default as Button } from './Button/Button';
9
+ export { default as Buttons } from './Buttons/Buttons';
9
10
  export { default as CardBase } from './CardBase/CardBase';
10
11
  export { default as ErrorWrapper } from './ErrorWrapper/ErrorWrapper';
11
12
  export { default as FileLink } from './FileLink/FileLink';
@@ -16,7 +17,7 @@ export { default as HeaderBreadcrumbs } from './HeaderBreadcrumbs/HeaderBreadcru
16
17
  export { default as Image } from './Image/Image';
17
18
  export { default as ImageBase } from './ImageBase/ImageBase';
18
19
  export { default as Link } from './Link/Link';
19
- export { default as Links } from './Link/Links';
20
+ export { default as Links } from './Links/Links';
20
21
  export { default as Media } from './Media/Media';
21
22
  export { default as OutsideClick } from './OutsideClick/OutsideClick';
22
23
  export { default as ReactPlayer } from './ReactPlayer/ReactPlayer';
@@ -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.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;
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.Buttons = 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");
@@ -20,6 +20,8 @@ var BlockBase_1 = require("./BlockBase/BlockBase");
20
20
  Object.defineProperty(exports, "BlockBase", { enumerable: true, get: function () { return __importDefault(BlockBase_1).default; } });
21
21
  var Button_1 = require("./Button/Button");
22
22
  Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return __importDefault(Button_1).default; } });
23
+ var Buttons_1 = require("./Buttons/Buttons");
24
+ Object.defineProperty(exports, "Buttons", { enumerable: true, get: function () { return __importDefault(Buttons_1).default; } });
23
25
  var CardBase_1 = require("./CardBase/CardBase");
24
26
  Object.defineProperty(exports, "CardBase", { enumerable: true, get: function () { return __importDefault(CardBase_1).default; } });
25
27
  var ErrorWrapper_1 = require("./ErrorWrapper/ErrorWrapper");
@@ -40,7 +42,7 @@ var ImageBase_1 = require("./ImageBase/ImageBase");
40
42
  Object.defineProperty(exports, "ImageBase", { enumerable: true, get: function () { return __importDefault(ImageBase_1).default; } });
41
43
  var Link_1 = require("./Link/Link");
42
44
  Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return __importDefault(Link_1).default; } });
43
- var Links_1 = require("./Link/Links");
45
+ var Links_1 = require("./Links/Links");
44
46
  Object.defineProperty(exports, "Links", { enumerable: true, get: function () { return __importDefault(Links_1).default; } });
45
47
  var Media_1 = require("./Media/Media");
46
48
  Object.defineProperty(exports, "Media", { enumerable: true, get: function () { return __importDefault(Media_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, icon, className, analyticsEvents, }: import("./models").LayoutItemProps) => JSX.Element;
27
+ "layout-item": ({ content: { links, buttons, ...content }, metaInfo, media, border, fullscreen, icon, className, analyticsEvents, controlPosition, }: 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;
@@ -209,7 +209,7 @@ export interface TableBlockProps {
209
209
  title: string;
210
210
  table: TableProps;
211
211
  }
212
- export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'> {
212
+ export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'>, WithBorder {
213
213
  tabName: string;
214
214
  /**
215
215
  * @deprecated Use array links from ContentBlockProps instead
@@ -297,9 +297,13 @@ export interface TitleItemBaseProps {
297
297
  export type MediaView = 'fit' | 'full';
298
298
  export type MediaBorder = 'shadow' | 'line' | 'none';
299
299
  export type CardBorder = MediaBorder;
300
+ export type ControlPosition = 'content' | 'footer';
300
301
  export interface CardBaseProps {
301
302
  border?: CardBorder;
302
303
  }
304
+ export type CardLayoutProps = {
305
+ controlPosition?: ControlPosition;
306
+ };
303
307
  export interface PriceDescriptionProps {
304
308
  title: string;
305
309
  detailedTitle?: string;
@@ -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, ImageCardMargins, ImageObjectProps, ImageProps, LinkProps, MediaProps, MediaView, PriceDetailedProps, TextTheme, Themable, ThemedImage } from './common';
6
+ import { AuthorItem, ButtonPixel, ButtonProps, CardBaseProps, CardLayoutProps, ContentTheme, DividerSize, ImageCardMargins, 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",
@@ -97,14 +97,14 @@ export interface QuoteProps extends Themable, CardBaseProps {
97
97
  quoteType?: QuoteType;
98
98
  button?: ButtonProps;
99
99
  }
100
- export interface BackgroundCardProps extends CardBaseProps, AnalyticsEventsBase, Omit<ContentBlockProps, 'colSizes' | 'centered'> {
100
+ export interface BackgroundCardProps extends CardBaseProps, AnalyticsEventsBase, CardLayoutProps, Omit<ContentBlockProps, 'colSizes' | 'centered'> {
101
101
  url?: string;
102
102
  urlTitle?: string;
103
103
  background?: ThemeSupporting<ImageObjectProps>;
104
104
  paddingBottom?: 's' | 'm' | 'l' | 'xl';
105
105
  backgroundColor?: string;
106
106
  }
107
- export interface BasicCardProps extends CardBaseProps, AnalyticsEventsBase, Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size' | 'theme'> {
107
+ export interface BasicCardProps extends CardBaseProps, AnalyticsEventsBase, CardLayoutProps, Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size' | 'theme'> {
108
108
  url: string;
109
109
  urlTitle?: string;
110
110
  icon?: ImageProps;
@@ -134,7 +134,7 @@ export interface PriceCardProps extends CardBaseProps, Pick<ContentBlockProps, '
134
134
  backgroundColor?: string;
135
135
  list?: string[];
136
136
  }
137
- export interface LayoutItemProps extends ClassNameProps, AnalyticsEventsBase {
137
+ export interface LayoutItemProps extends ClassNameProps, CardLayoutProps, AnalyticsEventsBase {
138
138
  content: Omit<ContentBlockProps, 'colSizes' | 'centered' | 'size'>;
139
139
  media?: MediaProps;
140
140
  metaInfo?: string[];
@@ -476,6 +476,10 @@ export declare const cardSchemas: {
476
476
  type: string;
477
477
  };
478
478
  };
479
+ controlPosition: {
480
+ type: string;
481
+ enum: string[];
482
+ };
479
483
  border: {
480
484
  type: string;
481
485
  enum: string[];
@@ -518,6 +522,10 @@ export declare const cardSchemas: {
518
522
  type: string;
519
523
  enum: string[];
520
524
  };
525
+ controlPosition: {
526
+ type: string;
527
+ enum: string[];
528
+ };
521
529
  title: {
522
530
  oneOf: ({
523
531
  type: string;
@@ -855,6 +863,10 @@ export declare const cardSchemas: {
855
863
  optionName: string;
856
864
  })[];
857
865
  };
866
+ controlPosition: {
867
+ type: string;
868
+ enum: string[];
869
+ };
858
870
  title: {
859
871
  oneOf: ({
860
872
  type: string;
@@ -1,20 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importDefault(require("react"));
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const uikit_1 = require("@gravity-ui/uikit");
5
6
  const components_1 = require("../../components/");
6
7
  const theme_1 = require("../../context/theme");
7
8
  const utils_1 = require("../../utils");
9
+ const renderContentControls_1 = tslib_1.__importDefault(require("../../utils/renderContentControls/renderContentControls"));
8
10
  const Content_1 = tslib_1.__importDefault(require("../Content/Content"));
11
+ const renderCardFooterControlsContainer_1 = tslib_1.__importDefault(require("../renderCardFooterControlsContainer/renderCardFooterControlsContainer"));
9
12
  const b = (0, utils_1.block)('background-card');
10
13
  const BackgroundCard = (props) => {
11
- const { url, title, text, border, background, paddingBottom, backgroundColor, additionalInfo, theme: cardTheme = 'default', links, buttons, analyticsEvents, urlTitle, } = props;
14
+ const { url, title, text, border, background, paddingBottom, backgroundColor, additionalInfo, theme: cardTheme = 'default', links, buttons, analyticsEvents, urlTitle, controlPosition = 'content', } = props;
15
+ const titleId = (0, uikit_1.useUniqId)();
12
16
  const theme = (0, theme_1.useTheme)();
13
17
  const hasBackgroundColor = backgroundColor || cardTheme !== 'default';
14
18
  const borderType = hasBackgroundColor ? 'none' : border;
19
+ const areControlsInFooter = !paddingBottom && controlPosition === 'footer';
20
+ const footerControls = (0, react_1.useMemo)(() => (0, renderContentControls_1.default)({
21
+ links: areControlsInFooter ? links : undefined,
22
+ buttons: areControlsInFooter ? buttons : undefined,
23
+ size: 's',
24
+ titleId,
25
+ }, renderCardFooterControlsContainer_1.default), [areControlsInFooter, links, buttons, titleId]);
15
26
  return (react_1.default.createElement(components_1.CardBase, { className: b({ padding: paddingBottom, theme: cardTheme }), url: url, border: borderType, analyticsEvents: analyticsEvents, urlTitle: urlTitle },
16
27
  react_1.default.createElement(components_1.CardBase.Content, null,
17
28
  react_1.default.createElement(components_1.BackgroundImage, Object.assign({ className: b('image') }, (0, utils_1.getThemedValue)(background, theme), { style: { backgroundColor } })),
18
- react_1.default.createElement(Content_1.default, { title: title, text: text, additionalInfo: additionalInfo, size: "s", theme: cardTheme, links: links, buttons: buttons, colSizes: { all: 12, md: 12 } }))));
29
+ react_1.default.createElement(Content_1.default, { titleId: titleId, title: title, text: text, additionalInfo: additionalInfo, size: "s", theme: cardTheme, links: areControlsInFooter ? undefined : links, buttons: areControlsInFooter ? undefined : buttons, colSizes: { all: 12, md: 12 } })),
30
+ footerControls));
19
31
  };
20
32
  exports.default = BackgroundCard;
@@ -144,6 +144,10 @@ export declare const BackgroundCard: {
144
144
  optionName: string;
145
145
  })[];
146
146
  };
147
+ controlPosition: {
148
+ type: string;
149
+ enum: string[];
150
+ };
147
151
  title: {
148
152
  oneOf: ({
149
153
  type: string;
@@ -30,6 +30,9 @@ exports.BackgroundCard = {
30
30
  optionName: 'list',
31
31
  },
32
32
  ],
33
+ }, controlPosition: {
34
+ type: 'string',
35
+ enum: ['content', 'footer'],
33
36
  } }),
34
37
  },
35
38
  };
@@ -1,21 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importDefault(require("react"));
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
- const CardBase_1 = tslib_1.__importDefault(require("../../components/CardBase/CardBase"));
7
- const IconWrapper_1 = tslib_1.__importDefault(require("../../components/IconWrapper/IconWrapper"));
6
+ const components_1 = require("../../components");
8
7
  const sub_blocks_1 = require("../../models/constructor-items/sub-blocks");
9
8
  const utils_1 = require("../../utils");
9
+ const renderContentControls_1 = tslib_1.__importDefault(require("../../utils/renderContentControls/renderContentControls"));
10
10
  const Content_1 = tslib_1.__importDefault(require("../Content/Content"));
11
+ const renderCardFooterControlsContainer_1 = tslib_1.__importDefault(require("../renderCardFooterControlsContainer/renderCardFooterControlsContainer"));
11
12
  const b = (0, utils_1.block)('basic-card');
12
13
  const BasicCard = (props) => {
13
- const { title, text, icon, additionalInfo, links, list, buttons, iconPosition = sub_blocks_1.IconPosition.Top } = props, cardParams = tslib_1.__rest(props, ["title", "text", "icon", "additionalInfo", "links", "list", "buttons", "iconPosition"]);
14
+ const { title, text, icon, additionalInfo, links, list, buttons, iconPosition = sub_blocks_1.IconPosition.Top, controlPosition = 'content' } = props, cardParams = tslib_1.__rest(props, ["title", "text", "icon", "additionalInfo", "links", "list", "buttons", "iconPosition", "controlPosition"]);
14
15
  const titleId = (0, uikit_1.useUniqId)();
15
16
  const descriptionId = (0, uikit_1.useUniqId)();
16
- return (react_1.default.createElement(CardBase_1.default, Object.assign({ className: b() }, cardParams, { extraProps: { 'aria-describedby': descriptionId, 'aria-labelledby': titleId } }),
17
- react_1.default.createElement(CardBase_1.default.Content, null,
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, list: list, buttons: buttons, size: "s", colSizes: { all: 12, md: 12 } })))));
17
+ const areControlsInFooter = controlPosition === 'footer';
18
+ const footerControls = (0, react_1.useMemo)(() => (0, renderContentControls_1.default)({
19
+ links: areControlsInFooter ? links : undefined,
20
+ buttons: areControlsInFooter ? buttons : undefined,
21
+ size: 's',
22
+ titleId,
23
+ }, renderCardFooterControlsContainer_1.default), [areControlsInFooter, links, buttons, titleId]);
24
+ return (react_1.default.createElement(components_1.CardBase, Object.assign({ className: b() }, cardParams, { extraProps: { 'aria-describedby': descriptionId, 'aria-labelledby': titleId } }),
25
+ react_1.default.createElement(components_1.CardBase.Content, null,
26
+ react_1.default.createElement(components_1.IconWrapper, { icon: icon ? { value: icon, position: iconPosition } : undefined },
27
+ react_1.default.createElement(Content_1.default, { title: title, titleId: titleId, text: text, textId: descriptionId, additionalInfo: additionalInfo, links: areControlsInFooter ? undefined : links, list: list, buttons: areControlsInFooter ? undefined : buttons, size: "s", colSizes: { all: 12, md: 12 } }))),
28
+ footerControls));
20
29
  };
21
30
  exports.default = BasicCard;
@@ -31,6 +31,10 @@ export declare const BasicCard: {
31
31
  type: string;
32
32
  enum: string[];
33
33
  };
34
+ controlPosition: {
35
+ type: string;
36
+ enum: string[];
37
+ };
34
38
  title: {
35
39
  oneOf: ({
36
40
  type: string;
@@ -21,6 +21,9 @@ exports.BasicCard = {
21
21
  }, iconPosition: {
22
22
  type: 'string',
23
23
  enum: ['top', 'left'],
24
+ }, controlPosition: {
25
+ type: 'string',
26
+ enum: ['content', 'footer'],
24
27
  } }),
25
28
  },
26
29
  };
@@ -27,16 +27,6 @@ unpredictable css rules order in build */
27
27
  color: var(--g-color-text-primary);
28
28
  }
29
29
 
30
- .pc-content__buttons {
31
- display: flex;
32
- flex-wrap: wrap;
33
- column-gap: 12px;
34
- }
35
- .pc-content__links {
36
- display: flex;
37
- flex-direction: column;
38
- align-items: baseline;
39
- }
40
30
  .pc-content__link {
41
31
  display: block;
42
32
  }
@@ -67,12 +57,6 @@ unpredictable css rules order in build */
67
57
  .pc-content_size_s .pc-content__text_without-title {
68
58
  margin-top: 0;
69
59
  }
70
- .pc-content_size_s .pc-content__links,
71
- .pc-content_size_s .pc-content__link,
72
- .pc-content_size_s .pc-content__buttons,
73
- .pc-content_size_s .pc-content__button {
74
- margin-top: 8px;
75
- }
76
60
  .pc-content_size_s .pc-content__list {
77
61
  margin-top: 16px;
78
62
  }
@@ -88,12 +72,6 @@ unpredictable css rules order in build */
88
72
  font-size: var(--g-text-body-3-font-size);
89
73
  line-height: var(--g-text-body-3-line-height);
90
74
  }
91
- .pc-content_size_l .pc-content__links,
92
- .pc-content_size_l .pc-content__link,
93
- .pc-content_size_l .pc-content__buttons,
94
- .pc-content_size_l .pc-content__button {
95
- margin-top: 12px;
96
- }
97
75
  .pc-content_size_l .pc-content__list {
98
76
  margin-top: 24px;
99
77
  }
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importDefault(require("react"));
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
6
  const components_1 = require("../../components");
7
7
  const grid_1 = require("../../grid");
8
8
  const utils_1 = require("../../utils");
9
9
  const blocks_1 = require("../../utils/blocks");
10
+ const renderContentControls_1 = tslib_1.__importDefault(require("../../utils/renderContentControls/renderContentControls"));
10
11
  const b = (0, utils_1.block)('content');
11
12
  function getTextSize(size) {
12
13
  switch (size) {
@@ -17,24 +18,6 @@ function getTextSize(size) {
17
18
  return 'm';
18
19
  }
19
20
  }
20
- function getLinkSize(size) {
21
- switch (size) {
22
- case 's':
23
- return 'm';
24
- case 'l':
25
- default:
26
- return 'l';
27
- }
28
- }
29
- function getButtonSize(size) {
30
- switch (size) {
31
- case 's':
32
- return 'm';
33
- case 'l':
34
- default:
35
- return 'xl';
36
- }
37
- }
38
21
  const Content = (props) => {
39
22
  const { title, titleId: titleIdFromProps, text, textId, additionalInfo, size = 'l', links, buttons, colSizes = { all: 12, sm: 8 }, centered, theme, className, list, qa, } = props;
40
23
  const qaAttributes = (0, blocks_1.getQaAttrubutes)(qa, ['links', 'link', 'buttons', 'button', 'list']);
@@ -44,6 +27,13 @@ const Content = (props) => {
44
27
  const hasTitle = Boolean(title);
45
28
  const defaultTitleId = (0, uikit_1.useUniqId)();
46
29
  const titleId = titleIdFromProps || defaultTitleId;
30
+ const controls = (0, react_1.useMemo)(() => (0, renderContentControls_1.default)({
31
+ size,
32
+ links,
33
+ buttons,
34
+ titleId,
35
+ qa: qaAttributes,
36
+ }), [size, links, buttons, titleId, qaAttributes]);
47
37
  return (react_1.default.createElement(grid_1.Col, { className: b({ size, centered, theme }, className), reset: true, sizes: colSizes, qa: qaAttributes.container },
48
38
  title && (react_1.default.createElement(components_1.Title, { className: b('title'), title: titleProps, colSizes: { all: 12 }, id: titleId })),
49
39
  text && (react_1.default.createElement("div", { className: b('text', { ['without-title']: !hasTitle }) },
@@ -56,7 +46,6 @@ const Content = (props) => {
56
46
  'constructor-notice': true,
57
47
  [`constructor-size-${size}`]: true,
58
48
  } }))),
59
- links && (react_1.default.createElement("div", { className: b('links'), "data-qa": qaAttributes.links }, links.map((link) => (react_1.default.createElement(components_1.Link, Object.assign({ className: b('link') }, link, { textSize: getLinkSize(size), key: link.url, qa: qaAttributes.link, extraProps: Object.assign({ 'aria-describedby': link.urlTitle ? undefined : titleId }, link.extraProps) })))))),
60
- buttons && (react_1.default.createElement("div", { className: b('buttons'), "data-qa": qaAttributes.buttons }, buttons.map((item) => (react_1.default.createElement(components_1.Button, Object.assign({ className: b('button') }, item, { key: item.url, size: getButtonSize(size), qa: qaAttributes.button, extraProps: Object.assign({ 'aria-describedby': item.urlTitle ? undefined : titleId }, item.extraProps) }))))))));
49
+ controls));
61
50
  };
62
51
  exports.default = Content;
@@ -1,5 +1,10 @@
1
1
  /* use this for style redefinitions to awoid problems with
2
2
  unpredictable css rules order in build */
3
+ .pc-layout-item {
4
+ display: flex;
5
+ flex-direction: column;
6
+ height: 100%;
7
+ }
3
8
  .pc-layout-item__media {
4
9
  width: 100%;
5
10
  display: block;
@@ -12,6 +17,7 @@ unpredictable css rules order in build */
12
17
  margin: 16px 0 -8px 0;
13
18
  }
14
19
  .pc-layout-item__content {
20
+ flex: auto;
15
21
  margin: 16px 16px 0 0;
16
22
  }
17
23
  .pc-layout-item__content_no-media {