@gravity-ui/page-constructor 1.7.0-alpha.9 → 1.7.1-alpha.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 (130) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +36 -58
  3. package/build/cjs/blocks/ExtendedFeatures/ExtendedFeatures.js +2 -2
  4. package/build/cjs/blocks/Tabs/Tabs.css +57 -24
  5. package/build/cjs/blocks/Tabs/Tabs.d.ts +1 -1
  6. package/build/cjs/blocks/Tabs/Tabs.js +29 -27
  7. package/build/cjs/components/ButtonTabs/ButtonTabs.css +12 -0
  8. package/build/cjs/components/ButtonTabs/ButtonTabs.d.ts +13 -0
  9. package/build/cjs/components/ButtonTabs/ButtonTabs.js +26 -0
  10. package/build/cjs/components/Image/Image.css +4 -0
  11. package/build/cjs/components/Image/Image.js +3 -1
  12. package/build/cjs/components/OverflowScroller/OverflowScroller.css +0 -2
  13. package/build/cjs/components/RouterLink/RouterLink.d.ts +0 -1
  14. package/build/cjs/components/VideoBlock/VideoBlock.js +1 -1
  15. package/build/cjs/components/index.d.ts +0 -2
  16. package/build/cjs/components/index.js +39 -40
  17. package/build/cjs/constructor-items.d.ts +1 -1
  18. package/build/cjs/containers/PageConstructor/PageConstructor.d.ts +2 -3
  19. package/build/cjs/containers/PageConstructor/PageConstructor.js +10 -12
  20. package/build/cjs/context/locationContext/locationContext.d.ts +0 -1
  21. package/build/cjs/icons/index.d.ts +0 -3
  22. package/build/cjs/icons/index.js +0 -3
  23. package/build/cjs/models/constructor-items/blocks.d.ts +9 -8
  24. package/build/cjs/models/index.d.ts +0 -1
  25. package/build/cjs/models/index.js +0 -1
  26. package/build/cjs/text-transform/blocks.js +11 -4
  27. package/build/cjs/text-transform/utils.js +1 -1
  28. package/build/esm/blocks/ExtendedFeatures/ExtendedFeatures.js +2 -2
  29. package/build/esm/blocks/Tabs/Tabs.css +57 -24
  30. package/build/esm/blocks/Tabs/Tabs.d.ts +1 -1
  31. package/build/esm/blocks/Tabs/Tabs.js +29 -27
  32. package/build/esm/components/ButtonTabs/ButtonTabs.css +12 -0
  33. package/build/esm/components/ButtonTabs/ButtonTabs.d.ts +14 -0
  34. package/build/esm/components/ButtonTabs/ButtonTabs.js +24 -0
  35. package/build/esm/components/Image/Image.css +4 -0
  36. package/build/esm/components/Image/Image.d.ts +1 -0
  37. package/build/esm/components/Image/Image.js +4 -1
  38. package/build/esm/components/OverflowScroller/OverflowScroller.css +0 -2
  39. package/build/esm/components/RouterLink/RouterLink.d.ts +0 -1
  40. package/build/esm/components/VideoBlock/VideoBlock.js +1 -1
  41. package/build/esm/components/index.d.ts +0 -2
  42. package/build/esm/components/index.js +0 -2
  43. package/build/esm/constructor-items.d.ts +1 -1
  44. package/build/esm/containers/PageConstructor/PageConstructor.d.ts +2 -3
  45. package/build/esm/containers/PageConstructor/PageConstructor.js +10 -12
  46. package/build/esm/context/locationContext/locationContext.d.ts +0 -1
  47. package/build/esm/icons/index.d.ts +0 -3
  48. package/build/esm/icons/index.js +0 -3
  49. package/build/esm/models/constructor-items/blocks.d.ts +9 -8
  50. package/build/esm/models/index.d.ts +0 -1
  51. package/build/esm/models/index.js +0 -1
  52. package/build/esm/text-transform/blocks.js +11 -4
  53. package/build/esm/text-transform/utils.js +1 -1
  54. package/package.json +5 -2
  55. package/server/models/constructor-items/blocks.d.ts +9 -8
  56. package/server/models/index.d.ts +0 -1
  57. package/server/models/index.js +0 -1
  58. package/server/text-transform/blocks.js +11 -4
  59. package/server/text-transform/utils.js +1 -1
  60. package/styles/mixins.scss +0 -38
  61. package/build/cjs/components/navigation/components/Header/Header.css +0 -85
  62. package/build/cjs/components/navigation/components/Header/Header.d.ts +0 -8
  63. package/build/cjs/components/navigation/components/Header/Header.js +0 -51
  64. package/build/cjs/components/navigation/components/Logo/Logo.css +0 -23
  65. package/build/cjs/components/navigation/components/Logo/Logo.d.ts +0 -7
  66. package/build/cjs/components/navigation/components/Logo/Logo.js +0 -17
  67. package/build/cjs/components/navigation/components/MobileNavigation/MobileNavigation.css +0 -58
  68. package/build/cjs/components/navigation/components/MobileNavigation/MobileNavigation.d.ts +0 -13
  69. package/build/cjs/components/navigation/components/MobileNavigation/MobileNavigation.js +0 -45
  70. package/build/cjs/components/navigation/components/Navigation/Navigation.css +0 -43
  71. package/build/cjs/components/navigation/components/Navigation/Navigation.d.ts +0 -18
  72. package/build/cjs/components/navigation/components/Navigation/Navigation.js +0 -69
  73. package/build/cjs/components/navigation/components/NavigationItem/NavigationItem.css +0 -41
  74. package/build/cjs/components/navigation/components/NavigationItem/NavigationItem.d.ts +0 -10
  75. package/build/cjs/components/navigation/components/NavigationItem/NavigationItem.js +0 -59
  76. package/build/cjs/components/navigation/components/NavigationPopup/NavigationPopup.css +0 -33
  77. package/build/cjs/components/navigation/components/NavigationPopup/NavigationPopup.d.ts +0 -10
  78. package/build/cjs/components/navigation/components/NavigationPopup/NavigationPopup.js +0 -45
  79. package/build/cjs/components/navigation/components/SocialIcon/SocialIcon.css +0 -20
  80. package/build/cjs/components/navigation/components/SocialIcon/SocialIcon.d.ts +0 -7
  81. package/build/cjs/components/navigation/components/SocialIcon/SocialIcon.js +0 -14
  82. package/build/cjs/components/navigation/components/index.d.ts +0 -7
  83. package/build/cjs/components/navigation/components/index.js +0 -20
  84. package/build/cjs/components/navigation/containers/Layout/Layout.css +0 -10
  85. package/build/cjs/components/navigation/containers/Layout/Layout.d.ts +0 -8
  86. package/build/cjs/components/navigation/containers/Layout/Layout.js +0 -11
  87. package/build/cjs/icons/NavigationArrow.d.ts +0 -2
  88. package/build/cjs/icons/NavigationArrow.js +0 -9
  89. package/build/cjs/icons/NavigationClose.d.ts +0 -2
  90. package/build/cjs/icons/NavigationClose.js +0 -9
  91. package/build/cjs/icons/NavigationOpen.d.ts +0 -2
  92. package/build/cjs/icons/NavigationOpen.js +0 -11
  93. package/build/cjs/models/navigation.d.ts +0 -62
  94. package/build/cjs/models/navigation.js +0 -10
  95. package/build/esm/components/navigation/components/Header/Header.css +0 -85
  96. package/build/esm/components/navigation/components/Header/Header.d.ts +0 -9
  97. package/build/esm/components/navigation/components/Header/Header.js +0 -47
  98. package/build/esm/components/navigation/components/Logo/Logo.css +0 -23
  99. package/build/esm/components/navigation/components/Logo/Logo.d.ts +0 -8
  100. package/build/esm/components/navigation/components/Logo/Logo.js +0 -15
  101. package/build/esm/components/navigation/components/MobileNavigation/MobileNavigation.css +0 -58
  102. package/build/esm/components/navigation/components/MobileNavigation/MobileNavigation.d.ts +0 -14
  103. package/build/esm/components/navigation/components/MobileNavigation/MobileNavigation.js +0 -43
  104. package/build/esm/components/navigation/components/Navigation/Navigation.css +0 -43
  105. package/build/esm/components/navigation/components/Navigation/Navigation.d.ts +0 -19
  106. package/build/esm/components/navigation/components/Navigation/Navigation.js +0 -68
  107. package/build/esm/components/navigation/components/NavigationItem/NavigationItem.css +0 -41
  108. package/build/esm/components/navigation/components/NavigationItem/NavigationItem.d.ts +0 -11
  109. package/build/esm/components/navigation/components/NavigationItem/NavigationItem.js +0 -58
  110. package/build/esm/components/navigation/components/NavigationPopup/NavigationPopup.css +0 -33
  111. package/build/esm/components/navigation/components/NavigationPopup/NavigationPopup.d.ts +0 -11
  112. package/build/esm/components/navigation/components/NavigationPopup/NavigationPopup.js +0 -41
  113. package/build/esm/components/navigation/components/SocialIcon/SocialIcon.css +0 -20
  114. package/build/esm/components/navigation/components/SocialIcon/SocialIcon.d.ts +0 -8
  115. package/build/esm/components/navigation/components/SocialIcon/SocialIcon.js +0 -12
  116. package/build/esm/components/navigation/components/index.d.ts +0 -7
  117. package/build/esm/components/navigation/components/index.js +0 -7
  118. package/build/esm/components/navigation/containers/Layout/Layout.css +0 -10
  119. package/build/esm/components/navigation/containers/Layout/Layout.d.ts +0 -9
  120. package/build/esm/components/navigation/containers/Layout/Layout.js +0 -9
  121. package/build/esm/icons/NavigationArrow.d.ts +0 -2
  122. package/build/esm/icons/NavigationArrow.js +0 -4
  123. package/build/esm/icons/NavigationClose.d.ts +0 -2
  124. package/build/esm/icons/NavigationClose.js +0 -4
  125. package/build/esm/icons/NavigationOpen.d.ts +0 -2
  126. package/build/esm/icons/NavigationOpen.js +0 -6
  127. package/build/esm/models/navigation.d.ts +0 -62
  128. package/build/esm/models/navigation.js +0 -7
  129. package/server/models/navigation.d.ts +0 -62
  130. package/server/models/navigation.js +0 -10
