@elementor/editor-canvas 0.7.1 → 0.9.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 (44) hide show
  1. package/.turbo/turbo-build.log +9 -9
  2. package/CHANGELOG.md +57 -0
  3. package/dist/index.js +241 -215
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +243 -217
  6. package/dist/index.mjs.map +1 -1
  7. package/package.json +15 -12
  8. package/src/__tests__/init-styles-renderer.test.ts +19 -9
  9. package/src/init-styles-renderer.ts +20 -7
  10. package/src/{styles-renderer → renderers}/__tests__/__mocks__/styles-schema.ts +214 -16
  11. package/src/renderers/__tests__/create-props-resolver.test.ts +175 -0
  12. package/src/renderers/__tests__/create-props-resolver.transformers.test.ts +325 -0
  13. package/src/renderers/__tests__/render-styles.test.ts +126 -0
  14. package/src/renderers/create-props-resolver.ts +123 -0
  15. package/src/{styles-renderer → renderers}/multi-props.ts +1 -1
  16. package/src/{styles-renderer/render.ts → renderers/render-styles.ts} +18 -17
  17. package/src/renderers/style-transformers/background-image-overlay-transformer.ts +24 -0
  18. package/src/renderers/style-transformers/background-image-position-offset-transformer.ts +10 -0
  19. package/src/renderers/style-transformers/background-image-size-scale-transformer.ts +10 -0
  20. package/src/{styles-renderer/transformers → renderers/style-transformers}/create-corner-sizes-transformer.ts +7 -9
  21. package/src/{styles-renderer/transformers → renderers/style-transformers}/create-edge-sizes-transformer.ts +2 -2
  22. package/src/{styles-renderer/transformers → renderers/style-transformers}/image-attachment.ts +1 -1
  23. package/src/{styles-renderer/transformers → renderers/style-transformers}/image-src.ts +4 -7
  24. package/src/renderers/style-transformers/image.ts +25 -0
  25. package/src/{styles-renderer/transformers → renderers/style-transformers}/index.ts +9 -2
  26. package/src/renderers/style-transformers/stroke-transformer.ts +16 -0
  27. package/src/renderers/types.ts +12 -0
  28. package/src/styles-renderer/__tests__/enqueue-used-fonts.test.ts +0 -60
  29. package/src/styles-renderer/__tests__/index.test.ts +0 -777
  30. package/src/styles-renderer/enqueue-used-fonts.ts +0 -22
  31. package/src/styles-renderer/index.ts +0 -2
  32. package/src/styles-renderer/resolve.ts +0 -103
  33. package/src/styles-renderer/transformers/background-image-overlay-transformer.ts +0 -31
  34. package/src/styles-renderer/transformers/stroke-transformer.ts +0 -9
  35. package/src/styles-renderer/types.ts +0 -16
  36. /package/src/{styles-renderer → renderers}/errors.ts +0 -0
  37. /package/src/{styles-renderer/transformers → renderers/style-transformers}/background-color-overlay-transformer.ts +0 -0
  38. /package/src/{styles-renderer/transformers → renderers/style-transformers}/background-transformer.ts +0 -0
  39. /package/src/{styles-renderer/transformers → renderers/style-transformers}/create-combine-array-transformer.ts +0 -0
  40. /package/src/{styles-renderer/transformers → renderers/style-transformers}/dimensions.ts +0 -0
  41. /package/src/{styles-renderer/transformers → renderers/style-transformers}/layout-direction-transformer.ts +0 -0
  42. /package/src/{styles-renderer/transformers → renderers/style-transformers}/primitive-transformer.ts +0 -0
  43. /package/src/{styles-renderer/transformers → renderers/style-transformers}/shadow-transformer.ts +0 -0
  44. /package/src/{styles-renderer/transformers → renderers/style-transformers}/size-transformer.ts +0 -0
@@ -1,22 +1,22 @@
1
1
 
2
- > @elementor/editor-canvas@0.7.1 build
2
+ > @elementor/editor-canvas@0.9.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: ../../../tsconfig.json
7
- CLI tsup v8.3.5
7
+ CLI tsup v8.4.0
8
8
  CLI Using tsup config: /home/runner/work/elementor-packages/elementor-packages/tsup.build.ts
