@cntrl-site/sdk-nextjs 1.9.72 → 1.9.73

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 (142) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +4 -4
  3. package/TODO.md +1 -1
  4. package/eslint.config.mjs +35 -35
  5. package/jest.config.js +6 -6
  6. package/lib/common/useItemFXData.js +5 -5
  7. package/lib/components/Article.js +6 -7
  8. package/lib/components/LayoutStyle.js +4 -4
  9. package/lib/components/Section/Section.js +48 -30
  10. package/lib/components/StructuredBlockItem/StructuredBlockItem.js +58 -0
  11. package/lib/components/StructuredBlockItem/StructuredComponent/StructuredComponent.js +48 -0
  12. package/lib/components/StructuredContent/StructuredContent.js +37 -0
  13. package/lib/components/items/CodeEmbedItem/CodeEmbedItem.js +36 -36
  14. package/lib/components/items/ComponentItem/ComponentItem.js +13 -13
  15. package/lib/components/items/CompoundItem/CompoundChild.js +20 -20
  16. package/lib/components/items/CompoundItem/CompoundItem.js +14 -14
  17. package/lib/components/items/CustomItem/CustomItem.js +9 -9
  18. package/lib/components/items/EmbedVideoItem/VimeoEmbed.js +24 -24
  19. package/lib/components/items/EmbedVideoItem/YoutubeEmbed.js +27 -27
  20. package/lib/components/items/FileItem/ImageItem.js +40 -40
  21. package/lib/components/items/FileItem/VideoItem.js +64 -64
  22. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  23. package/lib/components/items/Item.js +32 -33
  24. package/lib/components/items/RectangleItem/RectangleItem.js +27 -27
  25. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  26. package/lib/provider/CntrlSdkContext.js +1 -1
  27. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  28. package/package.json +62 -62
  29. package/src/ItemGeometry/CSSPropertyNameMap.ts +37 -37
  30. package/src/ItemGeometry/GenericGeometryController.ts +59 -59
  31. package/src/ItemGeometry/ItemGeometryContext.ts +4 -4
  32. package/src/ItemGeometry/ItemGeometryController.ts +22 -22
  33. package/src/ItemGeometry/ItemGeometryService.ts +34 -34
  34. package/src/ItemGeometry/RichTextGeometryController.ts +166 -166
  35. package/src/ItemGeometry/useItemGeometry.ts +25 -25
  36. package/src/common/useCurrentLayout.ts +52 -52
  37. package/src/common/useExemplary.ts +9 -9
  38. package/src/common/useItemFXData.ts +63 -63
  39. package/src/common/useKeyframeValue.ts +85 -85
  40. package/src/common/useRegisterResize.ts +16 -16
  41. package/src/components/Article.tsx +69 -75
  42. package/src/components/ArticleWrapper.tsx +21 -21
  43. package/src/components/Head.tsx +95 -95
  44. package/src/components/LayoutStyle.tsx +21 -21
  45. package/src/components/Page.tsx +47 -47
  46. package/src/components/ScrollPlaybackVideo.tsx +75 -75
  47. package/src/components/Section/Section.tsx +162 -130
  48. package/src/components/Section/SectionImage.tsx +48 -48
  49. package/src/components/Section/SectionVideo.tsx +144 -144
  50. package/src/components/Section/useSectionColor.ts +19 -19
  51. package/src/components/Section/useSectionHeightMap.ts +19 -19
  52. package/src/components/StructuredBlockItem/StructuredBlockItem.tsx +69 -0
  53. package/src/components/StructuredBlockItem/StructuredComponent/StructuredComponent.tsx +66 -0
  54. package/src/components/StructuredContent/StructuredContent.tsx +42 -0
  55. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +148 -148
  56. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  57. package/src/components/items/ComponentItem/ComponentItem.tsx +85 -85
  58. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  59. package/src/components/items/CompoundItem/CompoundChild.tsx +151 -151
  60. package/src/components/items/CompoundItem/CompoundItem.tsx +88 -88
  61. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  62. package/src/components/items/CustomItem/CustomItem.tsx +50 -50
  63. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +217 -217
  64. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +201 -201
  65. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  66. package/src/components/items/FileItem/ImageItem.tsx +166 -166
  67. package/src/components/items/FileItem/VideoItem.tsx +287 -287
  68. package/src/components/items/FileItem/useFileItem.ts +81 -81
  69. package/src/components/items/GroupItem/GroupItem.tsx +99 -99
  70. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  71. package/src/components/items/Item.tsx +268 -268
  72. package/src/components/items/LinkWrapper.tsx +39 -39
  73. package/src/components/items/RectangleItem/RectangleItem.tsx +177 -177
  74. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -89
  75. package/src/components/items/RichTextItem/RichTextItem.tsx +113 -113
  76. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  77. package/src/components/items/RichTextWrapper.tsx +15 -15
  78. package/src/components/items/itemsMap.ts +28 -28
  79. package/src/components/items/useDraggable.ts +252 -252
  80. package/src/components/items/useItemAngle.ts +13 -13
  81. package/src/components/items/useItemArea.ts +35 -35
  82. package/src/components/items/useItemPointerEvents.ts +23 -23
  83. package/src/components/items/useItemScale.ts +17 -17
  84. package/src/components/items/useItemTriggers.ts +15 -15
  85. package/src/components/items/useRichTextItemValues.ts +66 -66
  86. package/src/components/items/useSizing.ts +25 -25
  87. package/src/components/items/useStickyItemTop.ts +21 -21
  88. package/src/components/useLayoutContext.ts +7 -7
  89. package/src/index.ts +25 -25
  90. package/src/interactions/InteractionsRegistry.ts +513 -512
  91. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  92. package/src/interactions/getTransition.ts +27 -27
  93. package/src/interactions/types.ts +36 -36
  94. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  95. package/src/provider/ArticleRectContext.ts +4 -4
  96. package/src/provider/CntrlContext.ts +5 -5
  97. package/src/provider/CntrlProvider.tsx +11 -11
  98. package/src/provider/CntrlSdkContext.ts +113 -113
  99. package/src/provider/CustomItemRegistry.ts +14 -14
  100. package/src/provider/CustomItemTypes.ts +3 -3
  101. package/src/provider/CustomSectionRegistry.ts +25 -25
  102. package/src/provider/InteractionsContext.tsx +73 -73
  103. package/src/provider/Keyframes.ts +11 -11
  104. package/src/provider/KeyframesContext.ts +5 -5
  105. package/src/provider/LayoutContext.ts +3 -3
  106. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  107. package/src/provider/defaultContext.ts +8 -8
  108. package/src/provider/useCntrlContext.ts +8 -8
  109. package/src/styled-jsx.d.ts +1 -1
  110. package/src/types/components-utils.d.ts +7 -7
  111. package/src/utils/Animator/Animator.ts +570 -570
  112. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  113. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  114. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  115. package/src/utils/CSSNumeric.ts +19 -19
  116. package/src/utils/EventEmitter.ts +41 -41
  117. package/src/utils/RichTextConverter/RichTextConverter.tsx +342 -342
  118. package/src/utils/ScaleAnchorMap.ts +13 -13
  119. package/src/utils/StickyManager/StickyManager.ts +23 -23
  120. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  121. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  122. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  123. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -63
  124. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -37
  125. package/src/utils/binSearchInsertAt.ts +33 -33
  126. package/src/utils/castObject.ts +10 -10
  127. package/src/utils/checkOverflowClipSupport.ts +13 -13
  128. package/src/utils/domDfs.ts +11 -11
  129. package/src/utils/effects/useImageFx.ts +154 -154
  130. package/src/utils/effects/useVideoFx.ts +156 -156
  131. package/src/utils/evaluateComponentBundle.ts +83 -83
  132. package/src/utils/getAnchoredItemTop.ts +12 -12
  133. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  134. package/src/utils/getFill.ts +46 -46
  135. package/src/utils/getFontFamilyValue.ts +3 -3
  136. package/src/utils/getInvertedRanges.ts +43 -43
  137. package/src/utils/getItemTopStyle.ts +39 -39
  138. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  139. package/src/utils/getValidYoutubeUrl.ts +29 -29
  140. package/src/utils/isItemType.ts +5 -5
  141. package/src/utils/rangeMap.ts +13 -13
  142. package/src/utils/useElementRect.ts +23 -23
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2022 CNTRL
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2022 CNTRL
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # sdk-nextjs
2
- SDK is the code that transforms the raw data from the API
3
- into React components. In Control this happens at build time,
4
- when users hit the "Publish" button from the Project Dashboard.
1
+ # sdk-nextjs
2
+ SDK is the code that transforms the raw data from the API
3
+ into React components. In Control this happens at build time,
4
+ when users hit the "Publish" button from the Project Dashboard.
package/TODO.md CHANGED
@@ -1 +1 @@
1
- 1. Uninstall `@types/isomorphic-fetch` package and run `npm run build` - results in a TS compile error
1
+ 1. Uninstall `@types/isomorphic-fetch` package and run `npm run build` - results in a TS compile error
package/eslint.config.mjs CHANGED
@@ -1,35 +1,35 @@
1
- import antfu from '@antfu/eslint-config';
2
-
3
- export default antfu(
4
- {
5
- ignores: [],
6
- },
7
- {
8
- rules: {
9
- 'import/order': 'off',
10
- 'style/semi': 'off',
11
- 'antfu/if-newline': 'off',
12
- 'style/comma-dangle': 'off',
13
- 'style/member-delimiter-style': 'off',
14
- 'semi': ['error', 'always'],
15
- 'no-alert': 'off',
16
- 'ts/consistent-type-definitions': 'off',
17
- 'perfectionist/sort-imports': 'off',
18
- 'perfectionist/sort-named-imports': 'off',
19
- 'ts/consistent-type-imports': 'off',
20
- 'jsonc/sort-keys': 'off',
21
- 'node/prefer-global/process': 'off',
22
- 'style/arrow-parens': 'off',
23
- 'ts/method-signature-style': 'off',
24
- 'style/brace-style': 'off',
25
- 'style/jsx-one-expression-per-line': 'off',
26
- 'test/prefer-lowercase-title': 'off',
27
- 'perfectionist/sort-exports': 'off',
28
- 'no-extra-boolean-cast': 'off',
29
- 'prefer-promise-reject-errors': 'off',
30
- 'new-cap': 'off',
31
- 'perfectionist/sort-named-exports': 'off',
32
- 'style/multiline-ternary': 'off'
33
- },
34
- },
35
- );
1
+ import antfu from '@antfu/eslint-config';
2
+
3
+ export default antfu(
4
+ {
5
+ ignores: [],
6
+ },
7
+ {
8
+ rules: {
9
+ 'import/order': 'off',
10
+ 'style/semi': 'off',
11
+ 'antfu/if-newline': 'off',
12
+ 'style/comma-dangle': 'off',
13
+ 'style/member-delimiter-style': 'off',
14
+ 'semi': ['error', 'always'],
15
+ 'no-alert': 'off',
16
+ 'ts/consistent-type-definitions': 'off',
17
+ 'perfectionist/sort-imports': 'off',
18
+ 'perfectionist/sort-named-imports': 'off',
19
+ 'ts/consistent-type-imports': 'off',
20
+ 'jsonc/sort-keys': 'off',
21
+ 'node/prefer-global/process': 'off',
22
+ 'style/arrow-parens': 'off',
23
+ 'ts/method-signature-style': 'off',
24
+ 'style/brace-style': 'off',
25
+ 'style/jsx-one-expression-per-line': 'off',
26
+ 'test/prefer-lowercase-title': 'off',
27
+ 'perfectionist/sort-exports': 'off',
28
+ 'no-extra-boolean-cast': 'off',
29
+ 'prefer-promise-reject-errors': 'off',
30
+ 'new-cap': 'off',
31
+ 'perfectionist/sort-named-exports': 'off',
32
+ 'style/multiline-ternary': 'off'
33
+ },
34
+ },
35
+ );
package/jest.config.js CHANGED
@@ -1,6 +1,6 @@
1
- /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- testEnvironment: 'jsdom',
5
- rootDir: './src'
6
- };
1
+ /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2
+ module.exports = {
3
+ preset: 'ts-jest',
4
+ testEnvironment: 'jsdom',
5
+ rootDir: './src'
6
+ };
@@ -4,11 +4,11 @@ exports.useItemFXData = void 0;
4
4
  const sdk_1 = require("@cntrl-site/sdk");