@@ -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 }: import("./models").TabsBlockProps) => JSX.Element;
14
+ "tabs-block": ({ items, title, description, animated, tabsColSizes, centered, direction, }: 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;
@@ -1,14 +1,13 @@
1
1
  import React from 'react';
2
- import '@doc-tools/transform/dist/js/yfm';
3
- import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems, NavigationData } from '../../models';
2
+ import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems } from '../../models';
4
3
  import { blockMap, subBlockMap } from '../../constructor-items';
4
+ import '@doc-tools/transform/dist/js/yfm';
5
5
  export declare type ItemMap = typeof blockMap & typeof subBlockMap & CustomItems;
6
6
  export interface PageConstructorProps {
7
7
  content?: PageContent;
8
8
  shouldRenderBlock?: ShouldRenderBlock;
9
9
  custom?: CustomConfig;
10
10
  renderMenu?: () => React.ReactNode;
11
- navigation?: NavigationData;
12
11
  }
13
12
  export declare const Constructor: (props: PageConstructorProps) => JSX.Element;
14
13
  export declare const PageConstructor: (props: PageConstructorProps) => JSX.Element;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PageConstructor = exports.Constructor = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = (0, tslib_1.__importStar)(require("react"));
6
- require("@doc-tools/transform/dist/js/yfm");
7
6
  const models_1 = require("../../models");
