@cntrl-site/sdk-nextjs 1.9.29 → 1.9.31

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 (139) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +4 -4
  3. package/TODO.md +1 -1
  4. package/cntrl-site-sdk-nextjs-1.9.28-0.tgz +0 -0
  5. package/eslint.config.mjs +35 -35
  6. package/jest.config.js +6 -6
  7. package/lib/common/useItemFXData.js +7 -7
  8. package/lib/components/Article.js +5 -5
  9. package/lib/components/LayoutStyle.js +4 -4
  10. package/lib/components/Section/Section.js +27 -27
  11. package/lib/components/items/CodeEmbedItem/CodeEmbedItem.js +36 -36
  12. package/lib/components/items/ComponentItem/ComponentItem.js +13 -13
  13. package/lib/components/items/CompoundItem/CompoundChild.js +20 -20
  14. package/lib/components/items/CompoundItem/CompoundItem.js +14 -14
  15. package/lib/components/items/CustomItem/CustomItem.js +9 -9
  16. package/lib/components/items/EmbedVideoItem/VimeoEmbed.js +24 -24
  17. package/lib/components/items/EmbedVideoItem/YoutubeEmbed.js +27 -27
  18. package/lib/components/items/FileItem/ImageItem.js +40 -40
  19. package/lib/components/items/FileItem/VideoItem.js +64 -64
  20. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  21. package/lib/components/items/Item.js +30 -30
  22. package/lib/components/items/RectangleItem/RectangleItem.js +27 -27
  23. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  24. package/lib/interactions/InteractionsRegistry.js +2 -1
  25. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  26. package/package.json +60 -60
  27. package/src/ItemGeometry/CSSPropertyNameMap.ts +37 -37
  28. package/src/ItemGeometry/GenericGeometryController.ts +59 -59
  29. package/src/ItemGeometry/ItemGeometryContext.ts +4 -4
  30. package/src/ItemGeometry/ItemGeometryController.ts +22 -22
  31. package/src/ItemGeometry/ItemGeometryService.ts +34 -34
  32. package/src/ItemGeometry/RichTextGeometryController.ts +166 -166
  33. package/src/ItemGeometry/useItemGeometry.ts +25 -25
  34. package/src/common/useCurrentLayout.ts +52 -52
  35. package/src/common/useExemplary.ts +9 -9
  36. package/src/common/useItemFXData.ts +47 -47
  37. package/src/common/useKeyframeValue.ts +85 -85
  38. package/src/common/useRegisterResize.ts +16 -16
  39. package/src/components/Article.tsx +73 -73
  40. package/src/components/ArticleWrapper.tsx +21 -21
  41. package/src/components/Head.tsx +56 -56
  42. package/src/components/LayoutStyle.tsx +21 -21
  43. package/src/components/Page.tsx +38 -38
  44. package/src/components/ScrollPlaybackVideo.tsx +56 -56
  45. package/src/components/Section/Section.tsx +127 -127
  46. package/src/components/Section/SectionImage.tsx +48 -48
  47. package/src/components/Section/SectionVideo.tsx +144 -144
  48. package/src/components/Section/useSectionColor.ts +19 -19
  49. package/src/components/Section/useSectionHeightMap.ts +19 -19
  50. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +147 -147
  51. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  52. package/src/components/items/ComponentItem/ComponentItem.tsx +70 -70
  53. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  54. package/src/components/items/CompoundItem/CompoundChild.tsx +150 -150
  55. package/src/components/items/CompoundItem/CompoundItem.tsx +87 -87
  56. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  57. package/src/components/items/CustomItem/CustomItem.tsx +50 -50
  58. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +216 -216
  59. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +200 -200
  60. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  61. package/src/components/items/FileItem/ImageItem.tsx +165 -165
  62. package/src/components/items/FileItem/VideoItem.tsx +282 -282
  63. package/src/components/items/FileItem/useFileItem.ts +81 -81
  64. package/src/components/items/GroupItem/GroupItem.tsx +98 -98
  65. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  66. package/src/components/items/Item.tsx +262 -262
  67. package/src/components/items/LinkWrapper.tsx +39 -39
  68. package/src/components/items/RectangleItem/RectangleItem.tsx +184 -184
  69. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -89
  70. package/src/components/items/RichTextItem/RichTextItem.tsx +112 -112
  71. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  72. package/src/components/items/RichTextWrapper.tsx +15 -15
  73. package/src/components/items/itemsMap.ts +28 -28
  74. package/src/components/items/useDraggable.ts +252 -252
  75. package/src/components/items/useItemAngle.ts +13 -13
  76. package/src/components/items/useItemArea.ts +35 -35
  77. package/src/components/items/useItemPointerEvents.ts +23 -23
  78. package/src/components/items/useItemScale.ts +17 -17
  79. package/src/components/items/useItemTriggers.ts +15 -15
  80. package/src/components/items/useRichTextItemValues.ts +66 -66
  81. package/src/components/items/useSizing.ts +25 -25
  82. package/src/components/items/useStickyItemTop.ts +21 -21
  83. package/src/components/useLayoutContext.ts +7 -7
  84. package/src/index.ts +24 -24
  85. package/src/interactions/InteractionsRegistry.ts +508 -507
  86. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  87. package/src/interactions/getTransition.ts +27 -27
  88. package/src/interactions/types.ts +36 -36
  89. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  90. package/src/provider/ArticleRectContext.ts +4 -4
  91. package/src/provider/CntrlContext.ts +5 -5
  92. package/src/provider/CntrlProvider.tsx +11 -11
  93. package/src/provider/CntrlSdkContext.ts +84 -84
  94. package/src/provider/CustomItemRegistry.ts +14 -14
  95. package/src/provider/CustomItemTypes.ts +3 -3
  96. package/src/provider/CustomSectionRegistry.ts +25 -25
  97. package/src/provider/InteractionsContext.tsx +61 -61
  98. package/src/provider/Keyframes.ts +11 -11
  99. package/src/provider/KeyframesContext.ts +5 -5
  100. package/src/provider/LayoutContext.ts +3 -3
  101. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  102. package/src/provider/defaultContext.ts +8 -8
  103. package/src/provider/useCntrlContext.ts +8 -8
  104. package/src/styled-jsx.d.ts +1 -1
  105. package/src/utils/Animator/Animator.ts +570 -570
  106. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  107. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  108. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  109. package/src/utils/CSSNumeric.ts +19 -19
  110. package/src/utils/EventEmitter.ts +41 -41
  111. package/src/utils/RichTextConverter/RichTextConverter.tsx +342 -342
  112. package/src/utils/ScaleAnchorMap.ts +13 -13
  113. package/src/utils/StickyManager/StickyManager.ts +23 -23
  114. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  115. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  116. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  117. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -63
  118. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -37
  119. package/src/utils/binSearchInsertAt.ts +33 -33
  120. package/src/utils/castObject.ts +10 -10
  121. package/src/utils/checkOverflowClipSupport.ts +13 -13
  122. package/src/utils/domDfs.ts +11 -11
  123. package/src/utils/effects/useImageFx.ts +156 -156
  124. package/src/utils/effects/useVideoFx.ts +158 -158
  125. package/src/utils/getAnchoredItemTop.ts +12 -12
  126. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  127. package/src/utils/getFill.ts +46 -46
  128. package/src/utils/getFontFamilyValue.ts +3 -3
  129. package/src/utils/getInvertedRanges.ts +43 -43
  130. package/src/utils/getItemTopStyle.ts +14 -14
  131. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  132. package/src/utils/getValidYoutubeUrl.ts +29 -29
  133. package/src/utils/isItemType.ts +5 -5
  134. package/src/utils/rangeMap.ts +13 -13
  135. package/src/utils/useElementRect.ts +23 -23
  136. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  137. package/.idea/modules.xml +0 -8
  138. package/.idea/sdk-nextjs.iml +0 -12
  139. package/.idea/vcs.xml +0 -6
