@builder.io/sdk-react 0.2.3-4 → 0.3.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 (288) hide show
  1. package/README.md +72 -3
  2. package/dist/sdk/blocks/columns/columns.js +5 -5
  3. package/dist/sdk/blocks/image/image.js +8 -7
  4. package/dist/sdk/blocks/symbol/symbol.js +3 -2
  5. package/dist/sdk/blocks/video/video.js +4 -1
  6. package/dist/sdk/components/render-block/block-styles.js +3 -1
  7. package/dist/sdk/components/render-block/render-block.helpers.d.ts +0 -1
  8. package/dist/sdk/components/render-block/render-block.helpers.js +8 -20
  9. package/dist/sdk/components/render-block/render-block.js +24 -15
  10. package/dist/sdk/components/render-block/render-repeated-block.js +3 -2
  11. package/dist/sdk/components/render-content/render-content.js +31 -12
  12. package/dist/sdk/components/render-content-variants/helpers.d.ts +12 -0
  13. package/dist/sdk/components/render-content-variants/helpers.js +154 -0
  14. package/dist/sdk/components/render-content-variants/render-content-variants.d.ts +5 -0
  15. package/dist/sdk/components/render-content-variants/render-content-variants.js +29 -0
  16. package/dist/sdk/components/render-inlined-styles.js +2 -2
  17. package/dist/sdk/constants/sdk-version.d.ts +1 -0
  18. package/dist/sdk/constants/sdk-version.js +1 -0
  19. package/dist/sdk/context/builder.context.js +3 -2
  20. package/dist/sdk/context/types.d.ts +17 -2
  21. package/dist/sdk/functions/evaluate.d.ts +4 -3
  22. package/dist/sdk/functions/evaluate.js +23 -2
  23. package/dist/sdk/functions/evaluate.test.d.ts +1 -0
  24. package/dist/sdk/functions/evaluate.test.js +17 -0
  25. package/dist/sdk/functions/get-block-actions-handler.d.ts +1 -1
  26. package/dist/sdk/functions/get-block-actions-handler.js +3 -1
  27. package/dist/sdk/functions/get-block-actions.d.ts +1 -1
  28. package/dist/sdk/functions/get-processed-block.d.ts +2 -2
  29. package/dist/sdk/functions/get-processed-block.js +16 -4
  30. package/dist/sdk/functions/get-processed-block.test.js +3 -1
  31. package/dist/sdk/helpers/canTrack.d.ts +1 -0
  32. package/dist/sdk/helpers/canTrack.js +2 -0
  33. package/dist/sdk/index.d.ts +1 -0
  34. package/dist/sdk/scripts/init-editing.js +2 -0
  35. package/package.json +5 -5
  36. package/CHANGELOG.md +0 -25
  37. package/packages/react/src/blocks/BaseText.tsx +0 -19
  38. package/packages/react/src/blocks/button/button.tsx +0 -45
  39. package/packages/react/src/blocks/button/component-info.ts +0 -42
  40. package/packages/react/src/blocks/columns/columns.tsx +0 -211
  41. package/packages/react/src/blocks/columns/component-info.ts +0 -254
  42. package/packages/react/src/blocks/custom-code/component-info.ts +0 -31
  43. package/packages/react/src/blocks/custom-code/custom-code.tsx +0 -76
  44. package/packages/react/src/blocks/embed/component-info.ts +0 -55
  45. package/packages/react/src/blocks/embed/embed.tsx +0 -59
  46. package/packages/react/src/blocks/embed/helpers.ts +0 -8
  47. package/packages/react/src/blocks/form/component-info.ts +0 -282
  48. package/packages/react/src/blocks/form/form.tsx +0 -320
  49. package/packages/react/src/blocks/fragment/component-info.ts +0 -10
  50. package/packages/react/src/blocks/fragment/fragment.tsx +0 -14
  51. package/packages/react/src/blocks/image/component-info.ts +0 -172
  52. package/packages/react/src/blocks/image/image.helpers.ts +0 -75
  53. package/packages/react/src/blocks/image/image.tsx +0 -144
  54. package/packages/react/src/blocks/img/component-info.ts +0 -21
  55. package/packages/react/src/blocks/img/img.tsx +0 -40
  56. package/packages/react/src/blocks/input/component-info.ts +0 -78
  57. package/packages/react/src/blocks/input/input.tsx +0 -33
  58. package/packages/react/src/blocks/raw-text/component-info.ts +0 -15
  59. package/packages/react/src/blocks/raw-text/raw-text.tsx +0 -18
  60. package/packages/react/src/blocks/section/component-info.ts +0 -50
  61. package/packages/react/src/blocks/section/section.tsx +0 -33
  62. package/packages/react/src/blocks/select/component-info.ts +0 -61
  63. package/packages/react/src/blocks/select/select.tsx +0 -35
  64. package/packages/react/src/blocks/submit-button/component-info.ts +0 -32
  65. package/packages/react/src/blocks/submit-button/submit-button.tsx +0 -17
  66. package/packages/react/src/blocks/symbol/component-info.ts +0 -43
  67. package/packages/react/src/blocks/symbol/symbol.tsx +0 -111
  68. package/packages/react/src/blocks/text/component-info.ts +0 -24
  69. package/packages/react/src/blocks/text/text.tsx +0 -20
  70. package/packages/react/src/blocks/textarea/component-info.ts +0 -48
  71. package/packages/react/src/blocks/textarea/textarea.tsx +0 -24
  72. package/packages/react/src/blocks/util.ts +0 -18
  73. package/packages/react/src/blocks/video/component-info.ts +0 -109
  74. package/packages/react/src/blocks/video/video.tsx +0 -84
  75. package/packages/react/src/components/render-block/block-styles.tsx +0 -98
  76. package/packages/react/src/components/render-block/render-block.helpers.ts +0 -138
  77. package/packages/react/src/components/render-block/render-block.tsx +0 -216
  78. package/packages/react/src/components/render-block/render-component.tsx +0 -52
  79. package/packages/react/src/components/render-block/render-repeated-block.tsx +0 -43
  80. package/packages/react/src/components/render-block/types.ts +0 -7
  81. package/packages/react/src/components/render-blocks.tsx +0 -97
  82. package/packages/react/src/components/render-content/builder-editing.tsx +0 -8
  83. package/packages/react/src/components/render-content/components/render-styles.helpers.ts +0 -79
  84. package/packages/react/src/components/render-content/components/render-styles.tsx +0 -45
  85. package/packages/react/src/components/render-content/index.ts +0 -1
  86. package/packages/react/src/components/render-content/render-content.helpers.ts +0 -48
  87. package/packages/react/src/components/render-content/render-content.tsx +0 -410
  88. package/packages/react/src/components/render-content/render-content.types.ts +0 -33
  89. package/packages/react/src/components/render-inlined-styles.tsx +0 -36
  90. package/packages/react/src/constants/builder-registered-components.ts +0 -42
  91. package/packages/react/src/constants/device-sizes.ts +0 -65
  92. package/packages/react/src/constants/target.ts +0 -2
  93. package/packages/react/src/context/builder.context.ts +0 -12
  94. package/packages/react/src/context/types.ts +0 -26
  95. package/packages/react/src/functions/camel-to-kebab-case.ts +0 -2
  96. package/packages/react/src/functions/evaluate.ts +0 -57
  97. package/packages/react/src/functions/event-handler-name.ts +0 -6
  98. package/packages/react/src/functions/extract-text-styles.ts +0 -39
  99. package/packages/react/src/functions/fast-clone.ts +0 -5
  100. package/packages/react/src/functions/get-block-actions-handler.ts +0 -20
  101. package/packages/react/src/functions/get-block-actions.ts +0 -25
  102. package/packages/react/src/functions/get-block-component-options.ts +0 -12
  103. package/packages/react/src/functions/get-block-properties.ts +0 -75
  104. package/packages/react/src/functions/get-builder-search-params/fn.test.ts +0 -19
  105. package/packages/react/src/functions/get-builder-search-params/index.ts +0 -50
  106. package/packages/react/src/functions/get-content/ab-testing.ts +0 -132
  107. package/packages/react/src/functions/get-content/generate-content-url.test.ts +0 -95
  108. package/packages/react/src/functions/get-content/generate-content-url.ts +0 -59
  109. package/packages/react/src/functions/get-content/index.ts +0 -62
  110. package/packages/react/src/functions/get-content/types.ts +0 -53
  111. package/packages/react/src/functions/get-fetch.ts +0 -18
  112. package/packages/react/src/functions/get-global-this.ts +0 -17
  113. package/packages/react/src/functions/get-processed-block.test.ts +0 -33
  114. package/packages/react/src/functions/get-processed-block.ts +0 -54
  115. package/packages/react/src/functions/get-react-native-block-styles.ts +0 -33
  116. package/packages/react/src/functions/if-target.ts +0 -20
  117. package/packages/react/src/functions/is-browser.ts +0 -3
  118. package/packages/react/src/functions/is-editing.ts +0 -10
  119. package/packages/react/src/functions/is-iframe.ts +0 -5
  120. package/packages/react/src/functions/is-previewing.ts +0 -14
  121. package/packages/react/src/functions/on-change.test.ts +0 -23
  122. package/packages/react/src/functions/on-change.ts +0 -29
  123. package/packages/react/src/functions/register-component.ts +0 -50
  124. package/packages/react/src/functions/register.ts +0 -46
  125. package/packages/react/src/functions/sanitize-react-native-block-styles.ts +0 -65
  126. package/packages/react/src/functions/set-editor-settings.ts +0 -16
  127. package/packages/react/src/functions/set.test.ts +0 -19
  128. package/packages/react/src/functions/set.ts +0 -26
  129. package/packages/react/src/functions/track/helpers.ts +0 -67
  130. package/packages/react/src/functions/track/index.ts +0 -136
  131. package/packages/react/src/functions/track/interaction.ts +0 -80
  132. package/packages/react/src/functions/transform-block-properties.ts +0 -3
  133. package/packages/react/src/functions/transform-block.ts +0 -6
  134. package/packages/react/src/helpers/ab-tests.ts +0 -22
  135. package/packages/react/src/helpers/cookie.ts +0 -107
  136. package/packages/react/src/helpers/css.ts +0 -42
  137. package/packages/react/src/helpers/flatten.ts +0 -24
  138. package/packages/react/src/helpers/localStorage.ts +0 -40
  139. package/packages/react/src/helpers/logger.ts +0 -6
  140. package/packages/react/src/helpers/nullable.ts +0 -4
  141. package/packages/react/src/helpers/sessionId.ts +0 -38
  142. package/packages/react/src/helpers/time.ts +0 -4
  143. package/packages/react/src/helpers/url.test.ts +0 -23
  144. package/packages/react/src/helpers/url.ts +0 -16
  145. package/packages/react/src/helpers/uuid.ts +0 -17
  146. package/packages/react/src/helpers/visitorId.ts +0 -40
  147. package/packages/react/src/index-helpers/blocks-exports.ts +0 -10
  148. package/packages/react/src/index-helpers/top-of-file.ts +0 -4
  149. package/packages/react/src/index.ts +0 -14
  150. package/packages/react/src/scripts/init-editing.ts +0 -123
  151. package/packages/react/src/types/api-version.ts +0 -2
  152. package/packages/react/src/types/builder-block.ts +0 -69
  153. package/packages/react/src/types/builder-content.ts +0 -46
  154. package/packages/react/src/types/can-track.ts +0 -3
  155. package/packages/react/src/types/components.ts +0 -117
  156. package/packages/react/src/types/deep-partial.ts +0 -7
  157. package/packages/react/src/types/element.ts +0 -60
  158. package/packages/react/src/types/input.ts +0 -125
  159. package/packages/react/src/types/targets.ts +0 -6
  160. package/packages/react/src/types/typescript.ts +0 -7
  161. package/packages/rsc/src/blocks/BaseText.jsx +0 -12
  162. package/packages/rsc/src/blocks/button/button.jsx +0 -37
  163. package/packages/rsc/src/blocks/button/component-info.js +0 -40
  164. package/packages/rsc/src/blocks/columns/columns.jsx +0 -172
  165. package/packages/rsc/src/blocks/columns/component-info.js +0 -241
  166. package/packages/rsc/src/blocks/custom-code/component-info.js +0 -30
  167. package/packages/rsc/src/blocks/custom-code/custom-code.jsx +0 -57
  168. package/packages/rsc/src/blocks/embed/component-info.js +0 -43
  169. package/packages/rsc/src/blocks/embed/embed.jsx +0 -45
  170. package/packages/rsc/src/blocks/embed/helpers.js +0 -9
  171. package/packages/rsc/src/blocks/form/component-info.js +0 -261
  172. package/packages/rsc/src/blocks/form/form.jsx +0 -260
  173. package/packages/rsc/src/blocks/fragment/component-info.js +0 -10
  174. package/packages/rsc/src/blocks/fragment/fragment.jsx +0 -9
  175. package/packages/rsc/src/blocks/image/component-info.js +0 -150
  176. package/packages/rsc/src/blocks/image/image.helpers.js +0 -48
  177. package/packages/rsc/src/blocks/image/image.jsx +0 -122
  178. package/packages/rsc/src/blocks/img/component-info.js +0 -19
  179. package/packages/rsc/src/blocks/img/img.jsx +0 -21
  180. package/packages/rsc/src/blocks/input/component-info.js +0 -73
  181. package/packages/rsc/src/blocks/input/input.jsx +0 -23
  182. package/packages/rsc/src/blocks/raw-text/component-info.js +0 -15
  183. package/packages/rsc/src/blocks/raw-text/raw-text.jsx +0 -14
  184. package/packages/rsc/src/blocks/section/component-info.js +0 -48
  185. package/packages/rsc/src/blocks/section/section.jsx +0 -27
  186. package/packages/rsc/src/blocks/select/component-info.js +0 -58
  187. package/packages/rsc/src/blocks/select/select.jsx +0 -24
  188. package/packages/rsc/src/blocks/submit-button/component-info.js +0 -27
  189. package/packages/rsc/src/blocks/submit-button/submit-button.jsx +0 -13
  190. package/packages/rsc/src/blocks/symbol/component-info.js +0 -42
  191. package/packages/rsc/src/blocks/symbol/symbol.jsx +0 -89
  192. package/packages/rsc/src/blocks/text/component-info.js +0 -23
  193. package/packages/rsc/src/blocks/text/text.jsx +0 -17
  194. package/packages/rsc/src/blocks/textarea/component-info.js +0 -46
  195. package/packages/rsc/src/blocks/textarea/textarea.jsx +0 -17
  196. package/packages/rsc/src/blocks/util.js +0 -8
  197. package/packages/rsc/src/blocks/video/component-info.js +0 -105
  198. package/packages/rsc/src/blocks/video/video.jsx +0 -63
  199. package/packages/rsc/src/components/render-block/block-styles.jsx +0 -88
  200. package/packages/rsc/src/components/render-block/render-block.helpers.js +0 -129
  201. package/packages/rsc/src/components/render-block/render-block.jsx +0 -201
  202. package/packages/rsc/src/components/render-block/render-component.jsx +0 -39
  203. package/packages/rsc/src/components/render-block/render-repeated-block.jsx +0 -27
  204. package/packages/rsc/src/components/render-block/types.js +0 -0
  205. package/packages/rsc/src/components/render-blocks.jsx +0 -92
  206. package/packages/rsc/src/components/render-content/builder-editing.jsx +0 -64
  207. package/packages/rsc/src/components/render-content/components/render-styles.helpers.js +0 -57
  208. package/packages/rsc/src/components/render-content/components/render-styles.jsx +0 -39
  209. package/packages/rsc/src/components/render-content/index.js +0 -4
  210. package/packages/rsc/src/components/render-content/render-content.helpers.js +0 -48
  211. package/packages/rsc/src/components/render-content/render-content.jsx +0 -253
  212. package/packages/rsc/src/components/render-content/render-content.types.js +0 -0
  213. package/packages/rsc/src/components/render-inlined-styles.jsx +0 -33
  214. package/packages/rsc/src/constants/builder-registered-components.js +0 -54
  215. package/packages/rsc/src/constants/device-sizes.js +0 -48
  216. package/packages/rsc/src/constants/target.js +0 -4
  217. package/packages/rsc/src/context/builder.context.js +0 -14
  218. package/packages/rsc/src/context/types.js +0 -0
  219. package/packages/rsc/src/functions/camel-to-kebab-case.js +0 -4
  220. package/packages/rsc/src/functions/evaluate.js +0 -6
  221. package/packages/rsc/src/functions/event-handler-name.js +0 -7
  222. package/packages/rsc/src/functions/extract-text-styles.js +0 -22
  223. package/packages/rsc/src/functions/fast-clone.js +0 -4
  224. package/packages/rsc/src/functions/get-block-actions-handler.js +0 -11
  225. package/packages/rsc/src/functions/get-block-actions.js +0 -18
  226. package/packages/rsc/src/functions/get-block-component-options.js +0 -28
  227. package/packages/rsc/src/functions/get-block-properties.js +0 -53
  228. package/packages/rsc/src/functions/get-builder-search-params/fn.test.js +0 -13
  229. package/packages/rsc/src/functions/get-builder-search-params/index.js +0 -38
  230. package/packages/rsc/src/functions/get-content/ab-testing.js +0 -99
  231. package/packages/rsc/src/functions/get-content/generate-content-url.js +0 -60
  232. package/packages/rsc/src/functions/get-content/generate-content-url.test.js +0 -82
  233. package/packages/rsc/src/functions/get-content/index.js +0 -83
  234. package/packages/rsc/src/functions/get-content/types.js +0 -0
  235. package/packages/rsc/src/functions/get-fetch.js +0 -14
  236. package/packages/rsc/src/functions/get-global-this.js +0 -18
  237. package/packages/rsc/src/functions/get-processed-block.js +0 -59
  238. package/packages/rsc/src/functions/get-processed-block.test.js +0 -32
  239. package/packages/rsc/src/functions/get-react-native-block-styles.js +0 -33
  240. package/packages/rsc/src/functions/if-target.js +0 -15
  241. package/packages/rsc/src/functions/is-browser.js +0 -6
  242. package/packages/rsc/src/functions/is-editing.js +0 -8
  243. package/packages/rsc/src/functions/is-iframe.js +0 -7
  244. package/packages/rsc/src/functions/is-previewing.js +0 -14
  245. package/packages/rsc/src/functions/on-change.js +0 -27
  246. package/packages/rsc/src/functions/on-change.test.js +0 -19
  247. package/packages/rsc/src/functions/register-component.js +0 -68
  248. package/packages/rsc/src/functions/register.js +0 -29
  249. package/packages/rsc/src/functions/sanitize-react-native-block-styles.js +0 -66
  250. package/packages/rsc/src/functions/set-editor-settings.js +0 -15
  251. package/packages/rsc/src/functions/set.js +0 -11
  252. package/packages/rsc/src/functions/set.test.js +0 -16
  253. package/packages/rsc/src/functions/track/helpers.js +0 -50
  254. package/packages/rsc/src/functions/track/index.js +0 -129
  255. package/packages/rsc/src/functions/track/interaction.js +0 -53
  256. package/packages/rsc/src/functions/transform-block-properties.js +0 -6
  257. package/packages/rsc/src/functions/transform-block.js +0 -6
  258. package/packages/rsc/src/helpers/ab-tests.js +0 -16
  259. package/packages/rsc/src/helpers/cookie.js +0 -81
  260. package/packages/rsc/src/helpers/css.js +0 -34
  261. package/packages/rsc/src/helpers/flatten.js +0 -34
  262. package/packages/rsc/src/helpers/localStorage.js +0 -35
  263. package/packages/rsc/src/helpers/logger.js +0 -9
  264. package/packages/rsc/src/helpers/nullable.js +0 -4
  265. package/packages/rsc/src/helpers/sessionId.js +0 -52
  266. package/packages/rsc/src/helpers/time.js +0 -5
  267. package/packages/rsc/src/helpers/url.js +0 -13
  268. package/packages/rsc/src/helpers/url.test.js +0 -21
  269. package/packages/rsc/src/helpers/uuid.js +0 -13
  270. package/packages/rsc/src/helpers/visitorId.js +0 -34
  271. package/packages/rsc/src/index-helpers/blocks-exports.js +0 -22
  272. package/packages/rsc/src/index-helpers/top-of-file.js +0 -2
  273. package/packages/rsc/src/index.js +0 -13
  274. package/packages/rsc/src/scripts/init-editing.js +0 -93
  275. package/packages/rsc/src/types/api-version.js +0 -4
  276. package/packages/rsc/src/types/builder-block.js +0 -0
  277. package/packages/rsc/src/types/builder-content.js +0 -0
  278. package/packages/rsc/src/types/can-track.js +0 -0
  279. package/packages/rsc/src/types/components.js +0 -0
  280. package/packages/rsc/src/types/deep-partial.js +0 -0
  281. package/packages/rsc/src/types/element.js +0 -0
  282. package/packages/rsc/src/types/input.js +0 -0
  283. package/packages/rsc/src/types/targets.js +0 -0
  284. package/packages/rsc/src/types/typescript.js +0 -0
  285. package/tsconfig.json +0 -28
  286. package/tsconfig.sdk.json +0 -10
  287. package/tsconfig.server.json +0 -10
  288. package/vite.config.ts +0 -91
