@cntrl-site/sdk-nextjs 1.8.40 → 1.9.1

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 (134) 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.8.40.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 +85 -58
  19. package/lib/components/items/FileItem/VideoItem.js +107 -80
  20. package/lib/components/items/FileItem/useFileItem.js +12 -5
  21. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  22. package/lib/components/items/Item.js +30 -30
  23. package/lib/components/items/RectangleItem/RectangleItem.js +92 -36
  24. package/lib/components/items/RectangleItem/useRectangleItem.js +15 -8
  25. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  26. package/lib/interactions/CSSPropertyNameMap.js +18 -18
  27. package/lib/utils/Animator/Animator.js +171 -19
  28. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  29. package/lib/utils/areFillsVisible/areFillsVisible.js +23 -0
  30. package/lib/utils/getFill.js +43 -0
  31. package/package.json +58 -57
  32. package/src/common/useCurrentLayout.ts +52 -52
  33. package/src/common/useExemplary.ts +9 -9
  34. package/src/common/useItemFXData.ts +47 -47
  35. package/src/common/useKeyframeValue.ts +85 -85
  36. package/src/common/useRegisterResize.ts +16 -16
  37. package/src/components/Article.tsx +73 -73
  38. package/src/components/ArticleWrapper.tsx +21 -21
  39. package/src/components/Head.tsx +56 -56
  40. package/src/components/LayoutStyle.tsx +21 -21
  41. package/src/components/Page.tsx +33 -33
  42. package/src/components/ScrollPlaybackVideo.tsx +56 -56
  43. package/src/components/Section/Section.tsx +127 -127
  44. package/src/components/Section/SectionImage.tsx +48 -48
  45. package/src/components/Section/SectionVideo.tsx +144 -144
  46. package/src/components/Section/useSectionColor.ts +19 -19
  47. package/src/components/Section/useSectionHeightMap.ts +19 -19
  48. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +145 -145
  49. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  50. package/src/components/items/ComponentItem/ComponentItem.tsx +67 -67
  51. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  52. package/src/components/items/CompoundItem/CompoundChild.tsx +150 -150
  53. package/src/components/items/CompoundItem/CompoundItem.tsx +70 -70
  54. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  55. package/src/components/items/CustomItem/CustomItem.tsx +48 -48
  56. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +206 -206
  57. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +193 -193
  58. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  59. package/src/components/items/FileItem/ImageItem.tsx +211 -158
  60. package/src/components/items/FileItem/VideoItem.tsx +328 -275
  61. package/src/components/items/FileItem/useFileItem.ts +81 -73
  62. package/src/components/items/GroupItem/GroupItem.tsx +81 -81
  63. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  64. package/src/components/items/Item.tsx +251 -251
  65. package/src/components/items/LinkWrapper.tsx +39 -39
  66. package/src/components/items/RectangleItem/RectangleItem.tsx +199 -97
  67. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -82
  68. package/src/components/items/RichTextItem/RichTextItem.tsx +107 -107
  69. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  70. package/src/components/items/RichTextWrapper.tsx +15 -15
  71. package/src/components/items/itemsMap.ts +28 -28
  72. package/src/components/items/useDraggable.ts +252 -252
  73. package/src/components/items/useItemAngle.ts +13 -13
  74. package/src/components/items/useItemArea.ts +35 -35
  75. package/src/components/items/useItemPointerEvents.ts +23 -23
  76. package/src/components/items/useItemScale.ts +17 -17
  77. package/src/components/items/useItemTriggers.ts +15 -15
  78. package/src/components/items/useRichTextItemValues.ts +65 -65
  79. package/src/components/items/useSizing.ts +25 -25
  80. package/src/components/items/useStickyItemTop.ts +21 -21
  81. package/src/components/useLayoutContext.ts +7 -7
  82. package/src/index.ts +24 -24
  83. package/src/interactions/CSSPropertyNameMap.ts +37 -38
  84. package/src/interactions/InteractionsRegistry.ts +380 -380
  85. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  86. package/src/interactions/getTransition.ts +27 -27
  87. package/src/interactions/types.ts +36 -36
  88. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  89. package/src/provider/ArticleRectContext.ts +4 -4
  90. package/src/provider/CntrlContext.ts +5 -5
  91. package/src/provider/CntrlProvider.tsx +11 -11
  92. package/src/provider/CntrlSdkContext.ts +83 -83
  93. package/src/provider/CustomItemRegistry.ts +14 -14
  94. package/src/provider/CustomItemTypes.ts +3 -3
  95. package/src/provider/CustomSectionRegistry.ts +25 -25
  96. package/src/provider/InteractionsContext.tsx +59 -59
  97. package/src/provider/Keyframes.ts +11 -11
  98. package/src/provider/KeyframesContext.ts +5 -5
  99. package/src/provider/LayoutContext.ts +3 -3
  100. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  101. package/src/provider/defaultContext.ts +8 -8
  102. package/src/provider/useCntrlContext.ts +8 -8
  103. package/src/styled-jsx.d.ts +1 -1
  104. package/src/utils/Animator/Animator.ts +571 -371
  105. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  106. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  107. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  108. package/src/utils/EventEmitter.ts +41 -41
  109. package/src/utils/RichTextConverter/RichTextConverter.tsx +326 -326
  110. package/src/utils/ScaleAnchorMap.ts +13 -13
  111. package/src/utils/StickyManager/StickyManager.ts +23 -23
  112. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  113. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  114. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  115. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -0
  116. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -0
  117. package/src/utils/binSearchInsertAt.ts +33 -33
  118. package/src/utils/castObject.ts +10 -10
  119. package/src/utils/checkOverflowClipSupport.ts +13 -13
  120. package/src/utils/effects/useImageFx.ts +156 -156
  121. package/src/utils/effects/useVideoFx.ts +158 -158
  122. package/src/utils/getAnchoredItemTop.ts +12 -12
  123. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  124. package/src/utils/getFill.ts +46 -0
  125. package/src/utils/getFontFamilyValue.ts +3 -3
  126. package/src/utils/getInvertedRanges.ts +43 -43
  127. package/src/utils/getItemTopStyle.ts +14 -14
  128. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  129. package/src/utils/getValidYoutubeUrl.ts +29 -29
  130. package/src/utils/isItemType.ts +5 -5
  131. package/src/utils/rangeMap.ts +13 -13
  132. package/src/utils/useElementRect.ts +23 -23
  133. package/src/provider/InteractionsContext.old.tsx +0 -66
  134. package/src/provider/InteractionsContext.test.tsx +0 -97
