@gravity-ui/page-constructor 3.1.2 → 3.3.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 (241) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +2 -0
  3. package/build/cjs/blocks/Banner/schema.d.ts +63 -21
  4. package/build/cjs/blocks/CardLayout/schema.d.ts +10 -4
  5. package/build/cjs/blocks/Companies/schema.d.ts +5 -2
  6. package/build/cjs/blocks/ContentLayout/ContentLayout.js +3 -2
  7. package/build/cjs/blocks/ContentLayout/schema.d.ts +107 -61
  8. package/build/cjs/blocks/ContentLayout/schema.js +23 -18
  9. package/build/cjs/blocks/ExtendedFeatures/schema.d.ts +31 -4
  10. package/build/cjs/blocks/ExtendedFeatures/schema.js +2 -3
  11. package/build/cjs/blocks/FilterBlock/schema.d.ts +13 -5
  12. package/build/cjs/blocks/FilterBlock/schema.js +13 -2
  13. package/build/cjs/blocks/Header/Header.css +6 -7
  14. package/build/cjs/blocks/Header/schema.d.ts +92 -36
  15. package/build/cjs/blocks/Header/schema.js +1 -0
  16. package/build/cjs/blocks/HeaderSlider/schema.d.ts +48 -53
  17. package/build/cjs/blocks/HeaderSlider/schema.js +3 -1
  18. package/build/cjs/blocks/Icons/schema.d.ts +3 -1
  19. package/build/cjs/blocks/Icons/schema.js +2 -1
  20. package/build/cjs/blocks/Info/schema.d.ts +19 -8
  21. package/build/cjs/blocks/Map/schema.d.ts +17 -6
  22. package/build/cjs/blocks/Media/schema.d.ts +204 -152
  23. package/build/cjs/blocks/Media/schema.js +1 -1
  24. package/build/cjs/blocks/PromoFeaturesBlock/schema.d.ts +22 -8
  25. package/build/cjs/blocks/PromoFeaturesBlock/schema.js +1 -0
  26. package/build/cjs/blocks/Questions/schema.d.ts +7 -3
  27. package/build/cjs/blocks/Slider/schema.d.ts +13 -18
  28. package/build/cjs/blocks/Slider/schema.js +4 -5
  29. package/build/cjs/blocks/Table/schema.d.ts +5 -2
  30. package/build/cjs/blocks/Table/schema.js +12 -2
  31. package/build/cjs/blocks/Tabs/schema.d.ts +43 -16
  32. package/build/cjs/components/BlockBase/BlockBase.js +2 -2
  33. package/build/cjs/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +1 -1
  34. package/build/cjs/components/Image/schema.d.ts +1 -0
  35. package/build/cjs/components/Image/schema.js +3 -2
  36. package/build/cjs/containers/PageConstructor/components/ConstructorBlock/ConstructorBlock.js +1 -1
  37. package/build/cjs/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +1 -1
  38. package/build/cjs/customization/BlockDecoration.d.ts +1 -1
  39. package/build/cjs/customization/BlockDecoration.js +5 -6
  40. package/build/cjs/editor/{Components → components}/AddBlock/AddBlock.css +0 -7
  41. package/build/cjs/editor/components/AddBlock/AddBlock.d.ts +7 -0
  42. package/build/cjs/editor/{Components → components}/AddBlock/AddBlock.js +2 -2
  43. package/build/cjs/editor/components/BlockForm/BlockForm.d.ts +12 -0
  44. package/build/cjs/editor/components/BlockForm/BlockForm.js +26 -0
  45. package/build/cjs/editor/components/EditBlock/EditBlock.d.ts +13 -0
  46. package/build/cjs/editor/components/EditBlock/EditBlock.js +44 -0
  47. package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.css +27 -0
  48. package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.d.ts +13 -0
  49. package/build/cjs/editor/components/ErrorBoundary/ErrorBoundary.js +35 -0
  50. package/build/cjs/editor/components/ErrorBoundary/i18n/en.json +4 -0
  51. package/build/cjs/editor/components/ErrorBoundary/i18n/index.d.ts +2 -0
  52. package/build/cjs/editor/components/ErrorBoundary/i18n/index.js +8 -0
  53. package/build/cjs/editor/components/ErrorBoundary/i18n/ru.json +4 -0
  54. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.d.ts +10 -0
  55. package/build/cjs/editor/components/PagePropsForm/PagePropsForm.js +17 -0
  56. package/build/cjs/editor/containers/Editor/Editor.css +28 -0
  57. package/build/cjs/editor/containers/Editor/Editor.d.ts +2 -0
  58. package/build/cjs/editor/containers/Editor/Editor.js +37 -0
  59. package/build/cjs/editor/containers/Form/Form.css +94 -0
  60. package/build/cjs/editor/containers/Form/Form.d.ts +11 -0
  61. package/build/cjs/editor/containers/Form/Form.js +47 -0
  62. package/build/cjs/editor/containers/Form/dynamic-form-custom.css +0 -0
  63. package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.css +27 -0
  64. package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.d.ts +19 -0
  65. package/build/cjs/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.js +72 -0
  66. package/build/cjs/editor/dynamic-forms-custom/config.d.ts +2 -0
  67. package/build/cjs/editor/dynamic-forms-custom/config.js +13 -0
  68. package/build/cjs/editor/dynamic-forms-custom/hooks/useOneOf.d.ts +12 -0
  69. package/build/cjs/editor/dynamic-forms-custom/hooks/useOneOf.js +75 -0
  70. package/build/cjs/editor/dynamic-forms-custom/parser/detect.d.ts +9 -0
  71. package/build/cjs/editor/dynamic-forms-custom/parser/detect.js +36 -0
  72. package/build/cjs/editor/dynamic-forms-custom/parser/index.d.ts +28 -0
  73. package/build/cjs/editor/dynamic-forms-custom/parser/index.js +188 -0
  74. package/build/cjs/editor/dynamic-forms-custom/parser/types.d.ts +29 -0
  75. package/build/cjs/editor/dynamic-forms-custom/parser/types.js +2 -0
  76. package/build/cjs/editor/dynamic-forms-custom/parser/views.d.ts +37 -0
  77. package/build/cjs/editor/dynamic-forms-custom/parser/views.js +46 -0
  78. package/build/cjs/editor/hooks/useFormSpec.d.ts +2 -0
  79. package/build/cjs/editor/hooks/useFormSpec.js +13 -0
  80. package/build/cjs/editor/index.d.ts +1 -1
  81. package/build/cjs/editor/index.js +1 -1
  82. package/build/cjs/editor/store/index.d.ts +8 -11
  83. package/build/cjs/editor/store/index.js +61 -15
  84. package/build/cjs/editor/store/reducer.d.ts +17 -9
  85. package/build/cjs/editor/store/reducer.js +14 -31
  86. package/build/cjs/editor/store/utils.d.ts +1 -0
  87. package/build/cjs/editor/store/utils.js +3 -1
  88. package/build/cjs/editor/types/index.d.ts +11 -9
  89. package/build/cjs/editor/utils/index.d.ts +4 -3
  90. package/build/cjs/editor/utils/index.js +6 -4
  91. package/build/cjs/grid/Col/Col.d.ts +1 -1
  92. package/build/cjs/models/constructor-items/blocks.d.ts +13 -8
  93. package/build/cjs/models/constructor.d.ts +2 -2
  94. package/build/cjs/models/customization.d.ts +3 -8
  95. package/build/cjs/models/navigation.d.ts +1 -0
  96. package/build/cjs/navigation/components/Header/Header.css +2 -0
  97. package/build/cjs/navigation/components/Header/Header.js +15 -4
  98. package/build/cjs/navigation/schema.d.ts +1 -0
  99. package/build/cjs/schema/constants.d.ts +908 -0
  100. package/build/cjs/schema/constants.js +42 -0
  101. package/build/cjs/schema/index.d.ts +9 -228
  102. package/build/cjs/schema/index.js +8 -46
  103. package/build/cjs/schema/validators/common.d.ts +71 -27
  104. package/build/cjs/schema/validators/common.js +50 -17
  105. package/build/cjs/sub-blocks/BackgroundCard/schema.d.ts +12 -5
  106. package/build/cjs/sub-blocks/BasicCard/schema.d.ts +8 -3
  107. package/build/cjs/sub-blocks/Content/schema.d.ts +14 -6
  108. package/build/cjs/sub-blocks/Content/schema.js +9 -1
  109. package/build/cjs/sub-blocks/LayoutItem/schema.d.ts +23 -9
  110. package/build/cjs/sub-blocks/MediaCard/schema.d.ts +16 -6
  111. package/build/cjs/sub-blocks/PriceDetailed/schema.d.ts +1 -0
  112. package/build/cjs/sub-blocks/PriceDetailed/schema.js +5 -1
  113. package/build/cjs/sub-blocks/Quote/schema.d.ts +6 -2
  114. package/build/esm/blocks/Banner/schema.d.ts +63 -21
  115. package/build/esm/blocks/CardLayout/schema.d.ts +10 -4
  116. package/build/esm/blocks/Companies/schema.d.ts +5 -2
  117. package/build/esm/blocks/ContentLayout/ContentLayout.js +3 -2
  118. package/build/esm/blocks/ContentLayout/schema.d.ts +107 -61
  119. package/build/esm/blocks/ContentLayout/schema.js +23 -18
  120. package/build/esm/blocks/ExtendedFeatures/schema.d.ts +31 -4
  121. package/build/esm/blocks/ExtendedFeatures/schema.js +3 -4
  122. package/build/esm/blocks/FilterBlock/schema.d.ts +13 -5
  123. package/build/esm/blocks/FilterBlock/schema.js +13 -2
  124. package/build/esm/blocks/Header/Header.css +6 -7
  125. package/build/esm/blocks/Header/schema.d.ts +92 -36
  126. package/build/esm/blocks/Header/schema.js +1 -0
  127. package/build/esm/blocks/HeaderSlider/schema.d.ts +48 -53
  128. package/build/esm/blocks/HeaderSlider/schema.js +2 -1
  129. package/build/esm/blocks/Icons/schema.d.ts +3 -1
  130. package/build/esm/blocks/Icons/schema.js +2 -1
  131. package/build/esm/blocks/Info/schema.d.ts +19 -8
  132. package/build/esm/blocks/Map/schema.d.ts +17 -6
  133. package/build/esm/blocks/Media/schema.d.ts +204 -152
  134. package/build/esm/blocks/Media/schema.js +2 -2
  135. package/build/esm/blocks/PromoFeaturesBlock/schema.d.ts +22 -8
  136. package/build/esm/blocks/PromoFeaturesBlock/schema.js +1 -0
  137. package/build/esm/blocks/Questions/schema.d.ts +7 -3
  138. package/build/esm/blocks/Slider/schema.d.ts +13 -18
  139. package/build/esm/blocks/Slider/schema.js +4 -5
  140. package/build/esm/blocks/Table/schema.d.ts +5 -2
  141. package/build/esm/blocks/Table/schema.js +12 -2
  142. package/build/esm/blocks/Tabs/schema.d.ts +43 -16
  143. package/build/esm/components/BlockBase/BlockBase.js +2 -2
  144. package/build/esm/components/HeaderBreadcrumbs/HeaderBreadcrumbs.js +1 -1
  145. package/build/esm/components/Image/schema.d.ts +1 -0
  146. package/build/esm/components/Image/schema.js +3 -2
  147. package/build/esm/containers/PageConstructor/components/ConstructorBlock/ConstructorBlock.js +1 -1
  148. package/build/esm/containers/PageConstructor/components/ConstructorItem/ConstructorItem.js +1 -1
  149. package/build/esm/customization/BlockDecoration.d.ts +1 -1
  150. package/build/esm/customization/BlockDecoration.js +6 -6
  151. package/build/esm/editor/{Components → components}/AddBlock/AddBlock.css +0 -7
  152. package/build/esm/editor/components/AddBlock/AddBlock.d.ts +8 -0
  153. package/build/esm/editor/{Components → components}/AddBlock/AddBlock.js +2 -2
  154. package/build/esm/editor/components/BlockForm/BlockForm.d.ts +12 -0
  155. package/build/esm/editor/components/BlockForm/BlockForm.js +23 -0
  156. package/build/esm/editor/components/EditBlock/EditBlock.d.ts +14 -0
  157. package/build/esm/editor/components/EditBlock/EditBlock.js +41 -0
  158. package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.css +27 -0
  159. package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.d.ts +14 -0
  160. package/build/esm/editor/components/ErrorBoundary/ErrorBoundary.js +31 -0
  161. package/build/esm/editor/components/ErrorBoundary/i18n/en.json +4 -0
  162. package/build/esm/editor/components/ErrorBoundary/i18n/index.d.ts +2 -0
  163. package/build/esm/editor/components/ErrorBoundary/i18n/index.js +5 -0
  164. package/build/esm/editor/components/ErrorBoundary/i18n/ru.json +4 -0
  165. package/build/esm/editor/components/PagePropsForm/PagePropsForm.d.ts +10 -0
  166. package/build/esm/editor/components/PagePropsForm/PagePropsForm.js +13 -0
  167. package/build/esm/editor/containers/Editor/Editor.css +28 -0
  168. package/build/esm/editor/containers/Editor/Editor.d.ts +3 -0
  169. package/build/esm/editor/containers/Editor/Editor.js +34 -0
  170. package/build/esm/editor/containers/Form/Form.css +94 -0
  171. package/build/esm/editor/containers/Form/Form.d.ts +12 -0
  172. package/build/esm/editor/containers/Form/Form.js +45 -0
  173. package/build/esm/editor/containers/Form/dynamic-form-custom.css +0 -0
  174. package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.css +27 -0
  175. package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.d.ts +20 -0
  176. package/build/esm/editor/dynamic-forms-custom/components/OneOfCustom/OneOfCustom.js +68 -0
  177. package/build/esm/editor/dynamic-forms-custom/config.d.ts +2 -0
  178. package/build/esm/editor/dynamic-forms-custom/config.js +9 -0
  179. package/build/esm/editor/dynamic-forms-custom/hooks/useOneOf.d.ts +12 -0
  180. package/build/esm/editor/dynamic-forms-custom/hooks/useOneOf.js +69 -0
  181. package/build/esm/editor/dynamic-forms-custom/parser/detect.d.ts +9 -0
  182. package/build/esm/editor/dynamic-forms-custom/parser/detect.js +32 -0
  183. package/build/esm/editor/dynamic-forms-custom/parser/index.d.ts +28 -0
  184. package/build/esm/editor/dynamic-forms-custom/parser/index.js +186 -0
  185. package/build/esm/editor/dynamic-forms-custom/parser/types.d.ts +29 -0
  186. package/build/esm/editor/dynamic-forms-custom/parser/types.js +1 -0
  187. package/build/esm/editor/dynamic-forms-custom/parser/views.d.ts +37 -0
  188. package/build/esm/editor/dynamic-forms-custom/parser/views.js +39 -0
  189. package/build/esm/editor/hooks/useFormSpec.d.ts +2 -0
  190. package/build/esm/editor/hooks/useFormSpec.js +9 -0
  191. package/build/esm/editor/index.d.ts +1 -1
  192. package/build/esm/editor/index.js +1 -1
  193. package/build/esm/editor/store/index.d.ts +8 -11
  194. package/build/esm/editor/store/index.js +63 -17
  195. package/build/esm/editor/store/reducer.d.ts +17 -9
  196. package/build/esm/editor/store/reducer.js +12 -29
  197. package/build/esm/editor/store/utils.d.ts +1 -0
  198. package/build/esm/editor/store/utils.js +1 -0
  199. package/build/esm/editor/types/index.d.ts +11 -9
  200. package/build/esm/editor/utils/index.d.ts +4 -3
  201. package/build/esm/editor/utils/index.js +4 -3
  202. package/build/esm/grid/Col/Col.d.ts +1 -1
  203. package/build/esm/models/constructor-items/blocks.d.ts +13 -8
  204. package/build/esm/models/constructor.d.ts +2 -2
  205. package/build/esm/models/customization.d.ts +3 -8
  206. package/build/esm/models/navigation.d.ts +1 -0
  207. package/build/esm/navigation/components/Header/Header.css +2 -0
  208. package/build/esm/navigation/components/Header/Header.js +16 -5
  209. package/build/esm/navigation/schema.d.ts +1 -0
  210. package/build/esm/schema/constants.d.ts +908 -0
  211. package/build/esm/schema/constants.js +39 -0
  212. package/build/esm/schema/index.d.ts +9 -228
  213. package/build/esm/schema/index.js +4 -42
  214. package/build/esm/schema/validators/common.d.ts +71 -27
  215. package/build/esm/schema/validators/common.js +49 -16
  216. package/build/esm/sub-blocks/BackgroundCard/schema.d.ts +12 -5
  217. package/build/esm/sub-blocks/BasicCard/schema.d.ts +8 -3
  218. package/build/esm/sub-blocks/Content/schema.d.ts +14 -6
  219. package/build/esm/sub-blocks/Content/schema.js +9 -1
  220. package/build/esm/sub-blocks/LayoutItem/schema.d.ts +23 -9
  221. package/build/esm/sub-blocks/MediaCard/schema.d.ts +16 -6
  222. package/build/esm/sub-blocks/PriceDetailed/schema.d.ts +1 -0
  223. package/build/esm/sub-blocks/PriceDetailed/schema.js +5 -1
  224. package/build/esm/sub-blocks/Quote/schema.d.ts +6 -2
  225. package/package.json +5 -1
  226. package/server/models/constructor-items/blocks.d.ts +13 -8
  227. package/server/models/constructor.d.ts +2 -2
  228. package/server/models/customization.d.ts +3 -8
  229. package/server/models/navigation.d.ts +1 -0
  230. package/build/cjs/editor/Components/AddBlock/AddBlock.d.ts +0 -7
  231. package/build/cjs/editor/Components/EditBlock/EditBlock.d.ts +0 -4
  232. package/build/cjs/editor/Components/EditBlock/EditBlock.js +0 -32
  233. package/build/cjs/editor/Containers/Editor.d.ts +0 -2
  234. package/build/cjs/editor/Containers/Editor.js +0 -24
  235. package/build/esm/editor/Components/AddBlock/AddBlock.d.ts +0 -8
  236. package/build/esm/editor/Components/EditBlock/EditBlock.d.ts +0 -5
  237. package/build/esm/editor/Components/EditBlock/EditBlock.js +0 -30
  238. package/build/esm/editor/Containers/Editor.d.ts +0 -2
  239. package/build/esm/editor/Containers/Editor.js +0 -20
  240. /package/build/cjs/editor/{Components → components}/EditBlock/EditBlock.css +0 -0
  241. /package/build/esm/editor/{Components → components}/EditBlock/EditBlock.css +0 -0
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { Block } from '../../../models';
3
+ import { CustomSpec } from '../../dynamic-forms-custom/parser/types';
4
+ interface BlockFormProps {
5
+ data: Block;
6
+ spec: CustomSpec;
7
+ onChange: (data: Block) => void;
8
+ onSelect: () => void;
9
+ active?: boolean;
10
+ }
11
+ export declare const BlockForm: React.MemoExoticComponent<({ data: { type, ...content }, onChange, onSelect, active, spec: specRaw }: BlockFormProps) => JSX.Element>;
12
+ export {};
@@ -0,0 +1,23 @@
1
+ import { __rest } from "tslib";
2
+ import React, { memo, useMemo } from 'react';
3
+ import { DynamicField } from '@gravity-ui/dynamic-forms';
4
+ import _ from 'lodash';
5
+ import { Form as FinalForm, FormSpy } from 'react-final-form';
6
+ import { dynamicConfig } from '../../dynamic-forms-custom/config';
7
+ export const BlockForm = memo((_a) => {
8
+ var _b = _a.data, { type } = _b, content = __rest(_b, ["type"]), { onChange, onSelect, active, spec: specRaw } = _a;
9
+ // get initial values only at first render, then the form manages data
10
+ // eslint-disable-next-line react-hooks/exhaustive-deps
11
+ const initialValues = useMemo(() => ({ content }), []);
12
+ const spec = useMemo(() => (Object.assign(Object.assign({}, specRaw), { viewSpec: Object.assign(Object.assign({}, specRaw.viewSpec), { layoutOpen: active }) })), [specRaw, active]);
13
+ return (React.createElement(FinalForm, { initialValues: initialValues, onSubmit: _.noop }, () => (React.createElement("div", { onClick: () => {
14
+ if (!active) {
15
+ onSelect();
16
+ }
17
+ } },
18
+ React.createElement(FormSpy, { onChange: ({ values }) => onChange(Object.assign({ type }, values.content)), subscription: { values: true } }),
19
+ React.createElement(DynamicField, { name: "content",
20
+ // there is no way other way to manage with form open/close state now
21
+ key: String(active), spec: spec, config: dynamicConfig })))));
22
+ });
23
+ BlockForm.displayName = 'BlockForm';
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { EditBlockProps } from '../../types';
3
+ import './EditBlock.css';
4
+ export declare enum EditBlockControls {
5
+ Up = "up",
6
+ Down = "down",
7
+ Copy = "copy",
8
+ Delete = "delete"
9
+ }
10
+ export type EditBlockActions = {
11
+ [key in EditBlockControls]?: () => void;
12
+ };
13
+ declare const _default: React.MemoExoticComponent<({ actions, isActive, onSelect, isHeader, children }: EditBlockProps) => JSX.Element>;
14
+ export default _default;
@@ -0,0 +1,41 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { ChevronDown, ChevronUp, Copy as CopyIcon, TrashBin } from '@gravity-ui/icons';
3
+ import { block } from '../../../utils';
4
+ import './EditBlock.css';
5
+ const b = block('edit-block');
6
+ export var EditBlockControls;
7
+ (function (EditBlockControls) {
8
+ EditBlockControls["Up"] = "up";
9
+ EditBlockControls["Down"] = "down";
10
+ EditBlockControls["Copy"] = "copy";
11
+ EditBlockControls["Delete"] = "delete";
12
+ })(EditBlockControls || (EditBlockControls = {}));
13
+ const actionsOrder = [
14
+ EditBlockControls.Up,
15
+ EditBlockControls.Down,
16
+ EditBlockControls.Copy,
17
+ EditBlockControls.Delete,
18
+ ];
19
+ const editBlockControlsIcons = {
20
+ [EditBlockControls.Up]: ChevronUp,
21
+ [EditBlockControls.Down]: ChevronDown,
22
+ [EditBlockControls.Copy]: CopyIcon,
23
+ [EditBlockControls.Delete]: TrashBin,
24
+ };
25
+ const EditBlock = ({ actions, isActive, onSelect, isHeader, children }) => {
26
+ const ref = useRef(null);
27
+ useEffect(() => {
28
+ if (isActive && ref.current) {
29
+ //TODO: add behavior 'smooth' after addiiton of dynamic form layout open/close managing support
30
+ ref.current.scrollIntoView({ block: 'center' });
31
+ }
32
+ }, [isActive]);
33
+ return (React.createElement("div", { className: b(), onClick: onSelect, ref: ref },
34
+ React.createElement("div", { className: b('controls', { active: isActive, isHeader }) }, isActive && (React.createElement("div", { className: b('controls-content'), onClick: (e) => e.stopPropagation() }, actionsOrder.map((action) => {
35
+ const Icon = editBlockControlsIcons[action];
36
+ return actions[action] ? (React.createElement("div", { key: action, className: b('control'), onClick: actions[action] },
37
+ React.createElement(Icon, null))) : null;
38
+ })))),
39
+ children));
40
+ };
41
+ export default React.memo(EditBlock);
@@ -0,0 +1,27 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-error-boundary__container {
4
+ display: flex;
5
+ width: 100%;
6
+ padding: 32px;
7
+ background-color: var(--yc-color-base-background);
8
+ border-radius: var(--pc-border-radius);
9
+ box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.06), 0px 4px 24px rgba(0, 0, 0, 0.06);
10
+ }
11
+ .pc-error-boundary__header {
12
+ margin-top: 0;
13
+ }
14
+ .pc-error-boundary__error {
15
+ display: block;
16
+ color: var(--yc-color-text-danger);
17
+ max-height: 160px;
18
+ overflow: auto;
19
+ }
20
+ .pc-error-boundary__image {
21
+ flex: 0 0 auto;
22
+ width: 200px;
23
+ height: 200px;
24
+ background-repeat: no-repeat;
25
+ background-size: contain;
26
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MDAiIGhlaWdodD0iNDAwIj48c3R5bGU+LnN0MHtmaWxsOiNlY2YyZjl9LnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMyZWU1YzA7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwfS5zdDJ7ZmlsbDojMDA3Y2U5fS5zdDN7ZmlsbDojMDAyMzZifS5zdDR7ZmlsbDojMDBlNmM1fS5zdDExe2ZpbGw6I2ZmNDY0NX0uc3QxNXtmaWxsOm5vbmU7c3Ryb2tlOiMyZWU1YzA7c3Ryb2tlLXdpZHRoOjMuNzI1MjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LnN0MTUsLnN0MTZ7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LnN0MTYsLnN0MTd7ZmlsbDpub25lO3N0cm9rZTojMDA3Y2U5O3N0cm9rZS13aWR0aDo0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uc3QxOHtmaWxsOiNmYzB9PC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTMxLjcgMjkzLjdoMjM1LjJWMTc5LjRjMC05LjEtNy40LTE2LjUtMTYuNS0xNi41SDEzMS43djEzMC44eiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xODguMyAyOTUuNEg3MS43VjU1LjJjMC0xMi41IDEwLjEtMTcuNyAyMi42LTE3LjdoOTR2MjU3Ljl6TTIzMS4zIDI0Ny4zaDg5Ljh2LTIyMGMwLTEwLjQtOC41LTE0LjgtMTguOS0xNC44aC03MC45djIzNC44eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yODQuNiAxNDkuOWgxMi43YzYuOSAwIDEyLjQgNi4yIDEyLjQgMTMuN3Y1OS41TTI4NC42IDE5Ni45aDYuNGMzLjUgMCA2LjMgMi4yIDYuMyA5Ljd2NjMuNSIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yODQuNiAxMTYuN0gzMDVjOS40IDAgMTcgNy42IDE3IDE3djkwLjEiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjg0LjYgODcuNmgyNi42YzEyLjYgMCAyMi44IDEwLjIgMjIuOCAyMi44djEyMy4xTTE3Ni40IDY2LjRoMTA3Ljl2MTA3LjlIMTc2LjR6TTE3Ni40IDE3NC4zaDEwNy45djEwNy45SDE3Ni40eiIvPjxwYXRoIGNsYXNzPSJzdDE1IiBkPSJNMjIxLjkgNzkuMWg0OS40TTIyMS45IDg3LjZoMzAuOE0yMjEuOSA5Ni4yaDQ5LjQiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSI3OS4xIiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9Ijc5LjEiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iNzkuMSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iODcuNiIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTk4LjYiIGN5PSI4Ny42IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9Ijg3LjYiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9Ijk2LjIiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iOTYuMiIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMjA3LjIiIGN5PSI5Ni4yIiByPSIyLjEiLz48cGF0aCBjbGFzcz0ic3QxNSIgZD0iTTIyMS45IDExMS4zaDQ5LjRNMjIxLjkgMTE5LjloNDkuNE0yMjEuOSAxMjguNWg0MS40Ii8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iMTExLjMiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMTExLjMiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iMTExLjMiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9IjExOS45IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9IjExOS45IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjExOS45IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSIxMjguNSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTk4LjYiIGN5PSIxMjguNSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMjA3LjIiIGN5PSIxMjguNSIgcj0iMi4xIi8+PHBhdGggY2xhc3M9InN0MTUiIGQ9Ik0yMjEuOSAxNDMuNWg0OS40TTIyMS45IDE1Mi4xaDQ5LjRNMjIxLjkgMTYwLjdoNDkuNCIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9IjE0My41IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9IjE0My41IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjE0My41IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSIxNTIuMSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTk4LjYiIGN5PSIxNTIuMSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMjA3LjIiIGN5PSIxNTIuMSIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iMTYwLjciIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMTYwLjciIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iMTYwLjciIHI9IjIuMSIvPjxnPjxwYXRoIGNsYXNzPSJzdDE1IiBkPSJNMjIxLjkgMTg3LjRoNDkuNE0yMjEuOSAxOTUuOWgzMC44TTIyMS45IDIwNC41aDQ5LjQiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSIxODcuNCIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTk4LjYiIGN5PSIxODcuNCIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMjA3LjIiIGN5PSIxODcuNCIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iMTk1LjkiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMTk1LjkiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iMTk1LjkiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9IjIwNC41IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9IjIwNC41IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjIwNC41IiByPSIyLjEiLz48cGF0aCBjbGFzcz0ic3QxNSIgZD0iTTIyMS45IDIxOS42aDQ5LjRNMjIxLjkgMjI4LjJoNDkuNE0yMjEuOSAyMzYuOGg0MS40Ii8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iMjE5LjYiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMjE5LjYiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iMjE5LjYiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9IjIyOC4yIiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9IjIyOC4yIiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjIyOC4yIiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSIyMzYuOCIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTk4LjYiIGN5PSIyMzYuOCIgcj0iMi4xIi8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMjA3LjIiIGN5PSIyMzYuOCIgcj0iMi4xIi8+PHBhdGggY2xhc3M9InN0MTUiIGQ9Ik0yMjEuOSAyNTEuOGg0OS40TTIyMS45IDI2MC40aDQ5LjRNMjIxLjkgMjY5aDE0Ii8+PGNpcmNsZSBjbGFzcz0ic3Q0IiBjeD0iMTkwIiBjeT0iMjUxLjgiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMjUxLjgiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjIwNy4yIiBjeT0iMjUxLjgiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5MCIgY3k9IjI2MC40IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTguNiIgY3k9IjI2MC40IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjI2MC40IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIxOTAiIGN5PSIyNjkiIHI9IjIuMSIvPjxjaXJjbGUgY2xhc3M9InN0NCIgY3g9IjE5OC42IiBjeT0iMjY5IiByPSIyLjEiLz48Y2lyY2xlIGNsYXNzPSJzdDQiIGN4PSIyMDcuMiIgY3k9IjI2OSIgcj0iMi4xIi8+PC9nPjxnPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik03Mi44IDE3My4xYy03LjMgMi45LTI3LjkgMTQuNC0yNy45IDI3LjUgMCAzLjcgMi4yIDguMSAxNyA2LjIgMjcuMS0zLjUgNzcuOS0xLjggNzcuOS0xLjhsNTcuOS00LjYtMTI0LjktMjcuM3oiLz48cGF0aCBjbGFzcz0ic3QyIiBkPSJNNDcuMiAyMDQuNWw1NS4xLTcuN2MxLjQtLjIgMi42LTIuNSAyLjYtNVY3NC4zYzAtMi41LTIuNy0zLjUtNC4yLTMuMWwtNTMuNSAxOGMtMS4yLjQtMi4yIDIuNi0yLjIgNXYxMDYuNWMtLjEgMi4zLjkgNCAyLjIgMy44eiIvPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0xOTcuOCAyMDAuM2wtOTUuNS0zLjdjLTIuNS0uMS00LjUtMi4yLTQuNS00LjZWNzVjMC0yLjUgMi00LjIgNC41LTMuOUwxOTcuOCA4M2MyLjEuMyAzLjkgMi4zIDMuOSA0LjZ2MTA4LjhjMCAyLjItMS43IDQtMy45IDMuOXoiLz48cGF0aCBjbGFzcz0ic3QxNyIgZD0iTTk3LjkgMTEyLjZsMTAzLjggMTAuNSIvPjxwYXRoIGNsYXNzPSJzdDE2IiBkPSJNMTEzLjMgODUuNmw3NS45IDkuMU0xMTMuMyAxMzAuNWw3NS45IDcuMU0xMTMuMyAxNzIuN2w3NS45IDQuMiIvPjxwYXRoIGNsYXNzPSJzdDE3IiBkPSJNOTYuMSAxNTUuNmwxMDUuNiA3LjJNOTYuMSAxOTUuM2wxMDUuNiAzLjYiLz48L2c+PGc+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQ3LjIgMzI0LjZsNTUuNCA2LjFjMS40LjEgMi42LTEuOSAyLjYtNC40VjIwNS41YzAtMi41LTEuMi00LjUtMi42LTQuNGwtNTUuNCA3LjRjLTEuMi4xLTIuMyAyLjEtMi4zIDQuNHYxMDcuMmMwIDIuNCAxIDQuNCAyLjMgNC41eiIvPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0xOTguOCAzMjYuNWwtOTYuMSA0LjJjLTIuNS4xLTQuNS0xLjktNC41LTQuNFYyMDUuNWMwLTIuNSAyLTQuNSA0LjUtNC40bDk2LjEgNC4yYzIuMi4xIDMuOSAyLjEgMy45IDQuNFYzMjJjLjEgMi40LTEuNyA0LjQtMy45IDQuNXoiLz48cGF0aCBjbGFzcz0ic3QxNyIgZD0iTTk4LjIgMjQ0LjNsMTA0LjYgMi4xTTk2LjQgMjg4LjlsMTA2LjQtMS41Ii8+PHBhdGggY2xhc3M9InN0MTYiIGQ9Ik0xMTMuMyAyMTQuN2w3Ni4xIDNNMTEzLjMgMjU5LjZsNzYuMS45TTExMy4zIDMwMS43bDc2LjEtMiIvPjwvZz48Zz48cGF0aCBjbGFzcz0ic3QyIiBkPSJNMTUxIDMzNi40bDcwIDcuN2MxLjguMSAzLjMtMi40IDMuMy01LjZWMTg2YzAtMy4yLTEuNS01LjctMy4zLTUuNmwtNzAgOS4zYy0xLjYuMS0yLjggMi42LTIuOCA1LjZ2MTM1LjRjMCAzLjEgMS4zIDUuNiAyLjggNS43eiIvPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0zNDIuNSAzMzguOGwtMTIxLjMgNS4zYy0zLjEuMS01LjctMi40LTUuNy01LjZWMTg2YzAtMy4yIDIuNS01LjcgNS43LTUuNmwxMjEuMyA1LjNjMi43LjEgNC45IDIuNiA0LjkgNS42djE0MS44YzAgMy4xLTIuMiA1LjYtNC45IDUuN3oiLz48cGF0aCBjbGFzcz0ic3QxNyIgZD0iTTIxNS41IDIzNS4xbDEzMS45IDIuNk0yMTMuMiAyOTEuM2wxMzQuMi0xLjgiLz48cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTIzNC4zIDE5OC40YzAgMS44LTEuMyAzLjMtMyAzLjItMS43LS4xLTMtMS43LTMtMy41czEuNC0zLjMgMy0zLjJjMS42LjEgMyAxLjcgMyAzLjV6Ii8+PHBhdGggY2xhc3M9InN0MTgiIGQ9Ik0yNDggMTk5LjJjMCAxLjgtMS4zIDMuMi0zIDMuMi0xLjYtLjEtMy0xLjYtMy0zLjVzMS4zLTMuMyAzLTMuMmMxLjcuMSAzIDEuNiAzIDMuNXpNMjYxLjQgMTk5LjljMCAxLjgtMS4zIDMuMi0yLjkgMy4xLTEuNi0uMS0yLjktMS42LTIuOS0zLjQgMC0xLjggMS4zLTMuMiAyLjktMy4xIDEuNi4xIDIuOSAxLjYgMi45IDMuNHoiLz48cGF0aCBjbGFzcz0ic3QyIiBkPSJNMjc0LjYgMjAwLjZjMCAxLjgtMS4zIDMuMi0yLjggMy4xLTEuNi0uMS0yLjgtMS42LTIuOC0zLjRzMS4zLTMuMiAyLjgtMy4xYzEuNS4xIDIuOCAxLjYgMi44IDMuNHpNMjg3LjUgMjAxLjNjMCAxLjgtMS4yIDMuMi0yLjggMy4xLTEuNS0uMS0yLjgtMS42LTIuOC0zLjRzMS4zLTMuMiAyLjgtMy4xYzEuNS4yIDIuOCAxLjcgMi44IDMuNHpNMzAwLjEgMjAyYzAgMS44LTEuMiAzLjEtMi43IDMtMS41LS4xLTIuNy0xLjYtMi43LTMuMyAwLTEuOCAxLjItMy4xIDIuNy0zIDEuNS4xIDIuNyAxLjYgMi43IDMuM3pNMzEyLjUgMjAyLjdjMCAxLjctMS4yIDMuMS0yLjcgMy0xLjUtLjEtMi43LTEuNi0yLjctMy4zIDAtMS44IDEuMi0zLjEgMi43LTMgMS41LjEgMi43IDEuNiAyLjcgMy4zek0zMjQuNyAyMDMuNGMwIDEuNy0xLjIgMy4xLTIuNiAzLTEuNS0uMS0yLjYtMS41LTIuNi0zLjMgMC0xLjcgMS4yLTMuMSAyLjYtMyAxLjQuMSAyLjYgMS42IDIuNiAzLjN6TTMzNi42IDIwNC4xYzAgMS43LTEuMiAzLTIuNiAzLTEuNC0uMS0yLjYtMS41LTIuNi0zLjIgMC0xLjcgMS4yLTMgMi42LTMgMS41IDAgMi42IDEuNCAyLjYgMy4yeiIvPjxnPjxwYXRoIGNsYXNzPSJzdDExIiBkPSJNMjM0LjMgMjUzLjhjMCAxLjgtMS4zIDMuMy0zIDMuM3MtMy0xLjUtMy0zLjQgMS40LTMuMyAzLTMuMyAzIDEuNSAzIDMuNHpNMjQ4IDI1My45YzAgMS44LTEuMyAzLjMtMyAzLjMtMS42IDAtMy0xLjUtMy0zLjRzMS4zLTMuMyAzLTMuM2MxLjcuMSAzIDEuNiAzIDMuNHoiLz48cGF0aCBjbGFzcz0ic3QxOCIgZD0iTTI2MS40IDI1NC4xYzAgMS44LTEuMyAzLjMtMi45IDMuMi0xLjYgMC0yLjktMS41LTIuOS0zLjNzMS4zLTMuMyAyLjktMy4yYzEuNiAwIDIuOSAxLjUgMi45IDMuM3pNMjc0LjYgMjU0LjNjMCAxLjgtMS4zIDMuMi0yLjggMy4yLTEuNiAwLTIuOC0xLjUtMi44LTMuM3MxLjMtMy4yIDIuOC0zLjJjMS41LjEgMi44IDEuNSAyLjggMy4zek0yODcuNSAyNTQuNWMwIDEuOC0xLjIgMy4yLTIuOCAzLjItMS41IDAtMi44LTEuNS0yLjgtMy4zczEuMy0zLjIgMi44LTMuMmMxLjUuMSAyLjggMS41IDIuOCAzLjN6Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTMwMC4xIDI1NC43YzAgMS44LTEuMiAzLjItMi43IDMuMi0xLjUgMC0yLjctMS41LTIuNy0zLjIgMC0xLjggMS4yLTMuMiAyLjctMy4yIDEuNSAwIDIuNyAxLjQgMi43IDMuMnpNMzEyLjUgMjU0LjljMCAxLjctMS4yIDMuMS0yLjcgMy4xLTEuNSAwLTIuNy0xLjQtMi43LTMuMnMxLjItMy4xIDIuNy0zLjFjMS41IDAgMi43IDEuNCAyLjcgMy4yek0zMjQuNyAyNTVjMCAxLjctMS4yIDMuMS0yLjYgMy4xLTEuNSAwLTIuNi0xLjQtMi42LTMuMiAwLTEuNyAxLjItMy4xIDIuNi0zLjEgMS40LjEgMi42IDEuNSAyLjYgMy4yek0zMzYuNiAyNTUuMmMwIDEuNy0xLjIgMy4xLTIuNiAzLjEtMS40IDAtMi42LTEuNC0yLjYtMy4xIDAtMS43IDEuMi0zLjEgMi42LTMuMSAxLjUgMCAyLjYgMS40IDIuNiAzLjF6Ii8+PC9nPjxnPjxwYXRoIGNsYXNzPSJzdDExIiBkPSJNMjM0LjMgMzA5LjFjMCAxLjgtMS4zIDMuNC0zIDMuNHMtMy0xLjQtMy0zLjMgMS40LTMuNCAzLTMuNCAzIDEuNCAzIDMuM3oiLz48cGF0aCBjbGFzcz0ic3QxOCIgZD0iTTI0OCAzMDguN2MwIDEuOC0xLjMgMy40LTMgMy40LTEuNiAwLTMtMS40LTMtMy4yIDAtMS44IDEuMy0zLjQgMy0zLjQgMS43LS4xIDMgMS40IDMgMy4yek0yNjEuNCAzMDguNGMwIDEuOC0xLjMgMy4zLTIuOSAzLjQtMS42IDAtMi45LTEuNC0yLjktMy4yIDAtMS44IDEuMy0zLjMgMi45LTMuNCAxLjYtLjEgMi45IDEuNCAyLjkgMy4yek0yNzQuNiAzMDhjMCAxLjgtMS4zIDMuMy0yLjggMy4zLTEuNiAwLTIuOC0xLjQtMi44LTMuMnMxLjMtMy4zIDIuOC0zLjNjMS41IDAgMi44IDEuNCAyLjggMy4yeiIvPjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0yODcuNSAzMDcuN2MwIDEuOC0xLjIgMy4zLTIuOCAzLjMtMS41IDAtMi44LTEuNC0yLjgtMy4xIDAtMS44IDEuMy0zLjMgMi44LTMuMyAxLjUtLjEgMi44IDEuMyAyLjggMy4xek0zMDAuMSAzMDcuM2MwIDEuOC0xLjIgMy4yLTIuNyAzLjMtMS41IDAtMi43LTEuNC0yLjctMy4xIDAtMS44IDEuMi0zLjIgMi43LTMuMyAxLjUgMCAyLjcgMS40IDIuNyAzLjF6TTMxMi41IDMwN2MwIDEuNy0xLjIgMy4yLTIuNyAzLjItMS41IDAtMi43LTEuMy0yLjctMy4xczEuMi0zLjIgMi43LTMuMmMxLjUgMCAyLjcgMS40IDIuNyAzLjF6TTMyNC43IDMwNi43YzAgMS43LTEuMiAzLjItMi42IDMuMi0xLjUgMC0yLjYtMS4zLTIuNi0zLjFzMS4yLTMuMiAyLjYtMy4yYzEuNCAwIDIuNiAxLjMgMi42IDMuMXpNMzM2LjYgMzA2LjNjMCAxLjctMS4yIDMuMS0yLjYgMy4yLTEuNCAwLTIuNi0xLjMtMi42LTNzMS4yLTMuMSAyLjYtMy4yYzEuNSAwIDIuNiAxLjMgMi42IDN6Ii8+PC9nPjwvZz48Zz48cGF0aCBjbGFzcz0ic3QzIiBkPSJNNTkuNCAxMDNjMCAxLjggMS40IDMuMiAzLjEgMi45IDEuNy0uMiAzLjEtMS45IDMuMS0zLjhzLTEuNC0zLjItMy4xLTIuOWMtMS43LjItMy4xIDEuOS0zLjEgMy44ek01OS40IDE0MC41YzAgMS44IDEuNCAzLjIgMy4xIDIuOSAxLjctLjIgMy4xLTEuOSAzLjEtMy44cy0xLjQtMy4yLTMuMS0yLjljLTEuNy4zLTMuMSAyLTMuMSAzLjh6TTU5LjQgMTc4LjFjMCAxLjggMS40IDMuMiAzLjEgMi45IDEuNy0uMiAzLjEtMS45IDMuMS0zLjhzLTEuNC0zLjItMy4xLTIuOWMtMS43LjMtMy4xIDItMy4xIDMuOHoiLz48L2c+PGc+PHBhdGggY2xhc3M9InN0MyIgZD0iTTU5LjQgMjI4LjdjMCAxLjggMS40IDMuMiAzLjEgMi45IDEuNy0uMiAzLjEtMS45IDMuMS0zLjhzLTEuNC0zLjItMy4xLTIuOWMtMS43LjMtMy4xIDItMy4xIDMuOHpNNTkuNCAyNjYuM2MwIDEuOCAxLjQgMy4yIDMuMSAyLjkgMS43LS4yIDMuMS0xLjkgMy4xLTMuOHMtMS40LTMuMi0zLjEtMi45Yy0xLjcuMy0zLjEgMi0zLjEgMy44ek01OS40IDMwMy45YzAgMS44IDEuNCAzLjIgMy4xIDIuOSAxLjctLjIgMy4xLTEuOSAzLjEtMy44cy0xLjQtMy4yLTMuMS0yLjljLTEuNy4zLTMuMSAxLjktMy4xIDMuOHoiLz48L2c+PGc+PHBhdGggY2xhc3M9InN0MyIgZD0iTTE2Mi4zIDIxMy44YzAgMi40IDEuOCA0LjEgNCAzLjggMi4yLS4zIDQuMS0yLjUgNC4xLTQuOXMtMS44LTQuMS00LjEtMy44Yy0yLjIuMy00IDIuNS00IDQuOXpNMTYyLjMgMjYzLjFjMCAyLjQgMS44IDQuMSA0IDMuOCAyLjItLjMgNC4xLTIuNSA0LjEtNC45cy0xLjgtNC4xLTQuMS0zLjhjLTIuMi4zLTQgMi41LTQgNC45ek0xNjIuMyAzMTIuNGMwIDIuNCAxLjggNC4xIDQgMy44IDIuMi0uMyA0LjEtMi41IDQuMS00LjkgMC0yLjQtMS44LTQuMS00LjEtMy44LTIuMi4zLTQgMi41LTQgNC45eiIvPjwvZz48Zz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjEuNyAxMDIuNmwtMjItMS43Yy0zLjktLjMtNy4yIDIuOC03LjIgNi43djIwNi41Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTYxLjcgMTQwLjFsLTIyLTEuN2MtMy45LS4zLTcuMiAyLjgtNy4yIDYuN3Y5MS44Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTYxLjcgMTc3LjlsLTIyLS44Yy0zLjktLjMtNy4yIDIuOC03LjIgNi43djc2LjEiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjEuNyAyMjcuOWwtMjIgLjFjLTMuOS0uMy03LjIgMi44LTcuMiA2Ljd2NzYuMSIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik02MS43IDI2NS44bC0yMiAuMWMtMy45LS4zLTcuMiAyLjgtNy4yIDYuN3Y0OC45Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTYxLjcgMzAzLjdsLTIyIC4xYy0zLjktLjMtNy4yIDIuOC03LjIgNi43djE2Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTMyLjUgMzI0LjF2NS43YzAgMy4zLjIgNi41IDMuMSA3LjIgMi44LjcgODMuOCAxMy41IDkwLjUgMTQuNCA2LjcuOSA4LjYtMi40IDguNi01LjlWMjIzLjljMC01LjggNC43LTEwLjUgMTAuNS0xMC42bDIwLjMtLjIiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTM0LjYgMzAyLjZ2LTI5LjJjMC01LjggNC43LTEwLjUgMTAuNS0xMC42bDIwLjMtLjJNMTM0LjYgMzM4LjJWMzIzYzAtNS44IDQuNy0xMC41IDEwLjUtMTAuNmwyMC4zLS4yIi8+PC9nPjwvc3ZnPgo=");
27
+ }
@@ -0,0 +1,14 @@
1
+ import React, { ErrorInfo, PropsWithChildren } from 'react';
2
+ import { BlockDecorationProps } from '../../../models';
3
+ import './ErrorBoundary.css';
4
+ interface ErrorBoundaryProps extends PropsWithChildren, Partial<BlockDecorationProps> {
5
+ }
6
+ interface ErrorBoundaryState {
7
+ error?: string;
8
+ }
9
+ export declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
10
+ state: ErrorBoundaryState;
11
+ componentDidCatch(error: Error, info: ErrorInfo): void;
12
+ render(): string | number | boolean | React.ReactFragment | JSX.Element | null | undefined;
13
+ }
14
+ export {};
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { block } from '../../../utils';
3
+ import { getBlockId } from '../../utils';
4
+ import i18n from './i18n';
5
+ import './ErrorBoundary.css';
6
+ const b = block('error-boundary');
7
+ export class ErrorBoundary extends React.Component {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.state = {};
11
+ }
12
+ componentDidCatch(error, info) {
13
+ this.setState({ error: `${error.message} ${info === null || info === void 0 ? void 0 : info.componentStack}` });
14
+ }
15
+ render() {
16
+ const { type, index } = this.props;
17
+ const { error } = this.state;
18
+ const header = type
19
+ ? i18n('error-block-header', { id: getBlockId({ type, index }) })
20
+ : i18n('error-page-header');
21
+ if (this.state.error) {
22
+ return (React.createElement("div", { className: b() },
23
+ React.createElement("div", { className: b('container') },
24
+ React.createElement("div", { className: b('image') }),
25
+ React.createElement("div", { className: b('content') },
26
+ React.createElement("h2", { className: b('header') }, header),
27
+ React.createElement("code", { className: b('error') }, error)))));
28
+ }
29
+ return this.props.children;
30
+ }
31
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "error-block-header": "An error occurred in {{id}}",
3
+ "error-page-header": "An error occurred"
4
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: (key: string, params?: import("@gravity-ui/i18n").Params | undefined) => string;
2
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { registerKeyset } from '../../../../utils/registerKeyset';
2
+ import en from './en.json';
3
+ import ru from './ru.json';
4
+ const COMPONENT = 'ErrorBoundary';
5
+ export default registerKeyset({ en, ru }, COMPONENT);
@@ -0,0 +1,4 @@
1
+ {
2
+ "error-block-header": "Ошибка в блоке {{id}}",
3
+ "error-page-header": "Ошибка"
4
+ }
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { PageContent } from '../../../models';
3
+ import { CustomSpec } from '../../dynamic-forms-custom/parser/types';
4
+ export type PagePropsFormData = Omit<PageContent, 'blocks'>;
5
+ export interface PagePropsFormProps {
6
+ data: PagePropsFormData;
7
+ spec: CustomSpec;
8
+ onChange: (data: PagePropsFormData) => void;
9
+ }
10
+ export declare const PagePropsForm: React.MemoExoticComponent<({ data: content, spec, onChange }: PagePropsFormProps) => JSX.Element>;
@@ -0,0 +1,13 @@
1
+ import React, { memo, useMemo } from 'react';
2
+ import { DynamicField } from '@gravity-ui/dynamic-forms';
3
+ import _ from 'lodash';
4
+ import { Form as FinalForm, FormSpy } from 'react-final-form';
5
+ import { dynamicConfig } from '../../dynamic-forms-custom/config';
6
+ export const PagePropsForm = memo(({ data: content, spec, onChange }) => {
7
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8
+ const initialValues = useMemo(() => ({ content }), []);
9
+ return (React.createElement(FinalForm, { initialValues: initialValues, onSubmit: _.noop }, () => (React.createElement("div", null,
10
+ React.createElement(FormSpy, { onChange: ({ values }) => onChange(Object.assign({}, values.content)), subscription: { values: true } }),
11
+ React.createElement(DynamicField, { name: "content", spec: spec, config: dynamicConfig })))));
12
+ });
13
+ PagePropsForm.displayName = 'PagePropsForm';
@@ -0,0 +1,28 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-editor__form, .pc-editor__preview {
4
+ --yc-scrollbar-width: 0;
5
+ height: 100vh;
6
+ max-height: 100vh;
7
+ overflow: auto;
8
+ }
9
+
10
+ .pc-editor {
11
+ display: flex;
12
+ }
13
+ .pc-editor__form {
14
+ flex: 0 0 auto;
15
+ padding: 20px;
16
+ width: 412px;
17
+ border-right: 12px solid var(--yc-color-line-generic);
18
+ }
19
+ .pc-editor__preview {
20
+ width: 100%;
21
+ }
22
+ .pc-editor__add-button {
23
+ position: fixed;
24
+ bottom: 32px;
25
+ left: calc(50% + 206px);
26
+ transform: translateX(-50%);
27
+ z-index: 110;
28
+ }
@@ -0,0 +1,3 @@
1
+ import { EditorProps } from '../../types';
2
+ import './Editor.css';
3
+ export declare const Editor: ({ children, customSchema, onChange, ...rest }: EditorProps) => JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { __rest } from "tslib";
2
+ import React, { useEffect, useMemo } from 'react';
3
+ import { block } from '../../../utils';
4
+ import AddBlock from '../../components/AddBlock/AddBlock';
5
+ import EditBlock from '../../components/EditBlock/EditBlock';
6
+ import { ErrorBoundary } from '../../components/ErrorBoundary/ErrorBoundary';
7
+ import useFormSpec from '../../hooks/useFormSpec';
8
+ import { useEditorState } from '../../store';
9
+ import { addCustomDecorator, getBlockId } from '../../utils';
10
+ import { Form } from '../Form/Form';
11
+ import './Editor.css';
12
+ const b = block('editor');
13
+ export const Editor = (_a) => {
14
+ var { children, customSchema, onChange } = _a, rest = __rest(_a, ["children", "customSchema", "onChange"]);
15
+ const { content, activeBlockIndex, errorBoundaryState, onContentUpdate, onAdd, onSelect, injectEditBlockProps, } = useEditorState(rest);
16
+ const constructorProps = useMemo(() => ({
17
+ content,
18
+ custom: addCustomDecorator([
19
+ (props) => React.createElement(EditBlock, Object.assign({}, injectEditBlockProps(props))),
20
+ // need errorBoundaryState flag to reset error on content update
21
+ (props) => (React.createElement(ErrorBoundary, Object.assign({}, props, { key: `${getBlockId(props)}-${errorBoundaryState}` }))),
22
+ ], rest.custom),
23
+ }), [injectEditBlockProps, content, errorBoundaryState, rest.custom]);
24
+ const formSpecs = useFormSpec(customSchema);
25
+ useEffect(() => {
26
+ onChange === null || onChange === void 0 ? void 0 : onChange(content);
27
+ }, [content, onChange]);
28
+ return (React.createElement("div", { className: b() },
29
+ React.createElement("div", { className: b('form') },
30
+ React.createElement(Form, { content: content, onChange: onContentUpdate, activeBlockIndex: activeBlockIndex, onSelect: onSelect, spec: formSpecs })),
31
+ React.createElement("div", { className: b('preview') },
32
+ React.createElement(ErrorBoundary, { key: errorBoundaryState }, children(constructorProps)),
33
+ React.createElement(AddBlock, { onAdd: onAdd, className: b('add-button') }))));
34
+ };
@@ -0,0 +1,94 @@
1
+ /* use this for style redefinitions to awoid problems with
2
+ unpredictable css rules order in build */
3
+ .pc-editor-form {
4
+ --top-level-font-size: var(--yc-text-display-2-font-size);
5
+ --top-level-line-height: var(--yc-text-display-2-line-height);
6
+ --block-propery-font-size: var(--yc-text-body-3-font-size);
7
+ --block-property-line-height: var(--yc-text-body-3-line-height);
8
+ --nested-property-font-size: var(--yc-text-body-1-font-size);
9
+ --nested-property-line-height: var(--yc-text-body-1-line-height);
10
+ --complex-nested-property-font-size: var(--yc-text-body-2-font-size);
11
+ --complex-nested-property-line-height: var(--yc-text-body-2-line-height);
12
+ --input-min-width: 150px;
13
+ --property-title-width: 140px;
14
+ --button-height: 48px;
15
+ --icon-size: 32px;
16
+ --icon-margin: 42px;
17
+ --property-font-weight: 500;
18
+ --header-text-size: var(--top-level-font-size);
19
+ --header-line-height: var(--top-level-line-height);
20
+ --text-size: var(--top-level-font-size);
21
+ --line-height: var(--top-level-line-height);
22
+ }
23
+ .pc-editor-form .df-use-search .df-use-search {
24
+ --button-height: 32px;
25
+ --icon-size: 20px;
26
+ --icon-margin: 30px;
27
+ --header-text-size: var(--block-propery-font-size);
28
+ --header-line-height: var(--block-property-line-height);
29
+ --text-size: var(--block-propery-font-size);
30
+ --line-height: var(--block-property-line-height);
31
+ }
32
+ .pc-editor-form .df-use-search .df-use-search .df-use-search {
33
+ --button-height: 28px;
34
+ --icon-size: 16px;
35
+ --icon-margin: 25px;
36
+ --property-font-weight: 400;
37
+ --header-text-size: var(--complex-nested-property-font-size);
38
+ --header-line-height: var(--complex-nested-property-line-height);
39
+ --text-size: var(--nested-property-font-size);
40
+ --line-height: var(--nested-property-line-height);
41
+ }
42
+ .pc-editor-form .df-row {
43
+ width: inherit;
44
+ }
45
+ .pc-editor-form .df-row__left {
46
+ width: var(--property-title-width);
47
+ }
48
+ .pc-editor-form .df-row__title {
49
+ font-size: var(--text-size);
50
+ line-height: var(--line-height);
51
+ font-weight: var(--property-font-weight);
52
+ white-space: nowrap;
53
+ }
54
+ .pc-editor-form .df-simple-vertical-accordeon textarea {
55
+ min-width: var(--input-min-width);
56
+ min-height: var(--input-min-width);
57
+ }
58
+ .pc-editor-form .df-simple-vertical-accordeon__header .yc-button {
59
+ font-size: var(--header-text-size);
60
+ line-height: var(--header-line-height);
61
+ }
62
+ .pc-editor-form .df-simple-vertical-accordeon__header .yc-button {
63
+ --yc-button-height: var(--button-height);
64
+ display: flex;
65
+ justify-content: center;
66
+ align-items: center;
67
+ }
68
+ .pc-editor-form .df-simple-vertical-accordeon__header .yc-button .yc-button__icon-inner > svg {
69
+ width: var(--icon-size);
70
+ height: var(--icon-size);
71
+ color: var(--yc-color-text-hint);
72
+ }
73
+ .pc-editor-form .df-simple-vertical-accordeon__header .yc-button .yc-button__icon_side_right ~ .yc-button__text {
74
+ margin-right: var(--icon-margin);
75
+ }
76
+ .pc-editor-form .df-simple-vertical-accordeon__body,
77
+ .pc-editor-form .df-group-indent > .df-use-search {
78
+ margin-top: 0;
79
+ margin-left: 1px;
80
+ padding-top: 12px;
81
+ padding-left: 16px;
82
+ border-left: 1px solid var(--yc-color-line-generic-accent);
83
+ }
84
+ .pc-editor-form .g-select,
85
+ .pc-editor-form .yc-text-input {
86
+ width: var(--input-min-width);
87
+ }
88
+ .pc-editor-form + .pc-editor-form {
89
+ margin-top: 12px;
90
+ }
91
+ .pc-editor-form__tabs {
92
+ --yc-color-base-special: var(--yc-color-promo-base-neon);
93
+ margin-bottom: 20px;
94
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { PageContent } from '../../../models';
3
+ import { FormSpecs } from '../../dynamic-forms-custom/parser/types';
4
+ import './Form.css';
5
+ export interface FormProps {
6
+ content: PageContent;
7
+ activeBlockIndex: number;
8
+ spec: FormSpecs;
9
+ onChange: (content: PageContent) => void;
10
+ onSelect: (index: number) => void;
11
+ }
12
+ export declare const Form: React.MemoExoticComponent<({ content, onChange, activeBlockIndex, onSelect, spec }: FormProps) => JSX.Element>;
@@ -0,0 +1,45 @@
1
+ import { __rest } from "tslib";
2
+ import React, { Fragment, memo } from 'react';
3
+ import { Tabs } from '@gravity-ui/uikit';
4
+ import { block, getBlockKey } from '../../../utils';
5
+ import { BlockForm } from '../../components/BlockForm/BlockForm';
6
+ import { PagePropsForm } from '../../components/PagePropsForm/PagePropsForm';
7
+ import './Form.css';
8
+ var FormTab;
9
+ (function (FormTab) {
10
+ FormTab["Blocks"] = "blocks";
11
+ FormTab["Page"] = "page";
12
+ })(FormTab || (FormTab = {}));
13
+ const b = block('editor-form');
14
+ const tabsItems = Object.values(FormTab).map((tab) => ({
15
+ id: tab,
16
+ title: tab,
17
+ }));
18
+ export const Form = memo(({ content, onChange, activeBlockIndex, onSelect, spec }) => {
19
+ const [activeTab, setActiveTab] = React.useState(FormTab.Blocks);
20
+ const _a = content || {}, { blocks } = _a, page = __rest(_a, ["blocks"]);
21
+ const { blocks: blocksSpec, page: pageSpec } = spec || {};
22
+ let form;
23
+ switch (activeTab) {
24
+ case FormTab.Page: {
25
+ form = (React.createElement(PagePropsForm, { spec: pageSpec, data: page, onChange: (data) => {
26
+ return onChange(Object.assign(Object.assign({}, content), data));
27
+ } }));
28
+ break;
29
+ }
30
+ case FormTab.Blocks: {
31
+ form = (React.createElement(Fragment, null, blocks.map((blockData, index) => (React.createElement(BlockForm, { spec: blocksSpec[blockData.type], key: getBlockKey(blockData, index), data: blockData, active: activeBlockIndex === index, onChange: (data) => {
32
+ onChange(Object.assign(Object.assign({}, content), { blocks: [
33
+ ...blocks.slice(0, index),
34
+ data,
35
+ ...blocks.slice(index + 1),
36
+ ] }));
37
+ }, onSelect: () => onSelect(index) })))));
38
+ break;
39
+ }
40
+ }
41
+ return (React.createElement("div", { className: b() },
42
+ React.createElement(Tabs, { activeTab: activeTab, className: b('tabs'), items: tabsItems, onSelectTab: setActiveTab }),
43
+ form));
44
+ });
45
+ Form.displayName = 'Form';
@@ -0,0 +1,27 @@
1
+ .pc-one-of-custom {
2
+ display: flex;
3
+ flex-direction: column;
4
+ }
5
+ .pc-one-of-custom:last-child > .df-group-indent {
6
+ margin-bottom: 0;
7
+ }
8
+ .pc-one-of-custom .df-group-indent {
9
+ all: unset;
10
+ }
11
+ .pc-one-of-custom .df-group-indent > .df-use-search {
12
+ padding-top: 11px;
13
+ padding-left: 20px;
14
+ margin-top: 4px;
15
+ margin-bottom: 20px;
16
+ margin-left: 5px;
17
+ border-left: 1px solid var(--yc-color-line-generic-accent);
18
+ }
19
+ .pc-one-of-custom .df-group-indent > .df-use-search:empty {
20
+ display: none;
21
+ }
22
+ .pc-one-of-custom .df-group-indent > .df-use-search:last-child {
23
+ margin-bottom: 0;
24
+ }
25
+ .pc-one-of-custom .df-group-indent > .df-use-search > .df-simple-vertical-accordeon_view {
26
+ margin-top: -10px;
27
+ }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ObjectIndependentInputProps } from '@gravity-ui/dynamic-forms';
3
+ import './OneOfCustom.css';
4
+ /**
5
+ * Customization of @gravity-ui/dynamic-forms OneOf component
6
+ *
7
+ * Main differences from original component:
8
+ *
9
+ * 1. Custom component can detect initial data type by it's json schema passed it __schema property of spec and
10
+ * shows according input
11
+ *
12
+ * 2. Custom component doesn't create additional nested level of data for each OneOf option and doesn't wraps data value, e.g.
13
+ *
14
+ * custom component: {propertyName: propertyValue}
15
+ * original component: {propertyName: {option1: {value: propertyValue}}}
16
+ *
17
+ * @param {ObjectIndependentInputProps} props - props of original OneOf component
18
+ * @returns {React.FC<ObjectIndependentInputProps>}
19
+ */
20
+ export declare const OneOfCustom: React.FC<ObjectIndependentInputProps>;
@@ -0,0 +1,68 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Controller, GroupIndent, SpecTypes, transformArrOut, } from '@gravity-ui/dynamic-forms';
3
+ import Ajv from 'ajv';
4
+ import _ from 'lodash';
5
+ import { block } from '../../../../utils';
6
+ import { getSpecTypeDefaultValue, useOneOf } from '../../hooks/useOneOf';
7
+ import './OneOfCustom.css';
8
+ const b = block('one-of-custom');
9
+ const ajv = new Ajv({
10
+ $data: true,
11
+ strict: false,
12
+ strictSchema: false,
13
+ strictTypes: false,
14
+ strictRequired: false,
15
+ });
16
+ const getOneOfCustomSpecDefaultType = (spec) => { var _a, _b; return ((_b = (_a = spec.viewSpec) === null || _a === void 0 ? void 0 : _a.order) === null || _b === void 0 ? void 0 : _b[0]) || Object.keys(spec.properties || {})[0]; };
17
+ // dynamic-forms pass {} as default value for required properties of all types
18
+ // this function replaces {} with default value accordingly to selected OneOf option spec type
19
+ const getControllerDefautValue = (value, valueSpecType) => {
20
+ const isDefaultValue = typeof value === 'object' && _.isEmpty(value);
21
+ const defaultValue = valueSpecType ? getSpecTypeDefaultValue(valueSpecType) : undefined;
22
+ return isDefaultValue ? defaultValue : value;
23
+ };
24
+ /**
25
+ * Customization of @gravity-ui/dynamic-forms OneOf component
26
+ *
27
+ * Main differences from original component:
28
+ *
29
+ * 1. Custom component can detect initial data type by it's json schema passed it __schema property of spec and
30
+ * shows according input
31
+ *
32
+ * 2. Custom component doesn't create additional nested level of data for each OneOf option and doesn't wraps data value, e.g.
33
+ *
34
+ * custom component: {propertyName: propertyValue}
35
+ * original component: {propertyName: {option1: {value: propertyValue}}}
36
+ *
37
+ * @param {ObjectIndependentInputProps} props - props of original OneOf component
38
+ * @returns {React.FC<ObjectIndependentInputProps>}
39
+ */
40
+ export const OneOfCustom = (props) => {
41
+ var _a;
42
+ const { spec, input, name } = props;
43
+ const { properties } = spec;
44
+ //getting oneOf option type from initial value
45
+ const valueType = useMemo(() => {
46
+ var _a;
47
+ return (properties &&
48
+ ((_a = Object.keys(properties)) === null || _a === void 0 ? void 0 : _a.find((key) => {
49
+ const fieldSchema = (properties === null || properties === void 0 ? void 0 : properties[key]).__schema;
50
+ return fieldSchema && ajv.validate(fieldSchema, transformArrOut(input.value));
51
+ }))) ||
52
+ getOneOfCustomSpecDefaultType(spec);
53
+ },
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps
55
+ []);
56
+ const { oneOfValue, specProperties, toggler } = useOneOf({
57
+ props: Object.assign(Object.assign({}, props), { input: Object.assign(Object.assign({}, input), { value: valueType ? { [valueType]: input.value } : input.value }) }),
58
+ });
59
+ const parentOnChange = React.useCallback((_childName, childValue, childErrors) => {
60
+ input.onChange(childValue, childErrors);
61
+ }, [input]);
62
+ const parentOnUnmount = React.useCallback((childName) => input.onChange((currentValue) => currentValue, { [childName]: false }), [input]);
63
+ const valueSpecType = ((_a = specProperties[oneOfValue]) === null || _a === void 0 ? void 0 : _a.type) || SpecTypes.Object;
64
+ return (React.createElement("div", { className: b() },
65
+ React.createElement("div", null, toggler),
66
+ specProperties[oneOfValue] && (React.createElement(GroupIndent, null,
67
+ React.createElement(Controller, { value: getControllerDefautValue(input.value, valueSpecType), name: name, spec: specProperties[oneOfValue], parentOnChange: parentOnChange, parentOnUnmount: parentOnUnmount, key: `${name}.${oneOfValue}` })))));
68
+ };
@@ -0,0 +1,2 @@
1
+ import { DynamicFormConfig } from '@gravity-ui/dynamic-forms';
2
+ export declare const dynamicConfig: DynamicFormConfig;
@@ -0,0 +1,9 @@
1
+ import { dynamicConfig as libConfig } from '@gravity-ui/dynamic-forms';
2
+ import _ from 'lodash';
3
+ import { OneOfCustom } from './components/OneOfCustom/OneOfCustom';
4
+ const getDynamicConfig = () => {
5
+ const dynamicConfig = _.cloneDeep(libConfig);
6
+ dynamicConfig.object.inputs['oneof_custom'] = { Component: OneOfCustom, independent: true };
7
+ return dynamicConfig;
8
+ };
9
+ export const dynamicConfig = getDynamicConfig();
@@ -0,0 +1,12 @@
1
+ import { ObjectIndependentInputProps, Spec, SpecTypes } from '@gravity-ui/dynamic-forms';
2
+ export interface UseOneOfParams {
3
+ props: ObjectIndependentInputProps;
4
+ onTogglerChange?: (value: string) => void;
5
+ }
6
+ export declare const getSpecTypeDefaultValue: (type: SpecTypes) => {} | undefined;
7
+ export declare const useOneOf: ({ props, onTogglerChange }: UseOneOfParams) => {
8
+ oneOfValue: string;
9
+ specProperties: Record<string, Spec>;
10
+ toggler: JSX.Element;
11
+ togglerInput: JSX.Element;
12
+ };