9
9
  CLI Target: esnext
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- ESM dist/index.mjs 17.52 KB
14
- ESM dist/index.mjs.map 36.24 KB
15
- ESM ⚡️ Build success in 124ms
16
- CJS dist/index.js 19.16 KB
17
- CJS dist/index.js.map 36.27 KB
18
- CJS ⚡️ Build success in 125ms
13
+ ESM dist/index.mjs 18.47 KB
14
+ ESM dist/index.mjs.map 38.82 KB
15
+ ESM ⚡️ Build success in 105ms
16
+ CJS dist/index.js 20.09 KB
17
+ CJS dist/index.js.map 38.83 KB
18
+ CJS ⚡️ Build success in 108ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 18510ms
20
+ DTS ⚡️ Build success in 18574ms
21
21
  DTS dist/index.d.mts 13.00 B
22
22
  DTS dist/index.d.ts 13.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,62 @@
1
1
  # @elementor/editor-canvas
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c41674c: Update stroke renderer to be compatible with SVG widget
8
+
9
+ ### Patch Changes
10
+
11
+ - 6b064c5: Make atomic border radius control use logical properties
12
+ - Updated dependencies [6b064c5]
13
+ - @elementor/editor-props@0.9.1
14
+ - @elementor/editor-styles-repository@0.7.1
15
+ - @elementor/editor-elements@0.5.3
16
+ - @elementor/editor-styles@0.5.6
17
+
18
+ ## 0.8.0
19
+
20
+ ### Minor Changes
21
+
22
+ - c9133d7: Add background image overlay custom size
23
+ - 910044c: update `@elementor/icons` and `@elementor/ui` packages.
24
+ - 0953b40: Background image overlay resolution canvas connection
25
+ - 15c964f: Add background image overlay custom position
26
+ - 5caf78d: update `@elementor/ui` package.
27
+
28
+ ### Patch Changes
29
+
30
+ - da38fa9: Remove unused exports and add missing dependencies.
31
+ - 35f9714: Add default background image to background overlay repeater
32
+ - dc93616: Move resolver out of style renderer to allow dom renderer use it
33
+ - Updated dependencies [c9133d7]
34
+ - Updated dependencies [86863c1]
35
+ - Updated dependencies [e6c904a]
36
+ - Updated dependencies [188069d]
37
+ - Updated dependencies [e441663]
38
+ - Updated dependencies [efdadea]
39
+ - Updated dependencies [da38fa9]
40
+ - Updated dependencies [910044c]
41
+ - Updated dependencies [4ed562a]
42
+ - Updated dependencies [9ca4eab]
43
+ - Updated dependencies [15c964f]
44
+ - Updated dependencies [5caf78d]
45
+ - Updated dependencies [ffad70a]
46
+ - Updated dependencies [ad6fde0]
47
+ - Updated dependencies [ebd9676]
48
+ - Updated dependencies [d99471a]
49
+ - Updated dependencies [b8e2a85]
50
+ - @elementor/editor-props@0.9.0
51
+ - @elementor/editor-styles-repository@0.7.0
52
+ - @elementor/editor-elements@0.5.2
53
+ - @elementor/editor-v1-adapters@0.10.0
54
+ - @elementor/editor-responsive@0.13.0
55
+ - @elementor/editor@0.18.0
56
+ - @elementor/utils@0.3.1
57
+ - @elementor/editor-styles@0.5.5
58
+ - @elementor/wp-media@0.4.1
59
+
3
60
  ## 0.7.1
4
61
 
5
62
  ### Patch Changes