5
5
  const useKeyframeValue_1 = require("./useKeyframeValue");
6
6
  const react_1 = require("react");
7
- const baseVariables = `precision mediump float;
8
- uniform sampler2D u_image;
9
- uniform vec2 u_imgDimensions;
10
- uniform float u_time;
11
- uniform vec2 u_cursor;
7
+ const baseVariables = `precision mediump float;
8
+ uniform sampler2D u_image;
9
+ uniform vec2 u_imgDimensions;
10
+ uniform float u_time;
11
+ uniform vec2 u_cursor;
12
12
  varying vec2 v_texCoord;`;
13
13
  function useItemFXData(item, sectionId) {
14
14
  const { fragmentShader: shaderBody, FXControls, FXTextures } = item.commonParams;
@@ -8,7 +8,6 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_1 = require("react");
9
9
  const style_1 = __importDefault(require("styled-jsx/style"));
10
10
  const Section_1 = require("./Section/Section");
11
- const Item_1 = require("./items/Item");
12
11
  const useArticleRectObserver_1 = require("../utils/ArticleRectManager/useArticleRectObserver");
13
12
  const ArticleRectContext_1 = require("../provider/ArticleRectContext");
14
13
  const ArticleWrapper_1 = require("./ArticleWrapper");
@@ -31,12 +30,12 @@ const Article = ({ article, sectionData }) => {
31
30
  const sectionsLength = article.sections.length;
32
31
  return ((0, jsx_runtime_1.jsx)(ArticleRectContext_1.ArticleRectContext.Provider, { value: articleRectObserver, children: (0, jsx_runtime_1.jsxs)(InteractionsContext_1.InteractionsProvider, { article: article, children: [(0, jsx_runtime_1.jsx)(ArticleWrapper_1.ArticleWrapper, { children: (0, jsx_runtime_1.jsxs)("div", { className: "article", ref: articleRef, children: [(0, jsx_runtime_1.jsx)(WebGLContextManagerContext_1.WebglContextManagerContext.Provider, { value: webglContextManager, children: article.sections.map((section, i) => {
33
32
  const data = section.name ? sectionData[section.name] : {};
34
- return ((0, jsx_runtime_1.jsx)(Section_1.Section, { section: section, data: data, zIndex: sectionsLength - i, children: article.sections[i].items.map(item => ((0, jsx_runtime_1.jsx)(Item_1.Item, { item: item, sectionId: section.id, articleHeight: articleHeight }, item.id))) }, section.id));
35
- }) }), (0, jsx_runtime_1.jsx)("div", { id: "component-portal" })] }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
36
- .article {
37
- position: relative;
38
- overflow: clip;
39
- }
33
+ return ((0, jsx_runtime_1.jsx)(Section_1.Section, { articleHeight: articleHeight, section: section, data: data, zIndex: sectionsLength - i }, section.id));
34
+ }) }), (0, jsx_runtime_1.jsx)("div", { id: "component-portal" }), (0, jsx_runtime_1.jsx)("div", { id: "grid-component-lightbox-portal" })] }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
35
+ .article {
36
+ position: relative;
37
+ overflow: clip;
38
+ }
40
39
  ` })] }) }));
