@cntrl-site/sdk-nextjs 1.9.78 → 1.9.79

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 (145) hide show
  1. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/sdk-nextjs.iml +12 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/LICENSE +21 -21
  6. package/README.md +4 -4
  7. package/TODO.md +1 -1
  8. package/eslint.config.mjs +35 -35
  9. package/jest.config.js +6 -6
  10. package/lib/common/useItemFXData.js +5 -5
  11. package/lib/components/Article.js +5 -5
  12. package/lib/components/LayoutStyle.js +4 -4
  13. package/lib/components/Section/Section.js +27 -27
  14. package/lib/components/StructuredBlockItem/StructuredBlockItem.js +13 -13
  15. package/lib/components/StructuredBlockItem/StructuredComponent/StructuredComponent.js +12 -12
  16. package/lib/components/StructuredContent/StructuredContent.js +11 -11
  17. package/lib/components/items/CodeEmbedItem/CodeEmbedItem.js +36 -36
  18. package/lib/components/items/ComponentItem/ComponentItem.js +13 -13
  19. package/lib/components/items/CompoundItem/CompoundChild.js +20 -20
  20. package/lib/components/items/CompoundItem/CompoundItem.js +14 -14
  21. package/lib/components/items/CustomItem/CustomItem.js +9 -9
  22. package/lib/components/items/EmbedVideoItem/VimeoEmbed.js +24 -24
  23. package/lib/components/items/EmbedVideoItem/YoutubeEmbed.js +27 -27
  24. package/lib/components/items/FileItem/ImageItem.js +40 -40
  25. package/lib/components/items/FileItem/VideoItem.js +64 -64
  26. package/lib/components/items/GroupItem/GroupItem.js +14 -14
  27. package/lib/components/items/Item.js +30 -30
  28. package/lib/components/items/RectangleItem/RectangleItem.js +27 -27
  29. package/lib/components/items/RichTextItem/RichTextItem.js +22 -22
  30. package/lib/utils/RichTextConverter/RichTextConverter.js +21 -21
  31. package/package.json +62 -62
  32. package/src/ItemGeometry/CSSPropertyNameMap.ts +37 -37
  33. package/src/ItemGeometry/GenericGeometryController.ts +59 -59
  34. package/src/ItemGeometry/ItemGeometryContext.ts +4 -4
  35. package/src/ItemGeometry/ItemGeometryController.ts +22 -22
  36. package/src/ItemGeometry/ItemGeometryService.ts +34 -34
  37. package/src/ItemGeometry/RichTextGeometryController.ts +166 -166
  38. package/src/ItemGeometry/useItemGeometry.ts +25 -25
  39. package/src/common/useCurrentLayout.ts +52 -52
  40. package/src/common/useExemplary.ts +9 -9
  41. package/src/common/useItemFXData.ts +63 -63
  42. package/src/common/useKeyframeValue.ts +85 -85
  43. package/src/common/useRegisterResize.ts +16 -16
  44. package/src/components/Article.tsx +69 -69
  45. package/src/components/ArticleWrapper.tsx +21 -21
  46. package/src/components/Head.tsx +95 -95
  47. package/src/components/LayoutStyle.tsx +21 -21
  48. package/src/components/Page.tsx +47 -47
  49. package/src/components/ScrollPlaybackVideo.tsx +75 -75
  50. package/src/components/Section/Section.tsx +162 -162
  51. package/src/components/Section/SectionImage.tsx +48 -48
  52. package/src/components/Section/SectionVideo.tsx +144 -144
  53. package/src/components/Section/useSectionColor.ts +19 -19
  54. package/src/components/Section/useSectionHeightMap.ts +19 -19
  55. package/src/components/StructuredBlockItem/StructuredBlockItem.tsx +69 -69
  56. package/src/components/StructuredBlockItem/StructuredComponent/StructuredComponent.tsx +66 -66
  57. package/src/components/StructuredContent/StructuredContent.tsx +42 -42
  58. package/src/components/items/CodeEmbedItem/CodeEmbedItem.tsx +148 -148
  59. package/src/components/items/CodeEmbedItem/useCodeEmbedItem.ts +36 -36
  60. package/src/components/items/ComponentItem/ComponentItem.tsx +85 -85
  61. package/src/components/items/ComponentItem/useComponentItem.ts +35 -35
  62. package/src/components/items/CompoundItem/CompoundChild.tsx +151 -151
  63. package/src/components/items/CompoundItem/CompoundItem.tsx +88 -88
  64. package/src/components/items/CompoundItem/useCompoundItem.ts +21 -21
  65. package/src/components/items/CustomItem/CustomItem.tsx +50 -50
  66. package/src/components/items/EmbedVideoItem/VimeoEmbed.tsx +217 -217
  67. package/src/components/items/EmbedVideoItem/YoutubeEmbed.tsx +201 -201
  68. package/src/components/items/EmbedVideoItem/useEmbedVideoItem.ts +46 -46
  69. package/src/components/items/FileItem/ImageItem.tsx +166 -166
  70. package/src/components/items/FileItem/VideoItem.tsx +287 -287
  71. package/src/components/items/FileItem/useFileItem.ts +81 -81
  72. package/src/components/items/GroupItem/GroupItem.tsx +99 -99
  73. package/src/components/items/GroupItem/useGroupItem.ts +34 -34
  74. package/src/components/items/Item.tsx +268 -268
  75. package/src/components/items/LinkWrapper.tsx +39 -39
  76. package/src/components/items/RectangleItem/RectangleItem.tsx +177 -177
  77. package/src/components/items/RectangleItem/useRectangleItem.ts +89 -89
  78. package/src/components/items/RichTextItem/RichTextItem.tsx +113 -113
  79. package/src/components/items/RichTextItem/useRichTextItem.ts +12 -12
  80. package/src/components/items/RichTextWrapper.tsx +15 -15
  81. package/src/components/items/itemsMap.ts +28 -28
  82. package/src/components/items/useDraggable.ts +252 -252
  83. package/src/components/items/useItemAngle.ts +13 -13
  84. package/src/components/items/useItemArea.ts +35 -35
  85. package/src/components/items/useItemPointerEvents.ts +23 -23
  86. package/src/components/items/useItemScale.ts +17 -17
  87. package/src/components/items/useItemTriggers.ts +15 -15
  88. package/src/components/items/useRichTextItemValues.ts +66 -66
  89. package/src/components/items/useSizing.ts +25 -25
  90. package/src/components/items/useStickyItemTop.ts +21 -21
  91. package/src/components/useLayoutContext.ts +7 -7
  92. package/src/index.ts +25 -25
  93. package/src/interactions/InteractionsRegistry.ts +513 -513
  94. package/src/interactions/ItemInteractionCtrl.ts +78 -78
  95. package/src/interactions/getTransition.ts +27 -27
  96. package/src/interactions/types.ts +36 -36
  97. package/src/interactions/useItemInteractionCtrl.ts +18 -18
  98. package/src/provider/ArticleRectContext.ts +4 -4
  99. package/src/provider/CntrlContext.ts +5 -5
  100. package/src/provider/CntrlProvider.tsx +11 -11
  101. package/src/provider/CntrlSdkContext.ts +113 -113
  102. package/src/provider/CustomItemRegistry.ts +14 -14
  103. package/src/provider/CustomItemTypes.ts +3 -3
  104. package/src/provider/CustomSectionRegistry.ts +25 -25
  105. package/src/provider/InteractionsContext.tsx +73 -73
  106. package/src/provider/Keyframes.ts +11 -11
  107. package/src/provider/KeyframesContext.ts +5 -5
  108. package/src/provider/LayoutContext.ts +3 -3
  109. package/src/provider/WebGLContextManagerContext.tsx +4 -4
  110. package/src/provider/defaultContext.ts +8 -8
  111. package/src/provider/useCntrlContext.ts +8 -8
  112. package/src/styled-jsx.d.ts +1 -1
  113. package/src/types/components-utils.d.ts +7 -7
  114. package/src/utils/Animator/Animator.ts +570 -570
  115. package/src/utils/ArticleRectManager/ArticleRectObserver.ts +93 -93
  116. package/src/utils/ArticleRectManager/useArticleRectObserver.ts +17 -17
  117. package/src/utils/ArticleRectManager/useSectionRegistry.ts +11 -11
  118. package/src/utils/CSSNumeric.ts +19 -19
  119. package/src/utils/EventEmitter.ts +41 -41
  120. package/src/utils/RichTextConverter/RichTextConverter.tsx +342 -342
  121. package/src/utils/ScaleAnchorMap.ts +13 -13
  122. package/src/utils/StickyManager/StickyManager.ts +23 -23
  123. package/src/utils/Youtube/YouTubeIframeApiLoader.ts +58 -58
  124. package/src/utils/Youtube/YoutubeIframeApi.ts +101 -101
  125. package/src/utils/Youtube/useYouTubeIframeApi.ts +12 -12
  126. package/src/utils/areFillsVisible/areFillsVisible.test.ts +63 -63
  127. package/src/utils/areFillsVisible/areFillsVisible.ts +37 -37
  128. package/src/utils/binSearchInsertAt.ts +33 -33
  129. package/src/utils/castObject.ts +10 -10
  130. package/src/utils/checkOverflowClipSupport.ts +13 -13
  131. package/src/utils/domDfs.ts +11 -11
  132. package/src/utils/effects/useImageFx.ts +154 -154
  133. package/src/utils/effects/useVideoFx.ts +156 -156
  134. package/src/utils/evaluateComponentBundle.ts +83 -83
  135. package/src/utils/getAnchoredItemTop.ts +12 -12
  136. package/src/utils/getCompoundBoundaryStyles.ts +60 -60
  137. package/src/utils/getFill.ts +46 -46
  138. package/src/utils/getFontFamilyValue.ts +3 -3
  139. package/src/utils/getInvertedRanges.ts +43 -43
  140. package/src/utils/getItemTopStyle.ts +39 -39
  141. package/src/utils/getStyleFromItemStateAndParams.ts +8 -8
  142. package/src/utils/getValidYoutubeUrl.ts +29 -29
  143. package/src/utils/isItemType.ts +5 -5
  144. package/src/utils/rangeMap.ts +13 -13
  145. package/src/utils/useElementRect.ts +23 -23