package/dist/index.js CHANGED
@@ -150,37 +150,201 @@ function ElementsOverlays() {
150
150
 
151
151
  // src/init-styles-renderer.ts
152
152
  var import_editor_responsive = require("@elementor/editor-responsive");
153
+ var import_editor_styles = require("@elementor/editor-styles");
153
154
  var import_editor_styles_repository = require("@elementor/editor-styles-repository");
154
155
  var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
155
156
 
156
- // src/styles-renderer/transformers/background-color-overlay-transformer.ts
157
+ // src/renderers/create-props-resolver.ts
158
+ var import_editor_props = require("@elementor/editor-props");
159
+
160
+ // src/renderers/multi-props.ts
161
+ var isMultiProps = (propValue) => {
162
+ return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
163
+ };
164
+ var createMultiPropsValue = (props) => {
165
+ return {
166
+ "$$multi-props": true,
167
+ value: props
168
+ };
169
+ };
170
+ var getMultiPropsValue = (multiProps) => {
171
+ return multiProps.value;
172
+ };
173
+
174
+ // src/renderers/create-props-resolver.ts
175
+ var TRANSFORM_DEPTH_LIMIT = 3;
176
+ function createPropsResolver(transformers, { onPropResolve } = {}) {
177
+ async function transform({ value, key, type, signal, depth = 0 }) {
178
+ if (value === null || value === void 0) {
179
+ return null;
180
+ }
181
+ if (!(0, import_editor_props.isTransformable)(value)) {
182
+ return value;
183
+ }
184
+ if (depth > TRANSFORM_DEPTH_LIMIT) {
185
+ return null;
186
+ }
187
+ if (value.disabled === true) {
188
+ return null;
189
+ }
190
+ if (type.kind === "union") {
191
+ type = type.prop_types[value.$$type];
192
+ if (!type) {
193
+ return null;
194
+ }
195
+ }
196
+ let resolvedValue = value.value;
197
+ if (type.kind === "object") {
198
+ resolvedValue = await resolve({
199
+ props: resolvedValue,
200
+ schema: type.shape,
201
+ signal
202
+ });
203
+ }
204
+ if (type.kind === "array") {
205
+ resolvedValue = await Promise.all(
206
+ resolvedValue.map(
207
+ (item) => transform({ value: item, key, type: type.item_prop_type, depth, signal })
208
+ )
209
+ );
210
+ }
211
+ const transformer = transformers[value.$$type];
212
+ if (!transformer) {
213
+ return null;
214
+ }
215
+ try {
216
+ const transformed = await transformer(resolvedValue, { key, signal });
217
+ return transform({ value: transformed, key, type, signal, depth: depth + 1 });
218
+ } catch {
219
+ return null;
220
+ }
221
+ }
222
+ async function resolve({ props, schema, signal }) {
223
+ const promises = Promise.all(
224
+ Object.entries(schema).map(async ([key, type]) => {
225
+ const value = props[key] ?? type.default;
226
+ const transformed = await transform({ value, key, type, signal });
227
+ if (transformed === null) {
228
+ return;
229
+ }
230
+ onPropResolve?.({ key, value: transformed });
231
+ if (isMultiProps(transformed)) {
232
+ return getMultiPropsValue(transformed);
233
+ }
234
+ return { [key]: transformed };
235
+ })
236
+ );
237
+ return Object.assign({}, ...(await promises).filter(Boolean));
238
+ }
239
+ return resolve;
240
+ }
241
+
242
+ // src/renderers/errors.ts
243
+ var import_utils = require("@elementor/utils");
244
+ var UnknownStyleTypeError = (0, import_utils.createError)({
245
+ code: "unknown_style_type",
246
+ message: "Unknown style type"
247
+ });
248
+
249
+ // src/renderers/render-styles.ts
250
+ var SELECTORS_MAP = {
251
+ class: "."
252
+ };
253
+ async function renderStyles({
254
+ resolve,
255
+ styles,
256
+ schema,
257
+ breakpoints,
258
+ selectorPrefix = "",
259
+ signal
260
+ }) {
261
+ const stylesCssPromises = styles.map(async (style) => {
262
+ const variantCssPromises = Object.values(style.variants).map(async (variant) => {
263
+ const css = await propsToCss({ props: variant.props, schema, resolve, signal });
264
+ return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
265
+ });
266
+ const variantsCss = await Promise.all(variantCssPromises);
267
+ return wrapCssWithStyleElement(style.id, variantsCss.join(""));
268
+ });
269
+ const stylesCss = await Promise.all(stylesCssPromises);
270
+ return stylesCss.join("");
271
+ }
272
+ function createStyleWrapper(value = "", wrapper) {
273
+ return {
274
+ forStyle: ({ id, type }) => {
275
+ const symbol = SELECTORS_MAP[type];
276
+ if (!symbol) {
277
+ throw new UnknownStyleTypeError({ context: { type } });
278
+ }
279
+ return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
280
+ },
281
+ withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
282
+ withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
283
+ withMediaQuery: (breakpoint) => {
284
+ if (!breakpoint?.type) {
285
+ return createStyleWrapper(value, wrapper);
286
+ }
287
+ const size2 = `${breakpoint.type}:${breakpoint.width}px`;
288
+ return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
289
+ },
290
+ wrap: (css) => {
291
+ const res = `${value}{${css}}`;
292
+ if (!wrapper) {
293
+ return res;
294
+ }
295
+ return wrapper(res);
296
+ }
297
+ };
298
+ }
299
+ async function propsToCss({ props, resolve, signal, schema }) {
300
+ const transformed = await resolve({ props, schema, signal });
301
+ return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
302
+ acc.push(propName + ":" + propValue + ";");
303
+ return acc;
304
+ }, []).join("");
305
+ }
306
+ function wrapCssWithStyleElement(id, css) {
307
+ return `<style data-style-id="${id}">${css}</style>`;
308
+ }
309
+
310
+ // src/renderers/style-transformers/background-color-overlay-transformer.ts
157
311
  var backgroundColorOverlayTransformer = (value) => {
158
312
  return `linear-gradient(${value}, ${value})`;
159
313
  };