@@ -28,9 +28,9 @@ const useSizing_1 = require("./useSizing");
28
28
  const useItemPointerEvents_1 = require("./useItemPointerEvents");
29
29
  const useItemArea_1 = require("./useItemArea");
30
30
  const useDraggable_1 = require("./useDraggable");
31
- const stickyFix = `
32
- -webkit-transform: translate3d(0, 0, 0);
33
- transform: translate3d(0, 0, 0);
31
+ const stickyFix = `
32
+ -webkit-transform: translate3d(0, 0, 0);
33
+ transform: translate3d(0, 0, 0);
34
34
  `;
35
35
  const noop = () => null;
36
36
  const Item = ({ item, sectionId, articleHeight, isParentVisible = true, isInGroup = false }) => {
@@ -134,40 +134,40 @@ const Item = ({ item, sectionId, articleHeight, isParentVisible = true, isInGrou
134
134
  ? 'grab'
135
135
  : hasClickTriggers
136
136
  ? 'pointer'
137
- : 'unset', pointerEvents: allowPointerEvents ? 'auto' : 'none', userSelect: isDraggable ? 'none' : 'unset', WebkitUserSelect: isDraggable ? 'none' : 'unset', MozUserSelect: isDraggable ? 'none' : 'unset', msUserSelect: isDraggable ? 'none' : 'unset' }) }, triggers, { children: (0, jsx_runtime_1.jsx)(ItemComponent, { item: item, sectionId: sectionId, onResize: handleItemResize, articleHeight: articleHeight, interactionCtrl: interactionCtrl, onVisibilityChange: handleVisibilityChange }) })) }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
137
+ : 'unset', pointerEvents: allowPointerEvents ? 'auto' : 'none', userSelect: isDraggable ? 'none' : 'unset', WebkitUserSelect: isDraggable ? 'none' : 'unset', MozUserSelect: isDraggable ? 'none' : 'unset', msUserSelect: isDraggable ? 'none' : 'unset' }) }, triggers, { children: (0, jsx_runtime_1.jsx)(ItemComponent, { item: item, sectionId: sectionId, onResize: handleItemResize, articleHeight: articleHeight, interactionCtrl: interactionCtrl, onVisibilityChange: handleVisibilityChange }) })) }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
138
138
  ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, hidden, sticky, sectionHeight, layoutParams]) => {
139
139
  const sizingAxis = (0, useSizing_1.parseSizing)(layoutParams.sizing);
140
140
  const isScreenBasedBottom = area.positionType === sdk_1.PositionType.ScreenBased && area.anchorSide === sdk_1.AnchorSide.Bottom;
141
141
  const scaleAnchor = area.scaleAnchor;
142
- return (`
143
- .item-${item.id} {
144
- position: ${sticky ? 'sticky' : 'absolute'};
145
- top: ${sticky ? `${(0, getAnchoredItemTop_1.getAnchoredItemTop)(area.top - sticky.from, sectionHeight, area.anchorSide)}` : 0};
146
- transition: opacity 0.2s linear 0.1s;
147
- pointer-events: none;
148
- display: ${hidden ? 'none' : 'block'};
149
- height: fit-content;
150
- }
151
- .item-${item.id}-inner {
142
+ return (`
143
+ .item-${item.id} {
144
+ position: ${sticky ? 'sticky' : 'absolute'};
145
+ top: ${sticky ? `${(0, getAnchoredItemTop_1.getAnchoredItemTop)(area.top - sticky.from, sectionHeight, area.anchorSide)}` : 0};
146
+ transition: opacity 0.2s linear 0.1s;
147
+ pointer-events: none;
148
+ display: ${hidden ? 'none' : 'block'};
149
+ height: fit-content;
150
+ }
151
+ .item-${item.id}-inner {
152
152
  width: ${sizingAxis.x === 'manual'
153
153
  ? `${area.width * 100}vw`
154
- : 'max-content'};
155
- height: ${sizingAxis.y === 'manual' ? `${area.height * 100}vw` : 'unset'};
156
- transform-origin: ${ScaleAnchorMap_1.ScaleAnchorMap[scaleAnchor]};
157
- transform: scale(${area.scale});
158
- position: relative;
159
- }
160
- .item-wrapper-${item.id} {
161
- position: ${area.positionType === sdk_1.PositionType.ScreenBased ? 'fixed' : 'absolute'};
162
- z-index: ${area.zIndex};
163
- ${!isInGroup && stickyFix}
164
- pointer-events: none;
165
- bottom: ${isScreenBasedBottom ? `${-area.top * 100}vw` : 'unset'};
166
- top: ${isScreenBasedBottom ? 'unset' : (0, getItemTopStyle_1.getItemTopStyle)(area.top, area.anchorSide)};
167
- left: ${area.left * 100}vw;
168
- }
154
+ : 'max-content'};
155
+ height: ${sizingAxis.y === 'manual' ? `${area.height * 100}vw` : 'unset'};
156
+ transform-origin: ${ScaleAnchorMap_1.ScaleAnchorMap[scaleAnchor]};
157
+ transform: scale(${area.scale});
158
+ position: relative;
159
+ }
160
+ .item-wrapper-${item.id} {
161
+ position: ${area.positionType === sdk_1.PositionType.ScreenBased ? 'fixed' : 'absolute'};
162
+ z-index: ${area.zIndex};
163
+ ${!isInGroup && stickyFix}
164
+ pointer-events: none;
165
+ bottom: ${isScreenBasedBottom ? `${-area.top * 100}vw` : 'unset'};
166
+ top: ${isScreenBasedBottom ? 'unset' : (0, getItemTopStyle_1.getItemTopStyle)(area.top, area.anchorSide)};
167
+ left: ${area.left * 100}vw;
168
+ }
169
169
  `);
170
- })}
170
+ })}
171
171
  ` })] }));
172
172
  };
173
173
  exports.Item = Item;
@@ -7,7 +7,6 @@ exports.RectangleItem = void 0;
7
7
  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
- const color_1 = require("@cntrl-site/color");
11
10
  const sdk_1 = require("@cntrl-site/sdk");
12
11
  const LinkWrapper_1 = require("../LinkWrapper");
13
12
  const useRectangleItem_1 = require("./useRectangleItem");
@@ -15,22 +14,22 @@ const useItemAngle_1 = require("../useItemAngle");
15
14
  const useCntrlContext_1 = require("../../../provider/useCntrlContext");
16
15
  const useRegisterResize_1 = require("../../../common/useRegisterResize");
17
16
  const getStyleFromItemStateAndParams_1 = require("../../../utils/getStyleFromItemStateAndParams");
17
+ const getFill_1 = require("../../../utils/getFill");
18
+ const areFillsVisible_1 = require("../../../utils/areFillsVisible/areFillsVisible");
18
19
  const RectangleItem = ({ item, sectionId, onResize, interactionCtrl, onVisibilityChange }) => {
19
- var _a, _b, _c, _d;
20
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
20
21
  const id = (0, react_1.useId)();
21
22
  const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
22
- const { fillColor: itemFillColor, radius: itemRadius, strokeWidth: itemStrokeWidth, strokeColor: itemStrokeColor, blur: itemBlur, backdropBlur: itemBackdropBlur } = (0, useRectangleItem_1.useRectangleItem)(item, sectionId);
23
+ const { fill: itemFill, radius: itemRadius, strokeWidth: itemStrokeWidth, strokeFill: itemStrokeFill, blur: itemBlur, backdropBlur: itemBackdropBlur } = (0, useRectangleItem_1.useRectangleItem)(item, sectionId);
23
24
  const itemAngle = (0, useItemAngle_1.useItemAngle)(item, sectionId);
24
- const stateParams = interactionCtrl === null || interactionCtrl === void 0 ? void 0 : interactionCtrl.getState(['angle', 'fillColor', 'strokeWidth', 'radius', 'strokeColor', 'blur', 'backdropBlur']);
25
- const styles = (_a = stateParams === null || stateParams === void 0 ? void 0 : stateParams.styles) !== null && _a !== void 0 ? _a : {};
26
- const backgroundColor = (0, react_1.useMemo)(() => {
27
- const fillColor = (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(styles === null || styles === void 0 ? void 0 : styles.fillColor, itemFillColor);
28
- return fillColor ? color_1.CntrlColor.parse(fillColor) : undefined;
29
- }, [itemFillColor, styles === null || styles === void 0 ? void 0 : styles.fillColor]);
30
- const borderColor = (0, react_1.useMemo)(() => {
31
- const strokeColor = (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(styles === null || styles === void 0 ? void 0 : styles.strokeColor, itemStrokeColor);
32
- return strokeColor ? color_1.CntrlColor.parse(strokeColor) : undefined;
33
- }, [itemStrokeColor, styles === null || styles === void 0 ? void 0 : styles.strokeColor]);
25
+ const stateParams = interactionCtrl === null || interactionCtrl === void 0 ? void 0 : interactionCtrl.getState(['angle', 'strokeWidth', 'radius', 'blur', 'backdropBlur']);
26
+ const stateFillParams = interactionCtrl === null || interactionCtrl === void 0 ? void 0 : interactionCtrl.getState(['fill']);
27
+ const stateFillLayers = (_a = stateFillParams === null || stateFillParams === void 0 ? void 0 : stateFillParams.styles) === null || _a === void 0 ? void 0 : _a.fill;
28
+ const solidTransition = (_b = stateFillParams === null || stateFillParams === void 0 ? void 0 : stateFillParams.transition) !== null && _b !== void 0 ? _b : 'none';
29
+ const stateStrokeFillParams = interactionCtrl === null || interactionCtrl === void 0 ? void 0 : interactionCtrl.getState(['strokeFill']);
30
+ const stateStrokeFillLayers = (_c = stateStrokeFillParams === null || stateStrokeFillParams === void 0 ? void 0 : stateStrokeFillParams.styles) === null || _c === void 0 ? void 0 : _c.strokeFill;
31
+ const strokeSolidTransition = (_d = stateStrokeFillParams === null || stateStrokeFillParams === void 0 ? void 0 : stateStrokeFillParams.transition) !== null && _d !== void 0 ? _d : 'none';
32
+ const styles = (_e = stateParams === null || stateParams === void 0 ? void 0 : stateParams.styles) !== null && _e !== void 0 ? _e : {};
34
33
  const layoutValues = [item.area, item.layoutParams];
35
34
  const [ref, setRef] = (0, react_1.useState)(null);
36
35
  (0, useRegisterResize_1.useRegisterResize)(ref, onResize);
@@ -40,35 +39,92 @@ const RectangleItem = ({ item, sectionId, onResize, interactionCtrl, onVisibilit
40
39
  const angle = (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(styles === null || styles === void 0 ? void 0 : styles.angle, itemAngle);
41
40
  const blur = (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(styles === null || styles === void 0 ? void 0 : styles.blur, itemBlur);
42
41
  const backdropFilterValue = backdropBlur ? `blur(${backdropBlur * 100}vw)` : undefined;
43
- const isInteractive = (backgroundColor === null || backgroundColor === void 0 ? void 0 : backgroundColor.getAlpha()) !== 0 || (strokeWidth !== 0 && (borderColor === null || borderColor === void 0 ? void 0 : borderColor.getAlpha()) !== 0);
42
+ const isInteractive = (0, areFillsVisible_1.areFillsVisible)((_f = stateFillLayers !== null && stateFillLayers !== void 0 ? stateFillLayers : itemFill) !== null && _f !== void 0 ? _f : []) || (strokeWidth !== 0 && (0, areFillsVisible_1.areFillsVisible)((_g = stateStrokeFillLayers !== null && stateStrokeFillLayers !== void 0 ? stateStrokeFillLayers : itemStrokeFill) !== null && _g !== void 0 ? _g : []));
44
43
  (0, react_1.useEffect)(() => {
45
44
  onVisibilityChange === null || onVisibilityChange === void 0 ? void 0 : onVisibilityChange(isInteractive);
46
45
  }, [isInteractive, onVisibilityChange]);
47
- return ((0, jsx_runtime_1.jsx)(LinkWrapper_1.LinkWrapper, { url: (_b = item.link) === null || _b === void 0 ? void 0 : _b.url, target: (_c = item.link) === null || _c === void 0 ? void 0 : _c.target, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: `rectangle-${item.id}`, ref: setRef, style: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (backgroundColor ? { backgroundColor: `${backgroundColor.fmt('rgba')}` } : {})), (borderColor ? { borderColor: `${borderColor.fmt('rgba')}` } : {})), (radius !== undefined ? { borderRadius: `${radius * 100}vw` } : {})), (strokeWidth !== undefined ? { borderWidth: `${strokeWidth * 100}vw` } : {})), (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset' }), (backdropFilterValue !== undefined
46
+ const strokeValue = stateStrokeFillLayers
47
+ ? (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(stateStrokeFillLayers[0], itemStrokeFill === null || itemStrokeFill === void 0 ? void 0 : itemStrokeFill[0])
48
+ : itemStrokeFill === null || itemStrokeFill === void 0 ? void 0 : itemStrokeFill[0];
49
+ const stroke = strokeValue
50
+ ? (_h = (0, getFill_1.getFill)(strokeValue)) !== null && _h !== void 0 ? _h : 'transparent'
51
+ : 'transparent';
52
+ return ((0, jsx_runtime_1.jsx)(LinkWrapper_1.LinkWrapper, { url: (_j = item.link) === null || _j === void 0 ? void 0 : _j.url, target: (_k = item.link) === null || _k === void 0 ? void 0 : _k.target, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: `rectangle-${item.id}`, ref: setRef, style: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (strokeValue ? Object.assign({ '--stroke-background': stroke }, (strokeValue.type === 'image' ? {
53
+ backgroundPosition: 'center',
54
+ backgroundSize: strokeValue.behavior === 'repeat' ? `${strokeValue.backgroundSize}%` : strokeValue.behavior,
55
+ backgroundRepeat: strokeValue.behavior === 'repeat' ? 'repeat' : 'no-repeat'
56
+ } : {})) : {})), (radius !== undefined ? { borderRadius: `${radius * 100}vw` } : {})), (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset' }), (backdropFilterValue !== undefined
48
57
  ? { backdropFilter: backdropFilterValue, WebkitBackdropFilter: backdropFilterValue }
49
- : {})), { transition: (_d = stateParams === null || stateParams === void 0 ? void 0 : stateParams.transition) !== null && _d !== void 0 ? _d : 'none' }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
50
- .rectangle-${item.id} {
51
- position: absolute;
52
- width: 100%;
53
- height: 100%;
54
- border-style: solid;
55
- box-sizing: border-box;
56
- }
58
+ : {})), { transition: (_l = stateParams === null || stateParams === void 0 ? void 0 : stateParams.transition) !== null && _l !== void 0 ? _l : 'none' }), children: [(0, jsx_runtime_1.jsx)("div", { className: `rectangle-border-${item.id}`, style: Object.assign({ position: 'absolute', inset: 0, borderRadius: 'inherit', pointerEvents: 'none', zIndex: 2, WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)', WebkitMaskComposite: 'xor', maskComposite: 'exclude' }, (strokeWidth !== 0 && strokeValue ? Object.assign(Object.assign(Object.assign({}, (strokeWidth ? { padding: `${strokeWidth * 100}vw` } : {})), (strokeValue.type === 'solid' ? { transition: strokeSolidTransition, background: stroke } : {})), (strokeValue.type === 'image' ? {
59
+ backgroundPosition: 'center',
60
+ backgroundSize: strokeValue.behavior === 'repeat' ? `${strokeValue.backgroundSize}%` : strokeValue.behavior,
61
+ backgroundRepeat: strokeValue.behavior === 'repeat' ? 'repeat' : 'no-repeat'
62
+ } : {
63
+ background: stroke,
64
+ })) : { background: stroke })) }), itemFill && itemFill.map((fill) => {
65
+ var _a, _b;
66
+ const stateFillLayer = stateFillLayers === null || stateFillLayers === void 0 ? void 0 : stateFillLayers.find((layer) => layer.id === fill.id);
67
+ const value = stateFillLayer
68
+ ? ((_a = (0, getStyleFromItemStateAndParams_1.getStyleFromItemStateAndParams)(stateFillLayer, fill)) !== null && _a !== void 0 ? _a : fill)
69
+ : fill;
70
+ const background = value
71
+ ? (_b = (0, getFill_1.getFill)(value)) !== null && _b !== void 0 ? _b : 'transparent'
72
+ : 'transparent';
73
+ return ((0, jsx_runtime_1.jsx)(Fill, { fill: value, itemId: item.id, background: background, solidTransition: solidTransition }));
74
+ })] }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
75
+ .rectangle-${item.id} {
76
+ position: absolute;
77
+ width: 100%;
78
+ height: 100%;
79
+ box-sizing: border-box;
80
+ },
81
+ .image-fill-${item.id} {
82
+ position: absolute;
83
+ top: 0;
84
+ left: 0;
85
+ width: 100%;
86
+ height: 100%;
87
+ transform-origin: center center;
88
+ z-index: 1;
89
+ background-position: center;
90
+ },
57
91
  ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, layoutParams]) => {
58
- return (`
59
- .rectangle-${item.id} {
60
- background-color: ${color_1.CntrlColor.parse(layoutParams.fillColor).fmt('rgba')};
61
- border-color: ${color_1.CntrlColor.parse(layoutParams.strokeColor).fmt('rgba')};
62
- border-radius: ${layoutParams.radius * 100}vw;
63
- border-width: ${layoutParams.strokeWidth * 100}vw;
64
- transform: rotate(${area.angle}deg);
65
- filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
66
- ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
67
- backdrop-filter: ${layoutParams.backdropBlur !== 0 ? `blur(${layoutParams.backdropBlur * 100}vw)` : 'unset'};
68
- -webkit-backdrop-filter: ${layoutParams.backdropBlur !== 0 ? `blur(${layoutParams.backdropBlur * 100}vw)` : 'unset'};
69
- }
92
+ return (`
93
+ .rectangle-${item.id} {
94
+ border-radius: ${layoutParams.radius * 100}vw
95
+ transform: rotate(${area.angle}deg);
96
+ filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
97
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
98
+ backdrop-filter: ${layoutParams.backdropBlur !== 0 ? `blur(${layoutParams.backdropBlur * 100}vw)` : 'unset'};
99
+ -webkit-backdrop-filter: ${layoutParams.backdropBlur !== 0 ? `blur(${layoutParams.backdropBlur * 100}vw)` : 'unset'};
100
+ },
101
+ .rectangle-border-${item.id} {
102
+ position: absolute;
103
+ inset: 0;
104
+ border-radius: inherit;
105
+ pointer-events: none;
106
+ z-index: 2;
107
+ -webkit-mask:
108
+ linear-gradient(#fff 0 0) content-box,
109
+ linear-gradient(#fff 0 0);
110
+ -webkit-mask-composite: xor;
111
+ mask-composite: exclude;
112
+ }
70
113
  `);
