@cntrl-site/sdk-nextjs 0.3.0 → 0.4.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.
- package/cntrl-site-sdk-nextjs-0.4.0.tgz +0 -0
- package/lib/common/useCurrentLayout.js +42 -0
- package/lib/common/useKeyframeValue.js +66 -0
- package/lib/components/Article.js +6 -1
- package/lib/components/Item.js +21 -15
- package/lib/components/Page.js +6 -2
- package/lib/components/items/ImageItem.js +7 -4
- package/lib/components/items/RectangleItem.js +8 -5
- package/lib/components/items/VideoItem.js +7 -4
- package/lib/components/items/VimeoEmbed.js +14 -15
- package/lib/components/items/YoutubeEmbed.js +14 -15
- package/lib/components/items/useEmbedVideoItem.js +16 -0
- package/lib/components/items/useFileItem.js +22 -0
- package/lib/components/items/useRectangleItem.js +29 -0
- package/lib/components/useItemAngle.js +9 -0
- package/lib/components/useItemDimensions.js +19 -0
- package/lib/components/useItemPosition.js +34 -0
- package/lib/provider/ArticleRectContext.js +5 -0
- package/lib/provider/CntrlSdkContext.js +9 -3
- package/lib/provider/Keyframes.js +12 -0
- package/lib/provider/KeyframesContext.js +6 -0
- package/lib/utils/Animator/Animator.js +159 -0
- package/lib/utils/ArticleRectManager/ArticleRectObserver.js +61 -0
- package/lib/utils/ArticleRectManager/useArticleRectObserver.js +18 -0
- package/lib/utils/EventEmitter.js +35 -0
- package/lib/utils/binSearchInsertAt.js +36 -0
- package/package.json +5 -3
- package/src/common/useCurrentLayout.ts +47 -0
- package/src/common/useKeyframeValue.ts +74 -0
- package/src/components/Article.tsx +9 -4
- package/src/components/Item.tsx +27 -17
- package/src/components/Page.tsx +10 -4
- package/src/components/items/ImageItem.tsx +9 -4
- package/src/components/items/RectangleItem.tsx +10 -5
- package/src/components/items/VideoItem.tsx +9 -4
- package/src/components/items/VimeoEmbed.tsx +17 -17
- package/src/components/items/YoutubeEmbed.tsx +16 -16
- package/src/components/items/useEmbedVideoItem.ts +19 -0
- package/src/components/items/useFileItem.ts +29 -0
- package/src/components/items/useRectangleItem.ts +40 -0
- package/src/components/useItemAngle.ts +12 -0
- package/src/components/useItemDimensions.ts +23 -0
- package/src/components/useItemPosition.ts +36 -0
- package/src/provider/ArticleRectContext.ts +4 -0
- package/src/provider/CntrlSdkContext.ts +14 -5
- package/src/provider/Keyframes.ts +11 -0
- package/src/provider/KeyframesContext.ts +5 -0
- package/src/utils/Animator/Animator.ts +206 -0
- package/src/utils/ArticleRectManager/ArticleRectObserver.ts +69 -0
- package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -0
- package/src/utils/EventEmitter.ts +41 -0
- package/src/utils/binSearchInsertAt.ts +33 -0
- package/.idea/inspectionProfiles/Project_Default.xml +0 -15
|
Binary file
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCurrentLayout = void 0;
|
|
4
|
+
const useCntrlContext_1 = require("../provider/useCntrlContext");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const ArticleRectContext_1 = require("../provider/ArticleRectContext");
|
|
7
|
+
const useCurrentLayout = () => {
|
|
8
|
+
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
9
|
+
const [initialLayout] = layouts;
|
|
10
|
+
const articleRectObserver = (0, react_1.useContext)(ArticleRectContext_1.ArticleRectContext);
|
|
11
|
+
const layoutRanges = (0, react_1.useMemo)(() => {
|
|
12
|
+
const sorted = layouts.slice().sort((la, lb) => la.startsWith - lb.startsWith);
|
|
13
|
+
return sorted.reduce((acc, layout, i, layouts) => {
|
|
14
|
+
const next = layouts[i + 1];
|
|
15
|
+
return [
|
|
16
|
+
...acc,
|
|
17
|
+
{
|
|
18
|
+
layoutId: layout.id,
|
|
19
|
+
start: layout.startsWith,
|
|
20
|
+
end: next ? next.startsWith : Number.MAX_SAFE_INTEGER
|
|
21
|
+
}
|
|
22
|
+
];
|
|
23
|
+
}, []);
|
|
24
|
+
}, [layouts]);
|
|
25
|
+
const getCurrentLayout = (0, react_1.useCallback)((articleWidth) => {
|
|
26
|
+
return layoutRanges.find(l => articleWidth >= l.start && articleWidth < l.end).layoutId;
|
|
27
|
+
}, [layoutRanges]);
|
|
28
|
+
const [layoutId, setLayoutId] = (0, react_1.useState)(getCurrentLayout(isServer() ? 0 : window.innerWidth));
|
|
29
|
+
(0, react_1.useEffect)(() => {
|
|
30
|
+
if (!articleRectObserver)
|
|
31
|
+
return;
|
|
32
|
+
return articleRectObserver.on('resize', () => {
|
|
33
|
+
const articleWidth = articleRectObserver.width;
|
|
34
|
+
setLayoutId(getCurrentLayout(articleWidth));
|
|
35
|
+
});
|
|
36
|
+
}, [articleRectObserver, getCurrentLayout]);
|
|
37
|
+
return layoutId;
|
|
38
|
+
};
|
|
39
|
+
exports.useCurrentLayout = useCurrentLayout;
|
|
40
|
+
function isServer() {
|
|
41
|
+
return typeof window === 'undefined';
|
|
42
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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.useKeyframeValue = void 0;
|
|
7
|
+
const lodash_isequal_1 = __importDefault(require("lodash.isequal"));
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const ArticleRectContext_1 = require("../provider/ArticleRectContext");
|
|
10
|
+
const useCurrentLayout_1 = require("./useCurrentLayout");
|
|
11
|
+
const KeyframesContext_1 = require("../provider/KeyframesContext");
|
|
12
|
+
const Animator_1 = require("../utils/Animator/Animator");
|
|
13
|
+
const emptyDeps = [];
|
|
14
|
+
const useKeyframeValue = (item, itemParamsGetter, animatorGetter, deps = emptyDeps) => {
|
|
15
|
+
const animatorGetterRef = (0, react_1.useRef)(animatorGetter);
|
|
16
|
+
const itemParamsGetterRef = (0, react_1.useRef)(itemParamsGetter);
|
|
17
|
+
animatorGetterRef.current = animatorGetter;
|
|
18
|
+
itemParamsGetterRef.current = itemParamsGetter;
|
|
19
|
+
const articleRectObserver = (0, react_1.useContext)(ArticleRectContext_1.ArticleRectContext);
|
|
20
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
21
|
+
const keyframesRepo = (0, react_1.useContext)(KeyframesContext_1.KeyframesContext);
|
|
22
|
+
const keyframes = keyframesRepo.getItemKeyframes(item.id);
|
|
23
|
+
const paramValue = (0, react_1.useMemo)(() => {
|
|
24
|
+
return itemParamsGetterRef.current(item, layoutId);
|
|
25
|
+
}, [item, layoutId, ...deps]);
|
|
26
|
+
const [adjustedValue, setAdjustedValue] = (0, react_1.useState)(paramValue);
|
|
27
|
+
const adjustedValueRef = (0, react_1.useRef)(adjustedValue);
|
|
28
|
+
adjustedValueRef.current = adjustedValue;
|
|
29
|
+
const animator = (0, react_1.useMemo)(() => {
|
|
30
|
+
if (!layoutId || !keyframes.length)
|
|
31
|
+
return;
|
|
32
|
+
const animationData = keyframes
|
|
33
|
+
.filter(k => k.layoutId === layoutId)
|
|
34
|
+
.map(({ position, type, value }) => ({
|
|
35
|
+
position,
|
|
36
|
+
type,
|
|
37
|
+
value
|
|
38
|
+
}));
|
|
39
|
+
return new Animator_1.Animator(animationData);
|
|
40
|
+
}, [keyframes, layoutId]);
|
|
41
|
+
(0, react_1.useEffect)(() => {
|
|
42
|
+
setAdjustedValue(paramValue);
|
|
43
|
+
}, [paramValue]);
|
|
44
|
+
(0, react_1.useEffect)(() => {
|
|
45
|
+
if (!animator || !articleRectObserver)
|
|
46
|
+
return;
|
|
47
|
+
return articleRectObserver.on('resize', () => {
|
|
48
|
+
const scroll = articleRectObserver.scroll;
|
|
49
|
+
const newValue = animatorGetterRef.current(animator, scroll, paramValue);
|
|
50
|
+
setAdjustedValue(newValue);
|
|
51
|
+
});
|
|
52
|
+
}, [animator, articleRectObserver]);
|
|
53
|
+
(0, react_1.useEffect)(() => {
|
|
54
|
+
if (!animator || !articleRectObserver)
|
|
55
|
+
return;
|
|
56
|
+
return articleRectObserver.on('scroll', () => {
|
|
57
|
+
const scroll = articleRectObserver.scroll;
|
|
58
|
+
const newValue = animatorGetterRef.current(animator, scroll, paramValue);
|
|
59
|
+
if (!(0, lodash_isequal_1.default)(newValue, adjustedValueRef.current)) {
|
|
60
|
+
setAdjustedValue(newValue);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}, [animator, articleRectObserver]);
|
|
64
|
+
return adjustedValue;
|
|
65
|
+
};
|
|
66
|
+
exports.useKeyframeValue = useKeyframeValue;
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Article = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
5
6
|
const Section_1 = require("./Section");
|
|
6
7
|
const Item_1 = require("./Item");
|
|
8
|
+
const useArticleRectObserver_1 = require("../utils/ArticleRectManager/useArticleRectObserver");
|
|
9
|
+
const ArticleRectContext_1 = require("../provider/ArticleRectContext");
|
|
7
10
|
const Article = ({ article }) => {
|
|
8
|
-
|
|
11
|
+
const articleRef = (0, react_1.useRef)(null);
|
|
12
|
+
const articleRectObserver = (0, useArticleRectObserver_1.useArticleRectObserver)(articleRef.current);
|
|
13
|
+
return ((0, jsx_runtime_1.jsxs)(ArticleRectContext_1.ArticleRectContext.Provider, { value: articleRectObserver, children: [(0, jsx_runtime_1.jsx)("div", { className: "article", ref: articleRef, children: article.sections.map((section, i) => ((0, jsx_runtime_1.jsx)(Section_1.Section, { section: section, children: article.sections[i].items.map(item => ((0, jsx_runtime_1.jsx)(Item_1.Item, { item: item }, item.id))) }, section.id))) }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
9
14
|
.article {
|
|
10
15
|
position: relative;
|
|
11
16
|
overflow: hidden;
|
package/lib/components/Item.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Item = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
5
6
|
const sdk_1 = require("@cntrl-site/sdk");
|
|
6
7
|
const RectangleItem_1 = require("./items/RectangleItem");
|
|
7
8
|
const ImageItem_1 = require("./items/ImageItem");
|
|
@@ -11,6 +12,9 @@ const VimeoEmbed_1 = require("./items/VimeoEmbed");
|
|
|
11
12
|
const YoutubeEmbed_1 = require("./items/YoutubeEmbed");
|
|
12
13
|
const CustomItem_1 = require("./items/CustomItem");
|
|
13
14
|
const useCntrlContext_1 = require("../provider/useCntrlContext");
|
|
15
|
+
const useItemAngle_1 = require("./useItemAngle");
|
|
16
|
+
const useItemPosition_1 = require("./useItemPosition");
|
|
17
|
+
const useItemDimensions_1 = require("./useItemDimensions");
|
|
14
18
|
const itemsMap = {
|
|
15
19
|
[sdk_1.ArticleItemType.Rectangle]: RectangleItem_1.RectangleItem,
|
|
16
20
|
[sdk_1.ArticleItemType.Image]: ImageItem_1.ImageItem,
|
|
@@ -23,17 +27,32 @@ const itemsMap = {
|
|
|
23
27
|
const noop = () => null;
|
|
24
28
|
const Item = ({ item }) => {
|
|
25
29
|
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
30
|
+
const angle = (0, useItemAngle_1.useItemAngle)(item);
|
|
31
|
+
const { top, left } = (0, useItemPosition_1.useItemPosition)(item);
|
|
32
|
+
const { width, height } = (0, useItemDimensions_1.useItemDimensions)(item);
|
|
26
33
|
const layoutValues = [item.area];
|
|
34
|
+
const isInitialRef = (0, react_1.useRef)(true);
|
|
27
35
|
if (item.layoutParams) {
|
|
28
36
|
layoutValues.push(item.layoutParams);
|
|
29
37
|
}
|
|
30
38
|
const sizingAxis = parseSizing(item.commonParams.sizing);
|
|
31
39
|
const ItemComponent = itemsMap[item.type] || noop;
|
|
32
|
-
|
|
40
|
+
(0, react_1.useEffect)(() => {
|
|
41
|
+
isInitialRef.current = false;
|
|
42
|
+
}, []);
|
|
43
|
+
const styles = {
|
|
44
|
+
transform: `rotate(${angle}deg)`,
|
|
45
|
+
left: `${left * 100}vw`,
|
|
46
|
+
width: `${sizingAxis.x === sdk_1.ArticleItemSizingType.Manual ? `${width * 100}vw` : 'max-content'}`,
|
|
47
|
+
height: `${sizingAxis.y === sdk_1.ArticleItemSizingType.Manual ? `${height * 100}vw` : 'unset'}`,
|
|
48
|
+
top
|
|
49
|
+
};
|
|
50
|
+
return ((0, jsx_runtime_1.jsxs)("div", { suppressHydrationWarning: true, className: `item-${item.id}`, style: isInitialRef.current ? {} : styles, children: [(0, jsx_runtime_1.jsx)(ItemComponent, { item: item }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
33
51
|
${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area]) => (`
|
|
34
52
|
.item-${item.id} {
|
|
35
53
|
position: absolute;
|
|
36
|
-
|
|
54
|
+
z-index: ${area.zIndex};
|
|
55
|
+
top: ${(0, useItemPosition_1.getItemTopStyle)(area.top, area.anchorSide)};
|
|
37
56
|
left: ${area.left * 100}vw;
|
|
38
57
|
width: ${sizingAxis.x === sdk_1.ArticleItemSizingType.Manual ? `${area.width * 100}vw` : 'max-content'};
|
|
39
58
|
height: ${sizingAxis.y === sdk_1.ArticleItemSizingType.Manual ? `${area.height * 100}vw` : 'unset'};
|
|
@@ -44,19 +63,6 @@ const Item = ({ item }) => {
|
|
|
44
63
|
` })] }));
|
|
45
64
|
};
|
|
46
65
|
exports.Item = Item;
|
|
47
|
-
function getItemTopStyle(top, anchorSide) {
|
|
48
|
-
const defaultValue = `${top * 100}vw`;
|
|
49
|
-
if (!anchorSide)
|
|
50
|
-
return defaultValue;
|
|
51
|
-
switch (anchorSide) {
|
|
52
|
-
case sdk_1.AnchorSide.Top:
|
|
53
|
-
return defaultValue;
|
|
54
|
-
case sdk_1.AnchorSide.Center:
|
|
55
|
-
return `calc(50% + ${top * 100}vw)`;
|
|
56
|
-
case sdk_1.AnchorSide.Bottom:
|
|
57
|
-
return `calc(100% + ${top * 100}vw)`;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
66
|
function parseSizing(sizing) {
|
|
61
67
|
const axisSizing = sizing.split(' ');
|
|
62
68
|
return {
|
package/lib/components/Page.js
CHANGED
|
@@ -5,15 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Page = void 0;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
8
9
|
const html_react_parser_1 = __importDefault(require("html-react-parser"));
|
|
9
10
|
const Article_1 = require("./Article");
|
|
11
|
+
const KeyframesContext_1 = require("../provider/KeyframesContext");
|
|
10
12
|
const Head_1 = require("./Head");
|
|
11
13
|
const useCntrlContext_1 = require("../provider/useCntrlContext");
|
|
12
14
|
const generateTypePresetStyles_1 = require("../utils/generateTypePresetStyles/generateTypePresetStyles");
|
|
13
|
-
const
|
|
15
|
+
const Keyframes_1 = require("../provider/Keyframes");
|
|
16
|
+
const Page = ({ article, project, meta, keyframes }) => {
|
|
14
17
|
const afterBodyOpen = (0, html_react_parser_1.default)(project.html.afterBodyOpen);
|
|
15
18
|
const beforeBodyClose = (0, html_react_parser_1.default)(project.html.beforeBodyClose);
|
|
19
|
+
const keyframesRepo = (0, react_1.useMemo)(() => new Keyframes_1.Keyframes(keyframes), [keyframes]);
|
|
16
20
|
const { typePresets, layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
17
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Head_1.CNTRLHead, { project: project, meta: meta }), afterBodyOpen, (0, jsx_runtime_1.jsx)(Article_1.Article, { article: article }), beforeBodyClose, typePresets && typePresets.presets.length > 0 && ((0, jsx_runtime_1.jsx)("style", { children: (0, generateTypePresetStyles_1.generateTypePresetStyles)(typePresets, layouts) }))] }));
|
|
21
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Head_1.CNTRLHead, { project: project, meta: meta }), afterBodyOpen, (0, jsx_runtime_1.jsx)(KeyframesContext_1.KeyframesContext.Provider, { value: keyframesRepo, children: (0, jsx_runtime_1.jsx)(Article_1.Article, { article: article }) }), beforeBodyClose, typePresets && typePresets.presets.length > 0 && ((0, jsx_runtime_1.jsx)("style", { children: (0, generateTypePresetStyles_1.generateTypePresetStyles)(typePresets, layouts) }))] }));
|
|
18
22
|
};
|
|
19
23
|
exports.Page = Page;
|
|
@@ -5,10 +5,15 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const sdk_1 = require("@cntrl-site/sdk");
|
|
6
6
|
const LinkWrapper_1 = require("../LinkWrapper");
|
|
7
7
|
const useCntrlContext_1 = require("../../provider/useCntrlContext");
|
|
8
|
+
const useFileItem_1 = require("./useFileItem");
|
|
8
9
|
const ImageItem = ({ item }) => {
|
|
9
10
|
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const { radius, strokeWidth } = (0, useFileItem_1.useFileItem)(item);
|
|
12
|
+
return ((0, jsx_runtime_1.jsx)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: `image-wrapper-${item.id}`, style: {
|
|
13
|
+
borderRadius: `${radius * 100}vw`,
|
|
14
|
+
borderWidth: `${strokeWidth * 100}vw`
|
|
15
|
+
}, children: (0, jsx_runtime_1.jsx)("img", { className: "image", src: item.commonParams.url }) }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
16
|
+
${(0, sdk_1.getLayoutStyles)(layouts, [item.layoutParams], ([{ strokeColor, opacity }]) => (`
|
|
12
17
|
.image-wrapper-${item.id} {
|
|
13
18
|
position: absolute;
|
|
14
19
|
overflow: hidden;
|
|
@@ -17,9 +22,7 @@ const ImageItem = ({ item }) => {
|
|
|
17
22
|
border-style: solid;
|
|
18
23
|
box-sizing: border-box;
|
|
19
24
|
border-color: ${strokeColor};
|
|
20
|
-
border-radius: ${radius * 100}vw;
|
|
21
25
|
opacity: ${opacity};
|
|
22
|
-
border-width: ${strokeWidth * 100}vw;
|
|
23
26
|
}`))}
|
|
24
27
|
.image {
|
|
25
28
|
width: 100%;
|
|
@@ -5,10 +5,16 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const sdk_1 = require("@cntrl-site/sdk");
|
|
6
6
|
const LinkWrapper_1 = require("../LinkWrapper");
|
|
7
7
|
const useCntrlContext_1 = require("../../provider/useCntrlContext");
|
|
8
|
+
const useRectangleItem_1 = require("./useRectangleItem");
|
|
8
9
|
const RectangleItem = ({ item }) => {
|
|
9
10
|
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const { fillColor, radius, strokeWidth } = (0, useRectangleItem_1.useRectangleItem)(item);
|
|
12
|
+
return ((0, jsx_runtime_1.jsx)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: `rectangle-${item.id}`, style: {
|
|
13
|
+
backgroundColor: `${fillColor}`,
|
|
14
|
+
borderRadius: `${radius * 100}vw`,
|
|
15
|
+
borderWidth: `${strokeWidth * 100}vw`
|
|
16
|
+
} }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
17
|
+
${(0, sdk_1.getLayoutStyles)(layouts, [item.layoutParams], ([{ strokeColor }]) => (`
|
|
12
18
|
.rectangle-${item.id} {
|
|
13
19
|
position: absolute;
|
|
14
20
|
width: 100%;
|
|
@@ -16,9 +22,6 @@ const RectangleItem = ({ item }) => {
|
|
|
16
22
|
border-style: solid;
|
|
17
23
|
box-sizing: border-box;
|
|
18
24
|
border-color: ${strokeColor};
|
|
19
|
-
background-color: ${fillColor};
|
|
20
|
-
border-radius: ${radius * 100}vw;
|
|
21
|
-
border-width: ${strokeWidth * 100}vw;
|
|
22
25
|
}`))}
|
|
23
26
|
` })] }) }));
|
|
24
27
|
};
|
|
@@ -5,10 +5,15 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const LinkWrapper_1 = require("../LinkWrapper");
|
|
6
6
|
const sdk_1 = require("@cntrl-site/sdk");
|
|
7
7
|
const useCntrlContext_1 = require("../../provider/useCntrlContext");
|
|
8
|
+
const useFileItem_1 = require("./useFileItem");
|
|
8
9
|
const VideoItem = ({ item }) => {
|
|
9
10
|
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const { radius, strokeWidth } = (0, useFileItem_1.useFileItem)(item);
|
|
12
|
+
return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: [(0, jsx_runtime_1.jsx)("div", { className: `video-wrapper-${item.id}`, style: {
|
|
13
|
+
borderRadius: `${radius * 100}vw`,
|
|
14
|
+
borderWidth: `${strokeWidth * 100}vw`
|
|
15
|
+
}, children: (0, jsx_runtime_1.jsx)("video", { autoPlay: true, muted: true, loop: true, playsInline: true, className: "video", children: (0, jsx_runtime_1.jsx)("source", { src: item.commonParams.url }) }) }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
16
|
+
${(0, sdk_1.getLayoutStyles)(layouts, [item.layoutParams], ([{ strokeColor, opacity }]) => (`
|
|
12
17
|
.video-wrapper-${item.id} {
|
|
13
18
|
position: absolute;
|
|
14
19
|
overflow: hidden;
|
|
@@ -17,8 +22,6 @@ const VideoItem = ({ item }) => {
|
|
|
17
22
|
border-style: solid;
|
|
18
23
|
box-sizing: border-box;
|
|
19
24
|
border-color: ${strokeColor};
|
|
20
|
-
border-radius: ${radius * 100}vw;
|
|
21
|
-
border-width: ${strokeWidth * 100}vw;
|
|
22
25
|
opacity: ${opacity};
|
|
23
26
|
}`))}
|
|
24
27
|
.video {
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VimeoEmbedItem = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const sdk_1 = require("@cntrl-site/sdk");
|
|
6
5
|
const LinkWrapper_1 = require("../LinkWrapper");
|
|
7
|
-
const
|
|
6
|
+
const useEmbedVideoItem_1 = require("./useEmbedVideoItem");
|
|
8
7
|
const VimeoEmbedItem = ({ item }) => {
|
|
9
|
-
const {
|
|
8
|
+
const { radius } = (0, useEmbedVideoItem_1.useEmbedVideoItem)(item);
|
|
10
9
|
const { autoplay, controls, loop, muted, pictureInPicture, url } = item.commonParams;
|
|
11
10
|
const getValidVimeoUrl = (url) => {
|
|
12
11
|
const validURL = new URL(url);
|
|
@@ -22,18 +21,18 @@ const VimeoEmbedItem = ({ item }) => {
|
|
|
22
21
|
return validURL.href;
|
|
23
22
|
};
|
|
24
23
|
const validUrl = getValidVimeoUrl(url);
|
|
25
|
-
return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-video-wrapper-${item.id}`,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-video-wrapper-${item.id}`, style: {
|
|
25
|
+
borderRadius: `${radius * 100}vw`
|
|
26
|
+
}, children: (0, jsx_runtime_1.jsx)("iframe", { className: "embedVideo", src: validUrl || '', allow: "autoplay; fullscreen; picture-in-picture;", allowFullScreen: true }) }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
27
|
+
.embed-video-wrapper-${item.id} {
|
|
28
|
+
position: absolute;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
width: 100%;
|
|
31
|
+
height: 100%;
|
|
32
|
+
top: 50%;
|
|
33
|
+
left: 50%;
|
|
34
|
+
transform: translate(-50%, -50%);
|
|
35
|
+
}
|
|
37
36
|
.embedVideo {
|
|
38
37
|
width: 100%;
|
|
39
38
|
height: 100%;
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.YoutubeEmbedItem = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const sdk_1 = require("@cntrl-site/sdk");
|
|
6
5
|
const LinkWrapper_1 = require("../LinkWrapper");
|
|
7
6
|
const getValidYoutubeUrl_1 = require("../../utils/getValidYoutubeUrl");
|
|
8
|
-
const
|
|
7
|
+
const useEmbedVideoItem_1 = require("./useEmbedVideoItem");
|
|
9
8
|
const YoutubeEmbedItem = ({ item }) => {
|
|
10
|
-
const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
|
|
11
9
|
const { autoplay, controls, url } = item.commonParams;
|
|
10
|
+
const { radius } = (0, useEmbedVideoItem_1.useEmbedVideoItem)(item);
|
|
12
11
|
const getValidYoutubeUrl = (url) => {
|
|
13
12
|
const newUrl = new URL(url);
|
|
14
13
|
const id = (0, getValidYoutubeUrl_1.getYoutubeId)(newUrl);
|
|
@@ -19,18 +18,18 @@ const YoutubeEmbedItem = ({ item }) => {
|
|
|
19
18
|
return validUrl.href;
|
|
20
19
|
};
|
|
21
20
|
const validUrl = getValidYoutubeUrl(url);
|
|
22
|
-
return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-youtube-video-wrapper-${item.id}`,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
return ((0, jsx_runtime_1.jsxs)(LinkWrapper_1.LinkWrapper, { url: item.link?.url, children: [(0, jsx_runtime_1.jsx)("div", { className: `embed-youtube-video-wrapper-${item.id}`, style: {
|
|
22
|
+
borderRadius: `${radius * 100}vw`
|
|
23
|
+
}, children: (0, jsx_runtime_1.jsx)("iframe", { className: "embedYoutubeVideo", src: validUrl || '', allow: "accelerometer; autoplay; allowfullscreen;", allowFullScreen: true }) }), (0, jsx_runtime_1.jsx)("style", { jsx: true, children: `
|
|
24
|
+
.embed-youtube-video-wrapper-${item.id} {
|
|
25
|
+
position: absolute;
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
width: 100%;
|
|
28
|
+
height: 100%;
|
|
29
|
+
top: 50%;
|
|
30
|
+
left: 50%;
|
|
31
|
+
transform: translate(-50%, -50%);
|
|
32
|
+
}
|
|
34
33
|
.embedYoutubeVideo {
|
|
35
34
|
width: 100%;
|
|
36
35
|
height: 100%;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useEmbedVideoItem = void 0;
|
|
4
|
+
const useCurrentLayout_1 = require("../../common/useCurrentLayout");
|
|
5
|
+
const useKeyframeValue_1 = require("../../common/useKeyframeValue");
|
|
6
|
+
const useEmbedVideoItem = (item) => {
|
|
7
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
8
|
+
const radius = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
9
|
+
if (!layoutId)
|
|
10
|
+
return 0;
|
|
11
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
12
|
+
return 'radius' in layoutParams ? layoutParams.radius : 0;
|
|
13
|
+
}, (animator, scroll, value) => animator.getRadius({ radius: value }, scroll).radius, [layoutId]);
|
|
14
|
+
return { radius };
|
|
15
|
+
};
|
|
16
|
+
exports.useEmbedVideoItem = useEmbedVideoItem;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useFileItem = void 0;
|
|
4
|
+
const useKeyframeValue_1 = require("../../common/useKeyframeValue");
|
|
5
|
+
const useCurrentLayout_1 = require("../../common/useCurrentLayout");
|
|
6
|
+
const useFileItem = (item) => {
|
|
7
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
8
|
+
const radius = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
9
|
+
if (!layoutId)
|
|
10
|
+
return 0;
|
|
11
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
12
|
+
return 'radius' in layoutParams ? layoutParams.radius : 0;
|
|
13
|
+
}, (animator, scroll, value) => animator.getRadius({ radius: value }, scroll).radius, [layoutId]);
|
|
14
|
+
const strokeWidth = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
15
|
+
if (!layoutId)
|
|
16
|
+
return 0;
|
|
17
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
18
|
+
return 'strokeWidth' in layoutParams ? layoutParams.strokeWidth : 0;
|
|
19
|
+
}, (animator, scroll, value) => animator.getBorderWidth({ borderWidth: value }, scroll).borderWidth, [layoutId]);
|
|
20
|
+
return { radius, strokeWidth };
|
|
21
|
+
};
|
|
22
|
+
exports.useFileItem = useFileItem;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useRectangleItem = void 0;
|
|
4
|
+
const useKeyframeValue_1 = require("../../common/useKeyframeValue");
|
|
5
|
+
const useCurrentLayout_1 = require("../../common/useCurrentLayout");
|
|
6
|
+
const defaultColor = 'rgba(0, 0, 0, 1)';
|
|
7
|
+
const useRectangleItem = (item) => {
|
|
8
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
9
|
+
const radius = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
10
|
+
if (!layoutId)
|
|
11
|
+
return 0;
|
|
12
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
13
|
+
return 'radius' in layoutParams ? layoutParams.radius : 0;
|
|
14
|
+
}, (animator, scroll, value) => animator.getRadius({ radius: value }, scroll).radius, [layoutId]);
|
|
15
|
+
const strokeWidth = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
16
|
+
if (!layoutId)
|
|
17
|
+
return 0;
|
|
18
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
19
|
+
return 'strokeWidth' in layoutParams ? layoutParams.strokeWidth : 0;
|
|
20
|
+
}, (animator, scroll, value) => animator.getBorderWidth({ borderWidth: value }, scroll).borderWidth, [layoutId]);
|
|
21
|
+
const fillColor = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => {
|
|
22
|
+
if (!layoutId)
|
|
23
|
+
return defaultColor;
|
|
24
|
+
const layoutParams = item.layoutParams[layoutId];
|
|
25
|
+
return 'fillColor' in layoutParams ? layoutParams.fillColor : defaultColor;
|
|
26
|
+
}, (animator, scroll, value) => animator.getColor({ color: value }, scroll).color);
|
|
27
|
+
return { fillColor, strokeWidth, radius };
|
|
28
|
+
};
|
|
29
|
+
exports.useRectangleItem = useRectangleItem;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useItemAngle = void 0;
|
|
4
|
+
const useKeyframeValue_1 = require("../common/useKeyframeValue");
|
|
5
|
+
const useItemAngle = (item) => {
|
|
6
|
+
const { angle } = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => ({ angle: layoutId ? item.area[layoutId].angle : 0 }), (animator, scroll, value) => animator.getRotation(value, scroll));
|
|
7
|
+
return angle;
|
|
8
|
+
};
|
|
9
|
+
exports.useItemAngle = useItemAngle;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useItemDimensions = void 0;
|
|
4
|
+
const useCurrentLayout_1 = require("../common/useCurrentLayout");
|
|
5
|
+
const useKeyframeValue_1 = require("../common/useKeyframeValue");
|
|
6
|
+
const defaultArea = {
|
|
7
|
+
left: 0,
|
|
8
|
+
top: 0,
|
|
9
|
+
width: 0,
|
|
10
|
+
height: 0,
|
|
11
|
+
angle: 0,
|
|
12
|
+
zIndex: 0
|
|
13
|
+
};
|
|
14
|
+
const useItemDimensions = (item) => {
|
|
15
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
16
|
+
const { width, height } = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => layoutId ? item.area[layoutId] : defaultArea, (animator, scroll, value) => animator.getDimensions(value, scroll), [layoutId]);
|
|
17
|
+
return { width, height };
|
|
18
|
+
};
|
|
19
|
+
exports.useItemDimensions = useItemDimensions;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getItemTopStyle = exports.useItemPosition = void 0;
|
|
4
|
+
const sdk_1 = require("@cntrl-site/sdk");
|
|
5
|
+
const useKeyframeValue_1 = require("../common/useKeyframeValue");
|
|
6
|
+
const useCurrentLayout_1 = require("../common/useCurrentLayout");
|
|
7
|
+
const defaultArea = {
|
|
8
|
+
left: 0,
|
|
9
|
+
top: 0,
|
|
10
|
+
width: 0,
|
|
11
|
+
height: 0,
|
|
12
|
+
angle: 0,
|
|
13
|
+
zIndex: 0
|
|
14
|
+
};
|
|
15
|
+
const useItemPosition = (item) => {
|
|
16
|
+
const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
|
|
17
|
+
const { top, left } = (0, useKeyframeValue_1.useKeyframeValue)(item, (item, layoutId) => item.area[layoutId], (animator, scroll, value) => animator.getPositions(value, scroll), [layoutId]);
|
|
18
|
+
return { top: getItemTopStyle(top, layoutId ? item.area[layoutId].anchorSide : sdk_1.AnchorSide.Top), left };
|
|
19
|
+
};
|
|
20
|
+
exports.useItemPosition = useItemPosition;
|
|
21
|
+
function getItemTopStyle(top, anchorSide) {
|
|
22
|
+
const defaultValue = `${top * 100}vw`;
|
|
23
|
+
if (!anchorSide)
|
|
24
|
+
return defaultValue;
|
|
25
|
+
switch (anchorSide) {
|
|
26
|
+
case sdk_1.AnchorSide.Top:
|
|
27
|
+
return defaultValue;
|
|
28
|
+
case sdk_1.AnchorSide.Center:
|
|
29
|
+
return `calc(50% + ${top * 100}vw)`;
|
|
30
|
+
case sdk_1.AnchorSide.Bottom:
|
|
31
|
+
return `calc(100% + ${top * 100}vw)`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.getItemTopStyle = getItemTopStyle;
|
|
@@ -4,13 +4,19 @@ exports.CntrlSdkContext = void 0;
|
|
|
4
4
|
class CntrlSdkContext {
|
|
5
5
|
constructor(customItems) {
|
|
6
6
|
this.customItems = customItems;
|
|
7
|
-
this.
|
|
7
|
+
this._layouts = [];
|
|
8
8
|
}
|
|
9
9
|
setTypePresets(typePresets) {
|
|
10
|
-
this.
|
|
10
|
+
this._typePresets = typePresets;
|
|
11
11
|
}
|
|
12
12
|
setLayouts(layouts) {
|
|
13
|
-
this.
|
|
13
|
+
this._layouts = layouts;
|
|
14
|
+
}
|
|
15
|
+
get layouts() {
|
|
16
|
+
return this._layouts;
|
|
17
|
+
}
|
|
18
|
+
get typePresets() {
|
|
19
|
+
return this._typePresets;
|
|
14
20
|
}
|
|
15
21
|
}
|
|
16
22
|
exports.CntrlSdkContext = CntrlSdkContext;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Keyframes = void 0;
|
|
4
|
+
class Keyframes {
|
|
5
|
+
constructor(keyframes = []) {
|
|
6
|
+
this.keyframes = keyframes;
|
|
7
|
+
}
|
|
8
|
+
getItemKeyframes(itemId) {
|
|
9
|
+
return this.keyframes.filter(kf => kf.itemId === itemId);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.Keyframes = Keyframes;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeyframesContext = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const Keyframes_1 = require("./Keyframes");
|
|
6
|
+
exports.KeyframesContext = (0, react_1.createContext)(new Keyframes_1.Keyframes());
|