@gravity-ui/page-constructor 1.7.0-alpha.7 → 1.7.1

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 (31) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.js +2 -2
  3. package/build/cjs/blocks/Tabs/Tabs.css +23 -49
  4. package/build/cjs/blocks/Tabs/Tabs.d.ts +1 -1
  5. package/build/cjs/blocks/Tabs/Tabs.js +27 -29
  6. package/build/cjs/components/Image/Image.js +1 -3
  7. package/build/cjs/components/VideoBlock/VideoBlock.js +1 -1
  8. package/build/cjs/constructor-items.d.ts +1 -1
  9. package/build/cjs/models/constructor-items/blocks.d.ts +6 -11
  10. package/build/cjs/text-transform/blocks.js +4 -11
  11. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +2 -2
  12. package/build/esm/blocks/Tabs/Tabs.css +23 -49
  13. package/build/esm/blocks/Tabs/Tabs.d.ts +1 -1
  14. package/build/esm/blocks/Tabs/Tabs.js +27 -29
  15. package/build/esm/components/Image/Image.d.ts +0 -1
  16. package/build/esm/components/Image/Image.js +1 -4
  17. package/build/esm/components/VideoBlock/VideoBlock.js +1 -1
  18. package/build/esm/constructor-items.d.ts +1 -1
  19. package/build/esm/models/constructor-items/blocks.d.ts +6 -11
  20. package/build/esm/text-transform/blocks.js +4 -11
  21. package/package.json +2 -5
  22. package/server/models/constructor-items/blocks.d.ts +6 -11
  23. package/server/text-transform/blocks.js +4 -11
  24. package/build/cjs/components/ButtonTabs/ButtonTabs.css +0 -12
  25. package/build/cjs/components/ButtonTabs/ButtonTabs.d.ts +0 -13
  26. package/build/cjs/components/ButtonTabs/ButtonTabs.js +0 -27
  27. package/build/cjs/components/Image/Image.css +0 -3
  28. package/build/esm/components/ButtonTabs/ButtonTabs.css +0 -12
  29. package/build/esm/components/ButtonTabs/ButtonTabs.d.ts +0 -14
  30. package/build/esm/components/ButtonTabs/ButtonTabs.js +0 -25
  31. package/build/esm/components/Image/Image.css +0 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.7.1](https://github.com/gravity-ui/page-constructor/compare/v1.7.0...v1.7.1) (2022-11-29)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ExtendedFeatures:** add props ([6254d62](https://github.com/gravity-ui/page-constructor/commit/6254d62b9ceded154d0fdcded9a554fd33772d13))
9
+ * storybook content ([b98eccc](https://github.com/gravity-ui/page-constructor/commit/b98ecccc96cfba2376552e4c9314a559913455d9))
10
+
3
11
  ## [1.7.0](https://github.com/gravity-ui/page-constructor/compare/v1.6.1...v1.7.0) (2022-11-10)
4
12
 
5
13
 
@@ -21,7 +21,7 @@ const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DEFAULT_S
21
21
  return (react_1.default.createElement(components_1.AnimateBlock, { className: b(), animate: animated },
22
22
  react_1.default.createElement(components_1.BlockHeader, { title: title, description: description, className: b('header') }),
23
23
  react_1.default.createElement("div", { className: b('items') },
24
- react_1.default.createElement(grid_1.Row, null, items.map(({ title: itemTitle, text, link, links, label, icon }) => {
24
+ react_1.default.createElement(grid_1.Row, null, items.map(({ title: itemTitle, text, link, links, label, icon, buttons, additionalInfo, }) => {
25
25
  const itemLinks = links || [];
26
26
  const iconThemed = icon && (0, utils_1.getThemedValue)(icon, theme);
27
27
  const iconData = iconThemed && (0, utils_2.getMediaImage)(iconThemed);
@@ -34,7 +34,7 @@ const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DEFAULT_S
34
34
  itemTitle && (react_1.default.createElement("h5", { className: b('item-title') },
35
35
  react_1.default.createElement(components_1.HTML, null, itemTitle),
36
36
  label && (react_1.default.createElement("div", { className: b('item-label') }, label)))),
37
- react_1.default.createElement(sub_blocks_1.Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 } }))));
37
+ react_1.default.createElement(sub_blocks_1.Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 }, buttons: buttons, additionalInfo: additionalInfo }))));
38
38
  })))));
39
39
  };
40
40
  exports.ExtendedFeaturesBlock = ExtendedFeaturesBlock;
@@ -1,94 +1,68 @@
1
- .pc-tabs-block__content-title.pc-tabs-block__content-title > * {
1
+ .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
2
2
  margin: 0;
3
3
  }
4
4
 
5
5
  /* use this for style redefinitions to awoid problems with
6
6
  unpredictable css rules order in build */