71
- })}
114
+ })}
72
115
  ` })] }) }));
73
116
  };
74
117
  exports.RectangleItem = RectangleItem;
118
+ function Fill({ fill, itemId, background, solidTransition }) {
119
+ const isRotatedImage = fill.type === 'image' && fill.rotation && fill.rotation !== 0;
120
+ return ((0, jsx_runtime_1.jsx)("div", { className: fill.type === 'image' ? `image-fill-${itemId}` : `fill-${itemId}`, style: Object.assign(Object.assign(Object.assign(Object.assign({}, (fill.type === 'solid' ? { background, transition: solidTransition } : {})), (fill.type === 'image'
121
+ ? {
122
+ transform: `rotate(${fill.rotation}deg)`,
123
+ backgroundImage: `url(${fill.src})`,
124
+ backgroundSize: fill.behavior === 'repeat' ? `${fill.backgroundSize}%` : fill.behavior,
125
+ backgroundRepeat: fill.behavior === 'repeat' ? 'repeat' : 'no-repeat',
126
+ opacity: fill.opacity
127
+ }
128
+ : { background })), { position: 'absolute', mixBlendMode: fill.blendMode, top: 0, left: 0, width: '100%', height: '100%', pointerEvents: 'none' }), (isRotatedImage ? { overflow: 'hidden' } : {})) }, fill.id));
129
+ }
130
+ ;
@@ -4,7 +4,14 @@ exports.useRectangleItem = void 0;
4
4
  const sdk_1 = require("@cntrl-site/sdk");
5
5
  const useKeyframeValue_1 = require("../../../common/useKeyframeValue");
6
6
  const useLayoutContext_1 = require("../../useLayoutContext");
7
- const defaultColor = 'rgba(0, 0, 0, 1)';
7
+ const defaultFill = [
8
+ {
9
+ id: 'default',
10
+ type: 'solid',
11
+ value: 'rgba(0, 0, 0, 1)',
12
+ blendMode: 'normal'
13
+ }
14
+ ];
8
15
  function useRectangleItem(item, sectionId) {
9
16
  const layoutId = (0, useLayoutContext_1.useLayoutContext)();
10
17
  const radius = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.BorderRadius, (item, layoutId) => {
@@ -19,18 +26,18 @@ function useRectangleItem(item, sectionId) {
19
26
  const layoutParams = item.layoutParams[layoutId];
20
27
  return 'strokeWidth' in layoutParams ? layoutParams.strokeWidth : 0;
21
28
  }, (animator, scroll, value) => value !== undefined ? animator.getBorderWidth({ borderWidth: value }, scroll).borderWidth : undefined, sectionId, [layoutId]);
22
- const fillColor = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.Color, (item, layoutId) => {
29
+ const fill = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.Fill, (item, layoutId) => {
23
30
  if (!layoutId)
24
31
  return;
25
32
  const layoutParams = item.layoutParams[layoutId];
26
- return 'fillColor' in layoutParams ? layoutParams.fillColor : defaultColor;
27
- }, (animator, scroll, value) => value ? animator.getColor({ color: value }, scroll).color : undefined, sectionId, [layoutId]);
28
- const strokeColor = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.BorderColor, (item, layoutId) => {
33
+ return 'fill' in layoutParams ? layoutParams.fill : defaultFill;
34
+ }, (animator, scroll, value) => value ? animator.getFill(value, scroll) : undefined, sectionId, [layoutId]);
35
+ const strokeFill = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.BorderFill, (item, layoutId) => {
29
36
  if (!layoutId)
30
37
  return;
31
38
  const layoutParams = item.layoutParams[layoutId];
32
- return 'strokeColor' in layoutParams ? layoutParams.strokeColor : defaultColor;
33
- }, (animator, scroll, value) => value ? animator.getBorderColor({ color: value }, scroll).color : undefined, sectionId, [layoutId]);
39
+ return 'strokeFill' in layoutParams ? layoutParams.strokeFill : defaultFill;
40
+ }, (animator, scroll, value) => value ? animator.getBorderFill(value, scroll) : undefined, sectionId, [layoutId]);
34
41
  const blur = (0, useKeyframeValue_1.useKeyframeValue)(item, sdk_1.KeyframeType.Blur, (item, layoutId) => {
35
42
  if (!layoutId)
36
43
  return;
@@ -43,6 +50,6 @@ function useRectangleItem(item, sectionId) {
43
50
  const layoutParams = item.layoutParams[layoutId];
44
51
  return 'backdropBlur' in layoutParams ? layoutParams.backdropBlur : 0;
45
52
  }, (animator, scroll, value) => value !== undefined ? animator.getBackdropBlur({ backdropBlur: value }, scroll).backdropBlur : undefined, sectionId, [layoutId]);
46
- return { fillColor, strokeWidth, radius, strokeColor, blur, backdropBlur };
53
+ return { fill, strokeWidth, radius, strokeFill, blur, backdropBlur };
47
54
  }
48
55
  exports.useRectangleItem = useRectangleItem;
@@ -55,28 +55,28 @@ const RichTextItem = ({ item, sectionId, onResize, interactionCtrl, onVisibility
55
55
  }, [isInteractive, onVisibilityChange]);
56
56
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { ref: setRef, className: `rich-text-wrapper-${item.id}`, style: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (blur !== undefined ? { filter: `blur(${blur * 100}vw)` } : {})), (textColor ? { color: `${textColor.fmt('rgba')}` } : {})), (angle !== undefined ? { transform: `rotate(${angle}deg)` } : {})), (letterSpacing !== undefined ? { letterSpacing: `${letterSpacing * exemplary}px` } : {})), (wordSpacing !== undefined ? { wordSpacing: `${wordSpacing * exemplary}px` } : {})), (fontSize !== undefined ? { fontSize: `${Math.round(fontSize * exemplary)}px` } : {})), (lineHeight !== undefined ? { lineHeight: `${lineHeight * exemplary}px` } : {})), { willChange: blur !== 0 && blur !== undefined ? 'transform' : 'unset', transition }), children: content }), (0, jsx_runtime_1.jsxs)(style_1.default, { id: id, children: [styles, `${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, layoutParams]) => {
57
57
  const color = color_1.CntrlColor.parse(layoutParams.color);
58
- return (`
59
- .rich-text-wrapper-${item.id} {
60
- font-size: ${layoutParams.fontSize * 100}vw;
61
- line-height: ${layoutParams.lineHeight * 100}vw;
62
- letter-spacing: ${layoutParams.letterSpacing * 100}vw;
63
- word-spacing: ${layoutParams.wordSpacing * 100}vw;
64
- font-family: ${(0, getFontFamilyValue_1.getFontFamilyValue)(layoutParams.typeFace)};
65
- font-weight: ${layoutParams.fontWeight};
66
- font-style: ${layoutParams.fontStyle ? layoutParams.fontStyle : 'normal'};
67
- vertical-align: ${layoutParams.verticalAlign};
68
- font-variant: ${layoutParams.fontVariant};
69
- color: ${color.fmt('rgba')};
70
- transform: rotate(${area.angle}deg);
71
- filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
72
- text-transform: ${layoutParams.textTransform};
73
- ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
74
- }
75
- @supports not (color: oklch(42% 0.3 90 / 1)) {
76
- .rich-text-wrapper-${item.id} {
77
- color: ${color.fmt('rgba')};
78
- }
79
- }
58
+ return (`
59
+ .rich-text-wrapper-${item.id} {
60
+ font-size: ${layoutParams.fontSize * 100}vw;
61
+ line-height: ${layoutParams.lineHeight * 100}vw;
62
+ letter-spacing: ${layoutParams.letterSpacing * 100}vw;
63
+ word-spacing: ${layoutParams.wordSpacing * 100}vw;
64
+ font-family: ${(0, getFontFamilyValue_1.getFontFamilyValue)(layoutParams.typeFace)};
65
+ font-weight: ${layoutParams.fontWeight};
66
+ font-style: ${layoutParams.fontStyle ? layoutParams.fontStyle : 'normal'};
67
+ vertical-align: ${layoutParams.verticalAlign};
68
+ font-variant: ${layoutParams.fontVariant};
69
+ color: ${color.fmt('rgba')};
70
+ transform: rotate(${area.angle}deg);
71
+ filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
72
+ text-transform: ${layoutParams.textTransform};
73
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
74
+ }
75
+ @supports not (color: oklch(42% 0.3 90 / 1)) {
76
+ .rich-text-wrapper-${item.id} {
77
+ color: ${color.fmt('rgba')};
78
+ }
79
+ }
80
80
  `);
81
81
  })}`] })] }));