8
7
  const constructor_items_1 = require("../../constructor-items");
9
8
  const grid_1 = require("../../grid");
@@ -16,7 +15,7 @@ const ConstructorRow_1 = require("./components/ConstructorRow");
16
15
  const ConstructorFootnotes_1 = require("./components/ConstructorFootnotes");
17
16
  const ConstructorItem_1 = require("./components/ConstructorItem");
18
17
  const ConstructorBlocks_1 = require("./components/ConstructorBlocks");
19
- const Layout_1 = (0, tslib_1.__importDefault)(require("../../components/navigation/containers/Layout/Layout"));
18
+ require("@doc-tools/transform/dist/js/yfm");
20
19
  const b = (0, utils_1.block)('page-constructor');
21
20
  const Constructor = (props) => {
22
21
  const { context, headerBlockTypes } = (0, react_1.useMemo)(() => {
@@ -31,7 +30,7 @@ const Constructor = (props) => {
31
30
  });
32
31
  }, [props.custom]);
33
32
  const { themeValue: theme } = (0, react_1.useContext)(ThemeValueContext_1.ThemeValueContext);
34
- const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, navigation, } = props;
33
+ const { content: { blocks = [], background = {}, footnotes = [] } = {}, renderMenu, shouldRenderBlock, } = props;
35
34
  const hasFootnotes = footnotes.length > 0;