@@ -1,85 +1,85 @@
1
- import { KeyframeType, ItemAny } from '@cntrl-site/sdk';
2
- import isEqual from 'lodash.isequal';
3
- import { DependencyList, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
4
- import { ArticleRectContext } from '../provider/ArticleRectContext';
5
- import { KeyframesContext } from '../provider/KeyframesContext';
6
- import { AnimationData, Animator } from '../utils/Animator/Animator';
7
- import { useLayoutContext } from '../components/useLayoutContext';
8
-
9
- export type AnimatorGetter<T> = (animator: Animator, scroll: number, value: T) => T;
10
- type ItemParamGetter<T> = (item: ItemAny, layoutId: string | undefined) => T;
11
- const emptyDeps: DependencyList = [];
12
-
13
- export function useKeyframeValue<T>(
14
- item: ItemAny,
15
- type: KeyframeType,
16
- itemParamsGetter: ItemParamGetter<T>,
17
- animatorGetter: AnimatorGetter<T>,
18
- sectionId: string,
19
- deps: DependencyList = emptyDeps
20
- ): T {
21
- const animatorGetterRef = useRef(animatorGetter);
22
- const itemParamsGetterRef = useRef(itemParamsGetter);
23
-
24
- animatorGetterRef.current = animatorGetter;
25
- itemParamsGetterRef.current = itemParamsGetter;
26
-
27
- const articleRectObserver = useContext(ArticleRectContext);
28
- const layoutId = useLayoutContext();
29
- const keyframesRepo = useContext(KeyframesContext);
30
- const keyframes = useMemo(() => keyframesRepo.getItemKeyframes(item.id).filter(kf => kf.type === type), [item.id, keyframesRepo, type]);
31
- const paramValue = useMemo<T>(() => {
32
- return itemParamsGetterRef.current(item, layoutId);
33
- }, [item, layoutId, ...deps]);
34
-
35
- const [adjustedValue, setAdjustedValue] = useState<T>(paramValue);
36
- const adjustedValueRef = useRef<T>(adjustedValue);
37
- adjustedValueRef.current = adjustedValue;
38
-
39
- const animator = useMemo(() => {
40
- if (!layoutId || !keyframes.length) return;
41
- const animationData = keyframes
42
- .filter(k => k.layoutId === layoutId)
43
- .map<AnimationData<KeyframeType>>(({ position, type, value }) => ({
44
- position,
45
- type,
46
- value
47
- }));
48
- return new Animator(animationData);
49
- }, [keyframes, layoutId]);
50
-
51
- const handleKeyframeValue = useCallback((scroll: number) => {
52
- if (!animator) return;
53
- const newValue = animatorGetterRef.current(animator, scroll, paramValue);
54
- if (!isEqual(newValue, adjustedValueRef.current)) {
55
- setAdjustedValue(newValue);
56
- }
57
- }, [animator, paramValue]);
58
-
59
- useEffect(() => {
60
- setAdjustedValue(paramValue);
61
- }, [paramValue]);
62
-
63
- useEffect(() => {
64
- if (!articleRectObserver || !animator) return;
65
- const scroll = articleRectObserver.getSectionScroll(sectionId);
66
- handleKeyframeValue(scroll);
67
- }, [articleRectObserver, handleKeyframeValue, animator]);
68
-
69
- useEffect(() => {
70
- if (!articleRectObserver || !animator) return;
71
- return articleRectObserver.on('resize', () => {
72
- const scroll = articleRectObserver.getSectionScroll(sectionId);
73
- handleKeyframeValue(scroll);
74
- });
75
- }, [handleKeyframeValue, articleRectObserver, animator]);
76
-
77
- useEffect(() => {
78
- if (!articleRectObserver || !animator) return;
79
- return articleRectObserver.on('scroll', () => {
80
- const scroll = articleRectObserver.getSectionScroll(sectionId);
81
- handleKeyframeValue(scroll);
82
- });
83
- }, [handleKeyframeValue, articleRectObserver, animator]);
84
- return keyframes.length ? adjustedValue : paramValue;
85
- }
1
+ import { KeyframeType, ItemAny } from '@cntrl-site/sdk';
2
+ import isEqual from 'lodash.isequal';
3
+ import { DependencyList, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
4
+ import { ArticleRectContext } from '../provider/ArticleRectContext';
5
+ import { KeyframesContext } from '../provider/KeyframesContext';
6
+ import { AnimationData, Animator } from '../utils/Animator/Animator';
7
+ import { useLayoutContext } from '../components/useLayoutContext';
8
+
9
+ export type AnimatorGetter<T> = (animator: Animator, scroll: number, value: T) => T;
10
+ type ItemParamGetter<T> = (item: ItemAny, layoutId: string | undefined) => T;
11
+ const emptyDeps: DependencyList = [];
12
+
13
+ export function useKeyframeValue<T>(
14
+ item: ItemAny,
15
+ type: KeyframeType,
16
+ itemParamsGetter: ItemParamGetter<T>,
17
+ animatorGetter: AnimatorGetter<T>,
18
+ sectionId: string,
19
+ deps: DependencyList = emptyDeps
20
+ ): T {
21
+ const animatorGetterRef = useRef(animatorGetter);
22
+ const itemParamsGetterRef = useRef(itemParamsGetter);
23
+
24
+ animatorGetterRef.current = animatorGetter;
25
+ itemParamsGetterRef.current = itemParamsGetter;
26
+
27
+ const articleRectObserver = useContext(ArticleRectContext);
28
+ const layoutId = useLayoutContext();
29
+ const keyframesRepo = useContext(KeyframesContext);
30
+ const keyframes = useMemo(() => keyframesRepo.getItemKeyframes(item.id).filter(kf => kf.type === type), [item.id, keyframesRepo, type]);
31
+ const paramValue = useMemo<T>(() => {
32
+ return itemParamsGetterRef.current(item, layoutId);
33
+ }, [item, layoutId, ...deps]);
34
+
35
+ const [adjustedValue, setAdjustedValue] = useState<T>(paramValue);
36
+ const adjustedValueRef = useRef<T>(adjustedValue);
37
+ adjustedValueRef.current = adjustedValue;
38
+
39
+ const animator = useMemo(() => {
40
+ if (!layoutId || !keyframes.length) return;
41
+ const animationData = keyframes
42
+ .filter(k => k.layoutId === layoutId)
43
+ .map<AnimationData<KeyframeType>>(({ position, type, value }) => ({
44
+ position,
45
+ type,
46
+ value
47
+ }));
48
+ return new Animator(animationData);
49
+ }, [keyframes, layoutId]);
50
+
51
+ const handleKeyframeValue = useCallback((scroll: number) => {
52
+ if (!animator) return;
53
+ const newValue = animatorGetterRef.current(animator, scroll, paramValue);
54
+ if (!isEqual(newValue, adjustedValueRef.current)) {
55
+ setAdjustedValue(newValue);
56
+ }
57
+ }, [animator, paramValue]);
58
+
59
+ useEffect(() => {
60
+ setAdjustedValue(paramValue);
61
+ }, [paramValue]);
62
+
63
+ useEffect(() => {
64
+ if (!articleRectObserver || !animator) return;
65
+ const scroll = articleRectObserver.getSectionScroll(sectionId);
66
+ handleKeyframeValue(scroll);
67
+ }, [articleRectObserver, handleKeyframeValue, animator]);
68
+
69
+ useEffect(() => {
70
+ if (!articleRectObserver || !animator) return;
71
+ return articleRectObserver.on('resize', () => {
72
+ const scroll = articleRectObserver.getSectionScroll(sectionId);
73
+ handleKeyframeValue(scroll);
74
+ });
75
+ }, [handleKeyframeValue, articleRectObserver, animator]);
76
+
77
+ useEffect(() => {
78
+ if (!articleRectObserver || !animator) return;
79
+ return articleRectObserver.on('scroll', () => {
80
+ const scroll = articleRectObserver.getSectionScroll(sectionId);
81
+ handleKeyframeValue(scroll);
82
+ });
83
+ }, [handleKeyframeValue, articleRectObserver, animator]);
84
+ return keyframes.length ? adjustedValue : paramValue;
85
+ }
@@ -1,16 +1,16 @@
1
- import { useEffect } from 'react';
2
- import ResizeObserver from 'resize-observer-polyfill';
3
-
4
- export function useRegisterResize(ref: HTMLElement | null, onResize?: (height: number) => void) {
5
- useEffect(() => {
6
- if (!ref || !onResize) return;
7
- const observer = new ResizeObserver((entries) => {
8
- const [entry] = entries;
9
- onResize(entry.target.clientHeight / window.innerWidth);
10
- });
11
- observer.observe(ref);
12
- return () => {
13
- observer.unobserve(ref);
14
- };
15
- }, [ref, onResize]);
16
- }
1
+ import { useEffect } from 'react';
2
+ import ResizeObserver from 'resize-observer-polyfill';
3
+
4
+ export function useRegisterResize(ref: HTMLElement | null, onResize?: (height: number) => void) {
5
+ useEffect(() => {
6
+ if (!ref || !onResize) return;
7
+ const observer = new ResizeObserver((entries) => {
8
+ const [entry] = entries;
9
+ onResize(entry.target.clientHeight / window.innerWidth);
10
+ });
11
+ observer.observe(ref);
12
+ return () => {
13
+ observer.unobserve(ref);
14
+ };
15
+ }, [ref, onResize]);
16
+ }
@@ -1,73 +1,73 @@
1
- import { FC, useEffect, useId, useMemo, useRef, useState } from 'react';
2
- import JSXStyle from 'styled-jsx/style';
3
- import { Article as TArticle } from '@cntrl-site/sdk';
4
- import { Section } from './Section/Section';
5
- import { Item } from './items/Item';
6
- import { useArticleRectObserver } from '../utils/ArticleRectManager/useArticleRectObserver';
7
- import { ArticleRectContext } from '../provider/ArticleRectContext';
8
- import { ArticleWrapper } from './ArticleWrapper';
9
- import { InteractionsProvider } from '../provider/InteractionsContext';
10
- import { WebglContextManagerContext } from '../provider/WebGLContextManagerContext';
11
- import { WebGLContextManager } from '@cntrl-site/effects';
12
-
13
- interface Props {
14
- article: TArticle;
15
- sectionData: Record<SectionName, any>;
16
- }
17
-
18
- export const Article: FC<Props> = ({ article, sectionData }) => {
19
- const articleRef = useRef<HTMLDivElement | null>(null);
20
- const articleRectObserver = useArticleRectObserver(articleRef.current);
21
- const id = useId();
22
- const [articleHeight, setArticleHeight] = useState(1);
23
-
24
- useEffect(() => {
25
- if (!articleRectObserver) return;
26
- return articleRectObserver.on('resize', (rect) => {
27
- setArticleHeight(rect.height / rect.width);
28
- });
29
- }, [articleRectObserver]);
30
-
31
- const webglContextManager = useMemo(() => new WebGLContextManager(), []);
32
-
33
- return (
34
- <ArticleRectContext.Provider value={articleRectObserver}>
35
- <InteractionsProvider article={article}>
36
- <ArticleWrapper>
37
- <div className="article" ref={articleRef}>
38
- <WebglContextManagerContext.Provider value={webglContextManager}>
39
- {article.sections.map((section, i) => {
40
- const data = section.name ? sectionData[section.name] : {};
41
- return (
42
- <Section
43
- section={section}
44
- key={section.id}
45
- data={data}
46
- >
47
- {article.sections[i].items.map(item => (
48
- <Item
49
- item={item}
50
- key={item.id}
51
- sectionId={section.id}
52
- articleHeight={articleHeight}
53
- />
54
- ))}
55
- </Section>
56
- );
57
- })}
58
- </WebglContextManagerContext.Provider>
59
- <div id="component-portal" />
60
- </div>
61
- </ArticleWrapper>
62
- <JSXStyle id={id}>{`
63
- .article {
64
- position: relative;
65
- overflow: clip;
66
- }
67
- `}</JSXStyle>
68
- </InteractionsProvider>
69
- </ArticleRectContext.Provider>
70
- );
71
- };
72
-
73
- type SectionName = string;
1
+ import { FC, useEffect, useId, useMemo, useRef, useState } from 'react';
2
+ import JSXStyle from 'styled-jsx/style';
3
+ import { Article as TArticle } from '@cntrl-site/sdk';
4
+ import { Section } from './Section/Section';
5
+ import { Item } from './items/Item';
6
+ import { useArticleRectObserver } from '../utils/ArticleRectManager/useArticleRectObserver';
7
+ import { ArticleRectContext } from '../provider/ArticleRectContext';
8
+ import { ArticleWrapper } from './ArticleWrapper';
9
+ import { InteractionsProvider } from '../provider/InteractionsContext';
10
+ import { WebglContextManagerContext } from '../provider/WebGLContextManagerContext';
11
+ import { WebGLContextManager } from '@cntrl-site/effects';
12
+
13
+ interface Props {
14
+ article: TArticle;
15
+ sectionData: Record<SectionName, any>;
16
+ }
17
+
18
+ export const Article: FC<Props> = ({ article, sectionData }) => {
19
+ const articleRef = useRef<HTMLDivElement | null>(null);
20
+ const articleRectObserver = useArticleRectObserver(articleRef.current);
21
+ const id = useId();
22
+ const [articleHeight, setArticleHeight] = useState(1);
23
+
24
+ useEffect(() => {
25
+ if (!articleRectObserver) return;
26
+ return articleRectObserver.on('resize', (rect) => {
27
+ setArticleHeight(rect.height / rect.width);
28
+ });
29
+ }, [articleRectObserver]);
30
+
31
+ const webglContextManager = useMemo(() => new WebGLContextManager(), []);
32
+
33
+ return (
34
+ <ArticleRectContext.Provider value={articleRectObserver}>
35
+ <InteractionsProvider article={article}>
36
+ <ArticleWrapper>
37
+ <div className="article" ref={articleRef}>
38
+ <WebglContextManagerContext.Provider value={webglContextManager}>
39
+ {article.sections.map((section, i) => {
40
+ const data = section.name ? sectionData[section.name] : {};
41
+ return (
42
+ <Section
43
+ section={section}
44
+ key={section.id}
45
+ data={data}
46
+ >
47
+ {article.sections[i].items.map(item => (
48
+ <Item
49
+ item={item}
50
+ key={item.id}
51
+ sectionId={section.id}
52
+ articleHeight={articleHeight}
53
+ />
54
+ ))}
55
+ </Section>
56
+ );
57
+ })}
58
+ </WebglContextManagerContext.Provider>
59
+ <div id="component-portal" />
60
+ </div>
61
+ </ArticleWrapper>
62
+ <JSXStyle id={id}>{`
63
+ .article {
64
+ position: relative;
65
+ overflow: clip;
66
+ }
67
+ `}</JSXStyle>
68
+ </InteractionsProvider>
69
+ </ArticleRectContext.Provider>
70
+ );
71
+ };
72
+
73
+ type SectionName = string;
@@ -1,21 +1,21 @@
1
- import React, { CSSProperties, FC, PropsWithChildren } from 'react';
2
- import { useCurrentLayout } from '../common/useCurrentLayout';
3
- import { LayoutContext } from '../provider/LayoutContext';
4
-
5
- export const ArticleWrapper: FC<PropsWithChildren<{}>> = ({ children }) => {
6
- const { layoutId, layoutDeviation } = useCurrentLayout();
7
- const layoutDeviationStyle = { '--layout-deviation': layoutDeviation } as CSSProperties;
8
-
9
- return (
10
- <LayoutContext.Provider value={layoutId}>
11
- <div
12
- className="article-wrapper"
13
- style={{
14
- ...layoutDeviationStyle
15
- }}
16
- >
17
- {children}
18
- </div>
19
- </LayoutContext.Provider>
20
- );
21
- };
1
+ import React, { CSSProperties, FC, PropsWithChildren } from 'react';
2
+ import { useCurrentLayout } from '../common/useCurrentLayout';
3
+ import { LayoutContext } from '../provider/LayoutContext';
4
+
5
+ export const ArticleWrapper: FC<PropsWithChildren<{}>> = ({ children }) => {
6
+ const { layoutId, layoutDeviation } = useCurrentLayout();
7
+ const layoutDeviationStyle = { '--layout-deviation': layoutDeviation } as CSSProperties;
8
+
9
+ return (
10
+ <LayoutContext.Provider value={layoutId}>
11
+ <div
12
+ className="article-wrapper"
13
+ style={{
14
+ ...layoutDeviationStyle
15
+ }}
16
+ >
17
+ {children}
18
+ </div>
19
+ </LayoutContext.Provider>
20
+ );
21
+ };
@@ -1,56 +1,56 @@
1
- import React, { FC } from 'react';
2
- import HTMLReactParser, { domToReact } from 'html-react-parser';
3
- import Head from 'next/head';
4
- import { FontFaceGenerator, Meta, Project } from '@cntrl-site/sdk';
5
-
6
- interface Props {
7
- project: Project;
8
- meta: Meta;
9
- }
10
-
11
- export const CNTRLHead: FC<Props> = ({ meta, project }) => {
12
- const googleFonts: ReturnType<typeof domToReact> = HTMLReactParser(project.fonts.google);
13
- const adobeFonts: ReturnType<typeof domToReact> = HTMLReactParser(project.fonts.adobe);
14
- const parsedFonts = {
15
- ...(typeof googleFonts === 'object' ? googleFonts : {}),
16
- ...(typeof adobeFonts === 'object' ? adobeFonts : {})
17
- };
18
- const customFonts = project.fonts.custom;
19
- const htmlHead = HTMLReactParser(project.html.head);
20
- const ffGenerator = new FontFaceGenerator(customFonts);
21
- const links = Object.values(parsedFonts as ReturnType<typeof domToReact>).map((value) => {
22
- if (!value) return;
23
- const rel = value?.rel || value.props?.rel;
24
- const href = value?.href || value.props?.href;
25
- if (!rel || !href) return;
26
- return (
27
- <link key={`link-${rel}-${href}`} rel={rel} href={href} />
28
- );
29
- });
30
- return (
31
- <Head>
32
- <title>{meta.title}</title>
33
- <meta name="description" content={meta.description}/>
34
- <meta name="keywords" content={meta.keywords}/>
35
- <meta name="og:title" content={meta.title}/>
36
- <meta name="og:image" content={meta.opengraphThumbnail}/>
37
- <meta name="og:description" content={meta.description}/>
38
- <meta name="twitter:title" content={meta.title}/>
39
- <meta name="twitter:image" content={meta.opengraphThumbnail}/>
40
- <meta name="twitter:description" content={meta.description}/>
41
- <meta property="twitter:card" content="summary_large_image"/>
42
- <meta name="generator" content="https://cntrl.site"/>
43
- <link rel="icon" href={meta.favicon}/>
44
- {customFonts.length > 0 && (
45
- <style
46
- dangerouslySetInnerHTML={{
47
- __html: ffGenerator.generate()
48
- }}
49
- />
50
- )}
51
- {links}
52
- {htmlHead}
53
-
54
- </Head>
55
- );
56
- };
1
+ import React, { FC } from 'react';
2
+ import HTMLReactParser, { domToReact } from 'html-react-parser';
3
+ import Head from 'next/head';
4
+ import { FontFaceGenerator, Meta, Project } from '@cntrl-site/sdk';
5
+
6
+ interface Props {
7
+ project: Project;
8
+ meta: Meta;
9
+ }
10
+
11
+ export const CNTRLHead: FC<Props> = ({ meta, project }) => {
12
+ const googleFonts: ReturnType<typeof domToReact> = HTMLReactParser(project.fonts.google);
13
+ const adobeFonts: ReturnType<typeof domToReact> = HTMLReactParser(project.fonts.adobe);
14
+ const parsedFonts = {
15
+ ...(typeof googleFonts === 'object' ? googleFonts : {}),
16
+ ...(typeof adobeFonts === 'object' ? adobeFonts : {})
17
+ };
18
+ const customFonts = project.fonts.custom;
19
+ const htmlHead = HTMLReactParser(project.html.head);
20
+ const ffGenerator = new FontFaceGenerator(customFonts);
21
+ const links = Object.values(parsedFonts as ReturnType<typeof domToReact>).map((value) => {
22
+ if (!value) return;
23
+ const rel = value?.rel || value.props?.rel;
24
+ const href = value?.href || value.props?.href;
25
+ if (!rel || !href) return;
26
+ return (
27
+ <link key={`link-${rel}-${href}`} rel={rel} href={href} />
28
+ );
29
+ });
30
+ return (
31
+ <Head>
32
+ <title>{meta.title}</title>
33
+ <meta name="description" content={meta.description}/>
34
+ <meta name="keywords" content={meta.keywords}/>
35
+ <meta name="og:title" content={meta.title}/>
36
+ <meta name="og:image" content={meta.opengraphThumbnail}/>
37
+ <meta name="og:description" content={meta.description}/>
38
+ <meta name="twitter:title" content={meta.title}/>
39
+ <meta name="twitter:image" content={meta.opengraphThumbnail}/>
40
+ <meta name="twitter:description" content={meta.description}/>
41
+ <meta property="twitter:card" content="summary_large_image"/>
42
+ <meta name="generator" content="https://cntrl.site"/>
43
+ <link rel="icon" href={meta.favicon}/>
44
+ {customFonts.length > 0 && (
45
+ <style
46
+ dangerouslySetInnerHTML={{
47
+ __html: ffGenerator.generate()
48
+ }}
49
+ />
50
+ )}
51
+ {links}
52
+ {htmlHead}
53
+
54
+ </Head>
55
+ );
56
+ };
@@ -1,21 +1,21 @@
1
- import React, { FC } from 'react';
2
- import { getLayoutMediaQuery, Layout } from '@cntrl-site/sdk';
3
- import JSXStyle from 'styled-jsx/style';
4
-
5
- export interface LayoutStyleProps {
6
- id: string;
7
- layouts: Layout[];
8
- layoutId: string;
9
- children?: (layout: Layout) => string;
10
- }
11
-
12
- export const LayoutStyle: FC<LayoutStyleProps> = ({ id, layouts, layoutId, children }) => {
13
- const layout = layouts.find(l => l.id === layoutId)!;
14
- return (
15
- <JSXStyle id={id}>{`
16
- ${getLayoutMediaQuery(layoutId, layouts)} {
17
- ${children?.(layout)}
18
- }
19
- `}</JSXStyle>
20
- );
21
- };
1
+ import React, { FC } from 'react';
2
+ import { getLayoutMediaQuery, Layout } from '@cntrl-site/sdk';
3
+ import JSXStyle from 'styled-jsx/style';
4
+
5
+ export interface LayoutStyleProps {
6
+ id: string;
7
+ layouts: Layout[];
8
+ layoutId: string;
9
+ children?: (layout: Layout) => string;
10
+ }
11
+
12
+ export const LayoutStyle: FC<LayoutStyleProps> = ({ id, layouts, layoutId, children }) => {
13
+ const layout = layouts.find(l => l.id === layoutId)!;
14
+ return (
15
+ <JSXStyle id={id}>{`
16
+ ${getLayoutMediaQuery(layoutId, layouts)} {
17
+ ${children?.(layout)}
18
+ }
19
+ `}</JSXStyle>
20
+ );
21
+ };
@@ -1,38 +1,38 @@
1
- import React, { FC, useMemo } from 'react';
2
- import HTMLReactParser from 'html-react-parser';
3
- import { Article as TArticle, Project, Meta, KeyframeAny } from '@cntrl-site/sdk';
4
- import { Article } from './Article';
5
- import { KeyframesContext } from '../provider/KeyframesContext';
6
- import { CNTRLHead } from './Head';
7
- import { Keyframes } from '../provider/Keyframes';
8
- import { ItemGeometryContext } from '../ItemGeometry/ItemGeometryContext';
9
- import { ItemGeometryService } from '../ItemGeometry/ItemGeometryService';
10
-
11
- export interface PageProps {
12
- article: TArticle;
13
- project: Project;
14
- meta: Meta;
15
- keyframes: KeyframeAny[];
16
- sectionData: Record<SectionName, any>;
17
- }
18
-
19
- export const Page: FC<PageProps> = ({ article, project, meta, keyframes, sectionData }) => {
20
- const afterBodyOpen = HTMLReactParser(project.html.afterBodyOpen);
21
- const beforeBodyClose = HTMLReactParser(project.html.beforeBodyClose);
22
- const keyframesRepo = useMemo(() => new Keyframes(keyframes), [keyframes]);
23
- const itemGeometryService = useMemo(() => new ItemGeometryService(), []);
24
- return (
25
- <>
26
- <CNTRLHead project={project} meta={meta} />
27
- {afterBodyOpen}
28
- <ItemGeometryContext.Provider value={itemGeometryService}>
29
- <KeyframesContext.Provider value={keyframesRepo}>
30
- <Article article={article} sectionData={sectionData} />
31
- </KeyframesContext.Provider>
32
- </ItemGeometryContext.Provider>
33
- {beforeBodyClose}
34
- </>
35
- );
36
- };
37
-
38
- type SectionName = string;
1
+ import React, { FC, useMemo } from 'react';
2
+ import HTMLReactParser from 'html-react-parser';
3
+ import { Article as TArticle, Project, Meta, KeyframeAny } from '@cntrl-site/sdk';
4
+ import { Article } from './Article';
5
+ import { KeyframesContext } from '../provider/KeyframesContext';
6
+ import { CNTRLHead } from './Head';
7
+ import { Keyframes } from '../provider/Keyframes';
8
+ import { ItemGeometryContext } from '../ItemGeometry/ItemGeometryContext';
9
+ import { ItemGeometryService } from '../ItemGeometry/ItemGeometryService';
10
+
11
+ export interface PageProps {
12
+ article: TArticle;
13
+ project: Project;
14
+ meta: Meta;
15
+ keyframes: KeyframeAny[];
16
+ sectionData: Record<SectionName, any>;
17
+ }
18
+
19
+ export const Page: FC<PageProps> = ({ article, project, meta, keyframes, sectionData }) => {
20
+ const afterBodyOpen = HTMLReactParser(project.html.afterBodyOpen);
21
+ const beforeBodyClose = HTMLReactParser(project.html.beforeBodyClose);
22
+ const keyframesRepo = useMemo(() => new Keyframes(keyframes), [keyframes]);
23
+ const itemGeometryService = useMemo(() => new ItemGeometryService(), []);
24
+ return (
25
+ <>
26
+ <CNTRLHead project={project} meta={meta} />
27
+ {afterBodyOpen}
28
+ <ItemGeometryContext.Provider value={itemGeometryService}>
29
+ <KeyframesContext.Provider value={keyframesRepo}>
30
+ <Article article={article} sectionData={sectionData} />
31
+ </KeyframesContext.Provider>
32
+ </ItemGeometryContext.Provider>
33
+ {beforeBodyClose}
34
+ </>
35
+ );
36
+ };
37
+
38
+ type SectionName = string;