82
82
  };
@@ -2,29 +2,29 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getStyleKeysFromCSSProperty = exports.CSSPropertyNameMap = void 0;
4
4
  exports.CSSPropertyNameMap = {
5
- 'width': 'width',
6
- 'height': 'height',
7
- 'top': 'top',
8
- 'left': 'left',
9
- 'scale': 'transform',
10
- 'angle': 'transform',
11
- 'opacity': 'opacity',
12
- 'radius': 'border-radius',
13
- 'strokeWidth': 'border-width',
14
- 'strokeColor': 'border-color',
15
- 'fillColor': 'background-color',
16
- 'blur': 'filter',
17
- 'backdropBlur': 'backdrop-filter',
18
- 'letterSpacing': 'letter-spacing',
19
- 'wordSpacing': 'word-spacing',
20
- 'color': 'color'
5
+ width: 'width',
6
+ height: 'height',
7
+ top: 'top',
8
+ left: 'left',
9
+ scale: 'transform',
10
+ angle: 'transform',
11
+ opacity: 'opacity',
12
+ radius: 'border-radius',
13
+ strokeWidth: 'border-width',
14
+ strokeFill: 'border-color',
15
+ fill: 'background',
16
+ blur: 'filter',
17
+ backdropBlur: 'backdrop-filter',
18
+ letterSpacing: 'letter-spacing',
19
+ wordSpacing: 'word-spacing',
20
+ color: 'color'
21
21
  };
