@webstudio-is/react-sdk 0.60.0 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/lib/app/custom-components/__generated__/form.props.js +412 -0
  2. package/lib/app/custom-components/__generated__/image.props.js +442 -0
  3. package/lib/app/custom-components/__generated__/link-block.props.js +432 -0
  4. package/lib/app/custom-components/__generated__/link.props.js +432 -0
  5. package/lib/app/custom-components/__generated__/rich-text-link.props.js +432 -0
  6. package/lib/app/custom-components/form.js +54 -0
  7. package/lib/app/custom-components/form.ws.js +81 -0
  8. package/lib/app/custom-components/index.js +10 -4
  9. package/lib/cjs/app/custom-components/__generated__/form.props.js +432 -0
  10. package/lib/cjs/app/custom-components/__generated__/image.props.js +462 -0
  11. package/lib/cjs/app/custom-components/__generated__/link-block.props.js +452 -0
  12. package/lib/cjs/app/custom-components/__generated__/link.props.js +452 -0
  13. package/lib/cjs/app/custom-components/__generated__/rich-text-link.props.js +452 -0
  14. package/lib/cjs/app/custom-components/form.js +70 -0
  15. package/lib/cjs/app/custom-components/form.ws.js +101 -0
  16. package/lib/cjs/app/custom-components/index.js +12 -6
  17. package/lib/cjs/components/__generated__/checkbox-field.props.js +419 -0
  18. package/lib/cjs/components/__generated__/checkbox.props.js +459 -0
  19. package/lib/cjs/components/__generated__/error-message.props.js +418 -0
  20. package/lib/cjs/components/__generated__/input.props.js +8 -3
  21. package/lib/cjs/components/__generated__/label.props.js +420 -0
  22. package/lib/cjs/components/__generated__/radio-button-field.props.js +419 -0
  23. package/lib/cjs/components/__generated__/radio-button.props.js +459 -0
  24. package/lib/cjs/components/__generated__/success-message.props.js +418 -0
  25. package/lib/cjs/components/__generated__/textarea.props.js +432 -0
  26. package/lib/cjs/components/blockquote.ws.js +36 -48
  27. package/lib/cjs/components/body.ws.js +20 -17
  28. package/lib/cjs/components/button.ws.js +8 -3
  29. package/lib/cjs/components/checkbox-field.js +29 -0
  30. package/lib/cjs/components/checkbox-field.ws.js +53 -0
  31. package/lib/cjs/components/checkbox.js +29 -0
  32. package/lib/cjs/components/checkbox.ws.js +55 -0
  33. package/lib/cjs/components/code.ws.js +20 -28
  34. package/lib/cjs/components/component-meta.js +3 -1
  35. package/lib/cjs/components/components-utils.js +9 -1
  36. package/lib/cjs/components/components.js +17 -1
  37. package/lib/cjs/components/error-message.js +29 -0
  38. package/lib/cjs/components/error-message.ws.js +40 -0
  39. package/lib/cjs/components/form.js +1 -1
  40. package/lib/cjs/components/form.ws.js +35 -9
  41. package/lib/cjs/components/heading.ws.js +1 -1
  42. package/lib/cjs/components/image.ws.js +8 -9
  43. package/lib/cjs/components/index.js +43 -2
  44. package/lib/cjs/components/input.ws.js +15 -3
  45. package/lib/cjs/components/italic.ws.js +5 -5
  46. package/lib/cjs/components/label.js +29 -0
  47. package/lib/cjs/components/label.ws.js +54 -0
  48. package/lib/cjs/components/link-block.ws.js +6 -6
  49. package/lib/cjs/components/link.ws.js +9 -10
  50. package/lib/cjs/components/list-item.ws.js +2 -1
  51. package/lib/cjs/components/list.ws.js +22 -22
  52. package/lib/cjs/components/paragraph.ws.js +1 -1
  53. package/lib/cjs/components/radio-button-field.js +29 -0
  54. package/lib/cjs/components/radio-button-field.ws.js +53 -0
  55. package/lib/cjs/components/radio-button.js +29 -0
  56. package/lib/cjs/components/radio-button.ws.js +55 -0
  57. package/lib/cjs/components/separator.ws.js +20 -20
  58. package/lib/cjs/components/success-message.js +29 -0
  59. package/lib/cjs/components/success-message.ws.js +40 -0
  60. package/lib/cjs/components/text-block.ws.js +6 -7
  61. package/lib/cjs/components/textarea.js +29 -0
  62. package/lib/cjs/components/textarea.ws.js +56 -0
  63. package/lib/cjs/css/css.js +6 -9
  64. package/lib/cjs/css/normalize.js +168 -185
  65. package/lib/cjs/css/presets.js +14 -34
  66. package/lib/cjs/css/style-rules.js +17 -0
  67. package/lib/cjs/embed-template.js +160 -0
  68. package/lib/cjs/index.js +1 -0
  69. package/lib/components/__generated__/checkbox-field.props.js +399 -0
  70. package/lib/components/__generated__/checkbox.props.js +439 -0
  71. package/lib/components/__generated__/error-message.props.js +398 -0
  72. package/lib/components/__generated__/input.props.js +8 -3
  73. package/lib/components/__generated__/label.props.js +400 -0
  74. package/lib/components/__generated__/radio-button-field.props.js +399 -0
  75. package/lib/components/__generated__/radio-button.props.js +439 -0
  76. package/lib/components/__generated__/success-message.props.js +398 -0
  77. package/lib/components/__generated__/textarea.props.js +412 -0
  78. package/lib/components/blockquote.ws.js +36 -48
  79. package/lib/components/body.ws.js +20 -17
  80. package/lib/components/button.ws.js +8 -3
  81. package/lib/components/checkbox-field.js +9 -0
  82. package/lib/components/checkbox-field.ws.js +33 -0
  83. package/lib/components/checkbox.js +9 -0
  84. package/lib/components/checkbox.ws.js +35 -0
  85. package/lib/components/code.ws.js +20 -28
  86. package/lib/components/component-meta.js +3 -1
  87. package/lib/components/components-utils.js +9 -1
  88. package/lib/components/components.js +17 -1
  89. package/lib/components/error-message.js +9 -0
  90. package/lib/components/error-message.ws.js +20 -0
  91. package/lib/components/form.js +1 -1
  92. package/lib/components/form.ws.js +35 -9
  93. package/lib/components/heading.ws.js +1 -1
  94. package/lib/components/image.ws.js +8 -9
  95. package/lib/components/index.js +43 -2
  96. package/lib/components/input.ws.js +15 -3
  97. package/lib/components/italic.ws.js +5 -5
  98. package/lib/components/label.js +9 -0
  99. package/lib/components/label.ws.js +34 -0
  100. package/lib/components/link-block.ws.js +7 -7
  101. package/lib/components/link.ws.js +9 -10
  102. package/lib/components/list-item.ws.js +2 -1
  103. package/lib/components/list.ws.js +22 -22
  104. package/lib/components/paragraph.ws.js +1 -1
  105. package/lib/components/radio-button-field.js +9 -0
  106. package/lib/components/radio-button-field.ws.js +33 -0
  107. package/lib/components/radio-button.js +9 -0
  108. package/lib/components/radio-button.ws.js +35 -0
  109. package/lib/components/separator.ws.js +20 -20
  110. package/lib/components/success-message.js +9 -0
  111. package/lib/components/success-message.ws.js +20 -0
  112. package/lib/components/text-block.ws.js +6 -7
  113. package/lib/components/textarea.js +9 -0
  114. package/lib/components/textarea.ws.js +36 -0
  115. package/lib/css/css.js +8 -11
  116. package/lib/css/normalize.js +168 -185
  117. package/lib/css/presets.js +14 -34
  118. package/lib/css/style-rules.js +17 -0
  119. package/lib/embed-template.js +140 -0
  120. package/lib/index.js +1 -0
  121. package/lib/types/app/custom-components/__generated__/form.props.d.ts +2 -0
  122. package/lib/types/app/custom-components/__generated__/image.props.d.ts +2 -0
  123. package/lib/types/app/custom-components/__generated__/link-block.props.d.ts +2 -0
  124. package/lib/types/app/custom-components/__generated__/link.props.d.ts +2 -0
  125. package/lib/types/app/custom-components/__generated__/rich-text-link.props.d.ts +2 -0
  126. package/lib/types/app/custom-components/form.d.ts +5 -0
  127. package/lib/types/app/custom-components/form.ws.d.ts +3 -0
  128. package/lib/types/app/custom-components/index.d.ts +6 -1
  129. package/lib/types/components/__generated__/checkbox-field.props.d.ts +2 -0
  130. package/lib/types/components/__generated__/checkbox.props.d.ts +2 -0
  131. package/lib/types/components/__generated__/error-message.props.d.ts +2 -0
  132. package/lib/types/components/__generated__/label.props.d.ts +2 -0
  133. package/lib/types/components/__generated__/radio-button-field.props.d.ts +2 -0
  134. package/lib/types/components/__generated__/radio-button.props.d.ts +2 -0
  135. package/lib/types/components/__generated__/success-message.props.d.ts +2 -0
  136. package/lib/types/components/__generated__/textarea.props.d.ts +2 -0
  137. package/lib/types/components/box.stories.d.ts +2 -2
  138. package/lib/types/components/checkbox-field.d.ts +3 -0
  139. package/lib/types/components/checkbox-field.ws.d.ts +3 -0
  140. package/lib/types/components/checkbox.d.ts +3 -0
  141. package/lib/types/components/checkbox.ws.d.ts +3 -0
  142. package/lib/types/components/component-meta.d.ts +23 -5
  143. package/lib/types/components/components-utils.d.ts +5 -20
  144. package/lib/types/components/components.d.ts +8 -0
  145. package/lib/types/components/error-message.d.ts +3 -0
  146. package/lib/types/components/error-message.ws.d.ts +3 -0
  147. package/lib/types/components/index.d.ts +1 -0
  148. package/lib/types/components/input.d.ts +3 -1
  149. package/lib/types/components/input.stories.d.ts +6 -2
  150. package/lib/types/components/label.d.ts +3 -0
  151. package/lib/types/components/label.ws.d.ts +3 -0
  152. package/lib/types/components/radio-button-field.d.ts +3 -0
  153. package/lib/types/components/radio-button-field.ws.d.ts +3 -0
  154. package/lib/types/components/radio-button.d.ts +3 -0
  155. package/lib/types/components/radio-button.ws.d.ts +3 -0
  156. package/lib/types/components/success-message.d.ts +3 -0
  157. package/lib/types/components/success-message.ws.d.ts +3 -0
  158. package/lib/types/components/textarea.d.ts +3 -0
  159. package/lib/types/components/textarea.ws.d.ts +3 -0
  160. package/lib/types/css/normalize.d.ts +8977 -2286
  161. package/lib/types/css/presets.d.ts +2 -38
  162. package/lib/types/css/style-rules.d.ts +11 -9
  163. package/lib/types/embed-template.d.ts +1725 -0
  164. package/lib/types/embed-template.test.d.ts +1 -0
  165. package/lib/types/index.d.ts +1 -0
  166. package/package.json +15 -14
  167. package/src/app/custom-components/__generated__/form.props.ts +457 -0
  168. package/src/app/custom-components/__generated__/image.props.ts +487 -0
  169. package/src/app/custom-components/__generated__/link-block.props.ts +477 -0
  170. package/src/app/custom-components/__generated__/link.props.ts +477 -0
  171. package/src/app/custom-components/__generated__/rich-text-link.props.ts +477 -0
  172. package/src/app/custom-components/form.tsx +94 -0
  173. package/src/app/custom-components/form.ws.tsx +86 -0
  174. package/src/app/custom-components/index.ts +9 -4
  175. package/src/components/__generated__/checkbox-field.props.ts +444 -0
  176. package/src/components/__generated__/checkbox.props.ts +484 -0
  177. package/src/components/__generated__/error-message.props.ts +443 -0
  178. package/src/components/__generated__/input.props.ts +8 -3
  179. package/src/components/__generated__/label.props.ts +445 -0
  180. package/src/components/__generated__/radio-button-field.props.ts +444 -0
  181. package/src/components/__generated__/radio-button.props.ts +484 -0
  182. package/src/components/__generated__/success-message.props.ts +443 -0
  183. package/src/components/__generated__/textarea.props.ts +457 -0
  184. package/src/components/blockquote.ws.tsx +42 -52
  185. package/src/components/body.ws.tsx +26 -23
  186. package/src/components/bold.ws.tsx +6 -3
  187. package/src/components/box.ws.ts +6 -3
  188. package/src/components/button.ws.tsx +13 -5
  189. package/src/components/checkbox-field.tsx +10 -0
  190. package/src/components/checkbox-field.ws.tsx +38 -0
  191. package/src/components/checkbox.tsx +13 -0
  192. package/src/components/checkbox.ws.tsx +40 -0
  193. package/src/components/code.ws.tsx +26 -32
  194. package/src/components/component-meta.ts +6 -3
  195. package/src/components/components-utils.ts +16 -10
  196. package/src/components/components.ts +8 -0
  197. package/src/components/error-message.tsx +10 -0
  198. package/src/components/error-message.ws.tsx +24 -0
  199. package/src/components/form.tsx +5 -1
  200. package/src/components/form.ws.tsx +39 -10
  201. package/src/components/heading.ws.tsx +7 -4
  202. package/src/components/image.ws.tsx +14 -12
  203. package/src/components/index.ts +47 -0
  204. package/src/components/input.tsx +3 -1
  205. package/src/components/input.ws.tsx +19 -4
  206. package/src/components/italic.ws.tsx +11 -8
  207. package/src/components/label.tsx +10 -0
  208. package/src/components/label.ws.tsx +39 -0
  209. package/src/components/link-block.ws.tsx +13 -10
  210. package/src/components/link.ws.tsx +15 -13
  211. package/src/components/list-item.ws.tsx +8 -4
  212. package/src/components/list.ws.tsx +28 -25
  213. package/src/components/paragraph.ws.tsx +7 -4
  214. package/src/components/radio-button-field.tsx +10 -0
  215. package/src/components/radio-button-field.ws.tsx +38 -0
  216. package/src/components/radio-button.tsx +13 -0
  217. package/src/components/radio-button.ws.tsx +40 -0
  218. package/src/components/separator.ws.tsx +26 -25
  219. package/src/components/span.ws.tsx +6 -3
  220. package/src/components/subscript.ws.tsx +6 -3
  221. package/src/components/success-message.tsx +10 -0
  222. package/src/components/success-message.ws.tsx +24 -0
  223. package/src/components/superscript.ws.tsx +6 -3
  224. package/src/components/text-block.ws.tsx +12 -11
  225. package/src/components/textarea.tsx +13 -0
  226. package/src/components/textarea.ws.tsx +41 -0
  227. package/src/css/css.ts +8 -11
  228. package/src/css/normalize.ts +166 -188
  229. package/src/css/presets.ts +15 -37
  230. package/src/css/style-rules.ts +24 -0
  231. package/src/embed-template.test.ts +210 -0
  232. package/src/embed-template.ts +187 -0
  233. package/src/index.ts +1 -0