41
40
  };
42
41
  exports.Article = Article;
@@ -9,10 +9,10 @@ const sdk_1 = require("@cntrl-site/sdk");
9
9
  const style_1 = __importDefault(require("styled-jsx/style"));
10
10
  const LayoutStyle = ({ id, layouts, layoutId, children }) => {
11
11
  const layout = layouts.find(l => l.id === layoutId);
12
- return ((0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
13
- ${(0, sdk_1.getLayoutMediaQuery)(layoutId, layouts)} {
14
- ${children === null || children === void 0 ? void 0 : children(layout)}
15
- }
12
+ return ((0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
13
+ ${(0, sdk_1.getLayoutMediaQuery)(layoutId, layouts)} {
14
+ ${children === null || children === void 0 ? void 0 : children(layout)}
15
+ }
16
16
  ` }));
17
17
  };
18
18
  exports.LayoutStyle = LayoutStyle;
@@ -15,18 +15,24 @@ const useLayoutContext_1 = require("../useLayoutContext");
15
15
  const SectionVideo_1 = require("./SectionVideo");
16
16
  const SectionImage_1 = require("./SectionImage");
17
17
  const checkOverflowClipSupport_1 = require("../../utils/checkOverflowClipSupport");
18
+ const StructuredContent_1 = require("../StructuredContent/StructuredContent");
19
+ const Item_1 = require("../items/Item");
18
20
  const DEFAULT_COLOR = 'rgba(0, 0, 0, 0)';
19
- const Section = ({ section, data, children, zIndex }) => {
21
+ const Section = ({ section, data, zIndex, articleHeight }) => {
20
22
  var _a;
21
23
  const reactId = (0, react_1.useId)();
22
24
  const id = `${reactId}-section-${section.id}`;
23
25
  const sectionRef = (0, react_1.useRef)(null);
24
26
  const { layouts, customSections } = (0, useCntrlContext_1.useCntrlContext)();
25
27
  const layout = (0, useLayoutContext_1.useLayoutContext)();
26
- const layoutValues = [section.height, section.color, (_a = section.media) !== null && _a !== void 0 ? _a : {}];
28
+ const [sectionHeight, setSectionHeight] = (0, react_1.useState)(0);
29
+ const layoutValues = [
30
+ section.minHeight,
31
+ section.color,
32
+ (_a = section.media) !== null && _a !== void 0 ? _a : {}
33
+ ];
27
34
  const SectionComponent = section.name ? customSections.getComponent(section.name) : undefined;
28
35
  (0, useSectionRegistry_1.useSectionRegistry)(section.id, sectionRef.current);
29
- const sectionHeight = layout && section.height[layout] ? section.height[layout] : undefined;
30
36
  const layoutMedia = layout && section.media && section.media[layout] ? section.media[layout] : undefined;
31
37
  const media = (0, react_1.useMemo)(() => {
32
38
  if (layoutMedia && !(0, checkOverflowClipSupport_1.isOverflowClipSupported)()) {
@@ -39,38 +45,50 @@ const Section = ({ section, data, children, zIndex }) => {
39
45
  .sort((a, b) => a.startsWith - b.startsWith)
40
46
  .reduce((acc, layout) => {
41
47
  const isHidden = section.hidden[layout.id];
42
- return `
43
- ${acc}
44
- ${(0, sdk_1.getLayoutMediaQuery)(layout.id, layouts)} {
45
- .section-${section.id} {
46
- display: ${isHidden ? 'none' : 'block'};
47
- }
48
+ return `
49
+ ${acc}
50
+ ${(0, sdk_1.getLayoutMediaQuery)(layout.id, layouts)} {
51
+ .section-${section.id} {
52
+ display: ${isHidden ? 'none' : 'block'};
53
+ }
48
54
  }`;
49
55
  }, '');
50
56
  };
57
+ (0, react_1.useEffect)(() => {
58
+ if (!sectionRef.current)
59
+ return;
60
+ const observer = new ResizeObserver((entries) => {
61
+ const [entry] = entries;
62
+ const height = entry.contentRect.height;
63
+ setSectionHeight(height);
64
+ });
65
+ observer.observe(sectionRef.current);
66
+ return () => observer.disconnect();
67
+ }, []);
68
+ const children = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(StructuredContent_1.StructuredContent, { section: section }), section.items.map(item => ((0, jsx_runtime_1.jsx)(Item_1.Item, { sectionHeight: sectionHeight, item: item, sectionId: section.id, articleHeight: articleHeight }, item.id)))] }));
51
69
  if (SectionComponent)