36
35
  const isHeaderBlock = (block) => headerBlockTypes.includes(block.type);
37
36
  const header = blocks === null || blocks === void 0 ? void 0 : blocks.find(isHeaderBlock);
@@ -40,15 +39,14 @@ const Constructor = (props) => {
40
39
  return (react_1.default.createElement(innerContext_1.InnerContext.Provider, { value: context },
41
40
  react_1.default.createElement("div", { className: b() },
42
41
  react_1.default.createElement("div", { className: b('wrapper') },
43
- themedBackground && (react_1.default.createElement(BackgroundMedia_1.default, Object.assign({}, themedBackground, { className: b('background') }))),
44
- react_1.default.createElement(Layout_1.default, { navigation: navigation },
45
- renderMenu && renderMenu(),
46
- header && react_1.default.createElement(ConstructorItem_1.ConstructorHeader, { data: header }),
47
- react_1.default.createElement(grid_1.Grid, null,
48
- restBlocks && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
49
- react_1.default.createElement(ConstructorBlocks_1.ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
50
- hasFootnotes && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
51
- react_1.default.createElement(ConstructorFootnotes_1.ConstructorFootnotes, { items: footnotes })))))))));
42
+ react_1.default.createElement(BackgroundMedia_1.default, Object.assign({}, themedBackground, { className: b('background') })),
43
+ renderMenu && renderMenu(),
44
+ header && react_1.default.createElement(ConstructorItem_1.ConstructorHeader, { data: header }),
45
+ react_1.default.createElement(grid_1.Grid, null,
46
+ restBlocks && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
47
+ react_1.default.createElement(ConstructorBlocks_1.ConstructorBlocks, { items: restBlocks, shouldRenderBlock: shouldRenderBlock }))),
48
+ hasFootnotes && (react_1.default.createElement(ConstructorRow_1.ConstructorRow, null,
49
+ react_1.default.createElement(ConstructorFootnotes_1.ConstructorFootnotes, { items: footnotes }))))))));
52
50
  };
53
51
  exports.Constructor = Constructor;