@@ -6,6 +6,8 @@ import type {
6
6
  StyleSource,
7
7
  StyleSourceSelections,
8
8
  } from "@webstudio-is/project-build";
9
+ import type { PresetStyle } from "../components/component-meta";
10
+ import { componentAttribute } from "../tree";
9
11
 
10
12
  type StyleRule = {
11
13
  instanceId: string;
@@ -75,3 +77,25 @@ export const getStyleRules = (
75
77
 
76
78
  return styleRules;
77
79
  };
80
+
81
+ export const getPresetStyleRules = (
82
+ component: string,
83
+ presetStyle: PresetStyle
84
+ ) => {
85
+ // group style declarations by selector to render as separate rules
86
+ const presetStyleRules = new Map<string, Style>();
87
+ for (const [tag, styles] of Object.entries(presetStyle)) {
88
+ for (const styleDecl of styles) {
89
+ const selector = `${tag}:where([${componentAttribute}=${component}])${
90
+ styleDecl.state ?? ""
91
+ }`;
92
+ let rule = presetStyleRules.get(selector);
93
+ if (rule === undefined) {
94
+ rule = {};
95
+ presetStyleRules.set(selector, rule);
96
+ }
97
+ rule[styleDecl.property] = styleDecl.value;
98
+ }
99
+ }
100
+ return presetStyleRules;
101
+ };
@@ -0,0 +1,210 @@
1
+ import { expect, test } from "@jest/globals";
2
+ import { generateDataFromEmbedTemplate } from "./embed-template";
3
+
4
+ const expectString = expect.any(String) as unknown as string;
5
+
6
+ const defaultBreakpointId = "base";
7
+
8
+ test("generate data for embedding from instances and text", () => {
9
+ expect(
10
+ generateDataFromEmbedTemplate(
11
+ [
12
+ { type: "text", value: "hello" },
13
+ {
14
+ type: "instance",
15
+ component: "Box1",
16
+ children: [
17
+ { type: "instance", component: "Box2", children: [] },
18
+ { type: "text", value: "world" },
19
+ ],
20
+ },
21
+ ],
22
+ defaultBreakpointId
23
+ )
24
+ ).toEqual({
25
+ children: [
26
+ { type: "text", value: "hello" },
27
+ { type: "id", value: expectString },
28
+ ],
29
+ instances: [
30
+ {
31
+ type: "instance",
32
+ id: expectString,
33
+ component: "Box1",
34
+ children: [
35
+ { type: "id", value: expectString },
36
+ { type: "text", value: "world" },
37
+ ],
38
+ },
39
+ {
40
+ type: "instance",
41
+ id: expectString,
42
+ component: "Box2",
43
+ children: [],
44
+ },
45
+ ],
46
+ props: [],
47
+ styleSourceSelections: [],
48
+ styleSources: [],
49
+ styles: [],
50
+ });
51
+ });
52
+
53
+ test("generate data for embedding from props", () => {
54
+ expect(
55
+ generateDataFromEmbedTemplate(
56
+ [
57
+ {
58
+ type: "instance",
59
+ component: "Box1",
60
+ props: [
61
+ { type: "string", name: "data-prop1", value: "value1" },
62
+ { type: "string", name: "data-prop2", value: "value2" },
63
+ ],
64
+ children: [
65
+ {
66
+ type: "instance",
67
+ component: "Box2",
68
+ props: [{ type: "string", name: "data-prop3", value: "value3" }],
69
+ children: [],
70
+ },
71
+ ],
72
+ },
73
+ ],
74
+ defaultBreakpointId
75
+ )
76
+ ).toEqual({
77
+ children: [{ type: "id", value: expectString }],
78
+ instances: [
79
+ {
80
+ type: "instance",
81
+ id: expectString,
82
+ component: "Box1",
83
+ children: [{ type: "id", value: expectString }],
84
+ },
85
+ {
86
+ type: "instance",
87
+ id: expectString,
88
+ component: "Box2",
89
+ children: [],
90
+ },
91
+ ],
92
+ props: [
93
+ {
94
+ type: "string",
95
+ id: expectString,
96
+ instanceId: expectString,
97
+ name: "data-prop1",
98
+ value: "value1",
99
+ },
100
+ {
101
+ type: "string",
102
+ id: expectString,
103
+ instanceId: expectString,
104
+ name: "data-prop2",
105
+ value: "value2",
106
+ },
107
+ {
108
+ type: "string",
109
+ id: expectString,
110
+ instanceId: expectString,
111
+ name: "data-prop3",
112
+ value: "value3",
113
+ },
114
+ ],
115
+ styleSourceSelections: [],
116
+ styleSources: [],
117
+ styles: [],
118
+ });
119
+ });
120
+
121
+ test("generate data for embedding from styles", () => {
122
+ expect(
123
+ generateDataFromEmbedTemplate(
124
+ [
125
+ {
126
+ type: "instance",
127
+ component: "Box1",
128
+ styles: [
129
+ { property: "width", value: { type: "keyword", value: "auto" } },
130
+ { property: "height", value: { type: "keyword", value: "auto" } },
131
+ ],
132
+ children: [
133
+ {
134
+ type: "instance",
135
+ component: "Box2",
136
+ styles: [
137
+ {
138
+ property: "color",
139
+ value: { type: "keyword", value: "black" },
140
+ },
141
+ ],
142
+ children: [],
143
+ },
144
+ ],
145
+ },
146
+ ],
147
+ defaultBreakpointId
148
+ )
149
+ ).toEqual({
150
+ children: [{ type: "id", value: expectString }],
151
+ instances: [
152
+ {
153
+ type: "instance",
154
+ id: expectString,
155
+ component: "Box1",
156
+ children: [{ type: "id", value: expectString }],
157
+ },
158
+ {
159
+ type: "instance",
160
+ id: expectString,
161
+ component: "Box2",
162
+ children: [],
163
+ },
164
+ ],
165
+ props: [],
166
+ styleSourceSelections: [
167
+ {
168
+ instanceId: expectString,
169
+ values: [expectString],
170
+ },
171
+ {
172
+ instanceId: expectString,
173
+ values: [expectString],
174
+ },
175
+ ],
176
+ styleSources: [
177
+ {
178
+ type: "local",
179
+ id: expectString,
180
+ },
181
+ {
182
+ type: "local",
183
+ id: expectString,
184
+ },
185
+ ],
186
+ styles: [
187
+ {
188
+ breakpointId: "base",
189
+ styleSourceId: expectString,
190
+ state: undefined,
191
+ property: "width",
192
+ value: { type: "keyword", value: "auto" },
193
+ },
194
+ {
195
+ breakpointId: "base",
196
+ styleSourceId: expectString,
197
+ state: undefined,
198
+ property: "height",
199
+ value: { type: "keyword", value: "auto" },
200
+ },
201
+ {
202
+ breakpointId: "base",
203
+ styleSourceId: expectString,
204
+ state: undefined,
205
+ property: "color",
206
+ value: { type: "keyword", value: "black" },
207
+ },
208
+ ],
209
+ });
210
+ });
@@ -0,0 +1,187 @@
1
+ import { z } from "zod";
2
+ import { nanoid } from "nanoid";
3
+ import {
4
+ type Instance,
5
+ type InstancesList,
6
+ PropsList,
7
+ StyleSourceSelectionsList,
8
+ StyleSourcesList,
9
+ StylesList,
10
+ Breakpoint,
11
+ } from "@webstudio-is/project-build";
12
+ import { StyleValue, type StyleProperty } from "@webstudio-is/css-data";
13
+
14
+ const EmbedTemplateText = z.object({
15
+ type: z.literal("text"),
16
+ value: z.string(),
17
+ });
18
+
19
+ type EmbedTemplateText = z.infer<typeof EmbedTemplateText>;
20
+
21
+ const EmbedTemplateProp = z.union([
22
+ z.object({
23
+ type: z.literal("number"),
24
+ name: z.string(),
25
+ value: z.number(),
26
+ }),
27
+ z.object({
28
+ type: z.literal("string"),
29
+ name: z.string(),
30
+ value: z.string(),
31
+ }),
32
+ z.object({
33
+ type: z.literal("boolean"),
34
+ name: z.string(),
35
+ value: z.boolean(),
36
+ }),
37
+ z.object({
38
+ type: z.literal("string[]"),
39
+ name: z.string(),
40
+ value: z.array(z.string()),
41
+ }),
42
+ ]);
43
+
44
+ type EmbedTemplateProp = z.infer<typeof EmbedTemplateProp>;
45
+
46
+ export const EmbedTemplateStyleDecl = z.object({
47
+ state: z.optional(z.string()),
48
+ property: z.string() as z.ZodType<StyleProperty>,
49
+ value: StyleValue,
50
+ });
51
+
52
+ export type EmbedTemplateStyleDecl = z.infer<typeof EmbedTemplateStyleDecl>;
53
+
54
+ export type EmbedTemplateInstance = {
55
+ type: "instance";
56
+ component: string;
57
+ props?: EmbedTemplateProp[];
58
+ styles?: EmbedTemplateStyleDecl[];
59
+ children: Array<EmbedTemplateInstance | EmbedTemplateText>;
60
+ };
61
+
62
+ export const EmbedTemplateInstance: z.ZodType<EmbedTemplateInstance> = z.lazy(
63
+ () =>
64
+ z.object({
65
+ type: z.literal("instance"),
66
+ component: z.string(),
67
+ props: z.optional(z.array(EmbedTemplateProp)),
68
+ styles: z.optional(z.array(EmbedTemplateStyleDecl)),
69
+ children: WsEmbedTemplate,
70
+ })
71
+ );
72
+
73
+ export const WsEmbedTemplate = z.lazy(() =>
74
+ z.array(z.union([EmbedTemplateInstance, EmbedTemplateText]))
75
+ );
76
+
77
+ export type WsEmbedTemplate = z.infer<typeof WsEmbedTemplate>;
78
+
79
+ const createInstancesFromTemplate = (
80
+ treeTemplate: WsEmbedTemplate,
81
+ instances: InstancesList,
82
+ props: PropsList,
83
+ styleSourceSelections: StyleSourceSelectionsList,
84
+ styleSources: StyleSourcesList,
85
+ styles: StylesList,
86
+ defaultBreakpointId: Breakpoint["id"]
87
+ ) => {
88
+ const parentChildren: Instance["children"] = [];
89
+ for (const item of treeTemplate) {
90
+ if (item.type === "instance") {
91
+ const instanceId = nanoid();
92
+
93
+ // populate props
94
+ if (item.props) {
95
+ for (const prop of item.props) {
96
+ props.push({
97
+ id: nanoid(),
98
+ instanceId,
99
+ ...prop,
100
+ });
101
+ }
102
+ }
103
+
104
+ // populate styles
105
+ if (item.styles) {
106
+ const styleSourceId = nanoid();
107
+ styleSources.push({
108
+ type: "local",
109
+ id: styleSourceId,
110
+ });
111
+ styleSourceSelections.push({
112
+ instanceId,
113
+ values: [styleSourceId],
114
+ });
115
+ for (const styleDecl of item.styles) {
116
+ styles.push({
117
+ breakpointId: defaultBreakpointId,
118
+ styleSourceId,
119
+ state: styleDecl.state,
120
+ property: styleDecl.property,
121
+ value: styleDecl.value,
122
+ });
123
+ }
124
+ }
125
+
126
+ // populate instances
127
+ const instance: Instance = {
128
+ type: "instance",
129
+ id: instanceId,
130
+ component: item.component,
131
+ children: [],
132
+ };
133
+ instances.push(instance);
134
+ // traverse children after to preserve top down order
135
+ instance.children = createInstancesFromTemplate(
136
+ item.children,
137
+ instances,
138
+ props,
139
+ styleSourceSelections,
140
+ styleSources,
141
+ styles,
142
+ defaultBreakpointId
143
+ );
144
+ parentChildren.push({
145
+ type: "id",
146
+ value: instanceId,
147
+ });
148
+ }
149
+
150
+ if (item.type === "text") {
151
+ parentChildren.push({
152
+ type: "text",
153
+ value: item.value,
154
+ });
155
+ }
156
+ }
157
+ return parentChildren;
158
+ };
159
+
160
+ export const generateDataFromEmbedTemplate = (
161
+ treeTemplate: WsEmbedTemplate,
162
+ defaultBreakpointId: Breakpoint["id"]
163
+ ) => {
164
+ const instances: InstancesList = [];
165
+ const props: PropsList = [];
166
+ const styleSourceSelections: StyleSourceSelectionsList = [];
167
+ const styleSources: StyleSourcesList = [];
168
+ const styles: StylesList = [];
169
+
170
+ const children = createInstancesFromTemplate(
171
+ treeTemplate,
172
+ instances,
173
+ props,
174
+ styleSourceSelections,
175
+ styleSources,
176
+ styles,
177
+ defaultBreakpointId
178
+ );
179
+ return {
180
+ children,
181
+ instances,
182
+ props,
183
+ styleSourceSelections,
184
+ styleSources,
185
+ styles,
186
+ };
187
+ };
package/src/index.ts CHANGED
@@ -16,3 +16,4 @@ export {
16
16
  type ComponentState,
17
17
  componentCategories,
18
18
  } from "./components/component-meta";
19
+ export * from "./embed-template";