@@ -60,28 +60,28 @@ const RichTextItem = ({ item, sectionId, onResize, interactionCtrl, onVisibility
60
60
  }, [isInteractive, onVisibilityChange]);
61
61
  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]) => {
62
62
  const color = color_1.CntrlColor.parse(layoutParams.color);
63
- return (`
64
- .rich-text-wrapper-${item.id} {
65
- font-size: ${layoutParams.fontSize * 100}vw;
66
- line-height: ${layoutParams.lineHeight * 100}vw;
67
- letter-spacing: ${layoutParams.letterSpacing * 100}vw;
68
- word-spacing: ${layoutParams.wordSpacing * 100}vw;
69
- font-family: ${(0, getFontFamilyValue_1.getFontFamilyValue)(layoutParams.typeFace)};
70
- font-weight: ${layoutParams.fontWeight};
71
- font-style: ${layoutParams.fontStyle ? layoutParams.fontStyle : 'normal'};
72
- vertical-align: ${layoutParams.verticalAlign};
73
- font-variant: ${layoutParams.fontVariant};
74
- color: ${color.fmt('rgba')};
75
- transform: rotate(${area.angle}deg);
76
- filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
77
- text-transform: ${layoutParams.textTransform};
78
- ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
79
- }
80
- @supports not (color: oklch(42% 0.3 90 / 1)) {
81
- .rich-text-wrapper-${item.id} {
82
- color: ${color.fmt('rgba')};
83
- }
84
- }
63
+ return (`
64
+ .rich-text-wrapper-${item.id} {
65
+ font-size: ${layoutParams.fontSize * 100}vw;
66
+ line-height: ${layoutParams.lineHeight * 100}vw;
67
+ letter-spacing: ${layoutParams.letterSpacing * 100}vw;
68
+ word-spacing: ${layoutParams.wordSpacing * 100}vw;
69
+ font-family: ${(0, getFontFamilyValue_1.getFontFamilyValue)(layoutParams.typeFace)};
70
+ font-weight: ${layoutParams.fontWeight};
71
+ font-style: ${layoutParams.fontStyle ? layoutParams.fontStyle : 'normal'};
72
+ vertical-align: ${layoutParams.verticalAlign};
73
+ font-variant: ${layoutParams.fontVariant};
74
+ color: ${color.fmt('rgba')};
75
+ transform: rotate(${area.angle}deg);
76
+ filter: ${layoutParams.blur !== 0 ? `blur(${layoutParams.blur * 100}vw)` : 'unset'};
77
+ text-transform: ${layoutParams.textTransform};
78
+ ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''}
79
+ }
80
+ @supports not (color: oklch(42% 0.3 90 / 1)) {
81
+ .rich-text-wrapper-${item.id} {
82
+ color: ${color.fmt('rgba')};
83
+ }
84
+ }
85
85
  `);
86
86
  })}`] })] }));