52
70
  return (0, jsx_runtime_1.jsx)("div", { ref: sectionRef, children: (0, jsx_runtime_1.jsx)(SectionComponent, { data: data, children: children }) });
53
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: `section-${section.id}`, id: section.name, ref: sectionRef, style: { zIndex }, children: [media && media.size !== 'none' && sectionRef.current && ((0, jsx_runtime_1.jsx)("div", { className: `section-background-overlay-${section.id}`, children: (0, jsx_runtime_1.jsxs)("div", { className: `section-background-wrapper-${section.id}`, style: Object.assign({ transform: media.position === 'fixed' ? 'translateY(-100vh)' : 'unset' }, (sectionHeight && { height: media.position === 'fixed' ? `calc(${getSectionHeight(sectionHeight)} + 200vh)` : getSectionHeight(sectionHeight) })), children: [media.type === 'video' && ((0, jsx_runtime_1.jsx)(SectionVideo_1.SectionVideo, { container: sectionRef.current, sectionId: section.id, media: media })), media.type === 'image' && ((0, jsx_runtime_1.jsx)(SectionImage_1.SectionImage, { media: media, sectionId: section.id }))] }, `section-background-wrapper-${section.id}`) })), children] }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
54
- ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([height, color, media]) => (`
55
- .section-${section.id} {
56
- height: ${getSectionHeight(height)};
57
- position: relative;
58
- background-color: ${color_1.CntrlColor.parse(color !== null && color !== void 0 ? color : DEFAULT_COLOR).fmt('rgba')};
59
- }
60
- .section-background-overlay-${section.id} {
61
- height: ${getSectionHeight(height)};
62
- width: 100%;
63
- position: relative;
64
- overflow: clip;
65
- }
66
- .section-background-wrapper-${section.id} {
67
- transform: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? 'translateY(-100vh)' : 'unset'};
68
- position: relative;
69
- height: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? `calc(${getSectionHeight(height)} + 200vh)` : getSectionHeight(height)};
70
- width: 100%;
71
- }
72
- `))}
73
- ${getSectionVisibilityStyles()}
71
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: `section-${section.id}`, id: section.name, ref: sectionRef, style: { zIndex }, children: [media && media.size !== 'none' && sectionRef.current && ((0, jsx_runtime_1.jsx)("div", { className: `section-background-overlay-${section.id}`, children: (0, jsx_runtime_1.jsxs)("div", { className: `section-background-wrapper-${section.id}`, style: Object.assign({ transform: media.position === 'fixed' ? 'translateY(-100vh)' : 'unset' }, (sectionHeight && { height: media.position === 'fixed' ? `calc(${sectionHeight}px + 200vh)` : `${sectionHeight}px` })), children: [media.type === 'video' && ((0, jsx_runtime_1.jsx)(SectionVideo_1.SectionVideo, { container: sectionRef.current, sectionId: section.id, media: media })), media.type === 'image' && ((0, jsx_runtime_1.jsx)(SectionImage_1.SectionImage, { media: media, sectionId: section.id }))] }, `section-background-wrapper-${section.id}`) })), children] }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
72
+ ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([height, color, media]) => (`
73
+ .section-${section.id} {
74
+ min-height: ${getSectionHeight(height)};
75
+ position: relative;
76
+ background-color: ${color_1.CntrlColor.parse(color !== null && color !== void 0 ? color : DEFAULT_COLOR).fmt('rgba')};
77
+ }
78
+ .section-background-overlay-${section.id} {
79
+ height: 100%;
80
+ width: 100%;
81
+ position: absolute;
82
+ overflow: clip;
83
+ }
84
+ .section-background-wrapper-${section.id} {
85
+ transform: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? 'translateY(-100vh)' : 'unset'};
86
+ position: relative;
87
+ height: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? `calc(${getSectionHeight(height)} + 200vh)` : getSectionHeight(height)};
88
+ width: 100%;
89
+ }
90
+ `))}
91
+ ${getSectionVisibilityStyles()}
74
92
  ` })] }));
75
93
  };
76
94
  exports.Section = Section;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StructuredBlockItem = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const sdk_1 = require("@cntrl-site/sdk");
9
+ const react_1 = require("react");
10
+ const style_1 = __importDefault(require("styled-jsx/style"));
11
+ const useCntrlContext_1 = require("../../provider/useCntrlContext");
12
+ const useSizing_1 = require("../items/useSizing");
13
+ const StructuredComponent_1 = require("./StructuredComponent/StructuredComponent");
14
+ const noop = () => null;
15
+ const itemsMap = {
16
+ [sdk_1.StructuredBlockType.Component]: StructuredComponent_1.StructuredComponent,
17
+ [sdk_1.StructuredBlockType.RichText]: noop,
18
+ [sdk_1.StructuredBlockType.Image]: noop,
19
+ [sdk_1.StructuredBlockType.VimeoEmbed]: noop,
20
+ [sdk_1.StructuredBlockType.YoutubeEmbed]: noop,
21
+ };
22
+ const StructuredBlockItem = ({ block, maxWidthMap }) => {
23
+ var _a;
24
+ const reactId = (0, react_1.useId)();
25
+ const id = `${reactId}-item-${block.id}`;
26
+ const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
27
+ const layoutValues = [block.area, block.layoutParams, (_a = block.hidden) !== null && _a !== void 0 ? _a : {}, maxWidthMap];
28
+ const ItemComponent = itemsMap[block.type] || noop;
29
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `structured-block-item-${block.id}`, children: [(0, jsx_runtime_1.jsx)(ItemComponent, { block: block }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
30
+ ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, layoutParams, hidden, maxWidth]) => {
31
+ var _a, _b;
32
+ const sizingAxis = (0, useSizing_1.parseSizing)(layoutParams.sizing);
33
+ return (`
34
+ .structured-block-item-${block.id} {
35
+ display: ${hidden ? 'none' : 'block'};
36
+ align-self: ${getAlignSelf((_a = area.alignment) !== null && _a !== void 0 ? _a : 'center')};
37
+ width: ${sizingAxis.x === 'manual' && area.width ? `${area.width * 100}vw` : maxWidth !== null && maxWidth !== void 0 ? maxWidth : 'max-content'};
38
+ height: ${sizingAxis.y === 'manual' && area.height ? `${area.height * 100}vw` : 'unset'};
39
+ padding-top: ${area.paddingTop ? `${area.paddingTop * 100}vw` : 'unset'};
40
+ outline: none;
41
+ left: ${((_b = area.horizontalOffset) !== null && _b !== void 0 ? _b : 0) * 100}vw;
42
+ position: relative;
43
+ }
44
+ `);
45
+ })}
46
+ ` })] }));
47
+ };
48
+ exports.StructuredBlockItem = StructuredBlockItem;
49
+ function getAlignSelf(alignment) {
50
+ switch (alignment) {
51
+ case 'left':
52
+ return 'start';
53
+ case 'right':
54
+ return 'end';
55
+ default:
56
+ return 'center';
57
+ }
58
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StructuredComponent = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const style_1 = __importDefault(require("styled-jsx/style"));
9
+ const sdk_1 = require("@cntrl-site/sdk");
10
+ const react_1 = require("react");
11
+ const useCntrlContext_1 = require("../../../provider/useCntrlContext");
12
+ const useLayoutContext_1 = require("../../useLayoutContext");
13
+ const useItemGeometry_1 = require("../../../ItemGeometry/useItemGeometry");
14
+ const StructuredComponent = ({ block }) => {
15
+ var _a, _b;
16
+ const sdk = (0, useCntrlContext_1.useCntrlContext)();
17
+ const { layouts } = sdk;
18
+ const layout = (0, useLayoutContext_1.useLayoutContext)();
19
+ const fallbackLayout = (_a = layouts[0]) === null || _a === void 0 ? void 0 : _a.id;
20
+ const effectiveLayout = layout !== null && layout !== void 0 ? layout : fallbackLayout;
21
+ const layoutValues = [block.layoutParams];
22
+ const component = sdk.getComponent(block.commonParams.componentId);
23
+ const [ref, setRef] = (0, react_1.useState)(null);
24
+ (0, useItemGeometry_1.useItemGeometry)(block.id, ref);
25
+ const Element = component ? component.element : undefined;
26
+ const layoutParameters = effectiveLayout ? (_b = block.layoutParams[effectiveLayout]) === null || _b === void 0 ? void 0 : _b.parameters : undefined;
27
+ const commonParameters = block.commonParams.parameters;
28
+ const parameters = layoutParameters ? Object.assign(Object.assign({}, layoutParameters), { settings: Object.assign(Object.assign({}, layoutParameters.settings), commonParameters === null || commonParameters === void 0 ? void 0 : commonParameters.settings) }) : undefined;
29
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: `custom-component-${block.id}`, ref: setRef, children: parameters && Element && ((0, jsx_runtime_1.jsx)(Element, Object.assign({ metadata: {
30
+ itemId: block.id,
31
+ submitUrl: sdk.getSubmitUrl(commonParameters === null || commonParameters === void 0 ? void 0 : commonParameters.pluginConfigId)
32
+ }, portalId: "component-portal", content: block.commonParams.content }, parameters))) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: block.id, children: `
33
+ .custom-component-${block.id} {
34
+ width: 100%;
35
+ height: 100%;
36
+ pointer-events: auto;
37
+ }
38
+ ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([layoutParams]) => {
39
+ return (`
40
+ .custom-component-${block.id} {
41
+ opacity: ${layoutParams.opacity};
42
+ filter: blur(${layoutParams.blur}vw);
43
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
44
+ }
45
+ `);
46
+ })}` })] }));
47
+ };
48
+ exports.StructuredComponent = StructuredComponent;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StructuredContent = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const sdk_1 = require("@cntrl-site/sdk");
9
+ const react_1 = require("react");
10
+ const style_1 = __importDefault(require("styled-jsx/style"));
11
+ const useCntrlContext_1 = require("../../provider/useCntrlContext");
12
+ const StructuredBlockItem_1 = require("../StructuredBlockItem/StructuredBlockItem");
13
+ const StructuredContent = ({ section }) => {
14
+ const reactId = (0, react_1.useId)();
15
+ const id = `${reactId}-structured-content-${section.id}`;
16
+ const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
17
+ const structuredContentLength = section.structuredContent.length;
18
+ const defaultWidthRecord = section.type === 'content-based' ? section.structuredContentSettings.defaultWidth : {};
19
+ const layoutValues = [section.structuredContentSettings.paddingBottom, defaultWidthRecord];
20
+ if (structuredContentLength === 0)
21
+ return null;
22
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `structured-content-${section.id}`, children: [section.structuredContent.map(block => ((0, jsx_runtime_1.jsx)(StructuredBlockItem_1.StructuredBlockItem, { block: block, maxWidthMap: defaultWidthRecord }, block.id))), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
23
+ ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([paddingBottom, defaultWidth]) => {
24
+ return (`
25
+ .structured-content-${section.id} {
26
+ padding-bottom: ${paddingBottom * 100}vw;
27
+ max-width: ${defaultWidth < 1 ? `${defaultWidth * 100}vw` : 'unset'};
28
+ display: flex;
29
+ flex-direction: column;
30
+ margin: 0 auto;
31
+ width: 100%;
32
+ }
33
+ `);
34
+ })}
35
+ ` })] }));
36
+ };
37
+ exports.StructuredContent = StructuredContent;
@@ -65,18 +65,18 @@ const CodeEmbedItem = ({ item, sectionId, onResize, interactionCtrl, onVisibilit
65
65
  const iframe = ref.querySelector(`[data-embed="${item.id}"]`);
66
66
  if (!iframe)
67
67
  return;
68
- const htmlWithStyles = `
69
- ${fontGoogleTags}
70
- ${fontAdobeTags}
71
- <style>
72
- ${fontCustomTags}
73
- html, body {
74
- height: 100%;
75
- margin: 0 !important;
76
- padding: 0 !important;
77
- }
78
- </style>
79
- ${html}
68
+ const htmlWithStyles = `
69
+ ${fontGoogleTags}
70
+ ${fontAdobeTags}
71
+ <style>
72
+ ${fontCustomTags}
73
+ html, body {
74
+ height: 100%;
75
+ margin: 0 !important;
76
+ padding: 0 !important;
77
+ }
78
+ </style>
79
+ ${html}
80
80
  `;