7
- .pc-tabs-block__block-title {
7
+ .pc-TabsBlock__block-title {
8
8
  margin-bottom: 12px;
9
9
  }
10
- .pc-tabs-block__block-title_centered {
11
- margin: 0 auto 12px;
12
- text-align: center;
13
- }
14
- .pc-tabs-block__tabs_centered {
15
- display: flex;
16
- justify-content: center;
17
- }
18
- .pc-tabs-block__row_reverse {
19
- flex-direction: row-reverse;
10
+ .pc-TabsBlock__tabs.pc-TabsBlock__tabs {
11
+ flex-wrap: nowrap;
12
+ overflow-x: auto;
13
+ margin-bottom: 32px;
20
14
  }
21
- .pc-tabs-block__row_reverse .pc-tabs-block__content-wrapper {
22
- margin-right: 32px;
23
- margin-left: 0;
24
- }
25
- .pc-tabs-block__image {
15
+
16
+ .pc-TabsBlock__image {
26
17
  width: 100%;
27
18
  height: auto;
28
19
  object-fit: cover;
29
20
  display: block;
30
21
  }
31
- .pc-tabs-block__image, .pc-tabs-block__media {
22
+ .pc-TabsBlock__image, .pc-TabsBlock__media {
32
23
  box-shadow: 0 2px 8px var(--pc-color-sfx-shadow), 0 4px 24px var(--pc-color-sfx-shadow);
33
24
  overflow-x: hidden;
34
25
  border-radius: var(--pc-border-radius);
35
26
  }
36
- .pc-tabs-block__caption {
27
+ .pc-TabsBlock__caption {
37
28
  font-size: var(--yc-text-body-2-font-size);
38
29
  line-height: var(--yc-text-body-2-line-height);
39
30
  margin: 12px 0 0;
40
31
  color: var(--yc-color-text-secondary);
41
32
  }
42
- .pc-tabs-block__content {
33
+ .pc-TabsBlock__content {
43
34
  display: flex;
44
35
  flex-direction: column;
45
36
  }
46
- .pc-tabs-block__content_centered {
47
- margin: 0 auto;
48
- }
49
- .pc-tabs-block__col_centered {
50
- margin: 0 auto;
51
- }
52
- .pc-tabs-block__content-wrapper_margin {
37
+ .pc-TabsBlock__content-wrapper_margin {
53
38
  margin: 24px 0 0 32px;
54
39
  }
55
- .pc-tabs-block__content-title {
40
+ .pc-TabsBlock__content-title {
56
41
  margin: 0 auto 12px;
57
42
  }
58
- .pc-tabs-block__content-title.pc-tabs-block__content-title > * {
43
+ .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
59
44
  font-size: var(--yc-text-header-1-font-size);
60
45
  line-height: var(--yc-text-header-1-line-height);
61
46
  color: var(--pc-text-header-color);
62
47
  font-weight: var(--yc-text-accent-font-weight);
63
48
  }
64
49
 
50
+ .pc-TabsBlock__tabs, .pc-TabsBlock__link {
51
+ font-size: var(--yc-text-body-2-font-size);
52
+ line-height: var(--yc-text-body-2-line-height);
53
+ }
65
54
  @media (max-width: 769px) {
66
- .pc-tabs-block__tabs {
67
- display: flex;
68
- overflow: auto;
69
- margin-left: -24px;
70
- margin-right: -24px;
71
- padding-left: 24px;
72
- padding-right: 16px;
73
- }
74
- .pc-tabs-block__content-wrapper_margin {
55
+ .pc-TabsBlock__content-wrapper_margin {
75
56
  margin: 0 0 32px 0;
76
57
  }
77
- .pc-tabs-block__row_reverse {
78
- flex-direction: column-reverse;
79
- }
80
- .pc-tabs-block__row_reverse .pc-tabs-block__content > * {
81
- margin-top: 32px;
82
- padding-bottom: 0;
83
- }
84
58
  }
85
59
  @media (min-width: 769px) {
86
- .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__media {
60
+ .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__media {
87
61
  position: relative;
88
62
  top: 100px;
89
63
  opacity: 0;
90
64
  }
91
- .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__media {
65
+ .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__media {
92
66
  top: 0;
93
67
  opacity: 1;
94
68
  transition: top 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
@@ -96,12 +70,12 @@ unpredictable css rules order in build */
96
70
  }
97
71
  }
98
72
  @media (min-width: 769px) {
99
- .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__image {
73
+ .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__image {
100
74
  position: relative;
101
75
  top: 100px;
102
76
  opacity: 0;
103
77
  }
104
- .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__image {
78
+ .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__image {
105
79
  top: 0;
106
80
  opacity: 1;
107
81
  transition: top 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
@@ -1,3 +1,3 @@
1
1
  import { TabsBlockProps } from '../../models';
2
- export declare const TabsBlock: ({ items, title, description, animated, tabsColSizes, centered, direction, }: TabsBlockProps) => JSX.Element;
2
+ export declare const TabsBlock: ({ items, title, description, animated }: TabsBlockProps) => JSX.Element;
3
3
  export default TabsBlock;
@@ -3,55 +3,53 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TabsBlock = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = (0, tslib_1.__importStar)(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
6
7
  const utils_1 = require("../../utils");
7
8
  const grid_1 = require("../../grid");
9
+ const YFMWrapper_1 = (0, tslib_1.__importDefault)(require("../../components/YFMWrapper/YFMWrapper"));
8
10
  const AnimateBlock_1 = (0, tslib_1.__importDefault)(require("../../components/AnimateBlock/AnimateBlock"));
9
11
  const BlockHeader_1 = (0, tslib_1.__importDefault)(require("../../components/BlockHeader/BlockHeader"));
10
12
  const FullscreenImage_1 = (0, tslib_1.__importDefault)(require("../../components/FullscreenImage/FullscreenImage"));
11
13
  const Media_1 = (0, tslib_1.__importDefault)(require("../../components/Media/Media"));
14
+ const Links_1 = (0, tslib_1.__importDefault)(require("../../components/Link/Links"));
12
15
  const ThemeValueContext_1 = require("../../context/theme/ThemeValueContext");
13
16
  const utils_2 = require("../../components/Media/Image/utils");
14
- const ButtonTabs_1 = (0, tslib_1.__importDefault)(require("../../components/ButtonTabs/ButtonTabs"));
15
- const sub_blocks_1 = require("../../sub-blocks");
16
- const b = (0, utils_1.block)('tabs-block');
17
- const TabsBlock = ({ items, title, description, animated, tabsColSizes, centered, direction = 'media-content', }) => {
17
+ const b = (0, utils_1.block)('TabsBlock');
18
+ const TabsBlock = ({ items, title, description, animated }) => {
18
19
  const [activeTab, setActiveTab] = (0, react_1.useState)(items[0].tabName);
19
20
  const [play, setPlay] = (0, react_1.useState)(false);
20
21
  const { themeValue: theme } = (0, react_1.useContext)(ThemeValueContext_1.ThemeValueContext);
21
22
  const tabs = items.map(({ tabName }) => ({ title: tabName, id: tabName }));
22
23
  const activeTabData = items.find(({ tabName }) => tabName === activeTab);
23
- const isReverse = direction === 'content-media';
24
24
  let imageProps;
25
25
  if (activeTabData) {
26
26
  const themedImage = (0, utils_1.getThemedValue)(activeTabData.image, theme);
27
27
  imageProps = themedImage && (0, utils_2.getMediaImage)(themedImage);
28
28
  }
29
29
  const showMedia = Boolean((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps);
30
- const showText = Boolean(activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.text);
31
- const textContent = activeTabData && showText && (react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: showMedia ? 4 : 8 }, className: b('content', { centered: centered }) },
32
- react_1.default.createElement("div", { className: b('content-wrapper', {
33
- margin: Boolean(((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps) && !isReverse),
34
- }) },
35
- react_1.default.createElement(sub_blocks_1.Content, { title: activeTabData.title, text: activeTabData.text, additionalInfo: activeTabData.additionalInfo, size: "s", links: [
36
- ...(activeTabData.link ? [activeTabData.link] : []),
37
- ...(activeTabData.links || []),
38
- ], buttons: activeTabData.buttons, colSizes: { all: 12 } }))));
39
- const mediaContent = showMedia && (react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 8 }, orders: {
40
- all: grid_1.GridColumnOrderClasses.Last,
41
- md: grid_1.GridColumnOrderClasses.First,
42
- }, className: b('col', { centered: centered }) },
43
- (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) && (react_1.default.createElement(Media_1.default, Object.assign({}, (0, utils_1.getThemedValue)(activeTabData.media, theme), { key: activeTab, className: b('media'), playVideo: play }))),
44
- imageProps && (react_1.default.createElement(react_1.Fragment, null,
45
- react_1.default.createElement(FullscreenImage_1.default, Object.assign({}, imageProps, { imageClassName: b('image') })),
46
- (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.caption) && (react_1.default.createElement("p", { className: b('caption') }, activeTabData.caption))))));
47
30
  return (react_1.default.createElement(AnimateBlock_1.default, { className: b(), onScroll: () => setPlay(true), animate: animated },
48
- react_1.default.createElement(BlockHeader_1.default, { title: title, description: description, className: b('block-title', { centered: centered }), colSizes: centered ? { all: 12 } : { all: 12, sm: 8 } }),
49
- react_1.default.createElement(grid_1.Row, null,
50
- react_1.default.createElement(grid_1.Col, { sizes: tabsColSizes },
51
- react_1.default.createElement(ButtonTabs_1.default, { items: tabs, onSelectTab: setActiveTab, activeTab: activeTab, className: b('tabs', { centered: centered }) }))),
52
- activeTabData && (react_1.default.createElement(grid_1.Row, { className: b('row', { reverse: isReverse }) },
53
- mediaContent,
54
- textContent))));
31
+ react_1.default.createElement(BlockHeader_1.default, { title: title, description: description, className: b('block-title') }),
32
+ react_1.default.createElement(uikit_1.Tabs, { className: b('tabs'), items: tabs, activeTab: activeTab, onSelectTab: setActiveTab, size: "l" }),
33
+ activeTabData && (react_1.default.createElement(grid_1.Row, null,
34
+ showMedia && (react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: 8 }, orders: {
35
+ all: grid_1.GridColumnOrderClasses.Last,
36
+ md: grid_1.GridColumnOrderClasses.First,
37
+ } },
38
+ (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) && (react_1.default.createElement(Media_1.default, Object.assign({}, (0, utils_1.getThemedValue)(activeTabData.media, theme), { key: activeTab, className: b('media'), playVideo: play }))),
39
+ imageProps && (react_1.default.createElement(react_1.Fragment, null,
40
+ react_1.default.createElement(FullscreenImage_1.default, Object.assign({}, imageProps, { imageClassName: b('image') })),
41
+ activeTabData && (react_1.default.createElement("p", { className: b('caption') }, activeTabData.caption)))))),
42
+ react_1.default.createElement(grid_1.Col, { sizes: { all: 12, md: showMedia ? 4 : 8 }, className: b('content') },
43
+ react_1.default.createElement("div", { className: b('content-wrapper', {
44
+ margin: Boolean((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps),
45
+ }) },
46
+ react_1.default.createElement("h4", { className: b('content-title') },
47
+ react_1.default.createElement(YFMWrapper_1.default, { content: activeTabData.title, modifiers: { constructor: true } })),
48
+ react_1.default.createElement(YFMWrapper_1.default, { content: activeTabData.text, modifiers: { constructor: true } }),
49
+ react_1.default.createElement(Links_1.default, { links: [
50
+ ...(activeTabData.link ? [activeTabData.link] : []),
51
+ ...(activeTabData.links || []),
52
+ ], className: b('link') })))))));
55
53
  };
56
54
  exports.TabsBlock = TabsBlock;
57
55
  exports.default = exports.TabsBlock;
@@ -4,8 +4,6 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = (0, tslib_1.__importStar)(require("react"));
5
5
  const projectSettingsContext_1 = require("../../context/projectSettingsContext");
6
6
  const constants_1 = require("../../constants");
7
- const utils_1 = require("../../utils");
8
- const b = (0, utils_1.block)('Image');
9
7
  const checkWebP = (src) => {
10
8
  return src.endsWith('.webp') ? src : src + '.webp';
11
9
  };
@@ -22,7 +20,7 @@ const Image = (props) => {
22
20
  disableCompress ||
23
21
  imageSrc.endsWith('.svg') ||
24
22
  imgLoadingError;
25
- return (react_1.default.createElement("picture", { className: b() },
23
+ return (react_1.default.createElement("picture", null,
26
24
  mobile && (react_1.default.createElement(react_1.Fragment, null,
27
25
  !disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)` })),
28
26
  react_1.default.createElement("source", { srcSet: mobile, media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)` }))),
@@ -53,7 +53,7 @@ const VideoBlock = (props) => {
53
53
  }, [src, attributes]);
54
54
  (0, react_1.useEffect)(() => {
55
55
  const updateSize = lodash_1.default.debounce(() => {
56
- setHeight(ref.current ? Math.floor(getHeight(ref.current.offsetWidth)) : undefined);
56
+ setHeight(ref.current ? Math.round(getHeight(ref.current.offsetWidth)) : undefined);
57
57
  }, 100);
58
58
  updateSize();
59
59
  window.addEventListener('resize', updateSize);
@@ -11,7 +11,7 @@ export declare const blockMap: {
11
11
  "info-block": (props: import("./models").InfoBlockProps) => JSX.Element;
12
12
  "security-block": (props: import("./models").SecurityBlockProps) => JSX.Element;
13
13
  "table-block": (props: import("./models").TableBlockProps) => JSX.Element;
14
- "tabs-block": ({ items, title, description, animated, tabsColSizes, centered, direction, }: import("./models").TabsBlockProps) => JSX.Element;
14
+ "tabs-block": ({ items, title, description, animated }: import("./models").TabsBlockProps) => JSX.Element;
15
15
  "link-table-block": ({ items, title, description, linkTheme }: import("./models").LinkTableBlockProps) => JSX.Element;
16
16
  "header-block": (props: import("./models").WithChildren<import("./models").HeaderBlockProps & import("./models").ClassNameProps>) => JSX.Element;
17
17
  "icons-block": ({ title, size, items }: import("./models").IconsBlockProps) => JSX.Element;
@@ -114,14 +114,12 @@ export interface SimpleBlockProps extends Animatable, Childable {
114
114
  title: TitleBaseProps;
115
115
  description: string;
116
116
  }
117
- export interface ExtendedFeaturesItem {
118
- title?: string;
119
- text?: string;
117
+ export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' | 'centered' | 'colSizes' | 'size' | 'title'> {
118
+ title: string;
120
119
  label?: string;
121
120
  icon?: ThemedImage;
122
121
  /** @deprecated **/
123
122
  link?: LinkProps;
124
- links?: LinkProps[];
125
123
  }
126
124
  export interface ExtendedFeaturesProps extends Animatable {
127
125
  items: ExtendedFeaturesItem[];
@@ -221,21 +219,18 @@ export interface TableBlockProps {
221
219
  title: string;
222
220
  table: TableProps;
223
221
  }
224
- export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'> {
222
+ export interface TabsBlockItem {
225
223
  tabName: string;
226
- /**
227
- * @deprecated Use array links from ContentBlockProps instead
228
- */
224
+ title: string;
225
+ text: string;
229
226
  link?: LinkProps;
230
227
  image?: ThemedImage;
231
228
  disableCompress?: boolean;
232
229
  caption?: string;
233
230
  media?: ThemedMediaProps;
231
+ links?: LinkProps[];
234
232
  }
235
233
  export interface TabsBlockProps extends BlockHeaderProps, Animatable {
236
- tabsColSizes?: GridColumnSizesType;
237
- centered?: boolean;
238
- direction?: MediaDirection;
239
234
  items: TabsBlockItem[];
240
235
  }
241
236
  export interface LinkTableBlockProps extends BlockHeaderProps {
@@ -23,6 +23,7 @@ const createItemsParser = (fields) => (transformer, items) => items.map((item) =
23
23
  }
24
24
  });
25
25
  exports.createItemsParser = createItemsParser;
26
+ const parseItems = (0, exports.createItemsParser)(['title', 'text']);
26
27
  function parseTableBlock(transformer, content) {
27
28
  const legend = content === null || content === void 0 ? void 0 : content.legend;
28
29
  return Object.assign(Object.assign({}, (content || {})), { legend: legend && legend.map((string) => transformer(string)) });
@@ -48,13 +49,9 @@ function parseSlider(transformer, block) {
48
49
  }
49
50
  const parseTitle = (transformer, title) => typeof title === 'object' && 'text' in title
50
51
  ? Object.assign(Object.assign({}, title), { text: transformer(title.text) }) : title && transformer(title);
51
- const parseItemsTitle = (transformer, items) => items.map((_a) => {
52
- var { title } = _a, rest = (0, tslib_1.__rest)(_a, ["title"]);
53
- return (Object.assign({ title: title && parseTitle(transformer, title) }, rest));
54
- });
55
52
  function parsePriceDetailedBlock(transformer, block) {
56
53
  const { priceType } = block;
57
- block.items = block.items.map((item) => {
54
+ const transformedBlockItems = block.items.map((item) => {
58
55
  const { description, items: details = [] } = item;
59
56
  if (priceType === 'marked-list') {
60
57
  item.items = details.map((detail) => {
@@ -71,6 +68,7 @@ function parsePriceDetailedBlock(transformer, block) {
71
68
  item.description = transformer(description);
72
69
  return item;
73
70
  });
71
+ block.items = transformedBlockItems;
74
72
  return block;
75
73
  }
76
74
  const parseContentLayout = (transformer, content) => {
@@ -228,12 +226,7 @@ const config = {
228
226
  {
229
227
  fields: ['items'],
230
228
  transformer: yfmTransformer,
231
- parser: (0, exports.createItemsParser)(['text', 'additionalInfo']),
232
- },
233
- {
234
- fields: ['items'],
235
- transformer: typografTransformer,
236
- parser: parseItemsTitle,
229
+ parser: parseItems,
237
230
  },
238
231
  ],
239
232
  [models_1.BlockType.TableBlock]: [
@@ -18,7 +18,7 @@ export const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DE
18
18
  return (React.createElement(AnimateBlock, { className: b(), animate: animated },
19
19
  React.createElement(BlockHeader, { title: title, description: description, className: b('header') }),
20
20
  React.createElement("div", { className: b('items') },
21
- React.createElement(Row, null, items.map(({ title: itemTitle, text, link, links, label, icon }) => {
21
+ React.createElement(Row, null, items.map(({ title: itemTitle, text, link, links, label, icon, buttons, additionalInfo, }) => {
22
22
  const itemLinks = links || [];
23
23
  const iconThemed = icon && getThemedValue(icon, theme);
24
24
  const iconData = iconThemed && getMediaImage(iconThemed);
@@ -31,7 +31,7 @@ export const ExtendedFeaturesBlock = ({ title, description, items, colSizes = DE
31
31
  itemTitle && (React.createElement("h5", { className: b('item-title') },
32
32
  React.createElement(HTML, null, itemTitle),
33
33
  label && (React.createElement("div", { className: b('item-label') }, label)))),
34
- React.createElement(Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 } }))));
34
+ React.createElement(Content, { text: text, links: itemLinks, size: "s", colSizes: { all: 12, md: 12 }, buttons: buttons, additionalInfo: additionalInfo }))));
35
35
  })))));
36
36
  };
37
37
  export default ExtendedFeaturesBlock;
@@ -1,94 +1,68 @@
1
- .pc-tabs-block__content-title.pc-tabs-block__content-title > * {
1
+ .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
2
2
  margin: 0;
3
3
  }
4
4
 
5
5
  /* use this for style redefinitions to awoid problems with
6
6
  unpredictable css rules order in build */
7
- .pc-tabs-block__block-title {
7
+ .pc-TabsBlock__block-title {
8
8
  margin-bottom: 12px;
9
9
  }
10
- .pc-tabs-block__block-title_centered {
11
- margin: 0 auto 12px;
12
- text-align: center;
13
- }
14
- .pc-tabs-block__tabs_centered {
15
- display: flex;
16
- justify-content: center;
17
- }
18
- .pc-tabs-block__row_reverse {
19
- flex-direction: row-reverse;
10
+ .pc-TabsBlock__tabs.pc-TabsBlock__tabs {
11
+ flex-wrap: nowrap;
12
+ overflow-x: auto;
13
+ margin-bottom: 32px;
20
14
  }
21
- .pc-tabs-block__row_reverse .pc-tabs-block__content-wrapper {
22
- margin-right: 32px;
23
- margin-left: 0;
24
- }
25
- .pc-tabs-block__image {
15
+
16
+ .pc-TabsBlock__image {
26
17
  width: 100%;
27
18
  height: auto;
28
19
  object-fit: cover;
29
20
  display: block;
30
21
  }
31
- .pc-tabs-block__image, .pc-tabs-block__media {
22
+ .pc-TabsBlock__image, .pc-TabsBlock__media {
32
23
  box-shadow: 0 2px 8px var(--pc-color-sfx-shadow), 0 4px 24px var(--pc-color-sfx-shadow);
33
24
  overflow-x: hidden;
34
25
  border-radius: var(--pc-border-radius);
35
26
  }
36
- .pc-tabs-block__caption {
27
+ .pc-TabsBlock__caption {
37
28
  font-size: var(--yc-text-body-2-font-size);
38
29
  line-height: var(--yc-text-body-2-line-height);
39
30
  margin: 12px 0 0;
40
31
  color: var(--yc-color-text-secondary);
41
32
  }
42
- .pc-tabs-block__content {
33
+ .pc-TabsBlock__content {
43
34
  display: flex;
44
35
  flex-direction: column;
45
36
  }
46
- .pc-tabs-block__content_centered {
47
- margin: 0 auto;
48
- }
49
- .pc-tabs-block__col_centered {
50
- margin: 0 auto;
51
- }
52
- .pc-tabs-block__content-wrapper_margin {
37
+ .pc-TabsBlock__content-wrapper_margin {
53
38
  margin: 24px 0 0 32px;
54
39
  }
55
- .pc-tabs-block__content-title {
40
+ .pc-TabsBlock__content-title {
56
41
  margin: 0 auto 12px;
57
42
  }
58
- .pc-tabs-block__content-title.pc-tabs-block__content-title > * {
43
+ .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
59
44
  font-size: var(--yc-text-header-1-font-size);
60
45
  line-height: var(--yc-text-header-1-line-height);
61
46
  color: var(--pc-text-header-color);
62
47
  font-weight: var(--yc-text-accent-font-weight);
63
48
  }
64
49
 
50
+ .pc-TabsBlock__tabs, .pc-TabsBlock__link {
51
+ font-size: var(--yc-text-body-2-font-size);
52
+ line-height: var(--yc-text-body-2-line-height);
53
+ }
65
54
  @media (max-width: 769px) {
66
- .pc-tabs-block__tabs {
67
- display: flex;
68
- overflow: auto;
69
- margin-left: -24px;
70
- margin-right: -24px;
71
- padding-left: 24px;
72
- padding-right: 16px;
73
- }
74
- .pc-tabs-block__content-wrapper_margin {
55
+ .pc-TabsBlock__content-wrapper_margin {
75
56
  margin: 0 0 32px 0;
76
57
  }
77
- .pc-tabs-block__row_reverse {
78
- flex-direction: column-reverse;
79
- }
80
- .pc-tabs-block__row_reverse .pc-tabs-block__content > * {
81
- margin-top: 32px;
82
- padding-bottom: 0;
83
- }
84
58
  }
85
59
  @media (min-width: 769px) {
86
- .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__media {
60
+ .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__media {
87
61
  position: relative;
88
62
  top: 100px;
89
63
  opacity: 0;
90
64
  }
91
- .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__media {
65
+ .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__media {
92
66
  top: 0;
93
67
  opacity: 1;
94
68
  transition: top 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
@@ -96,12 +70,12 @@ unpredictable css rules order in build */
96
70
  }
97
71
  }
98
72
  @media (min-width: 769px) {
99
- .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__image {
73
+ .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__image {
100
74
  position: relative;
101
75
  top: 100px;
102
76
  opacity: 0;
103
77
  }
104
- .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__image {
78
+ .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__image {
105
79
  top: 0;
106
80
  opacity: 1;
107
81
  transition: top 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94), opacity 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
@@ -1,4 +1,4 @@
1
1
  import { TabsBlockProps } from '../../models';
2
2
  import './Tabs.css';
3
- export declare const TabsBlock: ({ items, title, description, animated, tabsColSizes, centered, direction, }: TabsBlockProps) => JSX.Element;
3
+ export declare const TabsBlock: ({ items, title, description, animated }: TabsBlockProps) => JSX.Element;
4
4
  export default TabsBlock;
@@ -1,53 +1,51 @@
1
1
  import React, { Fragment, useContext, useState } from 'react';
2
+ import { Tabs } from '@gravity-ui/uikit';
2
3
  import { block, getThemedValue } from '../../utils';
3
4
  import { Row, Col, GridColumnOrderClasses } from '../../grid';
5
+ import YFMWrapper from '../../components/YFMWrapper/YFMWrapper';
4
6
  import AnimateBlock from '../../components/AnimateBlock/AnimateBlock';
5
7
  import BlockHeader from '../../components/BlockHeader/BlockHeader';
6
8
  import FullScreenImage from '../../components/FullscreenImage/FullscreenImage';
7
9
  import Media from '../../components/Media/Media';
10
+ import Links from '../../components/Link/Links';
8
11
  import { ThemeValueContext } from '../../context/theme/ThemeValueContext';
9
12
  import { getMediaImage } from '../../components/Media/Image/utils';
10
- import ButtonTabs from '../../components/ButtonTabs/ButtonTabs';
11
- import { Content } from '../../sub-blocks';
12
13
  import './Tabs.css';
13
- const b = block('tabs-block');
14
- export const TabsBlock = ({ items, title, description, animated, tabsColSizes, centered, direction = 'media-content', }) => {
14
+ const b = block('TabsBlock');
15
+ export const TabsBlock = ({ items, title, description, animated }) => {
15
16
  const [activeTab, setActiveTab] = useState(items[0].tabName);
16
17
  const [play, setPlay] = useState(false);
17
18
  const { themeValue: theme } = useContext(ThemeValueContext);
18
19
  const tabs = items.map(({ tabName }) => ({ title: tabName, id: tabName }));
19
20
  const activeTabData = items.find(({ tabName }) => tabName === activeTab);
20
- const isReverse = direction === 'content-media';
21
21
  let imageProps;
22
22
  if (activeTabData) {
23
23
  const themedImage = getThemedValue(activeTabData.image, theme);
24
24
  imageProps = themedImage && getMediaImage(themedImage);
25
25
  }
26
26
  const showMedia = Boolean((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps);
27
- const showText = Boolean(activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.text);
28
- const textContent = activeTabData && showText && (React.createElement(Col, { sizes: { all: 12, md: showMedia ? 4 : 8 }, className: b('content', { centered: centered }) },
29
- React.createElement("div", { className: b('content-wrapper', {
30
- margin: Boolean(((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps) && !isReverse),
31
- }) },
32
- React.createElement(Content, { title: activeTabData.title, text: activeTabData.text, additionalInfo: activeTabData.additionalInfo, size: "s", links: [
33
- ...(activeTabData.link ? [activeTabData.link] : []),
34
- ...(activeTabData.links || []),
35
- ], buttons: activeTabData.buttons, colSizes: { all: 12 } }))));
36
- const mediaContent = showMedia && (React.createElement(Col, { sizes: { all: 12, md: 8 }, orders: {
37
- all: GridColumnOrderClasses.Last,
38
- md: GridColumnOrderClasses.First,
39
- }, className: b('col', { centered: centered }) },
40
- (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) && (React.createElement(Media, Object.assign({}, getThemedValue(activeTabData.media, theme), { key: activeTab, className: b('media'), playVideo: play }))),
41
- imageProps && (React.createElement(Fragment, null,
42
- React.createElement(FullScreenImage, Object.assign({}, imageProps, { imageClassName: b('image') })),
43
- (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.caption) && (React.createElement("p", { className: b('caption') }, activeTabData.caption))))));
44
27
  return (React.createElement(AnimateBlock, { className: b(), onScroll: () => setPlay(true), animate: animated },
45
- React.createElement(BlockHeader, { title: title, description: description, className: b('block-title', { centered: centered }), colSizes: centered ? { all: 12 } : { all: 12, sm: 8 } }),
46
- React.createElement(Row, null,
47
- React.createElement(Col, { sizes: tabsColSizes },
48
- React.createElement(ButtonTabs, { items: tabs, onSelectTab: setActiveTab, activeTab: activeTab, className: b('tabs', { centered: centered }) }))),
49
- activeTabData && (React.createElement(Row, { className: b('row', { reverse: isReverse }) },
50
- mediaContent,
51
- textContent))));
28
+ React.createElement(BlockHeader, { title: title, description: description, className: b('block-title') }),
29
+ React.createElement(Tabs, { className: b('tabs'), items: tabs, activeTab: activeTab, onSelectTab: setActiveTab, size: "l" }),
30
+ activeTabData && (React.createElement(Row, null,
31
+ showMedia && (React.createElement(Col, { sizes: { all: 12, md: 8 }, orders: {
32
+ all: GridColumnOrderClasses.Last,
33
+ md: GridColumnOrderClasses.First,
34
+ } },
35
+ (activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) && (React.createElement(Media, Object.assign({}, getThemedValue(activeTabData.media, theme), { key: activeTab, className: b('media'), playVideo: play }))),
36
+ imageProps && (React.createElement(Fragment, null,
37
+ React.createElement(FullScreenImage, Object.assign({}, imageProps, { imageClassName: b('image') })),
38
+ activeTabData && (React.createElement("p", { className: b('caption') }, activeTabData.caption)))))),
39
+ React.createElement(Col, { sizes: { all: 12, md: showMedia ? 4 : 8 }, className: b('content') },
40
+ React.createElement("div", { className: b('content-wrapper', {
41
+ margin: Boolean((activeTabData === null || activeTabData === void 0 ? void 0 : activeTabData.media) || imageProps),
42
+ }) },
43
+ React.createElement("h4", { className: b('content-title') },
44
+ React.createElement(YFMWrapper, { content: activeTabData.title, modifiers: { constructor: true } })),
45
+ React.createElement(YFMWrapper, { content: activeTabData.text, modifiers: { constructor: true } }),
46
+ React.createElement(Links, { links: [
47
+ ...(activeTabData.link ? [activeTabData.link] : []),
48
+ ...(activeTabData.links || []),
49
+ ], className: b('link') })))))));
52
50
  };
53
51
  export default TabsBlock;
@@ -1,6 +1,5 @@
1
1
  import { CSSProperties, MouseEventHandler } from 'react';
2
2
  import { ImageDeviceProps, ImageObjectProps } from '../../models';
3
- import './Image.css';
4
3
  export interface ImageProps extends Partial<ImageObjectProps>, Partial<ImageDeviceProps> {
5
4
  style?: CSSProperties;
6
5
  className?: string;
@@ -1,9 +1,6 @@
1
1
  import React, { useContext, useState, Fragment } from 'react';
2
2
  import { ProjectSettingsContext } from '../../context/projectSettingsContext';
3
3
  import { BREAKPOINTS } from '../../constants';
4
- import { block } from '../../utils';
5
- import './Image.css';
6
- const b = block('Image');
7
4
  const checkWebP = (src) => {
8
5
  return src.endsWith('.webp') ? src : src + '.webp';
9
6
  };
@@ -20,7 +17,7 @@ const Image = (props) => {
20
17
  disableCompress ||
21
18
  imageSrc.endsWith('.svg') ||
22
19
  imgLoadingError;
23
- return (React.createElement("picture", { className: b() },
20
+ return (React.createElement("picture", null,
24
21
  mobile && (React.createElement(Fragment, null,
25
22
  !disableWebp && (React.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${BREAKPOINTS.sm}px)` })),
26
23
  React.createElement("source", { srcSet: mobile, media: `(max-width: ${BREAKPOINTS.sm}px)` }))),
@@ -50,7 +50,7 @@ const VideoBlock = (props) => {
50
50
  }, [src, attributes]);
51
51
  useEffect(() => {
52
52
  const updateSize = _.debounce(() => {
53
- setHeight(ref.current ? Math.floor(getHeight(ref.current.offsetWidth)) : undefined);
53
+ setHeight(ref.current ? Math.round(getHeight(ref.current.offsetWidth)) : undefined);
54
54
  }, 100);
55
55
  updateSize();
56
56
  window.addEventListener('resize', updateSize);
@@ -11,7 +11,7 @@ export declare const blockMap: {
11
11
  "info-block": (props: import("./models").InfoBlockProps) => JSX.Element;
12
12
  "security-block": (props: import("./models").SecurityBlockProps) => JSX.Element;
13
13
  "table-block": (props: import("./models").TableBlockProps) => JSX.Element;
14
- "tabs-block": ({ items, title, description, animated, tabsColSizes, centered, direction, }: import("./models").TabsBlockProps) => JSX.Element;
14
+ "tabs-block": ({ items, title, description, animated }: import("./models").TabsBlockProps) => JSX.Element;
15
15
  "link-table-block": ({ items, title, description, linkTheme }: import("./models").LinkTableBlockProps) => JSX.Element;
16
16
  "header-block": (props: import("./models").WithChildren<import("./models").HeaderBlockProps & import("./models").ClassNameProps>) => JSX.Element;
17
17
  "icons-block": ({ title, size, items }: import("./models").IconsBlockProps) => JSX.Element;
@@ -114,14 +114,12 @@ export interface SimpleBlockProps extends Animatable, Childable {
114
114
  title: TitleBaseProps;
115
115
  description: string;
116
116
  }
117
- export interface ExtendedFeaturesItem {
118
- title?: string;
119
- text?: string;
117
+ export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' | 'centered' | 'colSizes' | 'size' | 'title'> {
118
+ title: string;
120
119
  label?: string;
121
120
  icon?: ThemedImage;
122
121
  /** @deprecated **/
123
122
  link?: LinkProps;
124
- links?: LinkProps[];
125
123
  }
126
124
  export interface ExtendedFeaturesProps extends Animatable {
127
125
  items: ExtendedFeaturesItem[];
@@ -221,21 +219,18 @@ export interface TableBlockProps {
221
219
  title: string;
222
220
  table: TableProps;
223
221
  }
224
- export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'> {
222
+ export interface TabsBlockItem {
225
223
  tabName: string;
226
- /**
227
- * @deprecated Use array links from ContentBlockProps instead
228
- */
224
+ title: string;
225
+ text: string;
229
226
  link?: LinkProps;
230
227
  image?: ThemedImage;
231
228
  disableCompress?: boolean;
232
229
  caption?: string;
233
230
  media?: ThemedMediaProps;
231
+ links?: LinkProps[];
234
232
  }
235
233
  export interface TabsBlockProps extends BlockHeaderProps, Animatable {
236
- tabsColSizes?: GridColumnSizesType;
237
- centered?: boolean;
238
- direction?: MediaDirection;
239
234
  items: TabsBlockItem[];
240
235
  }
241
236
  export interface LinkTableBlockProps extends BlockHeaderProps {
@@ -19,6 +19,7 @@ export const createItemsParser = (fields) => (transformer, items) => items.map((
19
19
  }, {}));
20
20
  }
21
21
  });
22
+ const parseItems = createItemsParser(['title', 'text']);
22
23
  function parseTableBlock(transformer, content) {
23
24
  const legend = content === null || content === void 0 ? void 0 : content.legend;
24
25
  return Object.assign(Object.assign({}, (content || {})), { legend: legend && legend.map((string) => transformer(string)) });
@@ -44,13 +45,9 @@ function parseSlider(transformer, block) {
44
45
  }
45
46
  const parseTitle = (transformer, title) => typeof title === 'object' && 'text' in title
46
47
  ? Object.assign(Object.assign({}, title), { text: transformer(title.text) }) : title && transformer(title);
47
- const parseItemsTitle = (transformer, items) => items.map((_a) => {
48
- var { title } = _a, rest = __rest(_a, ["title"]);
49
- return (Object.assign({ title: title && parseTitle(transformer, title) }, rest));
50
- });
51
48
  function parsePriceDetailedBlock(transformer, block) {
52
49
  const { priceType } = block;
53
- block.items = block.items.map((item) => {
50
+ const transformedBlockItems = block.items.map((item) => {
54
51
  const { description, items: details = [] } = item;
55
52
  if (priceType === 'marked-list') {
56
53
  item.items = details.map((detail) => {
@@ -67,6 +64,7 @@ function parsePriceDetailedBlock(transformer, block) {
67
64
  item.description = transformer(description);
68
65
  return item;
69
66
  });
67
+ block.items = transformedBlockItems;
70
68
  return block;
71
69
  }
72
70
  const parseContentLayout = (transformer, content) => {
@@ -222,12 +220,7 @@ const config = {
222
220
  {
223
221
  fields: ['items'],
224
222
  transformer: yfmTransformer,
225
- parser: createItemsParser(['text', 'additionalInfo']),
226
- },
227
- {
228
- fields: ['items'],
229
- transformer: typografTransformer,
230
- parser: parseItemsTitle,
223
+ parser: parseItems,
231
224
  },
232
225
  ],
233
226
  [BlockType.TableBlock]: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "1.7.0-alpha.7",
3
+ "version": "1.7.1",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -57,7 +57,7 @@
57
57
  "typograf": "^6.14.0"
58
58
  },
59
59
  "peerDependencies": {
60
- "react": "^16.0.0",
60
+ "react": "^16.0.0 || ^17.0.0",
61
61
  "@gravity-ui/uikit": "^3.0.1",
62
62
  "@doc-tools/transform": "^2.6.1"
63
63
  },
@@ -121,8 +121,5 @@
121
121
  "*.{json,yaml,yml,md}": [
122
122
  "prettier --write"
123
123
  ]
124
- },
125
- "publishConfig": {
126
- "tag": "alpha"
127
124
  }
128
125
  }
@@ -114,14 +114,12 @@ export interface SimpleBlockProps extends Animatable, Childable {
114
114
  title: TitleBaseProps;
115
115
  description: string;
116
116
  }
117
- export interface ExtendedFeaturesItem {
118
- title?: string;
119
- text?: string;
117
+ export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' | 'centered' | 'colSizes' | 'size' | 'title'> {
118
+ title: string;
120
119
  label?: string;
121
120
  icon?: ThemedImage;
122
121
  /** @deprecated **/
123
122
  link?: LinkProps;
124
- links?: LinkProps[];
125
123
  }
126
124
  export interface ExtendedFeaturesProps extends Animatable {
127
125
  items: ExtendedFeaturesItem[];
@@ -221,21 +219,18 @@ export interface TableBlockProps {
221
219
  title: string;
222
220
  table: TableProps;
223
221
  }
224
- export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'> {
222
+ export interface TabsBlockItem {
225
223
  tabName: string;
226
- /**
227
- * @deprecated Use array links from ContentBlockProps instead
228
- */
224
+ title: string;
225
+ text: string;
229
226
  link?: LinkProps;
230
227
  image?: ThemedImage;
231
228
  disableCompress?: boolean;
232
229
  caption?: string;
233
230
  media?: ThemedMediaProps;
231
+ links?: LinkProps[];
234
232
  }
235
233
  export interface TabsBlockProps extends BlockHeaderProps, Animatable {
236
- tabsColSizes?: GridColumnSizesType;
237
- centered?: boolean;
238
- direction?: MediaDirection;
239
234
  items: TabsBlockItem[];
240
235
  }
241
236
  export interface LinkTableBlockProps extends BlockHeaderProps {
@@ -36,6 +36,7 @@ const createItemsParser = (fields) => (transformer, items) => items.map((item) =
36
36
  }
37
37
  });
38
38
  exports.createItemsParser = createItemsParser;
39
+ const parseItems = (0, exports.createItemsParser)(['title', 'text']);
39
40
  function parseTableBlock(transformer, content) {
40
41
  const legend = content === null || content === void 0 ? void 0 : content.legend;
41
42
  return Object.assign(Object.assign({}, (content || {})), { legend: legend && legend.map((string) => transformer(string)) });
@@ -61,13 +62,9 @@ function parseSlider(transformer, block) {
61
62
  }
62
63
  const parseTitle = (transformer, title) => typeof title === 'object' && 'text' in title
63
64
  ? Object.assign(Object.assign({}, title), { text: transformer(title.text) }) : title && transformer(title);
64
- const parseItemsTitle = (transformer, items) => items.map((_a) => {
65
- var { title } = _a, rest = __rest(_a, ["title"]);
66
- return (Object.assign({ title: title && parseTitle(transformer, title) }, rest));
67
- });
68
65
  function parsePriceDetailedBlock(transformer, block) {
69
66
  const { priceType } = block;
70
- block.items = block.items.map((item) => {
67
+ const transformedBlockItems = block.items.map((item) => {
71
68
  const { description, items: details = [] } = item;
72
69
  if (priceType === 'marked-list') {
73
70
  item.items = details.map((detail) => {
@@ -84,6 +81,7 @@ function parsePriceDetailedBlock(transformer, block) {
84
81
  item.description = transformer(description);
85
82
  return item;
86
83
  });
84
+ block.items = transformedBlockItems;
87
85
  return block;
88
86
  }
89
87
  const parseContentLayout = (transformer, content) => {
@@ -241,12 +239,7 @@ const config = {
241
239
  {
242
240
  fields: ['items'],
243
241
  transformer: yfmTransformer,
244
- parser: (0, exports.createItemsParser)(['text', 'additionalInfo']),
245
- },
246
- {
247
- fields: ['items'],
248
- transformer: typografTransformer,
249
- parser: parseItemsTitle,
242
+ parser: parseItems,
250
243
  },
251
244
  ],
252
245
  [models_1.BlockType.TableBlock]: [
@@ -1,12 +0,0 @@
1
- /* use this for style redefinitions to awoid problems with
2
- unpredictable css rules order in build */
3
- .pc-button-tabs {
4
- margin-bottom: 20px;
5
- }
6
- .pc-button-tabs__item {
7
- margin-right: 8px;
8
- margin-bottom: 12px;
9
- }
10
- .pc-button-tabs__item_active {
11
- pointer-events: none;
12
- }
@@ -1,13 +0,0 @@
1
- import { ButtonProps } from '../../models';
2
- export interface ButtonTabsItemProps extends Omit<ButtonProps, 'url' | 'primary' | 'target' | 'text'> {
3
- id: string;
4
- title: string;
5
- }
6
- export interface ButtonTabsProps {
7
- className?: string;
8
- items: ButtonTabsItemProps[];
9
- activeTab?: string;
10
- onSelectTab?: (tabId: string) => void;
11
- }
12
- declare const ButtonTabs: (props: ButtonTabsProps) => JSX.Element;
13
- export default ButtonTabs;
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const react_1 = (0, tslib_1.__importStar)(require("react"));
5
- const utils_1 = require("../../utils");
6
- const index_1 = require("../index");
7
- const b = (0, utils_1.block)('button-tabs');
8
- const ButtonTabs = (props) => {
9
- const { className, items, activeTab, onSelectTab } = props;
10
- // const isMobile = useContext(MobileContext);
11
- const activeTabId = (0, react_1.useMemo)(() => {
12
- if (activeTab) {
13
- return activeTab;
14
- }
15
- return items[0].id;
16
- }, [activeTab, items]);
17
- const handleClick = (0, react_1.useCallback)((tabId) => {
18
- if (onSelectTab) {
19
- onSelectTab(tabId);
20
- }
21
- }, [onSelectTab]);
22
- return (react_1.default.createElement("div", { className: b(null, className) }, items.map((item) => {
23
- const isActive = item.id === activeTabId;
24
- return (react_1.default.createElement(index_1.Button, { text: item.title, className: b('item', { active: isActive }), key: item.title, size: 'l', onClick: () => handleClick(item.id), theme: isActive ? 'monochrome' : 'normal' }));
25
- })));
26
- };
27
- exports.default = ButtonTabs;
@@ -1,3 +0,0 @@
1
- .pc-Image {
2
- height: 100%;
3
- }
@@ -1,12 +0,0 @@
1
- /* use this for style redefinitions to awoid problems with
2
- unpredictable css rules order in build */
3
- .pc-button-tabs {
4
- margin-bottom: 20px;
5
- }
6
- .pc-button-tabs__item {
7
- margin-right: 8px;
8
- margin-bottom: 12px;
9
- }
10
- .pc-button-tabs__item_active {
11
- pointer-events: none;
12
- }
@@ -1,14 +0,0 @@
1
- import { ButtonProps } from '../../models';
2
- import './ButtonTabs.css';
3
- export interface ButtonTabsItemProps extends Omit<ButtonProps, 'url' | 'primary' | 'target' | 'text'> {
4
- id: string;
5
- title: string;
6
- }
7
- export interface ButtonTabsProps {
8
- className?: string;
9
- items: ButtonTabsItemProps[];
10
- activeTab?: string;
11
- onSelectTab?: (tabId: string) => void;
12
- }
13
- declare const ButtonTabs: (props: ButtonTabsProps) => JSX.Element;
14
- export default ButtonTabs;
@@ -1,25 +0,0 @@
1
- import React, { useCallback, useMemo } from 'react';
2
- import { block } from '../../utils';
3
- import { Button } from '../index';
4
- import './ButtonTabs.css';
5
- const b = block('button-tabs');
6
- const ButtonTabs = (props) => {
7
- const { className, items, activeTab, onSelectTab } = props;
8
- // const isMobile = useContext(MobileContext);
9
- const activeTabId = useMemo(() => {
10
- if (activeTab) {
11
- return activeTab;
12
- }
13
- return items[0].id;
14
- }, [activeTab, items]);
15
- const handleClick = useCallback((tabId) => {
16
- if (onSelectTab) {
17
- onSelectTab(tabId);
18
- }
19
- }, [onSelectTab]);
20
- return (React.createElement("div", { className: b(null, className) }, items.map((item) => {
21
- const isActive = item.id === activeTabId;
22
- return (React.createElement(Button, { text: item.title, className: b('item', { active: isActive }), key: item.title, size: 'l', onClick: () => handleClick(item.id), theme: isActive ? 'monochrome' : 'normal' }));
23
- })));
24
- };
25
- export default ButtonTabs;
@@ -1,3 +0,0 @@
1
- .pc-Image {
2
- height: 100%;
3
- }