@gravity-ui/page-constructor 3.0.0-alpha.4 → 3.0.0-alpha.6

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 +34 -0
  2. package/build/cjs/components/BackgroundImage/BackgroundImage.js +2 -2
  3. package/build/cjs/components/BlockBase/BlockBase.d.ts +3 -2
  4. package/build/cjs/components/BlockBase/BlockBase.js +4 -2
  5. package/build/cjs/components/Button/Button.css +3 -0
  6. package/build/cjs/components/Button/Button.js +5 -4
  7. package/build/cjs/components/Image/Image.d.ts +1 -0
  8. package/build/cjs/components/Image/Image.js +2 -2
  9. package/build/cjs/containers/Loadable/Loadable.d.ts +2 -2
  10. package/build/cjs/containers/PageConstructor/PageConstructor.js +5 -3
  11. package/build/cjs/containers/PageConstructor/components/ConstructorBlocks/ConstructorBlocks.js +3 -2
  12. package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.d.ts +1 -1
  13. package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +5 -5
  14. package/build/cjs/context/innerContext/InnerContext.d.ts +2 -1
  15. package/build/cjs/customization/BlockDecoration.d.ts +3 -0
  16. package/build/cjs/customization/BlockDecoration.js +22 -0
  17. package/build/cjs/editor/Components/AddBlock/AddBlock.css +82 -0
  18. package/build/cjs/editor/Components/AddBlock/AddBlock.d.ts +7 -0
  19. package/build/cjs/editor/Components/AddBlock/AddBlock.js +43 -0
  20. package/build/cjs/editor/Components/EditBlock/EditBlock.css +47 -0
  21. package/build/cjs/editor/Components/EditBlock/EditBlock.d.ts +4 -0
  22. package/build/cjs/editor/Components/EditBlock/EditBlock.js +32 -0
  23. package/build/cjs/editor/Containers/Editor.d.ts +2 -0
  24. package/build/cjs/editor/Containers/Editor.js +24 -0
  25. package/build/cjs/editor/data/index.d.ts +13 -0
  26. package/build/cjs/editor/data/index.js +27 -0
  27. package/build/cjs/editor/data/previews/default-preview.d.ts +3 -0
  28. package/build/cjs/editor/data/previews/default-preview.js +18 -0
  29. package/build/cjs/editor/data/previews/header-block.d.ts +3 -0
  30. package/build/cjs/editor/data/previews/header-block.js +19 -0
  31. package/build/cjs/editor/index.d.ts +2 -0
  32. package/build/cjs/editor/index.js +7 -0
  33. package/build/cjs/editor/store/index.d.ts +15 -0
  34. package/build/cjs/editor/store/index.js +32 -0
  35. package/build/cjs/editor/store/reducer.d.ts +41 -0
  36. package/build/cjs/editor/store/reducer.js +59 -0
  37. package/build/cjs/editor/store/utils.d.ts +12 -0
  38. package/build/cjs/editor/store/utils.js +34 -0
  39. package/build/cjs/editor/styles/mixins.css +0 -0
  40. package/build/cjs/editor/styles/variables.css +0 -0
  41. package/build/cjs/editor/types/index.d.ts +17 -0
  42. package/build/cjs/editor/types/index.js +2 -0
  43. package/build/cjs/editor/utils/index.d.ts +11 -0
  44. package/build/cjs/editor/utils/index.js +12 -0
  45. package/build/cjs/hooks/useMetrika.js +0 -7
  46. package/build/cjs/models/constructor-items/blocks.d.ts +1 -11
  47. package/build/cjs/models/constructor-items/blocks.js +0 -2
  48. package/build/cjs/models/constructor-items/common.d.ts +3 -3
  49. package/build/cjs/models/constructor.d.ts +4 -1
  50. package/build/cjs/models/customization.d.ts +9 -0
  51. package/build/cjs/models/customization.js +2 -0
  52. package/build/cjs/models/index.d.ts +1 -0
  53. package/build/cjs/models/index.js +1 -0
  54. package/build/cjs/schema/index.js +0 -1
  55. package/build/cjs/sub-blocks/Content/Content.js +2 -2
  56. package/build/cjs/text-transform/transformers.js +2 -4
  57. package/build/cjs/utils/blocks.d.ts +4 -1
  58. package/build/cjs/utils/blocks.js +11 -1
  59. package/build/esm/components/BackgroundImage/BackgroundImage.js +2 -2
  60. package/build/esm/components/BlockBase/BlockBase.d.ts +3 -2
  61. package/build/esm/components/BlockBase/BlockBase.js +4 -2
  62. package/build/esm/components/Button/Button.css +3 -0
  63. package/build/esm/components/Button/Button.js +5 -4
  64. package/build/esm/components/Image/Image.d.ts +1 -0
  65. package/build/esm/components/Image/Image.js +2 -2
  66. package/build/esm/containers/Loadable/Loadable.d.ts +2 -2
  67. package/build/esm/containers/PageConstructor/PageConstructor.js +6 -4
  68. package/build/esm/containers/PageConstructor/components/ConstructorBlocks/ConstructorBlocks.js +3 -2
  69. package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.d.ts +1 -1
  70. package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +5 -5
  71. package/build/esm/context/innerContext/InnerContext.d.ts +2 -1
  72. package/build/esm/customization/BlockDecoration.d.ts +3 -0
  73. package/build/esm/customization/BlockDecoration.js +17 -0
  74. package/build/esm/editor/Components/AddBlock/AddBlock.css +82 -0
  75. package/build/esm/editor/Components/AddBlock/AddBlock.d.ts +8 -0
  76. package/build/esm/editor/Components/AddBlock/AddBlock.js +41 -0
  77. package/build/esm/editor/Components/EditBlock/EditBlock.css +47 -0
  78. package/build/esm/editor/Components/EditBlock/EditBlock.d.ts +5 -0
  79. package/build/esm/editor/Components/EditBlock/EditBlock.js +30 -0
  80. package/build/esm/editor/Containers/Editor.d.ts +2 -0
  81. package/build/esm/editor/Containers/Editor.js +20 -0
  82. package/build/esm/editor/data/index.d.ts +13 -0
  83. package/build/esm/editor/data/index.js +24 -0
  84. package/build/esm/editor/data/previews/default-preview.d.ts +3 -0
  85. package/build/esm/editor/data/previews/default-preview.js +15 -0
  86. package/build/esm/editor/data/previews/header-block.d.ts +3 -0
  87. package/build/esm/editor/data/previews/header-block.js +16 -0
  88. package/build/esm/editor/index.d.ts +2 -0
  89. package/build/esm/editor/index.js +2 -0
  90. package/build/esm/editor/store/index.d.ts +15 -0
  91. package/build/esm/editor/store/index.js +28 -0
  92. package/build/esm/editor/store/reducer.d.ts +41 -0
  93. package/build/esm/editor/store/reducer.js +55 -0
  94. package/build/esm/editor/store/utils.d.ts +12 -0
  95. package/build/esm/editor/store/utils.js +26 -0
  96. package/build/esm/editor/styles/mixins.css +0 -0
  97. package/build/esm/editor/styles/variables.css +0 -0
  98. package/build/esm/editor/types/index.d.ts +17 -0
  99. package/build/esm/editor/types/index.js +1 -0
  100. package/build/esm/editor/utils/index.d.ts +11 -0
  101. package/build/esm/editor/utils/index.js +6 -0
  102. package/build/esm/hooks/useMetrika.js +0 -7
  103. package/build/esm/models/constructor-items/blocks.d.ts +1 -11
  104. package/build/esm/models/constructor-items/blocks.js +0 -2
  105. package/build/esm/models/constructor-items/common.d.ts +3 -3
  106. package/build/esm/models/constructor.d.ts +4 -1
  107. package/build/esm/models/customization.d.ts +9 -0
  108. package/build/esm/models/customization.js +1 -0
  109. package/build/esm/models/index.d.ts +1 -0
  110. package/build/esm/models/index.js +1 -0
  111. package/build/esm/schema/index.js +0 -1
  112. package/build/esm/sub-blocks/Content/Content.js +2 -3
  113. package/build/esm/text-transform/transformers.js +2 -4
  114. package/build/esm/utils/blocks.d.ts +4 -1
  115. package/build/esm/utils/blocks.js +7 -0
  116. package/package.json +4 -3
  117. package/server/models/constructor-items/blocks.d.ts +1 -11
  118. package/server/models/constructor-items/blocks.js +0 -2
  119. package/server/models/constructor-items/common.d.ts +3 -3
  120. package/server/models/constructor.d.ts +4 -1
  121. package/server/models/customization.d.ts +9 -0
  122. package/server/models/customization.js +2 -0
  123. package/server/models/index.d.ts +1 -0
  124. package/server/models/index.js +1 -0
  125. package/server/text-transform/transformers.js +2 -4
  126. package/server/utils/blocks.d.ts +4 -1
  127. package/server/utils/blocks.js +11 -1
  128. package/styles/styles.css +0 -196
  129. package/styles/styles.scss +0 -1
  130. package/styles/fonts.scss +0 -223
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.21.0](https://github.com/gravity-ui/page-constructor/compare/v2.20.1...v2.21.0) (2023-05-29)
4
+
5
+
6
+ ### Features
7
+
8
+ * remove metrika goals from pixel events ([#355](https://github.com/gravity-ui/page-constructor/issues/355)) ([1a0ddae](https://github.com/gravity-ui/page-constructor/commit/1a0ddae92e4862665c64652c0da27cee9085d286))
9
+
10
+ ## [2.20.1](https://github.com/gravity-ui/page-constructor/compare/v2.20.0...v2.20.1) (2023-05-29)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * editor scroll ([#352](https://github.com/gravity-ui/page-constructor/issues/352)) ([9fbbefe](https://github.com/gravity-ui/page-constructor/commit/9fbbefec311a0017eab7533b0b26bbddf97ff453))
16
+
17
+ ## [2.20.0](https://github.com/gravity-ui/page-constructor/compare/v2.19.0...v2.20.0) (2023-05-25)
18
+
19
+
20
+ ### Features
21
+
22
+ * add page structure editor ([8d1dafe](https://github.com/gravity-ui/page-constructor/commit/8d1dafe964a9af3c7f5ad0e6039cccf2d24da64f))
23
+ * Edit mode ([#347](https://github.com/gravity-ui/page-constructor/issues/347)) ([8d1dafe](https://github.com/gravity-ui/page-constructor/commit/8d1dafe964a9af3c7f5ad0e6039cccf2d24da64f))
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * customization types import fix ([#350](https://github.com/gravity-ui/page-constructor/issues/350)) ([206306f](https://github.com/gravity-ui/page-constructor/commit/206306f95d87ae428538b27dca08f78cb4de9430))
29
+
30
+ ## [2.19.0](https://github.com/gravity-ui/page-constructor/compare/v2.18.0...v2.19.0) (2023-05-23)
31
+
32
+
33
+ ### Features
34
+
35
+ * **Button:** add prop width ([#346](https://github.com/gravity-ui/page-constructor/issues/346)) ([f4b1ba8](https://github.com/gravity-ui/page-constructor/commit/f4b1ba85f56ef2de435bd91ae1fc35fbea0a177b))
36
+
3
37
  ## [2.18.0](https://github.com/gravity-ui/page-constructor/compare/v2.18.0...v2.18.0) (2023-05-15)
4
38
 
5
39
 
@@ -6,8 +6,8 @@ const utils_1 = require("../../utils");
6
6
  const Image_1 = tslib_1.__importDefault(require("../Image/Image"));
7
7
  const b = (0, utils_1.block)('storage-background-image');
8
8
  const BackgroundImage = (props) => {
9
- const { children, src, desktop, className, imageClassName, style, hide } = props;
10
- return (react_1.default.createElement("div", { className: b(null, className), style: style },
9
+ const { children, src, desktop, className, imageClassName, style, hide, qa } = props;
10
+ return (react_1.default.createElement("div", { className: b(null, className), style: style, "data-qa": qa },
11
11
  (src || desktop) && !hide && react_1.default.createElement(Image_1.default, Object.assign({}, props, { className: b('img', imageClassName) })),
12
12
  children && react_1.default.createElement("div", { className: b('container') }, children)));
13
13
  };
@@ -1,3 +1,4 @@
1
- import { BlockBaseProps, ClassNameProps, WithChildren } from '../../models';
2
- declare const BlockBase: (props: WithChildren<BlockBaseProps & ClassNameProps>) => JSX.Element;
1
+ import { PropsWithChildren } from 'react';
2
+ import { BlockBaseProps, ClassNameProps } from '../../models';
3
+ declare const BlockBase: (props: PropsWithChildren<BlockBaseProps & ClassNameProps>) => JSX.Element;
3
4
  export default BlockBase;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
+ const BlockDecoration_1 = require("../../customization/BlockDecoration");
5
6
  const grid_1 = require("../../grid");
6
7
  const utils_1 = require("../../utils");
7
8
  const Anchor_1 = tslib_1.__importDefault(require("../Anchor/Anchor"));
@@ -9,7 +10,8 @@ const b = (0, utils_1.block)('block-base');
9
10
  const BlockBase = (props) => {
10
11
  const { anchor, visible, children, className, resetPaddings, qa } = props;
11
12
  return (react_1.default.createElement(grid_1.Col, { className: b({ ['reset-paddings']: resetPaddings }, className), visible: visible, reset: true, dataQa: qa },
12
- anchor && react_1.default.createElement(Anchor_1.default, { id: anchor.url, className: b('anchor') }),
13
- children));
13
+ react_1.default.createElement(BlockDecoration_1.BlockDecoration, null,
14
+ anchor && react_1.default.createElement(Anchor_1.default, { id: anchor.url, className: b('anchor') }),
15
+ children)));
14
16
  };
15
17
  exports.default = BlockBase;
@@ -45,4 +45,7 @@ unpredictable css rules order in build */
45
45
  }
46
46
  .pc-button-block_size_xl {
47
47
  --btn-image-margin: 25px;
48
+ }
49
+ .pc-button-block_width_max .pc-button-block__text {
50
+ width: 100%;
48
51
  }
@@ -15,7 +15,7 @@ const b = (0, utils_1.block)('button-block');
15
15
  const Button = (props) => {
16
16
  const handleMetrika = (0, useMetrika_1.useMetrika)();
17
17
  const { lang, tld } = (0, react_1.useContext)(localeContext_1.LocaleContext);
18
- const { className, metrikaGoals, pixelEvents, analyticsEvents, size = 'l', theme = 'normal', url, img, onClick: onClickOrigin, text } = props, rest = tslib_1.__rest(props, ["className", "metrikaGoals", "pixelEvents", "analyticsEvents", "size", "theme", "url", "img", "onClick", "text"]);
18
+ const { className, metrikaGoals, pixelEvents, analyticsEvents, size = 'l', theme = 'normal', url, img, onClick: onClickOrigin, text, width } = props, rest = tslib_1.__rest(props, ["className", "metrikaGoals", "pixelEvents", "analyticsEvents", "size", "theme", "url", "img", "onClick", "text", "width"]);
19
19
  const defaultImgPosition = 'left';
20
20
  const handleAnalytics = (0, hooks_1.useAnalytics)(models_1.DefaultEventNames.Button, url);
21
21
  const onClick = (0, react_1.useCallback)((e) => {
@@ -25,12 +25,13 @@ const Button = (props) => {
25
25
  onClickOrigin(e);
26
26
  }
27
27
  }, [handleMetrika, metrikaGoals, pixelEvents, handleAnalytics, analyticsEvents, onClickOrigin]);
28
+ const buttonModifiers = { size, theme, width };
28
29
  const buttonImg = img instanceof Object
29
30
  ? { url: img.url, position: img.position || defaultImgPosition, alt: img.alt }
30
31
  : { url: img, position: defaultImgPosition };
31
32
  const buttonClass = img
32
- ? b({ position: buttonImg.position, size, theme }, className)
33
- : b({ size, theme }, className);
33
+ ? b(Object.assign({ position: buttonImg.position }, buttonModifiers), className)
34
+ : b(Object.assign({}, buttonModifiers), className);
34
35
  const buttonProps = Object.assign(Object.assign({}, rest), { onClick });
35
36
  if (theme === 'app-store' || theme === 'google-play') {
36
37
  const platform = theme === 'app-store' ? uikit_1.Platform.IOS : uikit_1.Platform.ANDROID;
@@ -43,7 +44,7 @@ const Button = (props) => {
43
44
  image = undefined;
44
45
  }
45
46
  const buttonTheme = theme === 'scale' ? 'accent' : theme;
46
- return (react_1.default.createElement(uikit_1.Button, Object.assign({ className: buttonClass, view: (0, utils_2.toCommonView)(buttonTheme), size: (0, utils_2.toCommonSize)(size), href: url ? (0, utils_1.setUrlTld)(url, tld) : undefined }, buttonProps),
47
+ return (react_1.default.createElement(uikit_1.Button, Object.assign({ className: buttonClass, view: (0, utils_2.toCommonView)(buttonTheme), size: (0, utils_2.toCommonSize)(size), href: url ? (0, utils_1.setUrlTld)(url, tld) : undefined, width: width }, buttonProps),
47
48
  icon && buttonImg.position === 'left' ? icon : null,
48
49
  react_1.default.createElement("span", { className: b('content') },
49
50
  image && buttonImg.position === 'left' ? image : null,
@@ -5,6 +5,7 @@ export interface ImageProps extends Partial<ImageObjectProps>, Partial<ImageDevi
5
5
  className?: string;
6
6
  onClick?: MouseEventHandler;
7
7
  containerClassName?: string;
8
+ qa?: string;
8
9
  }
9
10
  declare const Image: (props: ImageProps) => JSX.Element | null;
10
11
  export default Image;
@@ -12,7 +12,7 @@ const checkWebP = (src) => {
12
12
  };
13
13
  const Image = (props) => {
14
14
  const projectSettings = (0, react_1.useContext)(projectSettingsContext_1.ProjectSettingsContext);
15
- const { src: imageSrc, alt = (0, i18n_1.default)('img-alt'), disableCompress, tablet, desktop, mobile, style, className, onClick, containerClassName, } = props;
15
+ const { src: imageSrc, alt = (0, i18n_1.default)('img-alt'), disableCompress, tablet, desktop, mobile, style, className, onClick, containerClassName, qa, } = props;
16
16
  const [imgLoadingError, setImgLoadingError] = (0, react_1.useState)(false);
17
17
  const src = imageSrc || desktop;
18
18
  if (!src) {
@@ -22,7 +22,7 @@ const Image = (props) => {
22
22
  disableCompress ||
23
23
  !(0, imageCompress_1.isCompressible)(src) ||
24
24
  imgLoadingError;
25
- return (react_1.default.createElement("picture", { className: containerClassName },
25
+ return (react_1.default.createElement("picture", { className: containerClassName, "data-qa": qa },
26
26
  mobile && (react_1.default.createElement(react_1.Fragment, null,
27
27
  !disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)` })),
28
28
  react_1.default.createElement("source", { srcSet: mobile, media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)` }))),
@@ -1,5 +1,5 @@
1
1
  import { PropsWithChildren } from 'react';
2
- import { Block, CustomItem, FetchLoadableData, LoadableData, LoadableProps } from '../../models';
2
+ import { ConstructorItem, CustomItem, FetchLoadableData, LoadableData, LoadableProps } from '../../models';
3
3
  export interface LoadableState {
4
4
  loading: boolean;
5
5
  error: boolean;
@@ -8,7 +8,7 @@ export interface LoadableState {
8
8
  export interface LoadableComponentsProps extends Omit<PropsWithChildren<LoadableProps>, 'source'> {
9
9
  Component: CustomItem;
10
10
  ChildComponent: CustomItem;
11
- block: Block;
11
+ block: ConstructorItem;
12
12
  blockKey: string;
13
13
  fetch: FetchLoadableData;
14
14
  }
@@ -27,12 +27,14 @@ const Constructor = (props) => {
27
27
  itemMap: Object.assign(Object.assign(Object.assign({}, constructor_items_1.blockMap), constructor_items_1.subBlockMap), (0, utils_1.getCustomItems)(custom)),
28
28
  loadables: custom === null || custom === void 0 ? void 0 : custom.loadable,
29
29
  shouldRenderBlock,
30
+ customization: {
31
+ decorators: custom === null || custom === void 0 ? void 0 : custom.decorators,
32
+ },
30
33
  },
31
34
  }), [custom, shouldRenderBlock]);
32
35
  const { themeValue: theme } = (0, react_1.useContext)(ThemeValueContext_1.ThemeValueContext);
33
- const isHeaderBlock = (block) => context.headerBlockTypes.includes(block.type);
34
- const header = blocks === null || blocks === void 0 ? void 0 : blocks.find(isHeaderBlock);
35
- const restBlocks = blocks === null || blocks === void 0 ? void 0 : blocks.filter((block) => !isHeaderBlock(block));
36
+ const header = (0, utils_1.getHeaderBlock)(blocks, context.headerBlockTypes);
37
+ const restBlocks = (0, utils_1.getOrderedBlocks)(blocks, context.headerBlockTypes);
36
38
  const themedBackground = (0, utils_1.getThemedValue)(background, theme);
37
39
  return (react_1.default.createElement(innerContext_1.InnerContext.Provider, { value: context },
38
40
  react_1.default.createElement("div", { className: b() },
@@ -4,6 +4,7 @@ exports.ConstructorBlocks = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
6
  const lodash_1 = tslib_1.__importDefault(require("lodash"));
7
+ const blockIdContext_1 = require("../../../../context/blockIdContext");
7
8
  const innerContext_1 = require("../../../../context/innerContext");
8
9
  const utils_1 = require("../../../../utils");
9
10
  const ConstructorBlock_1 = require("../ConstructorBlock/ConstructorBlock");
@@ -34,9 +35,9 @@ const ConstructorBlocks = ({ items }) => {
34
35
  if ('children' in item && item.children) {
35
36
  children = item.children.map(renderer.bind(null, blockId));
36
37
  }
37
- itemElement = (react_1.default.createElement(ConstructorItem_1.ConstructorItem, { data: item, key: blockId, blockKey: blockId }, children));
38
+ itemElement = (react_1.default.createElement(ConstructorItem_1.ConstructorItem, { data: item, blockKey: blockId }, children));
38
39
  }
39
- return blockTypes.includes(item.type) ? (react_1.default.createElement(ConstructorBlock_1.ConstructorBlock, { data: item, key: blockId }, itemElement)) : (itemElement);
40
+ return (react_1.default.createElement(blockIdContext_1.BlockIdContext.Provider, { value: blockId, key: blockId }, blockTypes.includes(item.type) ? (react_1.default.createElement(ConstructorBlock_1.ConstructorBlock, { data: item }, itemElement)) : (itemElement)));
40
41
  };
41
42
  return react_1.default.createElement(react_1.Fragment, null, items.map(renderer.bind(null, '')));
42
43
  };
@@ -3,5 +3,5 @@ export interface ConstructorItemProps {
3
3
  data: ConstructorItemType;
4
4
  blockKey: string;
5
5
  }
6
- export declare const ConstructorItem: ({ data, blockKey, children }: WithChildren<ConstructorItemProps>) => JSX.Element;
6
+ export declare const ConstructorItem: ({ data, children }: WithChildren<ConstructorItemProps>) => JSX.Element;
7
7
  export declare const ConstructorHeader: ({ data, blockKey, }: Pick<ConstructorItemProps, 'data' | 'blockKey'>) => JSX.Element;
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConstructorHeader = exports.ConstructorItem = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
- const blockIdContext_1 = require("../../../../context/blockIdContext");
7
6
  const innerContext_1 = require("../../../../context/innerContext");
8
- const ConstructorItem = ({ data, blockKey, children }) => {
7
+ const BlockDecoration_1 = require("../../../../customization/BlockDecoration");
8
+ const ConstructorItem = ({ data, children }) => {
9
9
  const { itemMap } = (0, react_1.useContext)(innerContext_1.InnerContext);
10
10
  const { type } = data, rest = tslib_1.__rest(data, ["type"]);
11
11
  const Component = itemMap[type];
12
- return (react_1.default.createElement(blockIdContext_1.BlockIdContext.Provider, { value: blockKey },
13
- react_1.default.createElement(Component, Object.assign({}, rest), children)));
12
+ return react_1.default.createElement(Component, Object.assign({}, rest), children);
14
13
  };
15
14
  exports.ConstructorItem = ConstructorItem;
16
- const ConstructorHeader = ({ data, blockKey, }) => (react_1.default.createElement(exports.ConstructorItem, { data: data, key: data.type, blockKey: blockKey }));
15
+ const ConstructorHeader = ({ data, blockKey, }) => (react_1.default.createElement(BlockDecoration_1.BlockDecoration, { id: data.type },
16
+ react_1.default.createElement(exports.ConstructorItem, { data: data, key: data.type, blockKey: blockKey })));
17
17
  exports.ConstructorHeader = ConstructorHeader;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ItemMap } from '../../containers/PageConstructor/PageConstructor';
3
- import { LoadableConfig, ShouldRenderBlock } from '../../models';
3
+ import { CustomConfig, LoadableConfig, ShouldRenderBlock } from '../../models';
4
4
  export interface InnerContextType {
5
5
  blockTypes: string[];
6
6
  subBlockTypes: string[];
@@ -8,5 +8,6 @@ export interface InnerContextType {
8
8
  itemMap: ItemMap;
9
9
  loadables?: LoadableConfig;
10
10
  shouldRenderBlock?: ShouldRenderBlock;
11
+ customization?: Pick<CustomConfig, 'decorators'>;
11
12
  }
12
13
  export declare const InnerContext: React.Context<InnerContextType>;
@@ -0,0 +1,3 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { BlockDecorationProps } from '../models';
3
+ export declare const BlockDecoration: (props: PropsWithChildren<BlockDecorationProps>) => JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockDecoration = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const blockIdContext_1 = require("../context/blockIdContext");
7
+ const innerContext_1 = require("../context/innerContext");
8
+ const utils_1 = require("../utils");
9
+ const BlockDecoration = (props) => {
10
+ var _a, _b;
11
+ const blockContenxtId = (0, utils_1.getBlockIndexFromId)((0, react_1.useContext)(blockIdContext_1.BlockIdContext));
12
+ const { headerBlockTypes } = (0, react_1.useContext)(innerContext_1.InnerContext);
13
+ const blockId = props.id || blockContenxtId;
14
+ const isHeader = Boolean(props.id && headerBlockTypes.includes(props.id));
15
+ const block = react_1.default.createElement(react_1.Fragment, null, props.children);
16
+ const blockDecorators = (_b = (_a = (0, react_1.useContext)(innerContext_1.InnerContext).customization) === null || _a === void 0 ? void 0 : _a.decorators) === null || _b === void 0 ? void 0 : _b.block;
17
+ if (!blockDecorators) {
18
+ return block;
19
+ }
20
+ return blockDecorators.reduce((children, decorator) => (react_1.default.createElement(react_1.Fragment, null, decorator({ children, id: blockId, isHeader }))), block);
21
+ };
22
+ exports.BlockDecoration = BlockDecoration;
@@ -0,0 +1,82 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-add-block {
4
+ position: fixed;
5
+ bottom: 32px;
6
+ left: 50%;
7
+ transform: translateX(-50%);
8
+ z-index: 110;
9
+ }
10
+ .pc-add-block__button {
11
+ display: inline-block;
12
+ margin: 0;
13
+ padding: 0;
14
+ font: inherit;
15
+ border: none;
16
+ outline: none;
17
+ color: inherit;
18
+ background: none;
19
+ cursor: pointer;
20
+ display: flex;
21
+ justify-content: center;
22
+ align-items: center;
23
+ transition: transform 0.2s;
24
+ width: 76px;
25
+ height: 40px;
26
+ color: var(--yc-color-text-inverted-primary);
27
+ background-color: var(--yc-color-promo-base-neon);
28
+ border-radius: 8px;
29
+ }
30
+ .pc-add-block__button:hover {
31
+ transform: scale(1.05);
32
+ }
33
+ .pc-add-block__icon {
34
+ width: 16px;
35
+ height: 16px;
36
+ }
37
+
38
+ .pc-add-block__popup {
39
+ min-width: 420px;
40
+ border-radius: var(--pc-border-radius);
41
+ box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.06), 0px 4px 24px rgba(0, 0, 0, 0.06);
42
+ }
43
+ .pc-add-block__popup .pc-add-block__search {
44
+ padding: 20px 20px 0;
45
+ }
46
+ .pc-add-block__popup .pc-add-block__blocks {
47
+ display: flex;
48
+ flex-direction: column;
49
+ padding: 20px;
50
+ height: 296px;
51
+ max-height: 296px;
52
+ overflow-y: auto;
53
+ }
54
+ .pc-add-block__popup .pc-add-block__block {
55
+ display: flex;
56
+ justify-content: center;
57
+ align-items: center;
58
+ transition: transform 0.2s;
59
+ margin-top: 20px;
60
+ justify-content: flex-start;
61
+ cursor: pointer;
62
+ }
63
+ .pc-add-block__popup .pc-add-block__block:hover {
64
+ transform: scale(1.05);
65
+ }
66
+ .pc-add-block__popup .pc-add-block__block:first-child {
67
+ margin-top: 0;
68
+ }
69
+ .pc-add-block__popup .pc-add-block__preview {
70
+ width: 148px;
71
+ height: 74px;
72
+ border-radius: var(--pc-border-radius);
73
+ margin-right: 16px;
74
+ }
75
+ .pc-add-block__popup .pc-add-block__title {
76
+ font-size: var(--yc-text-body-2-font-size);
77
+ line-height: var(--yc-text-body-2-line-height);
78
+ }
79
+ .pc-add-block__popup .pc-add-block__title,
80
+ .pc-add-block__popup .pc-add-block__description {
81
+ margin: 0;
82
+ }
@@ -0,0 +1,7 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { Block } from '../../../models';
3
+ export interface AddBlockProps {
4
+ onAdd: (data: Block) => void;
5
+ }
6
+ declare const AddBlock: ({ onAdd }: PropsWithChildren<AddBlockProps>) => JSX.Element;
7
+ export default AddBlock;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const icons_1 = require("@gravity-ui/icons");
6
+ const uikit_1 = require("@gravity-ui/uikit");
7
+ const constructor_items_1 = require("../../../constructor-items");
8
+ const utils_1 = require("../../../utils");
9
+ const data_1 = tslib_1.__importDefault(require("../../data"));
10
+ const b = (0, utils_1.block)('add-block');
11
+ const sortedBlockNames = Object.keys(constructor_items_1.blockMap).sort();
12
+ const AddBlock = ({ onAdd }) => {
13
+ const [isOpened, setIsOpened] = (0, react_1.useState)(false);
14
+ const [search, setSearch] = (0, react_1.useState)('');
15
+ const ref = (0, react_1.useRef)(null);
16
+ const blocks = (0, react_1.useMemo)(() => sortedBlockNames.filter((blockName) => data_1.default[blockName].meta.title
17
+ .toLocaleLowerCase()
18
+ .startsWith(search.toLocaleLowerCase())), [search]);
19
+ return (react_1.default.createElement("div", { className: b(), ref: ref },
20
+ react_1.default.createElement("button", { className: b('button'), onClick: () => {
21
+ setIsOpened(!isOpened);
22
+ setSearch('');
23
+ } },
24
+ react_1.default.createElement(icons_1.Plus, { className: b('icon') })),
25
+ isOpened && (react_1.default.createElement(uikit_1.Popup, { anchorRef: ref, open: isOpened, className: b('popup'), placement: "top", offset: [0, 24], onOutsideClick: () => setIsOpened(false) },
26
+ react_1.default.createElement("div", { className: b('search') },
27
+ react_1.default.createElement(uikit_1.TextInput, { placeholder: "search", type: "text", value: search, size: "l", onUpdate: (value) => setSearch(value) })),
28
+ react_1.default.createElement("div", { className: b('blocks') }, blocks.map((blockName) => {
29
+ var _a;
30
+ const blockData = data_1.default[blockName];
31
+ const Preview = blockData === null || blockData === void 0 ? void 0 : blockData.preview;
32
+ return (react_1.default.createElement("div", { key: blockName, className: b('block'), onClick: () => {
33
+ onAdd(blockData === null || blockData === void 0 ? void 0 : blockData.template);
34
+ setIsOpened(false);
35
+ } },
36
+ react_1.default.createElement("div", { className: b('preview') },
37
+ react_1.default.createElement(Preview, null)),
38
+ react_1.default.createElement("div", { className: b('info') },
39
+ react_1.default.createElement("h4", { className: b('title') }, blockData.meta.title),
40
+ ((_a = blockData === null || blockData === void 0 ? void 0 : blockData.meta) === null || _a === void 0 ? void 0 : _a.description) && (react_1.default.createElement("p", { className: b('description') }, blockData.meta.description)))));
41
+ }))))));
42
+ };
43
+ exports.default = AddBlock;
@@ -0,0 +1,47 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-edit-block {
4
+ cursor: pointer;
5
+ position: relative;
6
+ }
7
+ .pc-edit-block__controls {
8
+ position: absolute;
9
+ width: calc(100% + 40px);
10
+ height: calc(100% + 40px);
11
+ top: -20px;
12
+ left: -20px;
13
+ border-radius: 8px;
14
+ z-index: 100;
15
+ }
16
+ .pc-edit-block__controls_isHeader {
17
+ width: 100%;
18
+ height: 100%;
19
+ top: 0;
20
+ left: 0;
21
+ }
22
+ .pc-edit-block__controls_active {
23
+ border: 4px solid var(--yc-color-promo-base-neon);
24
+ }
25
+ .pc-edit-block__controls-content {
26
+ display: flex;
27
+ position: absolute;
28
+ bottom: -44px;
29
+ left: 50%;
30
+ transform: translateX(-50%);
31
+ }
32
+ .pc-edit-block__control {
33
+ display: flex;
34
+ justify-content: center;
35
+ align-items: center;
36
+ transition: transform 0.2s;
37
+ width: 24px;
38
+ height: 24px;
39
+ border-radius: calc(8px / 2);
40
+ background-color: var(--yc-color-promo-highlight-neon);
41
+ }
42
+ .pc-edit-block__control:hover {
43
+ transform: scale(1.1);
44
+ }
45
+ .pc-edit-block__control:not(:first-child) {
46
+ margin-left: 12px;
47
+ }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { EditBlockProps } from '../../../editor/types';
3
+ declare const _default: React.MemoExoticComponent<({ id, isHeader, activeBlockId, onDelete, onSelect, onCopy, onOrderChange, children, orderedBlocksCount, }: EditBlockProps) => JSX.Element>;
4
+ export default _default;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const icons_1 = require("@gravity-ui/icons");
6
+ const utils_1 = require("../../../utils");
7
+ const b = (0, utils_1.block)('edit-block');
8
+ const EditBlock = ({ id, isHeader, activeBlockId, onDelete, onSelect, onCopy, onOrderChange, children, orderedBlocksCount, }) => {
9
+ const ref = (0, react_1.useRef)(null);
10
+ const controlsActive = activeBlockId === id;
11
+ (0, react_1.useEffect)(() => {
12
+ var _a;
13
+ if (controlsActive && ref.current) {
14
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: 'smooth', block: 'center' });
15
+ }
16
+ }, [controlsActive]);
17
+ return (react_1.default.createElement("div", { className: b(), onClick: () => {
18
+ onSelect(id);
19
+ }, ref: ref },
20
+ react_1.default.createElement("div", { className: b('controls', { active: controlsActive, isHeader }) }, controlsActive && (react_1.default.createElement("div", { className: b('controls-content'), onClick: (e) => e.stopPropagation() },
21
+ typeof id === 'number' && (react_1.default.createElement(react_1.Fragment, null,
22
+ id > 0 && (react_1.default.createElement("div", { className: b('control'), onClick: () => onOrderChange(id, id - 1) },
23
+ react_1.default.createElement(icons_1.ChevronUp, null))),
24
+ id < orderedBlocksCount - 1 && (react_1.default.createElement("div", { className: b('control'), onClick: () => onOrderChange(id, id + 1) },
25
+ react_1.default.createElement(icons_1.ChevronDown, null))),
26
+ react_1.default.createElement("div", { className: b('control'), onClick: () => onCopy(id) },
27
+ react_1.default.createElement(icons_1.Copy, null)))),
28
+ react_1.default.createElement("div", { className: b('control'), onClick: () => onDelete(id) },
29
+ react_1.default.createElement(icons_1.TrashBin, null))))),
30
+ children));
31
+ };
32
+ exports.default = react_1.default.memo(EditBlock);
@@ -0,0 +1,2 @@
1
+ import { EditorProps } from '../types';
2
+ export declare const Editor: ({ children, ...rest }: EditorProps) => JSX.Element;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Editor = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const AddBlock_1 = tslib_1.__importDefault(require("../Components/AddBlock/AddBlock"));
7
+ const EditBlock_1 = tslib_1.__importDefault(require("../Components/EditBlock/EditBlock"));
8
+ const store_1 = require("../store");
9
+ const utils_1 = require("../utils");
10
+ const Editor = (_a) => {
11
+ var { children } = _a, rest = tslib_1.__rest(_a, ["children"]);
12
+ const { content, onAdd, editControlsProps } = (0, store_1.useEditorState)(rest);
13
+ const constructorProps = (0, react_1.useMemo)(() => {
14
+ const editControlsDecorator = (props) => (react_1.default.createElement(EditBlock_1.default, Object.assign({}, props, editControlsProps)));
15
+ return {
16
+ content,
17
+ custom: (0, utils_1.addCustomDecorator)(editControlsDecorator, rest.custom),
18
+ };
19
+ }, [editControlsProps, content, rest.custom]);
20
+ return (react_1.default.createElement("div", null,
21
+ children(constructorProps),
22
+ react_1.default.createElement(AddBlock_1.default, { onAdd: onAdd })));
23
+ };
24
+ exports.Editor = Editor;
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import { Block, BlockType } from '../../models';
3
+ export type PreviewComponent = React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
4
+ export interface EdiorBlockData {
5
+ template: Block;
6
+ preview: PreviewComponent;
7
+ meta: {
8
+ title: string;
9
+ description?: string;
10
+ };
11
+ }
12
+ declare const EditorBlocksData: Record<BlockType, EdiorBlockData>;
13
+ export default EditorBlocksData;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const models_1 = require("../../models");
5
+ const utils_1 = require("../utils");
6
+ const default_preview_1 = tslib_1.__importDefault(require("./previews/default-preview"));
7
+ const getBlockTemplate = (blockType) => require(`./templates/${blockType}.json`);
8
+ const getBlockPreview = (blockType) => {
9
+ try {
10
+ return require(`./previews/${blockType}.tsx`).default;
11
+ }
12
+ catch (err) {
13
+ /*eslint-disable no-console */
14
+ console.warn(`Preview image for ${blockType} not found`);
15
+ return default_preview_1.default;
16
+ }
17
+ };
18
+ const EditorBlocksData = Object.values(models_1.BlockType).reduce((previewData, blockType) => {
19
+ const template = getBlockTemplate(blockType);
20
+ const preview = getBlockPreview(blockType);
21
+ template.meta = template.meta || {};
22
+ template.meta.title = template.meta.title || (0, utils_1.formatBlockName)(blockType);
23
+ /* eslint-disable no-param-reassign */
24
+ previewData[blockType] = Object.assign(Object.assign({}, template), { preview });
25
+ return previewData;
26
+ }, {});
27
+ exports.default = EditorBlocksData;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const DefaultPreview: React.FC<React.SVGProps<SVGSVGElement>>;
3
+ export default DefaultPreview;
@@ -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 svg_1 = require("../../../utils/svg");
6
+ const DefaultPreview = (props) => (react_1.default.createElement("svg", Object.assign({ width: "150", height: "76", viewBox: "0 0 150 76", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, svg_1.a11yHiddenSvgProps, props),
7
+ react_1.default.createElement("rect", { x: "1", y: "1", width: "148", height: "74", rx: "8", fill: "white" }),
8
+ react_1.default.createElement("rect", { x: "14.7674", y: "21.6512", width: "28.3953", height: "6.88372", rx: "0.860465", fill: "#E7E7E7" }),
9
+ react_1.default.createElement("rect", { x: "43.1628", y: "21.6512", width: "28.3953", height: "6.88372", rx: "0.860465", fill: "white" }),
10
+ react_1.default.createElement("rect", { x: "14.7674", y: "31.9767", width: "56.7907", height: "3.44186", rx: "0.860465", fill: "#E7E7E7" }),
11
+ react_1.default.createElement("rect", { x: "14.7675", y: "37.1395", width: "56.7907", height: "3.44186", rx: "0.860465", fill: "#E7E7E7" }),
12
+ react_1.default.createElement("rect", { x: "14.7675", y: "42.3023", width: "56.7907", height: "3.44186", rx: "0.860465", fill: "#E7E7E7" }),
13
+ react_1.default.createElement("rect", { x: "14.7674", y: "49.186", width: "18.9302", height: "5.16279", rx: "0.860465", fill: "#E7E7E7" }),
14
+ react_1.default.createElement("rect", { x: "33.6977", y: "49.186", width: "18.9302", height: "5.16279", rx: "0.860465", fill: "white" }),
15
+ react_1.default.createElement("rect", { x: "52.6279", y: "49.186", width: "18.9302", height: "5.16279", rx: "0.860465", fill: "white" }),
16
+ react_1.default.createElement("rect", { x: "78.4418", y: "9.60464", width: "56.7907", height: "56.7907", rx: "5.16279", fill: "#A967FF" }),
17
+ react_1.default.createElement("rect", { x: "0.5", y: "0.5", width: "149", height: "75", rx: "8.5", stroke: "black", strokeOpacity: "0.1" })));
18
+ exports.default = DefaultPreview;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const Header: React.FC<React.SVGProps<SVGSVGElement>>;
3
+ export default Header;