@@ -1,79 +0,0 @@
1
- export interface CustomFont {
2
- family?: string;
3
- kind?: string;
4
- fileUrl?: string;
5
- files?: {
6
- [key: string]: string;
7
- };
8
- }
9
-
10
- const getCssFromFont = (font: CustomFont) => {
11
- // TODO: compute what font sizes are used and only load those.......
12
- const family =
13
- font.family +
14
- (font.kind && !font.kind.includes('#') ? ', ' + font.kind : '');
15
- const name = family.split(',')[0];
16
- const url = font.fileUrl ?? font?.files?.regular;
17
- let str = '';
18
- if (url && family && name) {
19
- str += `
20
- @font-face {
21
- font-family: "${family}";
22
- src: local("${name}"), url('${url}') format('woff2');
23
- font-display: fallback;
24
- font-weight: 400;
25
- }
26
- `.trim();
27
- }
28
-
29
- if (font.files) {
30
- for (const weight in font.files) {
31
- const isNumber = String(Number(weight)) === weight;
32
- if (!isNumber) {
33
- continue;
34
- }
35
- // TODO: maybe limit number loaded
36
- const weightUrl = font.files[weight];
37
- if (weightUrl && weightUrl !== url) {
38
- str += `
39
- @font-face {
40
- font-family: "${family}";
41
- src: url('${weightUrl}') format('woff2');
42
- font-display: fallback;
43
- font-weight: ${weight};
44
- }
45
- `.trim();
46
- }
47
- }
48
- }
49
- return str;
50
- };
51
-
52
- export const getFontCss = ({ customFonts }: { customFonts?: CustomFont[] }) => {
53
- // TODO: flag for this
54
- // if (!this.builder.allowCustomFonts) {
55
- // return '';
56
- // }
57
- // TODO: separate internal data from external
58
- return customFonts?.map((font) => getCssFromFont(font))?.join(' ') || '';
59
- };
60
-
61
- export const getCss = ({
62
- cssCode,
63
- contentId,
64
- }: {
65
- cssCode?: string;
66
- contentId?: string;
67
- }) => {
68
- if (!cssCode) {
69
- return '';
70
- }
71
- if (!contentId) {
72
- return cssCode;
73
- }
74
-
75
- // Allow using `&` in custom CSS code like @emotion
76
- // E.g. `& .foobar { ... }` to scope CSS
77
- // TODO: handle if '&' is within a string like `content: "&"`
78
- return cssCode?.replace(/&/g, `div[builder-content-id="${contentId}"]`) || '';
79
- };
@@ -1,45 +0,0 @@
1
- "use client";
2
- import * as React from "react";
3
- import { useState } from "react";
4
-
5
- interface Props {
6
- cssCode?: string;
7
- customFonts?: CustomFont[];
8
- contentId?: string;
9
- }
10
-
11
- import RenderInlinedStyles from "../../render-inlined-styles";
12
- import type { CustomFont } from "./render-styles.helpers";
13
- import { getCss } from "./render-styles.helpers";
14
- import { getFontCss } from "./render-styles.helpers";
15
-
16
- function RenderContentStyles(props: Props) {
17
- const [injectedStyles, setInjectedStyles] = useState(
18
- () => `
19
- ${getCss({
20
- cssCode: props.cssCode,
21
- contentId: props.contentId,
22
- })}
23
- ${getFontCss({
24
- customFonts: props.customFonts,
25
- })}
26
-
27
- .builder-text > p:first-of-type, .builder-text > .builder-paragraph:first-of-type {
28
- margin: 0;
29
- }
30
- .builder-text > p, .builder-text > .builder-paragraph {
31
- color: inherit;
32
- line-height: inherit;
33
- letter-spacing: inherit;
34
- font-weight: inherit;
35
- font-size: inherit;
36
- text-align: inherit;
37
- font-family: inherit;
38
- }
39
- `
40
- );
41
-
42
- return <RenderInlinedStyles styles={injectedStyles} />;
43
- }
44
-
45
- export default RenderContentStyles;
@@ -1 +0,0 @@
1
- export { default } from './render-content';
@@ -1,48 +0,0 @@
1
- import type { BuilderRenderState } from '../../context/types';
2
- import type { BuilderContent } from '../../types/builder-content';
3
- import type { Nullable } from '../../types/typescript';
4
- import type { RenderContentProps } from './render-content.types';
5
-
6
- export const getContextStateInitialValue = ({
7
- content,
8
- data,
9
- locale,
10
- }: Pick<RenderContentProps, 'content' | 'data' | 'locale'>) => {
11
- const defaultValues: BuilderRenderState = {};
12
-
13
- // set default values for content state inputs
14
- content?.data?.inputs?.forEach((input) => {
15
- if (
16
- input.name &&
17
- input.defaultValue !== undefined &&
18
- content?.data?.state &&
19
- content.data.state[input.name] === undefined
20
- ) {
21
- defaultValues[input.name] = input.defaultValue;
22
- }
23
- });
24
-
25
- const stateToUse: BuilderRenderState = {
26
- ...content?.data?.state,
27
- ...data,
28
- ...(locale ? { locale } : {}),
29
- };
30
-
31
- return { ...defaultValues, ...stateToUse };
32
- };
33
-
34
- export const getContentInitialValue = ({
35
- content,
36
- data,
37
- }: Pick<RenderContentProps, 'content' | 'data'>): Nullable<BuilderContent> => {
38
- return !content
39
- ? undefined
40
- : {
41
- ...content,
42
- data: {
43
- ...content?.data,
44
- ...data,
45
- },
46
- meta: content?.meta,
47
- };
48
- };
@@ -1,410 +0,0 @@
1
- "use client";
2
- import * as React from "react";
3
- import { useState, useContext, useRef, useEffect } from "react";
4
- import { getDefaultRegisteredComponents } from "../../constants/builder-registered-components.js";
5
- import type {
6
- BuilderRenderState,
7
- RegisteredComponent,
8
- RegisteredComponents,
9
- } from "../../context/types.js";
10
- import { evaluate } from "../../functions/evaluate.js";
11
- import { getContent } from "../../functions/get-content/index.js";
12
- import { fetch } from "../../functions/get-fetch.js";
13
- import { isBrowser } from "../../functions/is-browser.js";
14
- import { isEditing } from "../../functions/is-editing.js";
15
- import { isPreviewing } from "../../functions/is-previewing.js";
16
- import {
17
- components,
18
- createRegisterComponentMessage,
19
- } from "../../functions/register-component.js";
20
- import { _track } from "../../functions/track/index.js";
21
- import type {
22
- Breakpoints,
23
- BuilderContent,
24
- } from "../../types/builder-content.js";
25
- import type { Nullable } from "../../types/typescript.js";
26
- import RenderBlocks from "../render-blocks";
27
- import RenderContentStyles from "./components/render-styles";
28
- import builderContext from "../../context/builder.context.js";
29
- import {
30
- registerInsertMenu,
31
- setupBrowserForEditing,
32
- } from "../../scripts/init-editing.js";
33
- import { checkIsDefined } from "../../helpers/nullable.js";
34
- import { getInteractionPropertiesForEvent } from "../../functions/track/interaction.js";
35
- import type {
36
- RenderContentProps,
37
- BuilderComponentStateChange,
38
- } from "./render-content.types.js";
39
- import {
40
- getContentInitialValue,
41
- getContextStateInitialValue,
42
- } from "./render-content.helpers.js";
43
- import { TARGET } from "../../constants/target.js";
44
- import { logger } from "../../helpers/logger.js";
45
-
46
- function RenderContent(props: RenderContentProps) {
47
- const elementRef = useRef<HTMLDivElement>(null);
48
- const [forceReRenderCount, setForceReRenderCount] = useState(() => 0);
49
-
50
- const [overrideContent, setOverrideContent] = useState(() => null);
51
-
52
- const [useContent, setUseContent] = useState(() =>
53
- getContentInitialValue({
54
- content: props.content,
55
- data: props.data,
56
- })
57
- );
58
-
59
- function mergeNewContent(newContent: BuilderContent) {
60
- setUseContent({
61
- ...useContent,
62
- ...newContent,
63
- data: { ...useContent?.data, ...newContent?.data },
64
- meta: {
65
- ...useContent?.meta,
66
- ...newContent?.meta,
67
- breakpoints:
68
- newContent?.meta?.breakpoints || useContent?.meta?.breakpoints,
69
- },
70
- });
71
- }
72
-
73
- function setBreakpoints(breakpoints: Breakpoints) {
74
- setUseContent({
75
- ...useContent,
76
- meta: { ...useContent?.meta, breakpoints },
77
- });
78
- }
79
-
80
- const [update, setUpdate] = useState(() => 0);
81
-
82
- const [canTrackToUse, setCanTrackToUse] = useState(() =>
83
- checkIsDefined(props.canTrack) ? props.canTrack : true
84
- );
85
-
86
- const [contentState, setContentState] = useState(() =>
87
- getContextStateInitialValue({
88
- content: props.content,
89
- data: props.data,
90
- locale: props.locale,
91
- })
92
- );
93
-
94
- function setContextState(newState: BuilderRenderState) {
95
- setContentState(newState);
96
- }
97
-
98
- const [allRegisteredComponents, setAllRegisteredComponents] = useState(() =>
99
- [
100
- ...getDefaultRegisteredComponents(), // While this `components` object is deprecated, we must maintain support for it.
101
- // Since users are able to override our default components, we need to make sure that we do not break such
102
- // existing usage.
103
- // This is why we spread `components` after the default Builder.io components, but before the `props.customComponents`,
104
- // which is the new standard way of providing custom components, and must therefore take precedence.
105
- ...components,
106
- ...(props.customComponents || []),
107
- ].reduce(
108
- (acc, curr) => ({ ...acc, [curr.name]: curr }),
109
- {} as RegisteredComponents
110
- )
111
- );
112
-
113
- function processMessage(event: MessageEvent) {
114
- const { data } = event;
115
-
116
- if (data) {
117
- switch (data.type) {
118
- case "builder.configureSdk": {
119
- const messageContent = data.data;
120
- const { breakpoints, contentId } = messageContent;
121
-
122
- if (!contentId || contentId !== useContent?.id) {
123
- return;
124
- }
125
-
126
- if (breakpoints) {
127
- setBreakpoints(breakpoints);
128
- }
129
-
130
- setForceReRenderCount(forceReRenderCount + 1); // This is a hack to force Qwik to re-render.
131
-
132
- break;
133
- }
134
-
135
- case "builder.contentUpdate": {
136
- const messageContent = data.data;
137
- const key =
138
- messageContent.key ||
139
- messageContent.alias ||
140
- messageContent.entry ||
141
- messageContent.modelName;
142
- const contentData = messageContent.data;
143
-
144
- if (key === props.model) {
145
- mergeNewContent(contentData);
146
- setForceReRenderCount(forceReRenderCount + 1); // This is a hack to force Qwik to re-render.
147
- }
148
-
149
- break;
150
- }
151
-
152
- case "builder.patchUpdates": {
153
- // TODO
154
- break;
155
- }
156
- }
157
- }
158
- }
159
-
160
- function evaluateJsCode() {
161
- // run any dynamic JS code attached to content
162
- const jsCode = useContent?.data?.jsCode;
163
-
164
- if (jsCode) {
165
- evaluate({
166
- code: jsCode,
167
- context: props.context || {},
168
- state: contentState,
169
- });
170
- }
171
- }
172
-
173
- const [httpReqsData, setHttpReqsData] = useState(() => ({}));
174
-
175
- const [clicked, setClicked] = useState(() => false);
176
-
177
- function onClick(event: any) {
178
- if (useContent) {
179
- const variationId = useContent?.testVariationId;
180
- const contentId = useContent?.id;
181
-
182
- _track({
183
- type: "click",
184
- canTrack: canTrackToUse,
185
- contentId,
186
- apiKey: props.apiKey,
187
- variationId: variationId !== contentId ? variationId : undefined,
188
- ...getInteractionPropertiesForEvent(event),
189
- unique: !clicked,
190
- });
191
- }
192
-
193
- if (!clicked) {
194
- setClicked(true);
195
- }
196
- }
197
-
198
- function evalExpression(expression: string) {
199
- return expression.replace(/{{([^}]+)}}/g, (_match, group) =>
200
- evaluate({
201
- code: group,
202
- context: props.context || {},
203
- state: contentState,
204
- })
205
- );
206
- }
207
-
208
- function handleRequest({ url, key }: { key: string; url: string }) {
209
- fetch(url)
210
- .then((response) => response.json())
211
- .then((json) => {
212
- const newState = { ...contentState, [key]: json };
213
- setContextState(newState);
214
- })
215
- .catch((err) => {
216
- console.error("error fetching dynamic data", url, err);
217
- });
218
- }
219
-
220
- function runHttpRequests() {
221
- const requests: {
222
- [key: string]: string;
223
- } = useContent?.data?.httpRequests ?? {};
224
- Object.entries(requests).forEach(([key, url]) => {
225
- if (url && (!httpReqsData[key] || isEditing())) {
226
- const evaluatedUrl = evalExpression(url);
227
- handleRequest({
228
- url: evaluatedUrl,
229
- key,
230
- });
231
- }
232
- });
233
- }
234
-
235
- function emitStateUpdate() {
236
- if (isEditing()) {
237
- window.dispatchEvent(
238
- new CustomEvent<BuilderComponentStateChange>(
239
- "builder:component:stateChange",
240
- {
241
- detail: {
242
- state: contentState,
243
- ref: {
244
- name: props.model,
245
- },
246
- },
247
- }
248
- )
249
- );
250
- }
251
- }
252
-
253
- useEffect(() => {
254
- if (!props.apiKey) {
255
- logger.error(
256
- "No API key provided to `RenderContent` component. This can cause issues. Please provide an API key using the `apiKey` prop."
257
- );
258
- }
259
-
260
- if (isBrowser()) {
261
- if (isEditing()) {
262
- setForceReRenderCount(forceReRenderCount + 1);
263
- registerInsertMenu();
264
- setupBrowserForEditing({
265
- ...(props.locale
266
- ? {
267
- locale: props.locale,
268
- }
269
- : {}),
270
- ...(props.includeRefs
271
- ? {
272
- includeRefs: props.includeRefs,
273
- }
274
- : {}),
275
- });
276
- Object.values<RegisteredComponent>(allRegisteredComponents).forEach(
277
- (registeredComponent) => {
278
- const message = createRegisterComponentMessage(registeredComponent);
279
- window.parent?.postMessage(message, "*");
280
- }
281
- );
282
- window.addEventListener("message", processMessage);
283
- window.addEventListener(
284
- "builder:component:stateChangeListenerActivated",
285
- emitStateUpdate
286
- );
287
- }
288
-
289
- if (useContent) {
290
- const variationId = useContent?.testVariationId;
291
- const contentId = useContent?.id;
292
-
293
- _track({
294
- type: "impression",
295
- canTrack: canTrackToUse,
296
- contentId,
297
- apiKey: props.apiKey,
298
- variationId: variationId !== contentId ? variationId : undefined,
299
- });
300
- } // override normal content in preview mode
301
-
302
- if (isPreviewing()) {
303
- const searchParams = new URL(location.href).searchParams;
304
- const searchParamPreviewModel = searchParams.get("builder.preview");
305
- const searchParamPreviewId = searchParams.get(
306
- `builder.preview.${searchParamPreviewModel}`
307
- );
308
- const previewApiKey =
309
- searchParams.get("apiKey") || searchParams.get("builder.space");
310
- /**
311
- * Make sure that:
312
- * - the preview model name is the same as the one we're rendering, since there can be multiple models rendered * at the same time, e.g. header/page/footer. * - the API key is the same, since we don't want to preview content from other organizations.
313
- * - if there is content, that the preview ID is the same as that of the one we receive.
314
- *
315
- * TO-DO: should we only update the state when there is a change?
316
- **/
317
-
318
- if (
319
- searchParamPreviewModel === props.model &&
320
- previewApiKey === props.apiKey &&
321
- (!props.content || searchParamPreviewId === props.content.id)
322
- ) {
323
- getContent({
324
- model: props.model,
325
- apiKey: props.apiKey,
326
- apiVersion: props.apiVersion,
327
- }).then((content) => {
328
- if (content) {
329
- mergeNewContent(content);
330
- }
331
- });
332
- }
333
- }
334
-
335
- evaluateJsCode();
336
- runHttpRequests();
337
- emitStateUpdate();
338
- }
339
- }, []);
340
-
341
- useEffect(() => {
342
- if (props.content) {
343
- mergeNewContent(props.content);
344
- }
345
- }, [props.content]);
346
- useEffect(() => {
347
- evaluateJsCode();
348
- }, [useContent?.data?.jsCode, contentState]);
349
- useEffect(() => {
350
- runHttpRequests();
351
- }, [useContent?.data?.httpRequests]);
352
- useEffect(() => {
353
- emitStateUpdate();
354
- }, [contentState]);
355
-
356
- useEffect(() => {
357
- return () => {
358
- if (isBrowser()) {
359
- window.removeEventListener("message", processMessage);
360
- window.removeEventListener(
361
- "builder:component:stateChangeListenerActivated",
362
- emitStateUpdate
363
- );
364
- }
365
- };
366
- }, []);
367
-
368
- return (
369
- <builderContext.Provider
370
- value={{
371
- content: useContent,
372
- state: contentState,
373
- setState: setContextState,
374
- context: props.context || {},
375
- apiKey: props.apiKey,
376
- apiVersion: props.apiVersion,
377
- registeredComponents: allRegisteredComponents,
378
- inheritedStyles: {},
379
- }}
380
- >
381
- {useContent ? (
382
- <>
383
- <div
384
- ref={elementRef}
385
- onClick={(event) => onClick(event)}
386
- builder-content-id={useContent?.id}
387
- builder-model={props.model}
388
- >
389
- {TARGET !== "reactNative" ? (
390
- <>
391
- <RenderContentStyles
392
- contentId={useContent?.id}
393
- cssCode={useContent?.data?.cssCode}
394
- customFonts={useContent?.data?.customFonts}
395
- />
396
- </>
397
- ) : null}
398
-
399
- <RenderBlocks
400
- blocks={useContent?.data?.blocks}
401
- key={forceReRenderCount}
402
- />
403
- </div>
404
- </>
405
- ) : null}
406
- </builderContext.Provider>
407
- );
408
- }
409
-
410
- export default RenderContent;
@@ -1,33 +0,0 @@
1
- import type {
2
- BuilderRenderContext,
3
- RegisteredComponent,
4
- BuilderRenderState,
5
- } from '../../context/types';
6
- import type { BuilderContent } from '../../types/builder-content';
7
- import type { Nullable } from '../../types/typescript';
8
- import type { ApiVersion } from '../../types/api-version';
9
-
10
- export type RenderContentProps = {
11
- content?: Nullable<BuilderContent>;
12
- model?: string;
13
- data?: { [key: string]: any };
14
- context?: BuilderRenderContext;
15
- apiKey: string;
16
- apiVersion?: ApiVersion;
17
- customComponents?: RegisteredComponent[];
18
- canTrack?: boolean;
19
- locale?: string;
20
- includeRefs?: boolean;
21
- };
22
-
23
- export interface BuilderComponentStateChange {
24
- state: BuilderRenderState;
25
- ref: {
26
- name?: string;
27
- props?: {
28
- builderBlock?: {
29
- id?: string;
30
- };
31
- };
32
- };
33
- }
@@ -1,36 +0,0 @@
1
- "use client";
2
- import * as React from "react";
3
-
4
- interface Props {
5
- styles: string;
6
- }
7
-
8
- import { TARGET } from "../constants/target.js";
9
-
10
- function RenderInlinedStyles(props: Props) {
11
- function tag() {
12
- // NOTE: we have to obfusctate the name of the tag due to a limitation in the svelte-preprocessor plugin.
13
- // https://github.com/sveltejs/vite-plugin-svelte/issues/315#issuecomment-1109000027
14
- return "style" as "style";
15
- }
16
-
17
- function injectedStyleScript() {
18
- return `<${tag()}>${props.styles}</${tag()}>`;
19
- }
20
-
21
- const TagRef = tag();
22
-
23
- return (
24
- <>
25
- {TARGET === "svelte" || TARGET === "qwik" ? (
26
- <>
27
- <TagRef dangerouslySetInnerHTML={{ __html: props.styles }} />
28
- </>
29
- ) : (
30
- <TagRef>{props.styles}</TagRef>
31
- )}
32
- </>
33
- );
34
- }
35
-
36
- export default RenderInlinedStyles;
@@ -1,42 +0,0 @@
1
- import { default as Button } from '../blocks/button/button';
2
- import { componentInfo as buttonComponentInfo } from '../blocks/button/component-info.js';
3
- import { default as Columns } from '../blocks/columns/columns';
4
- import { componentInfo as columnsComponentInfo } from '../blocks/columns/component-info.js';
5
- import { componentInfo as fragmentComponentInfo } from '../blocks/fragment/component-info.js';
6
- import { default as Fragment } from '../blocks/fragment/fragment';
7
- import { componentInfo as imageComponentInfo } from '../blocks/image/component-info.js';
8
- import { default as Image } from '../blocks/image/image';
9
- import { componentInfo as sectionComponentInfo } from '../blocks/section/component-info.js';
10
- import { default as Section } from '../blocks/section/section';
11
- import { componentInfo as symbolComponentInfo } from '../blocks/symbol/component-info.js';
12
- import { default as Symbol } from '../blocks/symbol/symbol';
13
- import { componentInfo as textComponentInfo } from '../blocks/text/component-info.js';
14
- import { default as Text } from '../blocks/text/text';
15
- import { componentInfo as videoComponentInfo } from '../blocks/video/component-info.js';
16
- import { default as Video } from '../blocks/video/video';
17
- import type { RegisteredComponent } from '../context/types.js';
18
- import { componentInfo as embedComponentInfo } from '../blocks/embed/component-info.js';
19
- import { default as embed } from '../blocks/embed/embed';
20
- import { default as Img } from '../blocks/img/img';
21
- import { componentInfo as imgComponentInfo } from '../blocks/img/component-info.js';
22
- import { default as customCode } from '../blocks/custom-code/custom-code';
23
- import { componentInfo as customCodeInfo } from '../blocks/custom-code/component-info.js';
24
-
25
- /**
26
- * Returns a list of all registered components.
27
- * NOTE: This needs to be a function to work around ESM circular dependencies.
28
- */
29
- export const getDefaultRegisteredComponents: () => RegisteredComponent[] =
30
- () => [
31
- { component: Button, ...buttonComponentInfo },
32
- { component: Columns, ...columnsComponentInfo },
33
- { component: customCode, ...customCodeInfo },
34
- { component: embed, ...embedComponentInfo },
35
- { component: Fragment, ...fragmentComponentInfo },
36
- { component: Image, ...imageComponentInfo },
37
- { component: Img, ...imgComponentInfo },
38
- { component: Section, ...sectionComponentInfo },
39
- { component: Symbol, ...symbolComponentInfo },
40
- { component: Text, ...textComponentInfo },
41
- { component: Video, ...videoComponentInfo },
42
- ];