81
81
  iframe.srcdoc = htmlWithStyles;
82
82
  }, [html, item.commonParams.iframe, ref]);
@@ -84,32 +84,32 @@ const CodeEmbedItem = ({ item, sectionId, onResize, interactionCtrl, onVisibilit
84
84
  (0, react_1.useEffect)(() => {
85
85
  onVisibilityChange === null || onVisibilityChange === void 0 ? void 0 : onVisibilityChange(isInteractive);
86
86
  }, [isInteractive, onVisibilityChange]);
87
- return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: (_h = item.link) === null || _h === void 0 ? void 0 : _h.url, target: (_j = item.link) === null || _j === void 0 ? void 0 : _j.target, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-wrapper-${item.id}`, style: Object.assign(Object.assign(Object.assign(Object.assign({}, (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), (opacity !== undefined ? { opacity } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset', transition: (_k = stateParams === null || stateParams === void 0 ? void 0 : stateParams.transition) !== null && _k !== void 0 ? _k : 'none' }), ref: setRef, children: item.commonParams.iframe ? ((0, jsx_runtime_1.jsx)("iframe", { "data-embed": item.id, className: `embed-${item.id}`, style: Object.assign(Object.assign({}, pos), { border: 'unset' }) })) : ((0, jsx_runtime_1.jsx)("div", { className: `embed-${item.id}`, style: Object.assign({}, pos), dangerouslySetInnerHTML: { __html: html } })) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
88
- .embed-wrapper-${item.id} {
89
- position: absolute;
90
- width: 100%;
91
- height: 100%;
92
- }
93
- .embed-${item.id} {
94
- transform: ${item.commonParams.scale ? 'scale(var(--layout-deviation))' : 'none'};
95
- transform-origin: top left;
96
- z-index: 1;
97
- border: none;
98
- }
87
+ return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: (_h = item.link) === null || _h === void 0 ? void 0 : _h.url, target: (_j = item.link) === null || _j === void 0 ? void 0 : _j.target, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-wrapper-${item.id}`, style: Object.assign(Object.assign(Object.assign(Object.assign({}, (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), (opacity !== undefined ? { opacity } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset', transition: (_k = stateParams === null || stateParams === void 0 ? void 0 : stateParams.transition) !== null && _k !== void 0 ? _k : 'none' }), ref: setRef, children: item.commonParams.iframe ? ((0, jsx_runtime_1.jsx)("iframe", { "data-embed": item.id, className: `embed-${item.id}`, style: Object.assign(Object.assign({}, pos), { border: 'unset' }) })) : ((0, jsx_runtime_1.jsx)("div", { className: `embed-${item.id}`, style: Object.assign({}, pos), dangerouslySetInnerHTML: { __html: html } })) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
88
+ .embed-wrapper-${item.id} {
89
+ position: absolute;
90
+ width: 100%;
91
+ height: 100%;
92
+ }
93
+ .embed-${item.id} {
94
+ transform: ${item.commonParams.scale ? 'scale(var(--layout-deviation))' : 'none'};
95
+ transform-origin: top left;
96
+ z-index: 1;
97
+ border: none;
98
+ }
99
99
  ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, layoutParams], exemplary) => {
100
- return (`
101
- .embed-wrapper-${item.id} {
102
- opacity: ${layoutParams.opacity};
103
- transform: rotate(${area.angle}deg);
104
- filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
105
- ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
106
- }
107
- .embed-${item.id} {
108
- width: ${item.commonParams.scale ? `${area.width * exemplary}px` : '100%'};
109
- height: ${item.commonParams.scale ? `${area.height * exemplary}px` : '100%'};
110
- }
100
+ return (`
101
+ .embed-wrapper-${item.id} {
102
+ opacity: ${layoutParams.opacity};
103
+ transform: rotate(${area.angle}deg);
104
+ filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
105
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
106
+ }
107
+ .embed-${item.id} {
108
+ width: ${item.commonParams.scale ? `${area.width * exemplary}px` : '100%'};
109
+ height: ${item.commonParams.scale ? `${area.height * exemplary}px` : '100%'};
110
+ }
111
111
  `);
112
- })}
112
+ })}
113
113
  ` })] }));
114
114
  };