54
52
  const PageConstructor = (props) => {
@@ -16,6 +16,5 @@ export declare type LocationContextProps = {
16
16
  pathname?: string;
17
17
  hostname?: string;
18
18
  Link?: RouterLink;
19
- asPath?: string;
20
19
  };
21
20
  export declare const LocationContext: React.Context<LocationContextProps>;
@@ -6,6 +6,3 @@ export * from './Github';
6
6
  export * from './NavigationChevron';
7
7
  export * from './PlayVideo';
8
8
  export * from './PreviewClose';
9
- export * from './NavigationClose';
10
- export * from './NavigationOpen';
11
- export * from './NavigationArrow';
@@ -9,6 +9,3 @@ const tslib_1 = require("tslib");
9
9
  (0, tslib_1.__exportStar)(require("./NavigationChevron"), exports);
10
10
  (0, tslib_1.__exportStar)(require("./PlayVideo"), exports);
11
11
  (0, tslib_1.__exportStar)(require("./PreviewClose"), exports);
12
- (0, tslib_1.__exportStar)(require("./NavigationClose"), exports);
13
- (0, tslib_1.__exportStar)(require("./NavigationOpen"), exports);
14
- (0, tslib_1.__exportStar)(require("./NavigationArrow"), exports);
@@ -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,18 +219,21 @@ export interface TableBlockProps {
221
219
  title: string;
222
220
  table: TableProps;
223
221
  }
224
- export interface TabsBlockItem {
222
+ export interface TabsBlockItem extends Omit<ContentBlockProps, 'size' | 'colSizes' | 'centered' | 'theme'> {
225
223
  tabName: string;
226
- title: string;
227
- text: string;
224
+ /**
225
+ * @deprecated Use array links from ContentBlockProps instead
226
+ */
228
227
  link?: LinkProps;
229
228
  image?: ThemedImage;
230
229
  disableCompress?: boolean;
231
230
  caption?: string;
232
231
  media?: ThemedMediaProps;
233
- links?: LinkProps[];
234
232
  }
235
233
  export interface TabsBlockProps extends BlockHeaderProps, Animatable {
234
+ tabsColSizes?: GridColumnSizesType;
235
+ centered?: boolean;
236
+ direction?: MediaDirection;
236
237
  items: TabsBlockItem[];
237
238
  }
238
239
  export interface LinkTableBlockProps extends BlockHeaderProps {
@@ -4,4 +4,3 @@ export * from './common';
4
4
  export * from './components';
5
5
  export * from './guards';
6
6
  export * from './react';
7
- export * from './navigation';
@@ -7,4 +7,3 @@ const tslib_1 = require("tslib");
7
7
  (0, tslib_1.__exportStar)(require("./components"), exports);
8
8
  (0, tslib_1.__exportStar)(require("./guards"), exports);
9
9
  (0, tslib_1.__exportStar)(require("./react"), exports);
10
- (0, tslib_1.__exportStar)(require("./navigation"), exports);
@@ -23,7 +23,6 @@ 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']);
27
26
  function parseTableBlock(transformer, content) {
28
27
  const legend = content === null || content === void 0 ? void 0 : content.legend;
29
28
  return Object.assign(Object.assign({}, (content || {})), { legend: legend && legend.map((string) => transformer(string)) });
@@ -49,9 +48,13 @@ function parseSlider(transformer, block) {
49
48
  }
50
49
  const parseTitle = (transformer, title) => typeof title === 'object' && 'text' in title
51
50
  ? 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
+ });
52
55
  function parsePriceDetailedBlock(transformer, block) {
53
56
  const { priceType } = block;
54
- const transformedBlockItems = block.items.map((item) => {
57
+ block.items = block.items.map((item) => {
55
58
  const { description, items: details = [] } = item;
56
59
  if (priceType === 'marked-list') {
57
60
  item.items = details.map((detail) => {
@@ -68,7 +71,6 @@ function parsePriceDetailedBlock(transformer, block) {
68
71
  item.description = transformer(description);
69
72
  return item;
70
73
  });
71
- block.items = transformedBlockItems;
72
74
  return block;
73
75
  }
74
76
  const parseContentLayout = (transformer, content) => {
@@ -226,7 +228,12 @@ const config = {
226
228
  {
227
229
  fields: ['items'],
228
230
  transformer: yfmTransformer,
229
- parser: parseItems,
231
+ parser: (0, exports.createItemsParser)(['text', 'additionalInfo']),
232
+ },
233
+ {
234
+ fields: ['items'],
235
+ transformer: typografTransformer,
236
+ parser: parseItemsTitle,
230
237
  },
231
238
  ],
232
239
  [models_1.BlockType.TableBlock]: [
@@ -26,7 +26,7 @@ exports.DEFAULT_ALLOWED_TAGS = [
26
26
  ];
27
27
  exports.typografConfig = {
28
28
  enabled: ['common/nbsp/afterNumber', 'common/nbsp/afterParagraphMark'],
29
- disabled: ['common/symbols/cf'],
29
+ disabled: ['common/symbols/cf', 'ru/other/phone-number'],
30
30
  };
31
31
  exports.sanitizeStripOptions = {
32
32
  allowedTags: [],
@@ -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,68 +1,101 @@
1
- .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
1
+ .pc-tabs-block__content-title.pc-tabs-block__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-TabsBlock__block-title {
8
- margin-bottom: 12px;
7
+ .pc-tabs-block__block-title {
8
+ margin-bottom: 24px;
9
9
  }
10
- .pc-TabsBlock__tabs.pc-TabsBlock__tabs {
11
- flex-wrap: nowrap;
12
- overflow-x: auto;
13
- margin-bottom: 32px;
10
+ .pc-tabs-block__block-title_centered {
11
+ margin: 0 auto 12px;
12
+ text-align: center;
14
13
  }
15
-
16
- .pc-TabsBlock__image {
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;
20
+ }
21
+ .pc-tabs-block__row_reverse .pc-tabs-block__content-wrapper {
22
+ margin: 24px 32px 0 0;
23
+ }
24
+ .pc-tabs-block__image {
17
25
  width: 100%;
18
26
  height: auto;
19
27
  object-fit: cover;
20
28
  display: block;
21
29
  }
22
- .pc-TabsBlock__image, .pc-TabsBlock__media {
30
+ .pc-tabs-block__image, .pc-tabs-block__media {
23
31
  box-shadow: 0 2px 8px var(--pc-color-sfx-shadow), 0 4px 24px var(--pc-color-sfx-shadow);
24
32
  overflow-x: hidden;
25
33
  border-radius: var(--pc-border-radius);
26
34
  }
27
- .pc-TabsBlock__caption {
35
+ .pc-tabs-block__caption {
28
36
  font-size: var(--yc-text-body-2-font-size);
29
37
  line-height: var(--yc-text-body-2-line-height);
30
38
  margin: 12px 0 0;
31
39
  color: var(--yc-color-text-secondary);
32
40
  }
33
- .pc-TabsBlock__content {
41
+ .pc-tabs-block__content {
34
42
  display: flex;
35
43
  flex-direction: column;
36
44
  }
37
- .pc-TabsBlock__content-wrapper_margin {
45
+ .pc-tabs-block__content_centered {
46
+ margin: 0 auto;
47
+ }
48
+ .pc-tabs-block__col_centered {
49
+ margin: 0 auto;
50
+ }
51
+ .pc-tabs-block__content-wrapper_margin {
38
52
  margin: 24px 0 0 32px;
39
53
  }
40
- .pc-TabsBlock__content-title {
54
+ .pc-tabs-block__content-title {
41
55
  margin: 0 auto 12px;
42
56
  }
43
- .pc-TabsBlock__content-title.pc-TabsBlock__content-title > * {
57
+ .pc-tabs-block__content-title.pc-tabs-block__content-title > * {
44
58
  font-size: var(--yc-text-header-1-font-size);
45
59
  line-height: var(--yc-text-header-1-line-height);
46
60
  color: var(--pc-text-header-color);
47
61
  font-weight: var(--yc-text-accent-font-weight);
48
62
  }
49
63
 
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
- }
54
64
  @media (max-width: 769px) {
55
- .pc-TabsBlock__content-wrapper_margin {
65
+ .pc-tabs-block__tabs {
66
+ display: flex;
67
+ overflow: auto;
68
+ margin-left: -48px;
69
+ margin-right: -48px;
70
+ padding-left: 48px;
71
+ padding-right: 40px;
72
+ }
73
+ .pc-tabs-block__content-wrapper_margin {
56
74
  margin: 0 0 32px 0;
57
75
  }
76
+ .pc-tabs-block__row_reverse {
77
+ flex-direction: column-reverse;
78
+ }
79
+ .pc-tabs-block__row_reverse .pc-tabs-block__content > * {
80
+ margin-top: 32px;
81
+ padding-bottom: 0;
82
+ }
83
+ }
84
+ @media (max-width: 577px) {
85
+ .pc-tabs-block__tabs {
86
+ margin-left: -24px;
87
+ margin-right: -24px;
88
+ padding-left: 24px;
89
+ padding-right: 16px;
90
+ }
58
91
  }
59
92
  @media (min-width: 769px) {
60
- .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__media {
93
+ .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__media {
61
94
  position: relative;
62
95
  top: 100px;
63
96
  opacity: 0;
64
97
  }
65
- .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__media, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__media {
98
+ .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__media, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__media {
66
99
  top: 0;
67
100
  opacity: 1;
68
101
  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);
@@ -70,12 +103,12 @@ unpredictable css rules order in build */
70
103
  }
71
104
  }
72
105
  @media (min-width: 769px) {
73
- .pc-TabsBlock.pc-AnimateBlock .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock .pc-TabsBlock__image {
106
+ .pc-tabs-block.pc-AnimateBlock .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block .pc-tabs-block__image {
74
107
  position: relative;
75
108
  top: 100px;
76
109
  opacity: 0;
77
110
  }
78
- .pc-TabsBlock.pc-AnimateBlock.animate .pc-TabsBlock__image, .pc-AnimateBlock .pc-TabsBlock.animate .pc-TabsBlock__image {
111
+ .pc-tabs-block.pc-AnimateBlock.animate .pc-tabs-block__image, .pc-AnimateBlock .pc-tabs-block.animate .pc-tabs-block__image {
79
112
  top: 0;
80
113
  opacity: 1;
81
114
  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 }: TabsBlockProps) => JSX.Element;
3
+ export declare const TabsBlock: ({ items, title, description, animated, tabsColSizes, centered, direction, }: TabsBlockProps) => JSX.Element;
4
4
  export default TabsBlock;
@@ -1,51 +1,53 @@
1
1
  import React, { Fragment, useContext, useState } from 'react';
2
- import { Tabs } from '@gravity-ui/uikit';
3
2
  import { block, getThemedValue } from '../../utils';
4
3
  import { Row, Col, GridColumnOrderClasses } from '../../grid';
5
- import YFMWrapper from '../../components/YFMWrapper/YFMWrapper';
6
4
  import AnimateBlock from '../../components/AnimateBlock/AnimateBlock';
7
5
  import BlockHeader from '../../components/BlockHeader/BlockHeader';
8
6
  import FullScreenImage from '../../components/FullscreenImage/FullscreenImage';
9
7
  import Media from '../../components/Media/Media';
10
- import Links from '../../components/Link/Links';
11
8
  import { ThemeValueContext } from '../../context/theme/ThemeValueContext';
12
9
  import { getMediaImage } from '../../components/Media/Image/utils';
10
+ import ButtonTabs from '../../components/ButtonTabs/ButtonTabs';
11
+ import { Content } from '../../sub-blocks';
13
12
  import './Tabs.css';
14
- const b = block('TabsBlock');
15
- export const TabsBlock = ({ items, title, description, animated }) => {
13
+ const b = block('tabs-block');
14
+ export const TabsBlock = ({ items, title, description, animated, tabsColSizes, centered, direction = 'media-content', }) => {
16
15
  const [activeTab, setActiveTab] = useState(items[0].tabName);
17
16
  const [play, setPlay] = useState(false);
18
17
  const { themeValue: theme } = useContext(ThemeValueContext);
19
18
  const tabs = items.map(({ tabName }) => ({ title: tabName, id: tabName }));
20
19
  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))))));
27
44
  return (React.createElement(AnimateBlock, { className: b(), onScroll: () => setPlay(true), animate: animated },
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') })))))));
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))));
50
52
  };
51
53
  export default TabsBlock;
@@ -0,0 +1,12 @@
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
+ }
@@ -0,0 +1,14 @@
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;
@@ -0,0 +1,24 @@
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 activeTabId = useMemo(() => {
9
+ if (activeTab) {
10
+ return activeTab;
11
+ }
12
+ return items[0].id;
13
+ }, [activeTab, items]);
14
+ const handleClick = useCallback((tabId) => {
15
+ if (onSelectTab) {
16
+ onSelectTab(tabId);
17
+ }
18
+ }, [onSelectTab]);
19
+ return (React.createElement("div", { className: b(null, className) }, items.map((item) => {
20
+ const isActive = item.id === activeTabId;
21
+ 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' }));
22
+ })));
23
+ };
24
+ export default ButtonTabs;
@@ -0,0 +1,4 @@
1
+ .pc-Image {
2
+ height: 100%;
3
+ width: 100%;
4
+ }
@@ -1,5 +1,6 @@
1
1
  import { CSSProperties, MouseEventHandler } from 'react';
2
2
  import { ImageDeviceProps, ImageObjectProps } from '../../models';
3
+ import './Image.css';
3
4
  export interface ImageProps extends Partial<ImageObjectProps>, Partial<ImageDeviceProps> {
4
5
  style?: CSSProperties;
5
6
  className?: string;
@@ -1,6 +1,9 @@
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');
4
7
  const checkWebP = (src) => {
5
8
  return src.endsWith('.webp') ? src : src + '.webp';
6
9
  };
@@ -17,7 +20,7 @@ const Image = (props) => {
17
20
  disableCompress ||
18
21
  imageSrc.endsWith('.svg') ||
19
22
  imgLoadingError;
20
- return (React.createElement("picture", null,
23
+ return (React.createElement("picture", { className: b() },
21
24
  mobile && (React.createElement(Fragment, null,
22
25
  !disableWebp && (React.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${BREAKPOINTS.sm}px)` })),
23
26
  React.createElement("source", { srcSet: mobile, media: `(max-width: ${BREAKPOINTS.sm}px)` }))),
@@ -9,12 +9,10 @@
9
9
  .pc-overflow-scroller__scroller {
10
10
  position: absolute;
11
11
  z-index: 10;
12
- top: 0;
13
12
  display: flex;
14
13
  justify-content: flex-end;
15
14
  align-items: center;
16
15
  width: 32px;
17
- height: calc(100% - 1px);
18
16
  cursor: pointer;
19
17
  color: var(--yc-color-text-secondary);
20
18
  background: linear-gradient(to left, var(--yc-color-base-background) 70%, var(--pc-transparent) 100%) no-repeat;
@@ -1,7 +1,6 @@
1
1
  import { WithChildren } from '../../models';
2
2
  export interface RouterLinkProps {
3
3
  href: string;
4
- [key: string]: unknown;
5
4
  }
6
5
  declare const RouterLink: ({ href, children }: WithChildren<RouterLinkProps>) => JSX.Element;
7
6
  export default RouterLink;
@@ -50,7 +50,7 @@ const VideoBlock = (props) => {
50
50
  }, [src, attributes]);
51
51
  useEffect(() => {
52
52
  const updateSize = _.debounce(() => {
53
- setHeight(ref.current ? Math.round(getHeight(ref.current.offsetWidth)) : undefined);
53
+ setHeight(ref.current ? Math.floor(getHeight(ref.current.offsetWidth)) : undefined);
54
54
  }, 100);
55
55
  updateSize();
56
56
  window.addEventListener('resize', updateSize);
@@ -33,6 +33,4 @@ export { default as OverflowScroller } from './OverflowScroller/OverflowScroller
33
33
  export { default as Author } from './Author/Author';
34
34
  export { default as RouterLink } from './RouterLink/RouterLink';
35
35
  export { default as HTML } from './HTML/HTML';
36
- export { default as Header } from './navigation/components/Header/Header';
37
- export * as Navigation from './navigation/components/index';
38
36
  export type { RouterLinkProps } from './RouterLink/RouterLink';
@@ -33,5 +33,3 @@ export { default as OverflowScroller } from './OverflowScroller/OverflowScroller
33
33
  export { default as Author } from './Author/Author';
34
34
  export { default as RouterLink } from './RouterLink/RouterLink';
35
35
  export { default as HTML } from './HTML/HTML';
36
- export { default as Header } from './navigation/components/Header/Header';
37
- export * as Navigation from './navigation/components/index';
@@ -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 }: import("./models").TabsBlockProps) => JSX.Element;
14
+ "tabs-block": ({ items, title, description, animated, tabsColSizes, centered, direction, }: 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;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import '@doc-tools/transform/dist/js/yfm';
3
- import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems, NavigationData } from '../../models';
2
+ import { ShouldRenderBlock, CustomConfig, PageContent, CustomItems } from '../../models';
4
3
  import { blockMap, subBlockMap } from '../../constructor-items';
4
+ import '@doc-tools/transform/dist/js/yfm';
5
5
  import './PageConstructor.css';
6
6
  export declare type ItemMap = typeof blockMap & typeof subBlockMap & CustomItems;
7
7
  export interface PageConstructorProps {
@@ -9,7 +9,6 @@ export interface PageConstructorProps {
9
9
  shouldRenderBlock?: ShouldRenderBlock;
10
10
  custom?: CustomConfig;
11
11
  renderMenu?: () => React.ReactNode;
12
- navigation?: NavigationData;
13
12
  }
14
13
  export declare const Constructor: (props: PageConstructorProps) => JSX.Element;
15
14
  export declare const PageConstructor: (props: PageConstructorProps) => JSX.Element;