22
22
  const PropertyNameCSSMap = {
23
23
  'transform': ['angle', 'scale'],
24
24
  'border-radius': ['radius'],
25
25
  'border-width': ['strokeWidth'],
26
- 'border-color': ['strokeColor'],
27
- 'background-color': ['fillColor'],
26
+ 'border-color': ['strokeFill'],
27
+ 'background': ['fill'],
28
28
  'filter': ['blur'],
29
29
  'backdrop-filter': ['backdrop-blur'],
30
30
  'letter-spacing': ['letterSpacing'],
@@ -69,35 +69,27 @@ class Animator {
69
69
  top: (0, rangeMap_1.rangeMap)(pos, start.position, end.position, start.value.top, end.value.top, true)
70
70
  };
71
71
  }
72
- getColor(values, pos) {
73
- const keyframes = this.keyframesMap[sdk_1.KeyframeType.Color];
72
+ getBorderFill(values, pos) {
73
+ const keyframes = this.keyframesMap[sdk_1.KeyframeType.BorderFill];
74
74
  if (!keyframes || !keyframes.length)
75
75
  return values;
76
76
  if (keyframes.length === 1) {
77
77
  const [keyframe] = keyframes;
78
- return {
79
- color: keyframe.value.color
80
- };
78
+ return keyframe.value;
81
79
  }
82
80
  const { start, end } = this.getStartEnd(pos, keyframes);
83
- return {
84
- color: this.getRangeColor(start, end, pos)
85
- };
81
+ return this.getRangeGradient(start, end, pos);
86
82
  }
87
- getBorderColor(values, pos) {
88
- const keyframes = this.keyframesMap[sdk_1.KeyframeType.BorderColor];
83
+ getFill(values, pos) {
84
+ const keyframes = this.keyframesMap[sdk_1.KeyframeType.Fill];
89
85
  if (!keyframes || !keyframes.length)
90
86
  return values;
91
87
  if (keyframes.length === 1) {
92
88
  const [keyframe] = keyframes;
93
- return {
94
- color: keyframe.value.color
95
- };
89
+ return keyframe.value;
96
90
  }
97
91
  const { start, end } = this.getStartEnd(pos, keyframes);
98
- return {
99
- color: this.getRangeColor(start, end, pos)
100
- };
92
+ return this.getRangeGradient(start, end, pos);
101
93
  }
102
94
  getRadius(values, pos) {
103
95
  const keyframes = this.keyframesMap[sdk_1.KeyframeType.BorderRadius];
@@ -268,6 +260,166 @@ class Animator {
268
260
  const mixedColor = startColor.mix(endColor, rangeAmount);
269
261
  return mixedColor.fmt('oklch');
270
262
  }
263
+ getRangeGradient(start, end, position) {
264
+ const rangeAmount = (0, rangeMap_1.rangeMap)(position, start.position, end.position, 0, 1, true);
265
+ const allLayerIds = new Set([
266
+ ...start.value.map(layer => layer.id),
267
+ ...end.value.map(layer => layer.id)
268
+ ]);
269
+ const result = [];
270
+ for (const layerId of allLayerIds) {
271
+ const startLayers = start.value.find(layer => layer.id === layerId);
272
+ const endLayers = end.value.find(layer => layer.id === layerId);
273
+ const startLayersArray = Array.isArray(startLayers) ? startLayers : startLayers ? [startLayers] : [];
274
+ const endLayersArray = Array.isArray(endLayers) ? endLayers : endLayers ? [endLayers] : [];
275
+ if (startLayersArray.length > 0 && endLayersArray.length === 0) {
276
+ result.push(...startLayersArray);
277
+ continue;
278
+ }
279
+ if (startLayersArray.length === 0 && endLayersArray.length > 0) {
280
+ result.push(...endLayersArray);
281
+ continue;
282
+ }
283
+ if (startLayersArray.length > 0 && endLayersArray.length > 0) {
284
+ result.push(...this.interpolateFillLayerArray(startLayersArray, endLayersArray, rangeAmount));
285
+ }
286
+ }
287
+ return result;
288
+ }
289
+ interpolateFillLayerArray(startLayers, endLayers, rangeAmount) {
290
+ const startLayerMap = new Map(startLayers.map(layer => [layer.id, layer]));
291
+ const endLayerMap = new Map(endLayers.map(layer => [layer.id, layer]));
292
+ const allLayerIds = new Set([
293
+ ...startLayers.map(layer => layer.id),
294
+ ...endLayers.map(layer => layer.id)
295
+ ]);
296
+ const interpolatedLayers = [];
297
+ for (const layerId of allLayerIds) {
298
+ const startLayer = startLayerMap.get(layerId);
299
+ const endLayer = endLayerMap.get(layerId);
300
+ if (startLayer && !endLayer) {
301
+ interpolatedLayers.push(startLayer);
302
+ continue;
303
+ }
304
+ if (!startLayer && endLayer) {
305
+ interpolatedLayers.push(endLayer);
306
+ continue;
307
+ }
308
+ if (startLayer && endLayer) {
309
+ interpolatedLayers.push(this.interpolateFillLayer(startLayer, endLayer, rangeAmount));
310
+ }
311
+ }
312
+ const result = [];
313
+ for (const startLayer of startLayers) {
314
+ const interpolatedLayer = interpolatedLayers.find(layer => layer.id === startLayer.id);
315
+ if (interpolatedLayer) {
316
+ result.push(interpolatedLayer);
317
+ }
318
+ }
319
+ for (const endLayer of endLayers) {
320
+ if (!startLayerMap.has(endLayer.id)) {
321
+ const interpolatedLayer = interpolatedLayers.find(layer => layer.id === endLayer.id);
322
+ if (interpolatedLayer) {
323
+ result.push(interpolatedLayer);
324
+ }
325
+ }
326
+ }
327
+ return result;
328
+ }
329
+ interpolateFillLayer(startLayer, endLayer, rangeAmount) {
330
+ if (startLayer.type !== endLayer.type) {
331
+ return startLayer;
332
+ }
333
+ switch (startLayer.type) {
334
+ case 'solid': {
335
+ const endSolidLayer = endLayer;
336
+ const startColor = color_1.CntrlColor.parse(startLayer.value);
337
+ const endColor = color_1.CntrlColor.parse(endSolidLayer.value);
338
+ const mixedColor = startColor.mix(endColor, rangeAmount);
339
+ return Object.assign(Object.assign({}, startLayer), { value: mixedColor.fmt('oklch') });
340
+ }
341
+ case 'linear-gradient': {
342
+ const endLinearLayer = endLayer;
343
+ const interpolatedColors = this.interpolateColorStops(startLayer.colors, endLinearLayer.colors, rangeAmount);
344
+ const angle = startLayer.angle + (endLinearLayer.angle - startLayer.angle) * rangeAmount;
345
+ const startPoint = [
346
+ startLayer.start[0] + (endLinearLayer.start[0] - startLayer.start[0]) * rangeAmount,
347
+ startLayer.start[1] + (endLinearLayer.start[1] - startLayer.start[1]) * rangeAmount
348
+ ];
349
+ const endPoint = [
350
+ startLayer.end[0] + (endLinearLayer.end[0] - startLayer.end[0]) * rangeAmount,
351
+ startLayer.end[1] + (endLinearLayer.end[1] - startLayer.end[1]) * rangeAmount
352
+ ];
353
+ return Object.assign(Object.assign({}, startLayer), { colors: interpolatedColors, angle, start: startPoint, end: endPoint });
354
+ }
355
+ case 'radial-gradient': {
356
+ const endRadialLayer = endLayer;
357
+ const interpolatedColors = this.interpolateColorStops(startLayer.colors, endRadialLayer.colors, rangeAmount);
358
+ const angle = startLayer.angle + (endRadialLayer.angle - startLayer.angle) * rangeAmount;
359
+ const center = [
360
+ startLayer.center[0] + (endRadialLayer.center[0] - startLayer.center[0]) * rangeAmount,
361
+ startLayer.center[1] + (endRadialLayer.center[1] - startLayer.center[1]) * rangeAmount
362
+ ];
363
+ const diameter = startLayer.diameter + (endRadialLayer.diameter - startLayer.diameter) * rangeAmount;
364
+ return Object.assign(Object.assign({}, startLayer), { colors: interpolatedColors, angle,
365
+ center,
366
+ diameter });
367
+ }
368
+ case 'conic-gradient': {
369
+ const endConicLayer = endLayer;
370
+ const interpolatedColors = this.interpolateColorStops(startLayer.colors, endConicLayer.colors, rangeAmount);
371
+ const angle = startLayer.angle + (endConicLayer.angle - startLayer.angle) * rangeAmount;
372
+ const center = [
373
+ startLayer.center[0] + (endConicLayer.center[0] - startLayer.center[0]) * rangeAmount,
374
+ startLayer.center[1] + (endConicLayer.center[1] - startLayer.center[1]) * rangeAmount
375
+ ];
376
+ return Object.assign(Object.assign({}, startLayer), { colors: interpolatedColors, angle,
377
+ center });
378
+ }
379
+ case 'image': {
380
+ const endImageLayer = endLayer;
381
+ const opacity = startLayer.opacity + (endImageLayer.opacity - startLayer.opacity) * rangeAmount;
382
+ const backgroundSize = startLayer.backgroundSize + (endImageLayer.backgroundSize - startLayer.backgroundSize) * rangeAmount;
383
+ return Object.assign(Object.assign({}, startLayer), { opacity,
384
+ backgroundSize });
385
+ }
386
+ default:
387
+ return startLayer;
388
+ }
389
+ }
390
+ interpolateColorStops(startColors, endColors, rangeAmount) {
391
+ const startColorMap = new Map(startColors.map(stop => [stop.id, stop]));
392
+ const endColorMap = new Map(endColors.map(stop => [stop.id, stop]));
393
+ const allStopIds = new Set([
394
+ ...startColors.map(stop => stop.id),
395
+ ...endColors.map(stop => stop.id)
396
+ ]);
397
+ const interpolatedStops = [];
398
+ for (const stopId of allStopIds) {
399
+ const startStop = startColorMap.get(stopId);
400
+ const endStop = endColorMap.get(stopId);
401
+ if (startStop && !endStop) {
402
+ interpolatedStops.push(startStop);
403
+ continue;
404
+ }
405
+ if (!startStop && endStop) {
406
+ interpolatedStops.push(endStop);
407
+ continue;
408
+ }
409
+ if (startStop && endStop) {
410
+ const startColor = color_1.CntrlColor.parse(startStop.value);
411
+ const endColor = color_1.CntrlColor.parse(endStop.value);
412
+ const mixedColor = startColor.mix(endColor, rangeAmount);
413
+ const position = startStop.position + (endStop.position - startStop.position) * rangeAmount;
414
+ interpolatedStops.push({
415
+ id: stopId,
416
+ value: mixedColor.fmt('oklch'),
417
+ position
418
+ });
419
+ }
420
+ }
421
+ return interpolatedStops.sort((a, b) => a.position - b.position);
422
+ }
271
423
  }
272
424
  exports.Animator = Animator;
273
425
  function createKeyframesMap() {
@@ -276,9 +428,8 @@ function createKeyframesMap() {
276
428
  [sdk_1.KeyframeType.Position]: [],
277
429
  [sdk_1.KeyframeType.BorderWidth]: [],
278
430
  [sdk_1.KeyframeType.BorderRadius]: [],
279
- [sdk_1.KeyframeType.Color]: [],
280
431
  [sdk_1.KeyframeType.Rotation]: [],
281
- [sdk_1.KeyframeType.BorderColor]: [],
432
+ [sdk_1.KeyframeType.BorderFill]: [],
282
433
  [sdk_1.KeyframeType.Opacity]: [],
283
434
  [sdk_1.KeyframeType.Scale]: [],
284
435
  [sdk_1.KeyframeType.Blur]: [],
@@ -286,6 +437,7 @@ function createKeyframesMap() {
286
437
  [sdk_1.KeyframeType.LetterSpacing]: [],
287
438
  [sdk_1.KeyframeType.WordSpacing]: [],
288
439
  [sdk_1.KeyframeType.TextColor]: [],
289
- [sdk_1.KeyframeType.FXParams]: []
440
+ [sdk_1.KeyframeType.FXParams]: [],
441
+ [sdk_1.KeyframeType.Fill]: []
290
442
  };
291
443
  }