115
115
  exports.CodeEmbedItem = CodeEmbedItem;
@@ -42,20 +42,20 @@ const ComponentItem = ({ item, sectionId, onResize, interactionCtrl }) => {
42
42
  : layout == null ? { opacity: 0 } : {})), (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset', transition: (_f = stateParams === null || stateParams === void 0 ? void 0 : stateParams.transition) !== null && _f !== void 0 ? _f : 'none' }), children: parameters && Element && ((0, jsx_runtime_1.jsx)(Element, Object.assign({ metadata: {
43
43
  itemId: item.id,
44
44
  submitUrl: sdk.getSubmitUrl(commonParameters === null || commonParameters === void 0 ? void 0 : commonParameters.pluginConfigId)
45
- }, portalId: "component-portal", content: item.commonParams.content }, parameters))) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: item.id, children: `
46
- .custom-component-${item.id} {
47
- width: 100%;
48
- height: 100%;
49
- pointer-events: auto;
50
- }
45
+ }, portalId: "component-portal", content: item.commonParams.content }, parameters))) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: item.id, children: `
46
+ .custom-component-${item.id} {
47
+ width: 100%;
48
+ height: 100%;
49
+ pointer-events: auto;
50
+ }
51
51
  ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, layoutParams]) => {
52
- return (`
53
- .custom-component-${item.id} {
54
- transform: rotate(${area.angle}deg);
55
- opacity: ${layoutParams.opacity};
56
- filter: blur(${layoutParams.blur}vw);
57
- ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
58
- }
52
+ return (`
53
+ .custom-component-${item.id} {
54
+ transform: rotate(${area.angle}deg);
55
+ opacity: ${layoutParams.opacity};
56
+ filter: blur(${layoutParams.blur}vw);
57
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
58
+ }
59
59
  `);
60
60
  })}` })] }));
61
61
  };