@gravity-ui/page-constructor 2.22.0-alpha → 2.22.0-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 (162) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/build/cjs/components/Anchor/Anchor.d.ts +2 -2
  3. package/build/cjs/components/Anchor/Anchor.js +1 -1
  4. package/build/cjs/components/BackgroundImage/BackgroundImage.js +2 -2
  5. package/build/cjs/components/BlockBase/BlockBase.d.ts +3 -2
  6. package/build/cjs/components/BlockBase/BlockBase.js +4 -2
  7. package/build/cjs/components/Button/Button.css +3 -0
  8. package/build/cjs/components/Button/Button.js +5 -4
  9. package/build/cjs/components/Image/Image.d.ts +1 -0
  10. package/build/cjs/components/Image/Image.js +2 -2
  11. package/build/cjs/containers/Loadable/Loadable.d.ts +2 -2
  12. package/build/cjs/containers/PageConstructor/PageConstructor.js +5 -3
  13. package/build/cjs/containers/PageConstructor/components/ConstructorBlocks/ConstructorBlocks.js +3 -2
  14. package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.d.ts +1 -1
  15. package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +5 -5
  16. package/build/cjs/context/innerContext/InnerContext.d.ts +2 -1
  17. package/build/cjs/customization/BlockDecoration.d.ts +3 -0
  18. package/build/cjs/customization/BlockDecoration.js +22 -0
  19. package/build/cjs/editor/Components/AddBlock/AddBlock.css +82 -0
  20. package/build/cjs/editor/Components/AddBlock/AddBlock.d.ts +7 -0
  21. package/build/cjs/editor/Components/AddBlock/AddBlock.js +43 -0
  22. package/build/cjs/editor/Components/EditBlock/EditBlock.css +47 -0
  23. package/build/cjs/editor/Components/EditBlock/EditBlock.d.ts +4 -0
  24. package/build/cjs/editor/Components/EditBlock/EditBlock.js +32 -0
  25. package/build/cjs/editor/Containers/Editor.d.ts +2 -0
  26. package/build/cjs/editor/Containers/Editor.js +24 -0
  27. package/build/cjs/editor/data/index.d.ts +13 -0
  28. package/build/cjs/editor/data/index.js +27 -0
  29. package/build/cjs/editor/data/previews/default-preview.d.ts +3 -0
  30. package/build/cjs/editor/data/previews/default-preview.js +18 -0
  31. package/build/cjs/editor/data/previews/header-block.d.ts +3 -0
  32. package/build/cjs/editor/data/previews/header-block.js +19 -0
  33. package/build/cjs/editor/index.d.ts +2 -0
  34. package/build/cjs/editor/index.js +7 -0
  35. package/build/cjs/editor/store/index.d.ts +15 -0
  36. package/build/cjs/editor/store/index.js +32 -0
  37. package/build/cjs/editor/store/reducer.d.ts +41 -0
  38. package/build/cjs/editor/store/reducer.js +59 -0
  39. package/build/cjs/editor/store/utils.d.ts +13 -0
  40. package/build/cjs/editor/store/utils.js +34 -0
  41. package/build/cjs/editor/styles/mixins.css +0 -0
  42. package/build/cjs/editor/styles/variables.css +0 -0
  43. package/build/cjs/editor/types/index.d.ts +17 -0
  44. package/build/cjs/editor/types/index.js +2 -0
  45. package/build/cjs/editor/utils/index.d.ts +11 -0
  46. package/build/cjs/editor/utils/index.js +12 -0
  47. package/build/cjs/grid/Col/Col.d.ts +1 -1
  48. package/build/cjs/hooks/useMetrika.js +0 -7
  49. package/build/cjs/internal-typings/global.d.ts +18 -16
  50. package/build/cjs/models/constructor-items/blocks.d.ts +1 -11
  51. package/build/cjs/models/constructor-items/blocks.js +0 -2
  52. package/build/cjs/models/constructor-items/common.d.ts +3 -3
  53. package/build/cjs/models/constructor.d.ts +4 -1
  54. package/build/cjs/models/customization.d.ts +9 -0
  55. package/build/cjs/models/customization.js +2 -0
  56. package/build/cjs/models/index.d.ts +1 -0
  57. package/build/cjs/models/index.js +1 -0
  58. package/build/cjs/sub-blocks/HubspotForm/HubspotFormContainer.d.ts +2 -1
  59. package/build/cjs/sub-blocks/HubspotForm/HubspotFormContainer.js +5 -2
  60. package/build/cjs/sub-blocks/HubspotForm/index.d.ts +1 -1
  61. package/build/cjs/sub-blocks/HubspotForm/index.js +6 -5
  62. package/build/cjs/utils/blocks.d.ts +4 -1
  63. package/build/cjs/utils/blocks.js +11 -1
  64. package/build/esm/components/Anchor/Anchor.d.ts +2 -2
  65. package/build/esm/components/Anchor/Anchor.js +1 -1
  66. package/build/esm/components/BackgroundImage/BackgroundImage.js +2 -2
  67. package/build/esm/components/BlockBase/BlockBase.d.ts +3 -2
  68. package/build/esm/components/BlockBase/BlockBase.js +4 -2
  69. package/build/esm/components/Button/Button.css +3 -0
  70. package/build/esm/components/Button/Button.js +5 -4
  71. package/build/esm/components/Image/Image.d.ts +1 -0
  72. package/build/esm/components/Image/Image.js +2 -2
  73. package/build/esm/containers/Loadable/Loadable.d.ts +2 -2
  74. package/build/esm/containers/PageConstructor/PageConstructor.js +6 -4
  75. package/build/esm/containers/PageConstructor/components/ConstructorBlocks/ConstructorBlocks.js +3 -2
  76. package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.d.ts +1 -1
  77. package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +5 -5
  78. package/build/esm/context/innerContext/InnerContext.d.ts +2 -1
  79. package/build/esm/customization/BlockDecoration.d.ts +3 -0
  80. package/build/esm/customization/BlockDecoration.js +17 -0
  81. package/build/esm/editor/Components/AddBlock/AddBlock.css +82 -0
  82. package/build/esm/editor/Components/AddBlock/AddBlock.d.ts +8 -0
  83. package/build/esm/editor/Components/AddBlock/AddBlock.js +41 -0
  84. package/build/esm/editor/Components/EditBlock/EditBlock.css +47 -0
  85. package/build/esm/editor/Components/EditBlock/EditBlock.d.ts +5 -0
  86. package/build/esm/editor/Components/EditBlock/EditBlock.js +30 -0
  87. package/build/esm/editor/Containers/Editor.d.ts +2 -0
  88. package/build/esm/editor/Containers/Editor.js +20 -0
  89. package/build/esm/editor/data/index.d.ts +13 -0
  90. package/build/esm/editor/data/index.js +24 -0
  91. package/build/esm/editor/data/previews/default-preview.d.ts +3 -0
  92. package/build/esm/editor/data/previews/default-preview.js +15 -0
  93. package/build/esm/editor/data/previews/header-block.d.ts +3 -0
  94. package/build/esm/editor/data/previews/header-block.js +16 -0
  95. package/build/esm/editor/index.d.ts +2 -0
  96. package/build/esm/editor/index.js +2 -0
  97. package/build/esm/editor/store/index.d.ts +15 -0
  98. package/build/esm/editor/store/index.js +28 -0
  99. package/build/esm/editor/store/reducer.d.ts +41 -0
  100. package/build/esm/editor/store/reducer.js +55 -0
  101. package/build/esm/editor/store/utils.d.ts +13 -0
  102. package/build/esm/editor/store/utils.js +26 -0
  103. package/build/esm/editor/styles/mixins.css +0 -0
  104. package/build/esm/editor/styles/variables.css +0 -0
  105. package/build/esm/editor/types/index.d.ts +17 -0
  106. package/build/esm/editor/utils/index.d.ts +11 -0
  107. package/build/esm/editor/utils/index.js +6 -0
  108. package/build/esm/grid/Col/Col.d.ts +1 -1
  109. package/build/esm/hooks/useMetrika.js +0 -7
  110. package/build/esm/internal-typings/global.d.ts +18 -16
  111. package/build/esm/models/constructor-items/blocks.d.ts +1 -11
  112. package/build/esm/models/constructor-items/blocks.js +0 -2
  113. package/build/esm/models/constructor-items/common.d.ts +3 -3
  114. package/build/esm/models/constructor.d.ts +4 -1
  115. package/build/esm/models/customization.d.ts +9 -0
  116. package/build/esm/models/index.d.ts +1 -0
  117. package/build/esm/models/index.js +1 -0
  118. package/build/esm/sub-blocks/HubspotForm/HubspotFormContainer.d.ts +2 -1
  119. package/build/esm/sub-blocks/HubspotForm/HubspotFormContainer.js +6 -3
  120. package/build/esm/sub-blocks/HubspotForm/index.d.ts +1 -1
  121. package/build/esm/sub-blocks/HubspotForm/index.js +7 -6
  122. package/build/esm/utils/blocks.d.ts +4 -1
  123. package/build/esm/utils/blocks.js +7 -0
  124. package/package.json +4 -3
  125. package/server/models/constructor-items/blocks.d.ts +1 -11
  126. package/server/models/constructor-items/blocks.js +0 -2
  127. package/server/models/constructor-items/common.d.ts +3 -3
  128. package/server/models/constructor.d.ts +4 -1
  129. package/server/models/customization.d.ts +9 -0
  130. package/server/models/customization.js +2 -0
  131. package/server/models/index.d.ts +1 -0
  132. package/server/models/index.js +1 -0
  133. package/server/utils/blocks.d.ts +4 -1
  134. package/server/utils/blocks.js +11 -1
  135. package/build/cjs/components/Anchor/__tests__/Anchor.test.js +0 -21
  136. package/build/cjs/components/AnimateBlock/__tests__/AnimateBlock.test.js +0 -36
  137. package/build/cjs/components/Author/__tests__/Author.test.d.ts +0 -1
  138. package/build/cjs/components/Author/__tests__/Author.test.js +0 -49
  139. package/build/cjs/components/BackLink/__tests__/BackLink.test.d.ts +0 -1
  140. package/build/cjs/components/BackLink/__tests__/BackLink.test.js +0 -63
  141. package/build/cjs/components/BlockBase/__tests__/BlockBase.test.d.ts +0 -1
  142. package/build/cjs/components/BlockBase/__tests__/BlockBase.test.js +0 -44
  143. package/build/cjs/components/Button/__tests__/Button.test.d.ts +0 -1
  144. package/build/cjs/components/Button/__tests__/Button.test.js +0 -91
  145. package/build/cjs/components/ButtonTabs/__tests__/ButtonTabs.test.d.ts +0 -1
  146. package/build/cjs/components/ButtonTabs/__tests__/ButtonTabs.test.js +0 -58
  147. package/build/esm/components/Anchor/__tests__/Anchor.test.d.ts +0 -1
  148. package/build/esm/components/Anchor/__tests__/Anchor.test.js +0 -18
  149. package/build/esm/components/AnimateBlock/__tests__/AnimateBlock.test.d.ts +0 -1
  150. package/build/esm/components/AnimateBlock/__tests__/AnimateBlock.test.js +0 -33
  151. package/build/esm/components/Author/__tests__/Author.test.d.ts +0 -1
  152. package/build/esm/components/Author/__tests__/Author.test.js +0 -46
  153. package/build/esm/components/BackLink/__tests__/BackLink.test.d.ts +0 -1
  154. package/build/esm/components/BackLink/__tests__/BackLink.test.js +0 -60
  155. package/build/esm/components/BlockBase/__tests__/BlockBase.test.d.ts +0 -1
  156. package/build/esm/components/BlockBase/__tests__/BlockBase.test.js +0 -41
  157. package/build/esm/components/Button/__tests__/Button.test.d.ts +0 -1
  158. package/build/esm/components/Button/__tests__/Button.test.js +0 -88
  159. package/build/esm/components/ButtonTabs/__tests__/ButtonTabs.test.d.ts +0 -1
  160. package/build/esm/components/ButtonTabs/__tests__/ButtonTabs.test.js +0 -55
  161. /package/build/{cjs/components/Anchor/__tests__/Anchor.test.d.ts → esm/editor/types/index.js} +0 -0
  162. /package/build/{cjs/components/AnimateBlock/__tests__/AnimateBlock.test.d.ts → esm/models/customization.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
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
+
37
+ ## [2.18.0](https://github.com/gravity-ui/page-constructor/compare/v2.18.0...v2.18.0) (2023-05-15)
38
+
39
+
40
+ ### Features
41
+
42
+ * **HubspotForm:** add ref forwarding for HS form ([#332](https://github.com/gravity-ui/page-constructor/issues/332)) ([37b75d3](https://github.com/gravity-ui/page-constructor/commit/37b75d31c09e8dc061d718828bcccc72b037e106))
43
+
44
+
45
+ ### Bug Fixes
46
+
47
+ * config gulpfile for tests ([a5cb59d](https://github.com/gravity-ui/page-constructor/commit/a5cb59d0bc1e3a8c09babed0c5ace9a2253416c3))
48
+
49
+ ## [2.17.0](https://github.com/gravity-ui/page-constructor/compare/v2.16.0...v2.17.0) (2023-05-12)
50
+
51
+
52
+ ### Features
53
+
54
+ * drop rules overriding ([#303](https://github.com/gravity-ui/page-constructor/issues/303)) ([0c13398](https://github.com/gravity-ui/page-constructor/commit/0c1339885ce3b930ab9428b585aa6dd020b0d298))
55
+
3
56
  ## [2.16.0](https://github.com/gravity-ui/page-constructor/compare/v2.15.0...v2.16.0) (2023-05-11)
4
57
 
5
58
 
@@ -2,7 +2,7 @@ import { ClassNameProps } from '../../models';
2
2
  export declare const qaIdByDefault = "qa-anchor";
3
3
  export interface AnchorProps extends ClassNameProps {
4
4
  id: string;
5
- dataQa?: string;
5
+ qa?: string;
6
6
  }
7
- declare const Anchor: ({ id, className, dataQa }: AnchorProps) => JSX.Element;
7
+ declare const Anchor: ({ id, className, qa }: AnchorProps) => JSX.Element;
8
8
  export default Anchor;
@@ -7,5 +7,5 @@ const react_1 = tslib_1.__importDefault(require("react"));
7
7
  const utils_1 = require("../../utils");
8
8
  const b = (0, utils_1.block)('Anchor');
9
9
  exports.qaIdByDefault = 'qa-anchor';
10
- const Anchor = ({ id, className, dataQa }) => (react_1.default.createElement("div", { id: id, className: b(null, className), "data-qa": dataQa || exports.qaIdByDefault }));
10
+ const Anchor = ({ id, className, qa }) => (react_1.default.createElement("div", { id: id, className: b(null, className), "data-qa": qa || exports.qaIdByDefault }));
11
11
  exports.default = Anchor;
@@ -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
  }
@@ -28,13 +28,15 @@ const Constructor = (props) => {
28
28
  itemMap: Object.assign(Object.assign(Object.assign({}, constructor_items_1.blockMap), constructor_items_1.subBlockMap), (0, utils_1.getCustomItems)(custom)),
29
29
  loadables: custom === null || custom === void 0 ? void 0 : custom.loadable,
30
30
  shouldRenderBlock,
31
+ customization: {
32
+ decorators: custom === null || custom === void 0 ? void 0 : custom.decorators,
33
+ },
31
34
  },
32
35
  }), [custom, shouldRenderBlock]);
33
36
  const { themeValue: theme } = (0, react_1.useContext)(ThemeValueContext_1.ThemeValueContext);
34
37
  const hasFootnotes = footnotes.length > 0;
35
- const isHeaderBlock = (block) => context.headerBlockTypes.includes(block.type);
36
- const header = blocks === null || blocks === void 0 ? void 0 : blocks.find(isHeaderBlock);
37
- const restBlocks = blocks === null || blocks === void 0 ? void 0 : blocks.filter((block) => !isHeaderBlock(block));
38
+ const header = (0, utils_1.getHeaderBlock)(blocks, context.headerBlockTypes);
39
+ const restBlocks = (0, utils_1.getOrderedBlocks)(blocks, context.headerBlockTypes);
38
40
  const themedBackground = (0, utils_1.getThemedValue)(background, theme);
39
41
  return (react_1.default.createElement(innerContext_1.InnerContext.Provider, { value: context },
40
42
  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;