87
87
  };
@@ -61,13 +61,13 @@ class RichTextConverter {
61
61
  const kids = [];
62
62
  layouts.forEach(l => {
63
63
  const ta = richText.layoutParams[l.id].textAlign;
64
- styleRules[l.id].push(`
65
- .${blockClass} {
66
- display: ${group.some(g => g.layout === l.id) ? 'block' : 'none'};
67
- text-align: ${ta};
68
- white-space: pre-wrap;
69
- overflow-wrap: break-word;
70
- }
64
+ styleRules[l.id].push(`
65
+ .${blockClass} {
66
+ display: ${group.some(g => g.layout === l.id) ? 'block' : 'none'};
67
+ text-align: ${ta};
68
+ white-space: pre-wrap;
69
+ overflow-wrap: break-word;
70
+ }
71
71
  `);
72
72
  });
73
73
  const item = group[0];
@@ -111,18 +111,18 @@ class RichTextConverter {
111
111
  if (lineHeight === null || lineHeight === void 0 ? void 0 : lineHeight.value) {
112
112
  currentLineHeight[item.layout] = lineHeight.value;
113
113
  }
114
- styleRules[item.layout].push(`
115
- .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
116
- ${styleGroup.styles.map(s => RichTextConverter.fromRangeStylesToInline(s, exemplary)).join('\n')}
117
- }
114
+ styleRules[item.layout].push(`
115
+ .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
116
+ ${styleGroup.styles.map(s => RichTextConverter.fromRangeStylesToInline(s, exemplary)).join('\n')}
117
+ }
118
118
  `);
119
119
  if (color) {
120
- styleRules[item.layout].push(`
121
- @supports not (color: oklch(42% 0.3 90 / 1)) {
122
- .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
123
- color: ${color_1.CntrlColor.parse(getResolvedValue(color.value, 'COLOR')).fmt('rgba')};
124
- }
125
- }
120
+ styleRules[item.layout].push(`
121
+ @supports not (color: oklch(42% 0.3 90 / 1)) {
122
+ .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
123
+ color: ${color_1.CntrlColor.parse(getResolvedValue(color.value, 'COLOR')).fmt('rgba')};
124
+ }
125
+ }
126
126
  `);
127
127
  }
128
128
  }
@@ -131,10 +131,10 @@ class RichTextConverter {
131
131
  root.push((0, jsx_runtime_1.jsx)("div", { className: blockClass, children: kids }, blockClass));
132
132
  }
133
133
  }
134
- const styles = layouts.map(l => `
135
- ${(0, sdk_1.getLayoutMediaQuery)(l.id, layouts)} {
136
- ${styleRules[l.id].join('\n')}
137
- }
134
+ const styles = layouts.map(l => `
135
+ ${(0, sdk_1.getLayoutMediaQuery)(l.id, layouts)} {
136
+ ${styleRules[l.id].join('\n')}
137
+ }
138
138
  `).join('\n');
139
139
  return [
140
140
  root,
package/package.json CHANGED
@@ -1,62 +1,62 @@
1
- {
2
- "name": "@cntrl-site/sdk-nextjs",
3
- "version": "1.9.78",
4
- "description": "SDK for Next.js",
5
- "author": "arsen@momdesign.nyc",
6
- "license": "MIT",
7
- "homepage": "https://github.com/cntrl-site/sdk-nextjs#readme",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/cntrl-site/sdk-nextjs.git"
11
- },
12
- "bugs": {
13
- "url": "https://github.com/cntrl-site/sdk-nextjs/issues"
14
- },
15
- "main": "lib/index.js",
16
- "types": "src/index.ts",
17
- "scripts": {
18
- "test": "jest",
19
- "prebuild": "rimraf ./lib",
20
- "build": "tsc --project tsconfig.build.json",
21
- "build:watch": "tsc --watch --project tsconfig.build.json",
22
- "prepublishOnly": "cross-env NODE_ENV=production npm run build"
23
- },
24
- "peerDependencies": {
25
- "@types/lodash.isequal": "^4.5.6",
26
- "lodash.isequal": "^4.5.0",
27
- "next": "^14.2.3",
28
- "react": "^18.3.1",
29
- "react-dom": "^18.3.1"
30
- },
31
- "dependencies": {
32
- "@antfu/eslint-config": "^3.8.0",
33
- "@cntrl-site/color": "^1.0.0",
34
- "@cntrl-site/components": "^1.0.20",
35
- "@cntrl-site/effects": "^1.4.2",
36
- "@cntrl-site/sdk": "^1.28.0",
37
- "@types/vimeo__player": "^2.18.0",
38
- "@vimeo/player": "^2.25.0",
39
- "html-react-parser": "^3.0.1",
40
- "resize-observer-polyfill": "^1.5.1",
41
- "styled-jsx": "^5.0.2"
42
- },
43
- "devDependencies": {
44
- "@testing-library/jest-dom": "^6.4.8",
45
- "@testing-library/react": "^16.0.0",
46
- "@tsconfig/node16": "^1.0.3",
47
- "@tsconfig/recommended": "^1.0.1",
48
- "@types/jest": "^29.5.12",
49
- "@types/node": "^18.11.7",
50
- "@types/react": "^18.0.15",
51
- "@types/react-dom": "^18.3.7",
52
- "cross-env": "^10.1.0",
53
- "jest": "^29.7.0",
54
- "jest-environment-jsdom": "^29.7.0",
55
- "rimraf": "^6.0.1",
56
- "ts-jest": "^29.0.3",
57
- "typescript": "^5.2.2"
58
- },
59
- "directories": {
60
- "lib": "lib"
61
- }
62
- }
1
+ {
2
+ "name": "@cntrl-site/sdk-nextjs",
3
+ "version": "1.9.79",
4
+ "description": "SDK for Next.js",
5
+ "author": "arsen@momdesign.nyc",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/cntrl-site/sdk-nextjs#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/cntrl-site/sdk-nextjs.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/cntrl-site/sdk-nextjs/issues"
14
+ },
15
+ "main": "lib/index.js",
16
+ "types": "src/index.ts",
17
+ "scripts": {
18
+ "test": "jest",
19
+ "prebuild": "rimraf ./lib",
20
+ "build": "tsc --project tsconfig.build.json",
21
+ "build:watch": "tsc --watch --project tsconfig.build.json",
22
+ "prepublishOnly": "cross-env NODE_ENV=production npm run build"
23
+ },
24
+ "peerDependencies": {
25
+ "@types/lodash.isequal": "^4.5.6",
26
+ "lodash.isequal": "^4.5.0",
27
+ "next": "^14.2.3",
28
+ "react": "^18.3.1",
29
+ "react-dom": "^18.3.1"
30
+ },
31
+ "dependencies": {
32
+ "@antfu/eslint-config": "^3.8.0",
33
+ "@cntrl-site/color": "^1.0.0",
34
+ "@cntrl-site/components": "^1.0.21",
35
+ "@cntrl-site/effects": "^1.4.2",
36
+ "@cntrl-site/sdk": "^1.28.0",
37
+ "@types/vimeo__player": "^2.18.0",
38
+ "@vimeo/player": "^2.25.0",
39
+ "html-react-parser": "^3.0.1",
40
+ "resize-observer-polyfill": "^1.5.1",
41
+ "styled-jsx": "^5.0.2"
42
+ },
43
+ "devDependencies": {
44
+ "@testing-library/jest-dom": "^6.4.8",
45
+ "@testing-library/react": "^16.0.0",
46
+ "@tsconfig/node16": "^1.0.3",
47
+ "@tsconfig/recommended": "^1.0.1",
48
+ "@types/jest": "^29.5.12",
49
+ "@types/node": "^18.11.7",
50
+ "@types/react": "^18.0.15",
51
+ "@types/react-dom": "^18.3.7",
52
+ "cross-env": "^10.1.0",
53
+ "jest": "^29.7.0",
54
+ "jest-environment-jsdom": "^29.7.0",
55
+ "rimraf": "^6.0.1",
56
+ "ts-jest": "^29.0.3",
57
+ "typescript": "^5.2.2"
58
+ },
59
+ "directories": {
60
+ "lib": "lib"
61
+ }
62
+ }
@@ -1,37 +1,37 @@
1
- import { ArticleItemType, ItemState } from '@cntrl-site/sdk';
2
-
3
- export const CSSPropertyNameMap: Record<keyof ItemState<ArticleItemType>, string> = {
4
- width: 'width',
5
- height: 'height',
6
- top: 'top',
7
- left: 'left',
8
- scale: 'transform',
9
- angle: 'transform',
10
- opacity: 'opacity',
11
- radius: 'border-radius',
12
- strokeWidth: 'border-width',
13
- strokeFill: 'border-color',
14
- fill: 'background',
15
- blur: 'filter',
16
- backdropBlur: 'backdrop-filter',
17
- letterSpacing: 'letter-spacing',
18
- wordSpacing: 'word-spacing',
19
- color: 'color'
20
- };
21
-
22
- const PropertyNameCSSMap: Record<string, string[]> = {
23
- 'transform': ['angle', 'scale'],
24
- 'border-radius': ['radius'],
25
- 'border-width': ['strokeWidth'],
26
- 'border-color': ['strokeFill'],
27
- 'background': ['fill'],
28
- 'filter': ['blur'],
29
- 'backdrop-filter': ['backdrop-blur'],
30
- 'letter-spacing': ['letterSpacing'],
31
- 'word-spacing': ['wordSpacing'],
32
- };
33
-
34
- export function getStyleKeysFromCSSProperty(cssProp: string): string[] {
35
- const key = PropertyNameCSSMap[cssProp] ?? [cssProp];
36
- return key;
37
- }
1
+ import { ArticleItemType, ItemState } from '@cntrl-site/sdk';
2
+
3
+ export const CSSPropertyNameMap: Record<keyof ItemState<ArticleItemType>, string> = {
4
+ width: 'width',
5
+ height: 'height',
6
+ top: 'top',
7
+ left: 'left',
8
+ scale: 'transform',
9
+ angle: 'transform',
10
+ opacity: 'opacity',
11
+ radius: 'border-radius',
12
+ strokeWidth: 'border-width',
13
+ strokeFill: 'border-color',
14
+ fill: 'background',
15
+ blur: 'filter',
16
+ backdropBlur: 'backdrop-filter',
17
+ letterSpacing: 'letter-spacing',
18
+ wordSpacing: 'word-spacing',
19
+ color: 'color'
20
+ };
21
+
22
+ const PropertyNameCSSMap: Record<string, string[]> = {
23
+ 'transform': ['angle', 'scale'],
24
+ 'border-radius': ['radius'],
25
+ 'border-width': ['strokeWidth'],
26
+ 'border-color': ['strokeFill'],
27
+ 'background': ['fill'],
28
+ 'filter': ['blur'],
29
+ 'backdrop-filter': ['backdrop-blur'],
30
+ 'letter-spacing': ['letterSpacing'],
31
+ 'word-spacing': ['wordSpacing'],
32
+ };
33
+
34
+ export function getStyleKeysFromCSSProperty(cssProp: string): string[] {
35
+ const key = PropertyNameCSSMap[cssProp] ?? [cssProp];
36
+ return key;
37
+ }
@@ -1,59 +1,59 @@
1
- import { Rect } from '@cntrl-site/sdk';
2
- import { ItemGeometryController } from './ItemGeometryController';
3
-
4
- type GeomtryRegistry = {
5
- getControllerById: (itemId: string) => ItemGeometryController;
6
- };
7
-
8
- export class GenericGeometryController implements ItemGeometryController {
9
- private scale: number = 1;
10
- private parentId?: string;
11
- private offsetParent: HTMLElement | null = null;
12
- private angle: number = 0;
13
- private registry: GeomtryRegistry | undefined;
14
-
15
- constructor(
16
- private container: HTMLElement
17
- ) { }
18
-
19
- setRegistry(registry: GeomtryRegistry) {
20
- this.registry = registry;
21
- }
22
-
23
- setParentId(parentId?: string) {
24
- this.parentId = parentId;
25
- }
26
-
27
- getParentId(): string | undefined {
28
- return this.parentId;
29
- }
30
-
31
- getBoundary(): Rect {
32
- const rect = this.container.getBoundingClientRect();
33
- return Rect.fromObject(rect);
34
- }
35
-
36
- getContentBoundary(): Rect {
37
- return this.getBoundary();
38
- }
39
-
40
- setScale(scale: number): void {
41
- this.scale = scale;
42
- }
43
-
44
- setAngle(angle: number) {
45
- this.angle = angle;
46
- }
47
-
48
- setOptions(options?: unknown) {
49
-
50
- }
51
-
52
- getAngle(): number {
53
- return 0;
54
- }
55
-
56
- getScale() {
57
- return 1;
58
- }
59
- }
1
+ import { Rect } from '@cntrl-site/sdk';
2
+ import { ItemGeometryController } from './ItemGeometryController';
3
+
4
+ type GeomtryRegistry = {
5
+ getControllerById: (itemId: string) => ItemGeometryController;
6
+ };
7
+
8
+ export class GenericGeometryController implements ItemGeometryController {
9
+ private scale: number = 1;
10
+ private parentId?: string;
11
+ private offsetParent: HTMLElement | null = null;
12
+ private angle: number = 0;
13
+ private registry: GeomtryRegistry | undefined;
14
+
15
+ constructor(
16
+ private container: HTMLElement
17
+ ) { }
18
+
19
+ setRegistry(registry: GeomtryRegistry) {
20
+ this.registry = registry;
21
+ }
22
+
23
+ setParentId(parentId?: string) {
24
+ this.parentId = parentId;
25
+ }
26
+
27
+ getParentId(): string | undefined {
28
+ return this.parentId;
29
+ }
30
+
31
+ getBoundary(): Rect {
32
+ const rect = this.container.getBoundingClientRect();
33
+ return Rect.fromObject(rect);
34
+ }
35
+
36
+ getContentBoundary(): Rect {
37
+ return this.getBoundary();
38
+ }
39
+
40
+ setScale(scale: number): void {
41
+ this.scale = scale;
42
+ }
43
+
44
+ setAngle(angle: number) {
45
+ this.angle = angle;
46
+ }
47
+
48
+ setOptions(options?: unknown) {
49
+
50
+ }
51
+
52
+ getAngle(): number {
53
+ return 0;
54
+ }
55
+
56
+ getScale() {
57
+ return 1;
58
+ }
59
+ }
@@ -1,4 +1,4 @@
1
- import { createContext } from "react";
2
- import { ItemGeometryService } from "./ItemGeometryService";
3
-
4
- export const ItemGeometryContext = createContext(new ItemGeometryService());
1
+ import { createContext } from "react";
2
+ import { ItemGeometryService } from "./ItemGeometryService";
3
+
4
+ export const ItemGeometryContext = createContext(new ItemGeometryService());
@@ -1,22 +1,22 @@
1
- import { Rect } from '@cntrl-site/sdk';
2
-
3
- export interface GeometryControllerCtor {
4
- new (element: HTMLElement): ItemGeometryController;
5
- }
6
-
7
- interface Registry {
8
- getControllerById(itemId: string): ItemGeometryController;
9
- }
10
-
11
- export interface ItemGeometryController {
12
- getBoundary(isRotatedBoundary?: boolean): Rect;
13
- getContentBoundary(isRotatedBoundary?: boolean): Rect;
14
- getScale(): number;
15
- setScale(scale: number): void;
16
- setAngle(angle: number): void;
17
- setRegistry(regisrty: Registry): void;
18
- setOptions(options?: unknown): void;
19
- setParentId(parentId?: string): void;
20
- getParentId(): string | undefined;
21
- getAngle(): number;
22
- }
1
+ import { Rect } from '@cntrl-site/sdk';
2
+
3
+ export interface GeometryControllerCtor {
4
+ new (element: HTMLElement): ItemGeometryController;
5
+ }
6
+
7
+ interface Registry {
8
+ getControllerById(itemId: string): ItemGeometryController;
9
+ }
10
+
11
+ export interface ItemGeometryController {
12
+ getBoundary(isRotatedBoundary?: boolean): Rect;
13
+ getContentBoundary(isRotatedBoundary?: boolean): Rect;
14
+ getScale(): number;
15
+ setScale(scale: number): void;
16
+ setAngle(angle: number): void;
17
+ setRegistry(regisrty: Registry): void;
18
+ setOptions(options?: unknown): void;
19
+ setParentId(parentId?: string): void;
20
+ getParentId(): string | undefined;
21
+ getAngle(): number;
22
+ }
@@ -1,34 +1,34 @@
1
- import { Rect } from '@cntrl-site/sdk';
2
- import { ItemGeometryController } from './ItemGeometryController';
3
-
4
- export class ItemGeometryService {
5
- private registry: Map<string, ItemGeometryController> = new Map();
6
-
7
- register(itemId: string, controller: ItemGeometryController): () => void {
8
- this.registry.set(itemId, controller);
9
- controller.setRegistry(this);
10
- return () => {
11
- this.registry.delete(itemId);
12
- };
13
- }
14
-
15
- getItemBoundary(itemId: string) {
16
- const controller = this.registry.get(itemId);
17
- if (!controller) {
18
- return new Rect(0, 0, 0, 0);
19
- }
20
- return controller.getContentBoundary();
21
- }
22
-
23
- getControllerById(itemId: string): ItemGeometryController {
24
- const controller = this.registry.get(itemId);
25
- if (!controller) {
26
- throw new ReferenceError(`There is no registred contoller for item w/ id ${itemId}`);
27
- }
28
- return controller;
29
- }
30
-
31
- hasItem(itemId: string): boolean {
32
- return this.registry.has(itemId);
33
- }
34
- }
1
+ import { Rect } from '@cntrl-site/sdk';
2
+ import { ItemGeometryController } from './ItemGeometryController';
3
+
4
+ export class ItemGeometryService {
5
+ private registry: Map<string, ItemGeometryController> = new Map();
6
+
7
+ register(itemId: string, controller: ItemGeometryController): () => void {
8
+ this.registry.set(itemId, controller);
9
+ controller.setRegistry(this);
10
+ return () => {
11
+ this.registry.delete(itemId);
12
+ };
13
+ }
14
+
15
+ getItemBoundary(itemId: string) {
16
+ const controller = this.registry.get(itemId);
17
+ if (!controller) {
18
+ return new Rect(0, 0, 0, 0);
19
+ }
20
+ return controller.getContentBoundary();
21
+ }
22
+
23
+ getControllerById(itemId: string): ItemGeometryController {
24
+ const controller = this.registry.get(itemId);
25
+ if (!controller) {
26
+ throw new ReferenceError(`There is no registred contoller for item w/ id ${itemId}`);
27
+ }
28
+ return controller;
29
+ }
30
+
31
+ hasItem(itemId: string): boolean {
32
+ return this.registry.has(itemId);
33
+ }
34
+ }