160
314
  var background_color_overlay_transformer_default = backgroundColorOverlayTransformer;
161
315
 
162
- // src/styles-renderer/transformers/background-image-overlay-transformer.ts
163
- var defaultPositionValue = "0% 0%";
316
+ // src/renderers/style-transformers/background-image-overlay-transformer.ts
317
+ var DEFAULT_POSITION_VALUE = "0% 0%";
164
318
  var backgroundImageOverlayTransformer = (value) => {
165
- const { "image-src": imageSrc, size: size2 = null, position = null, repeat = null, attachment = null } = value;
166
- let resultBackgroundStyle = imageSrc;
167
- if (repeat) {
168
- resultBackgroundStyle += ` ${repeat}`;
169
- }
170
- if (attachment) {
171
- resultBackgroundStyle += ` ${attachment}`;
172
- }
173
- if (position && !size2) {
174
- resultBackgroundStyle += ` ${position}`;
175
- }
176
- if (size2) {
177
- resultBackgroundStyle += ` ${position || defaultPositionValue} / ${size2}`;
319
+ const { image: imageSrc, size: size2 = null, position = null, repeat = null, attachment = null } = value;
320
+ if (!imageSrc) {
321
+ return null;
178
322
  }
179
- return resultBackgroundStyle;
323
+ const backgroundStyles = [
324
+ imageSrc,
325
+ repeat,
326
+ attachment,
327
+ size2 ? `${position || DEFAULT_POSITION_VALUE} / ${size2}` : position
328
+ ].filter(Boolean);
329
+ return backgroundStyles.join(" ");
180
330
  };
181
331
  var background_image_overlay_transformer_default = backgroundImageOverlayTransformer;
182
332
 
183
- // src/styles-renderer/transformers/background-transformer.ts
333
+ // src/renderers/style-transformers/background-image-position-offset-transformer.ts
334
+ var backgroundImagePositionOffsetTransformer = ({
335
+ x = "0px",
336
+ y = "0px"
337
+ }) => `${x} ${y}`;
338
+ var background_image_position_offset_transformer_default = backgroundImagePositionOffsetTransformer;
339
+
340
+ // src/renderers/style-transformers/background-image-size-scale-transformer.ts
341
+ var backgroundImageSizeScaleTransformer = ({
342
+ width = "auto",
343
+ height = "auto"
344
+ }) => `${width} ${height}`;
345
+ var background_image_size_scale_transformer_default = backgroundImageSizeScaleTransformer;
346
+
347
+ // src/renderers/style-transformers/background-transformer.ts
184
348
  var backgroundTransformer = (value) => {
185
349
  const overlays = value["background-overlay"] ?? "";
186
350
  const color = value.color ?? "";
@@ -188,28 +352,14 @@ var backgroundTransformer = (value) => {
188
352
  };
189
353
  var background_transformer_default = backgroundTransformer;
190
354
 
191
- // src/styles-renderer/transformers/create-combine-array-transformer.ts
355
+ // src/renderers/style-transformers/create-combine-array-transformer.ts
192
356
  var createCombineArrayTransformer = (delimiter) => {
193
357
  return (value) => value.filter(Boolean).join(delimiter);
194
358
  };
195
359
  var create_combine_array_transformer_default = createCombineArrayTransformer;
196
360
 
197
- // src/styles-renderer/multi-props.ts
198
- var isMultiProps = (propValue) => {
199
- return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
200
- };
201
- var createMultiPropsValue = (props) => {
202
- return {
203
- "$$multi-props": true,
204
- value: props
205
- };
206
- };
207
- var getMultiPropsValue = (multiProps) => {
208
- return multiProps.value;
209
- };
210
-
211
- // src/styles-renderer/transformers/create-corner-sizes-transformer.ts
212
- var validCorners = ["top-left", "top-right", "bottom-left", "bottom-right"];
361
+ // src/renderers/style-transformers/create-corner-sizes-transformer.ts
362
+ var validCorners = ["start-start", "start-end", "end-start", "end-end"];
213
363
  var createCornerSizesTransformer = (keyGenerator) => (value) => {
214
364
  const props = Object.entries(value).reduce((acc, [corner, cornerValue]) => {
215
365
  if (validCorners.includes(corner)) {
@@ -222,7 +372,7 @@ var createCornerSizesTransformer = (keyGenerator) => (value) => {
222
372
  };
223
373
  var create_corner_sizes_transformer_default = createCornerSizesTransformer;
224
374
 
225
- // src/styles-renderer/transformers/create-edge-sizes-transformer.ts
375
+ // src/renderers/style-transformers/create-edge-sizes-transformer.ts
226
376
  var validEdges = ["top", "right", "bottom", "left"];
227
377
  var createEdgeSizesTransformer = (keyGenerator) => (value) => {
228
378
  const props = Object.entries(value).reduce((acc, [edge, edgeValue]) => {
@@ -236,7 +386,7 @@ var createEdgeSizesTransformer = (keyGenerator) => (value) => {
236
386
  };
237
387
  var create_edge_sizes_transformer_default = createEdgeSizesTransformer;
238
388
 
239
- // src/styles-renderer/transformers/dimensions.ts
389
+ // src/renderers/style-transformers/dimensions.ts
240
390
  var validKeys = ["top", "right", "bottom", "left"];
241
391
  var dimensions = (value, { key }) => {
242
392
  const parsed = Object.entries(value).reduce((acc, [dimensionKey, dimensionValue]) => {
@@ -249,25 +399,40 @@ var dimensions = (value, { key }) => {
249
399
  };
250
400
  var dimensions_default = dimensions;
251
401
 
252
- // src/styles-renderer/transformers/image-attachment.ts
402
+ // src/renderers/style-transformers/image.ts
403
+ var imageTransformer = (value) => {
404
+ const { src, size: size2 } = value;
405
+ if (src.url) {
406
+ return `url(${src.url})`;
407
+ }
408
+ const sizeUrl = src.attachment?.sizes[size2]?.url;
409
+ if (sizeUrl) {
410
+ return `url(${sizeUrl})`;
411
+ }
412
+ const attachmentUrl = src.attachment?.url;
413
+ if (attachmentUrl) {
414
+ return `url(${attachmentUrl})`;
415
+ }
416
+ return null;
417
+ };
418
+
419
+ // src/renderers/style-transformers/image-attachment.ts
253
420
  var import_wp_media = require("@elementor/wp-media");
254
421
  var imageAttachmentTransformer = async (value) => {
255
422
  const attachment = await (0, import_wp_media.getMediaAttachment)({ id: value });
256
423
  if (!attachment) {
257
424
  return null;
258
425
  }
259
- return attachment.url;
426
+ return attachment;
260
427
  };
261
428
 
262
- // src/styles-renderer/transformers/image-src.ts
263
- var imageSrcTransformer = (value) => {
264
- const url = value.id ?? value.url?.value;
265
- if (url) {
266
- return `url(${url})`;
267
- }
268
- };
429
+ // src/renderers/style-transformers/image-src.ts
430
+ var imageSrcTransformer = (value) => ({
431
+ attachment: value.id,
432
+ url: value.url
433
+ });
269
434
 
270
- // src/styles-renderer/transformers/layout-direction-transformer.ts
435
+ // src/renderers/style-transformers/layout-direction-transformer.ts
271
436
  var validKeys2 = ["row", "column"];
272
437
  var layoutDirectionTransformer = (value, { key }) => {
273
438
  const parsed = Object.entries(value).reduce((acc, [dimensionKey, dimensionValue]) => {
@@ -280,31 +445,36 @@ var layoutDirectionTransformer = (value, { key }) => {
280
445
  };
281
446
  var layout_direction_transformer_default = layoutDirectionTransformer;
282
447
 
283
- // src/styles-renderer/transformers/primitive-transformer.ts
448
+ // src/renderers/style-transformers/primitive-transformer.ts
284
449
  var primitiveTransformer = (value) => {
285
450
  return value;
286
451
  };
287
452
 
288
- // src/styles-renderer/transformers/shadow-transformer.ts
453
+ // src/renderers/style-transformers/shadow-transformer.ts
289
454
  var shadowTransformer = (value) => {
290
455
  return [value.hOffset, value.vOffset, value.blur, value.spread, value.color, value.position].filter(Boolean).join(" ");
291
456
  };
292
457
  var shadow_transformer_default = shadowTransformer;
293
458
 
294
- // src/styles-renderer/transformers/size-transformer.ts
459
+ // src/renderers/style-transformers/size-transformer.ts
295
460
  var sizeTransformer = (value) => {
296
461
  return `${value.size}${value.unit}`;
297
462
  };
298
463
  var size_transformer_default = sizeTransformer;
299
464
 
300
- // src/styles-renderer/transformers/stroke-transformer.ts
465
+ // src/renderers/style-transformers/stroke-transformer.ts
301
466
  var strokeTransformer = (value) => {
302
- return `${value.width} ${value.color}`;
467
+ const parsed = {
468
+ "-webkit-text-stroke": `${value.width} ${value.color}`,
469
+ stroke: `${value.color}`,
470
+ "stroke-width": `${value.width}`
471
+ };
472
+ return createMultiPropsValue(parsed);
303
473
  };
304
474
  var stroke_transformer_default = strokeTransformer;
305
475
 
306
- // src/styles-renderer/transformers/index.ts
307
- var transformers_default = {
476
+ // src/renderers/style-transformers/index.ts
477
+ var styleTransformers = {
308
478
  size: size_transformer_default,
309
479
  shadow: shadow_transformer_default,
310
480
  stroke: stroke_transformer_default,
@@ -312,180 +482,28 @@ var transformers_default = {
312
482
  color: primitiveTransformer,
313
483
  number: primitiveTransformer,
314
484
  string: primitiveTransformer,
485
+ url: primitiveTransformer,
315
486
  dimensions: dimensions_default,
316
487
  "background-color-overlay": background_color_overlay_transformer_default,
317
488
  "background-image-overlay": background_image_overlay_transformer_default,
489
+ "background-image-position-offset": background_image_position_offset_transformer_default,
490
+ "background-image-size-scale": background_image_size_scale_transformer_default,
318
491
  "background-overlay": create_combine_array_transformer_default(","),
319
492
  "box-shadow": create_combine_array_transformer_default(","),
320
493
  "border-width": create_edge_sizes_transformer_default((edgeKey) => `border-${edgeKey}-width`),
321
494
  "border-radius": create_corner_sizes_transformer_default((cornerKey) => `border-${cornerKey}-radius`),
322
495
  "image-attachment-id": imageAttachmentTransformer,
323
496
  "image-src": imageSrcTransformer,
497
+ image: imageTransformer,
324
498
  "layout-direction": layout_direction_transformer_default
325
499
  };
326
500
 
327
- // src/styles-renderer/render.ts
328
- var import_editor_styles = require("@elementor/editor-styles");
329
-
330
- // src/styles-renderer/errors.ts
331
- var import_utils = require("@elementor/utils");
332
- var UnknownStyleTypeError = (0, import_utils.createError)({
333
- code: "unknown_style_type",
334
- message: "Unknown style type"
335
- });
336
-
337
- // src/styles-renderer/resolve.ts
338
- var import_editor_props = require("@elementor/editor-props");
339
- var TRANSFORM_DEPTH_LIMIT = 3;
340
- async function resolve({ props, schema, transformers, signal }) {
341
- const promises = Promise.all(
342
- Object.entries(schema).map(async ([propKey, propType]) => {
343
- const value = props[propKey] ?? propType.default;
344
- const transformed = await transform(value, propKey, propType, transformers, 0, signal);
345
- if (transformed === null) {
346
- return;
347
- }
348
- if (isMultiProps(transformed)) {
349
- return getMultiPropsValue(transformed);
350
- }
351
- return { [propKey]: transformed };
352
- })
353
- );
354
- return Object.assign({}, ...(await promises).filter(Boolean));
355
- }
356
- async function transform(value, propKey, propType, transformers, depth = 0, signal) {
357
- if (!value && value !== 0) {
358
- return null;
359
- }
360
- if (!(0, import_editor_props.isTransformable)(value)) {
361
- return value;
362
- }
363
- if (depth > TRANSFORM_DEPTH_LIMIT) {
364
- return null;
365
- }
366
- if (value.disabled === true) {
367
- return null;
368
- }
369
- if (propType.kind === "union") {
370
- propType = propType.prop_types[value.$$type];
371
- if (!propType) {
372
- return null;
373
- }
374
- }
375
- let resolvedValue = value.value;
376
- if (propType.kind === "object") {
377
- resolvedValue = await resolve({
378
- transformers,
379
- props: resolvedValue,
380
- schema: propType.shape,
381
- signal
382
- });
383
- }
384
- if (propType.kind === "array") {
385
- resolvedValue = await Promise.all(
386
- resolvedValue.map(
387
- (item) => transform(item, propKey, propType.item_prop_type, transformers, depth, signal)
388
- )
389
- );
390
- }
391
- const transformer = transformers[value.$$type];
392
- if (!transformer) {
393
- return null;
394
- }
395
- try {
396
- const transformed = await transformer(resolvedValue, { key: propKey, signal });
397
- return transform(transformed, propKey, propType, transformers, depth + 1, signal);
398
- } catch {
399
- return null;
400
- }
401
- }
402
-
403
- // src/styles-renderer/render.ts
404
- var SELECTORS_MAP = {
405
- class: "."
406
- };
407
- async function render({
408
- transformers,
409
- styles,
410
- breakpoints,
411
- selectorPrefix = "",
412
- signal
413
- }) {
414
- const stylesCssPromises = styles.map(async (style) => {
415
- const variantCssPromises = Object.values(style.variants).map(async (variant) => {
416
- const css = await propsToCss(variant.props, transformers, signal);
417
- return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
418
- });
419
- const variantsCss = await Promise.all(variantCssPromises);
420
- return wrapCssWithStyleElement(style.id, variantsCss.join(""));
421
- });
422
- const stylesCss = await Promise.all(stylesCssPromises);
423
- return stylesCss.join("");
424
- }
425
- function createStyleWrapper(value = "", wrapper) {
426
- return {
427
- forStyle: ({ id, type }) => {
428
- const symbol = SELECTORS_MAP[type];
429
- if (!symbol) {
430
- throw new UnknownStyleTypeError({ context: { type } });
431
- }
432
- return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
433
- },
434
- withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
435
- withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
436
- withMediaQuery: (breakpoint) => {
437
- if (!breakpoint?.type) {
438
- return createStyleWrapper(value, wrapper);
439
- }
440
- const size2 = `${breakpoint.type}:${breakpoint.width}px`;
441
- return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
442
- },
443
- wrap: (css) => {
444
- const res = `${value}{${css}}`;
445
- if (!wrapper) {
446
- return res;
447
- }
448
- return wrapper(res);
449
- }
450
- };
451
- }
452
- async function propsToCss(props, transformers, signal) {
453
- const schema = (0, import_editor_styles.getStylesSchema)();
454
- const transformed = await resolve({ props, schema, transformers, signal });
455
- return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
456
- acc.push(propName + ":" + propValue + ";");
457
- return acc;
458
- }, []).join("");
459
- }
460
- function wrapCssWithStyleElement(id, css) {
461
- return `<style data-style-id="${id}">${css}</style>`;
462
- }
463
-
464
- // src/styles-renderer/enqueue-used-fonts.ts
465
- var import_utils2 = require("@elementor/utils");
466
-
467
501
  // src/sync/enqueue-font.ts
468
502
  var enqueueFont = (fontFamily, context = "preview") => {
469
503
  const extendedWindow = window;
470
504
  return extendedWindow.elementor?.helpers?.enqueueFont?.(fontFamily, context) ?? null;
471
505
  };
472
506
 
473
- // src/styles-renderer/enqueue-used-fonts.ts
474
- function enqueueUsedFonts(styles) {
475
- try {
476
- styles.forEach((styleDef) => {
477
- Object.values(styleDef.variants).forEach((variant) => {
478
- const fontFamily = variant.props["font-family"];
479
- if (fontFamily?.value) {
480
- enqueueFont(fontFamily.value);
481
- }
482
- });
483
- });
484
- } catch (error) {
485
- console.error(`Cannot enqueue font': ${(0, import_utils2.ensureError)(error).message}`);
486
- }
487
- }
488
-
489
507
  // src/sync/get-canvas-iframe-body.ts
490
508
  function getCanvasIframeBody() {
491
509
  const extendedWindow = window;
@@ -497,23 +515,25 @@ var WRAPPER_DATA_ATTR = "data-styles-container";
497
515
  var SELECTOR_PREFIX = ".elementor";
498
516
  function initStylesRenderer() {
499
517
  let abortController = null;
518
+ const resolve = createPropsResolver(styleTransformers, { onPropResolve: enqueueUsedFonts });
500
519
  (0, import_editor_v1_adapters2.__privateListenTo)((0, import_editor_v1_adapters2.v1ReadyEvent)(), () => {
501
520
  import_editor_styles_repository.stylesRepository.subscribe(async () => {
502
521
  const styleContainer = getStylesContainer();
503
- const breakpoints = (0, import_editor_responsive.getBreakpointsMap)();
504
522
  const styles = import_editor_styles_repository.stylesRepository.all().reverse();
523
+ const breakpoints = (0, import_editor_responsive.getBreakpointsMap)();
524
+ const schema = (0, import_editor_styles.getStylesSchema)();
505
525
  if (abortController) {
506
526
  abortController.abort();
507
527
  }
508
528
  abortController = new AbortController();
509
- styleContainer.innerHTML = await render({
510
- transformers: transformers_default,
529
+ styleContainer.innerHTML = await renderStyles({
511
530
  styles,
531
+ resolve,
512
532
  breakpoints,
513
533
  selectorPrefix: SELECTOR_PREFIX,
514
- signal: abortController.signal
534
+ signal: abortController.signal,
535
+ schema
515
536
  });
516
- enqueueUsedFonts(styles);
517
537
  });
518
538
  });
519
539
  }
@@ -533,6 +553,12 @@ function createStylesContainer() {
533
553
  el.setAttribute(WRAPPER_DATA_ATTR, "");
534
554
  return el;
535
555
  }
556
+ function enqueueUsedFonts({ key, value }) {
557
+ if (key !== "font-family" || typeof value !== "string") {
558
+ return;
559
+ }
560
+ enqueueFont(value);
561
+ }
536
562
 
537
563
  // src/init.tsx
538
564
  function init() {