@elementor/editor-canvas 0.7.1 → 0.8.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.
- package/.turbo/turbo-build.log +9 -9
- package/CHANGELOG.md +42 -0
- package/dist/index.js +234 -213
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +236 -215
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -12
- package/src/__tests__/init-styles-renderer.test.ts +19 -9
- package/src/init-styles-renderer.ts +20 -7
- package/src/{styles-renderer → renderers}/__tests__/__mocks__/styles-schema.ts +210 -12
- package/src/renderers/__tests__/create-props-resolver.test.ts +175 -0
- package/src/renderers/__tests__/create-props-resolver.transformers.test.ts +323 -0
- package/src/renderers/__tests__/render-styles.test.ts +126 -0
- package/src/renderers/create-props-resolver.ts +123 -0
- package/src/{styles-renderer → renderers}/multi-props.ts +1 -1
- package/src/{styles-renderer/render.ts → renderers/render-styles.ts} +18 -17
- package/src/renderers/style-transformers/background-image-overlay-transformer.ts +24 -0
- package/src/renderers/style-transformers/background-image-position-offset-transformer.ts +10 -0
- package/src/renderers/style-transformers/background-image-size-scale-transformer.ts +10 -0
- package/src/{styles-renderer/transformers → renderers/style-transformers}/create-corner-sizes-transformer.ts +2 -4
- package/src/{styles-renderer/transformers → renderers/style-transformers}/create-edge-sizes-transformer.ts +2 -2
- package/src/{styles-renderer/transformers → renderers/style-transformers}/image-attachment.ts +1 -1
- package/src/{styles-renderer/transformers → renderers/style-transformers}/image-src.ts +4 -7
- package/src/renderers/style-transformers/image.ts +25 -0
- package/src/{styles-renderer/transformers → renderers/style-transformers}/index.ts +9 -2
- package/src/renderers/types.ts +12 -0
- package/src/styles-renderer/__tests__/enqueue-used-fonts.test.ts +0 -60
- package/src/styles-renderer/__tests__/index.test.ts +0 -777
- package/src/styles-renderer/enqueue-used-fonts.ts +0 -22
- package/src/styles-renderer/index.ts +0 -2
- package/src/styles-renderer/resolve.ts +0 -103
- package/src/styles-renderer/transformers/background-image-overlay-transformer.ts +0 -31
- package/src/styles-renderer/types.ts +0 -16
- /package/src/{styles-renderer → renderers}/errors.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/background-color-overlay-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/background-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/create-combine-array-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/dimensions.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/layout-direction-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/primitive-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/shadow-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/size-transformer.ts +0 -0
- /package/src/{styles-renderer/transformers → renderers/style-transformers}/stroke-transformer.ts +0 -0
package/dist/index.mjs
CHANGED
|
@@ -129,37 +129,203 @@ function ElementsOverlays() {
|
|
|
129
129
|
|
|
130
130
|
// src/init-styles-renderer.ts
|
|
131
131
|
import { getBreakpointsMap } from "@elementor/editor-responsive";
|
|
132
|
+
import { getStylesSchema } from "@elementor/editor-styles";
|
|
132
133
|
import { stylesRepository } from "@elementor/editor-styles-repository";
|
|
133
134
|
import { __privateListenTo as listenTo, v1ReadyEvent } from "@elementor/editor-v1-adapters";
|
|
134
135
|
|
|
135
|
-
// src/
|
|
136
|
+
// src/renderers/create-props-resolver.ts
|
|
137
|
+
import {
|
|
138
|
+
isTransformable
|
|
139
|
+
} from "@elementor/editor-props";
|
|
140
|
+
|
|
141
|
+
// src/renderers/multi-props.ts
|
|
142
|
+
var isMultiProps = (propValue) => {
|
|
143
|
+
return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
|
|
144
|
+
};
|
|
145
|
+
var createMultiPropsValue = (props) => {
|
|
146
|
+
return {
|
|
147
|
+
"$$multi-props": true,
|
|
148
|
+
value: props
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
var getMultiPropsValue = (multiProps) => {
|
|
152
|
+
return multiProps.value;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// src/renderers/create-props-resolver.ts
|
|
156
|
+
var TRANSFORM_DEPTH_LIMIT = 3;
|
|
157
|
+
function createPropsResolver(transformers, { onPropResolve } = {}) {
|
|
158
|
+
async function transform({ value, key, type, signal, depth = 0 }) {
|
|
159
|
+
if (value === null || value === void 0) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (!isTransformable(value)) {
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
if (depth > TRANSFORM_DEPTH_LIMIT) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
if (value.disabled === true) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
if (type.kind === "union") {
|
|
172
|
+
type = type.prop_types[value.$$type];
|
|
173
|
+
if (!type) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
let resolvedValue = value.value;
|
|
178
|
+
if (type.kind === "object") {
|
|
179
|
+
resolvedValue = await resolve({
|
|
180
|
+
props: resolvedValue,
|
|
181
|
+
schema: type.shape,
|
|
182
|
+
signal
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (type.kind === "array") {
|
|
186
|
+
resolvedValue = await Promise.all(
|
|
187
|
+
resolvedValue.map(
|
|
188
|
+
(item) => transform({ value: item, key, type: type.item_prop_type, depth, signal })
|
|
189
|
+
)
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const transformer = transformers[value.$$type];
|
|
193
|
+
if (!transformer) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const transformed = await transformer(resolvedValue, { key, signal });
|
|
198
|
+
return transform({ value: transformed, key, type, signal, depth: depth + 1 });
|
|
199
|
+
} catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function resolve({ props, schema, signal }) {
|
|
204
|
+
const promises = Promise.all(
|
|
205
|
+
Object.entries(schema).map(async ([key, type]) => {
|
|
206
|
+
const value = props[key] ?? type.default;
|
|
207
|
+
const transformed = await transform({ value, key, type, signal });
|
|
208
|
+
if (transformed === null) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
onPropResolve?.({ key, value: transformed });
|
|
212
|
+
if (isMultiProps(transformed)) {
|
|
213
|
+
return getMultiPropsValue(transformed);
|
|
214
|
+
}
|
|
215
|
+
return { [key]: transformed };
|
|
216
|
+
})
|
|
217
|
+
);
|
|
218
|
+
return Object.assign({}, ...(await promises).filter(Boolean));
|
|
219
|
+
}
|
|
220
|
+
return resolve;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// src/renderers/errors.ts
|
|
224
|
+
import { createError } from "@elementor/utils";
|
|
225
|
+
var UnknownStyleTypeError = createError({
|
|
226
|
+
code: "unknown_style_type",
|
|
227
|
+
message: "Unknown style type"
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// src/renderers/render-styles.ts
|
|
231
|
+
var SELECTORS_MAP = {
|
|
232
|
+
class: "."
|
|
233
|
+
};
|
|
234
|
+
async function renderStyles({
|
|
235
|
+
resolve,
|
|
236
|
+
styles,
|
|
237
|
+
schema,
|
|
238
|
+
breakpoints,
|
|
239
|
+
selectorPrefix = "",
|
|
240
|
+
signal
|
|
241
|
+
}) {
|
|
242
|
+
const stylesCssPromises = styles.map(async (style) => {
|
|
243
|
+
const variantCssPromises = Object.values(style.variants).map(async (variant) => {
|
|
244
|
+
const css = await propsToCss({ props: variant.props, schema, resolve, signal });
|
|
245
|
+
return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
|
|
246
|
+
});
|
|
247
|
+
const variantsCss = await Promise.all(variantCssPromises);
|
|
248
|
+
return wrapCssWithStyleElement(style.id, variantsCss.join(""));
|
|
249
|
+
});
|
|
250
|
+
const stylesCss = await Promise.all(stylesCssPromises);
|
|
251
|
+
return stylesCss.join("");
|
|
252
|
+
}
|
|
253
|
+
function createStyleWrapper(value = "", wrapper) {
|
|
254
|
+
return {
|
|
255
|
+
forStyle: ({ id, type }) => {
|
|
256
|
+
const symbol = SELECTORS_MAP[type];
|
|
257
|
+
if (!symbol) {
|
|
258
|
+
throw new UnknownStyleTypeError({ context: { type } });
|
|
259
|
+
}
|
|
260
|
+
return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
|
|
261
|
+
},
|
|
262
|
+
withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
|
|
263
|
+
withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
|
|
264
|
+
withMediaQuery: (breakpoint) => {
|
|
265
|
+
if (!breakpoint?.type) {
|
|
266
|
+
return createStyleWrapper(value, wrapper);
|
|
267
|
+
}
|
|
268
|
+
const size2 = `${breakpoint.type}:${breakpoint.width}px`;
|
|
269
|
+
return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
|
|
270
|
+
},
|
|
271
|
+
wrap: (css) => {
|
|
272
|
+
const res = `${value}{${css}}`;
|
|
273
|
+
if (!wrapper) {
|
|
274
|
+
return res;
|
|
275
|
+
}
|
|
276
|
+
return wrapper(res);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
async function propsToCss({ props, resolve, signal, schema }) {
|
|
281
|
+
const transformed = await resolve({ props, schema, signal });
|
|
282
|
+
return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
|
|
283
|
+
acc.push(propName + ":" + propValue + ";");
|
|
284
|
+
return acc;
|
|
285
|
+
}, []).join("");
|
|
286
|
+
}
|
|
287
|
+
function wrapCssWithStyleElement(id, css) {
|
|
288
|
+
return `<style data-style-id="${id}">${css}</style>`;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// src/renderers/style-transformers/background-color-overlay-transformer.ts
|
|
136
292
|
var backgroundColorOverlayTransformer = (value) => {
|
|
137
293
|
return `linear-gradient(${value}, ${value})`;
|
|
138
294
|
};
|
|
139
295
|
var background_color_overlay_transformer_default = backgroundColorOverlayTransformer;
|
|
140
296
|
|
|
141
|
-
// src/
|
|
142
|
-
var
|
|
297
|
+
// src/renderers/style-transformers/background-image-overlay-transformer.ts
|
|
298
|
+
var DEFAULT_POSITION_VALUE = "0% 0%";
|
|
143
299
|
var backgroundImageOverlayTransformer = (value) => {
|
|
144
|
-
const {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
resultBackgroundStyle += ` ${repeat}`;
|
|
148
|
-
}
|
|
149
|
-
if (attachment) {
|
|
150
|
-
resultBackgroundStyle += ` ${attachment}`;
|
|
151
|
-
}
|
|
152
|
-
if (position && !size2) {
|
|
153
|
-
resultBackgroundStyle += ` ${position}`;
|
|
154
|
-
}
|
|
155
|
-
if (size2) {
|
|
156
|
-
resultBackgroundStyle += ` ${position || defaultPositionValue} / ${size2}`;
|
|
300
|
+
const { image: imageSrc, size: size2 = null, position = null, repeat = null, attachment = null } = value;
|
|
301
|
+
if (!imageSrc) {
|
|
302
|
+
return null;
|
|
157
303
|
}
|
|
158
|
-
|
|
304
|
+
const backgroundStyles = [
|
|
305
|
+
imageSrc,
|
|
306
|
+
repeat,
|
|
307
|
+
attachment,
|
|
308
|
+
size2 ? `${position || DEFAULT_POSITION_VALUE} / ${size2}` : position
|
|
309
|
+
].filter(Boolean);
|
|
310
|
+
return backgroundStyles.join(" ");
|
|
159
311
|
};
|
|
160
312
|
var background_image_overlay_transformer_default = backgroundImageOverlayTransformer;
|
|
161
313
|
|
|
162
|
-
// src/
|
|
314
|
+
// src/renderers/style-transformers/background-image-position-offset-transformer.ts
|
|
315
|
+
var backgroundImagePositionOffsetTransformer = ({
|
|
316
|
+
x = "0px",
|
|
317
|
+
y = "0px"
|
|
318
|
+
}) => `${x} ${y}`;
|
|
319
|
+
var background_image_position_offset_transformer_default = backgroundImagePositionOffsetTransformer;
|
|
320
|
+
|
|
321
|
+
// src/renderers/style-transformers/background-image-size-scale-transformer.ts
|
|
322
|
+
var backgroundImageSizeScaleTransformer = ({
|
|
323
|
+
width = "auto",
|
|
324
|
+
height = "auto"
|
|
325
|
+
}) => `${width} ${height}`;
|
|
326
|
+
var background_image_size_scale_transformer_default = backgroundImageSizeScaleTransformer;
|
|
327
|
+
|
|
328
|
+
// src/renderers/style-transformers/background-transformer.ts
|
|
163
329
|
var backgroundTransformer = (value) => {
|
|
164
330
|
const overlays = value["background-overlay"] ?? "";
|
|
165
331
|
const color = value.color ?? "";
|
|
@@ -167,27 +333,13 @@ var backgroundTransformer = (value) => {
|
|
|
167
333
|
};
|
|
168
334
|
var background_transformer_default = backgroundTransformer;
|
|
169
335
|
|
|
170
|
-
// src/
|
|
336
|
+
// src/renderers/style-transformers/create-combine-array-transformer.ts
|
|
171
337
|
var createCombineArrayTransformer = (delimiter) => {
|
|
172
338
|
return (value) => value.filter(Boolean).join(delimiter);
|
|
173
339
|
};
|
|
174
340
|
var create_combine_array_transformer_default = createCombineArrayTransformer;
|
|
175
341
|
|
|
176
|
-
// src/
|
|
177
|
-
var isMultiProps = (propValue) => {
|
|
178
|
-
return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
|
|
179
|
-
};
|
|
180
|
-
var createMultiPropsValue = (props) => {
|
|
181
|
-
return {
|
|
182
|
-
"$$multi-props": true,
|
|
183
|
-
value: props
|
|
184
|
-
};
|
|
185
|
-
};
|
|
186
|
-
var getMultiPropsValue = (multiProps) => {
|
|
187
|
-
return multiProps.value;
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// src/styles-renderer/transformers/create-corner-sizes-transformer.ts
|
|
342
|
+
// src/renderers/style-transformers/create-corner-sizes-transformer.ts
|
|
191
343
|
var validCorners = ["top-left", "top-right", "bottom-left", "bottom-right"];
|
|
192
344
|
var createCornerSizesTransformer = (keyGenerator) => (value) => {
|
|
193
345
|
const props = Object.entries(value).reduce((acc, [corner, cornerValue]) => {
|
|
@@ -201,7 +353,7 @@ var createCornerSizesTransformer = (keyGenerator) => (value) => {
|
|
|
201
353
|
};
|
|
202
354
|
var create_corner_sizes_transformer_default = createCornerSizesTransformer;
|
|
203
355
|
|
|
204
|
-
// src/
|
|
356
|
+
// src/renderers/style-transformers/create-edge-sizes-transformer.ts
|
|
205
357
|
var validEdges = ["top", "right", "bottom", "left"];
|
|
206
358
|
var createEdgeSizesTransformer = (keyGenerator) => (value) => {
|
|
207
359
|
const props = Object.entries(value).reduce((acc, [edge, edgeValue]) => {
|
|
@@ -215,7 +367,7 @@ var createEdgeSizesTransformer = (keyGenerator) => (value) => {
|
|
|
215
367
|
};
|
|
216
368
|
var create_edge_sizes_transformer_default = createEdgeSizesTransformer;
|
|
217
369
|
|
|
218
|
-
// src/
|
|
370
|
+
// src/renderers/style-transformers/dimensions.ts
|
|
219
371
|
var validKeys = ["top", "right", "bottom", "left"];
|
|
220
372
|
var dimensions = (value, { key }) => {
|
|
221
373
|
const parsed = Object.entries(value).reduce((acc, [dimensionKey, dimensionValue]) => {
|
|
@@ -228,25 +380,40 @@ var dimensions = (value, { key }) => {
|
|
|
228
380
|
};
|
|
229
381
|
var dimensions_default = dimensions;
|
|
230
382
|
|
|
231
|
-
// src/
|
|
383
|
+
// src/renderers/style-transformers/image.ts
|
|
384
|
+
var imageTransformer = (value) => {
|
|
385
|
+
const { src, size: size2 } = value;
|
|
386
|
+
if (src.url) {
|
|
387
|
+
return `url(${src.url})`;
|
|
388
|
+
}
|
|
389
|
+
const sizeUrl = src.attachment?.sizes[size2]?.url;
|
|
390
|
+
if (sizeUrl) {
|
|
391
|
+
return `url(${sizeUrl})`;
|
|
392
|
+
}
|
|
393
|
+
const attachmentUrl = src.attachment?.url;
|
|
394
|
+
if (attachmentUrl) {
|
|
395
|
+
return `url(${attachmentUrl})`;
|
|
396
|
+
}
|
|
397
|
+
return null;
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// src/renderers/style-transformers/image-attachment.ts
|
|
232
401
|
import { getMediaAttachment } from "@elementor/wp-media";
|
|
233
402
|
var imageAttachmentTransformer = async (value) => {
|
|
234
403
|
const attachment = await getMediaAttachment({ id: value });
|
|
235
404
|
if (!attachment) {
|
|
236
405
|
return null;
|
|
237
406
|
}
|
|
238
|
-
return attachment
|
|
407
|
+
return attachment;
|
|
239
408
|
};
|
|
240
409
|
|
|
241
|
-
// src/
|
|
242
|
-
var imageSrcTransformer = (value) => {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
};
|
|
410
|
+
// src/renderers/style-transformers/image-src.ts
|
|
411
|
+
var imageSrcTransformer = (value) => ({
|
|
412
|
+
attachment: value.id,
|
|
413
|
+
url: value.url
|
|
414
|
+
});
|
|
248
415
|
|
|
249
|
-
// src/
|
|
416
|
+
// src/renderers/style-transformers/layout-direction-transformer.ts
|
|
250
417
|
var validKeys2 = ["row", "column"];
|
|
251
418
|
var layoutDirectionTransformer = (value, { key }) => {
|
|
252
419
|
const parsed = Object.entries(value).reduce((acc, [dimensionKey, dimensionValue]) => {
|
|
@@ -259,31 +426,31 @@ var layoutDirectionTransformer = (value, { key }) => {
|
|
|
259
426
|
};
|
|
260
427
|
var layout_direction_transformer_default = layoutDirectionTransformer;
|
|
261
428
|
|
|
262
|
-
// src/
|
|
429
|
+
// src/renderers/style-transformers/primitive-transformer.ts
|
|
263
430
|
var primitiveTransformer = (value) => {
|
|
264
431
|
return value;
|
|
265
432
|
};
|
|
266
433
|
|
|
267
|
-
// src/
|
|
434
|
+
// src/renderers/style-transformers/shadow-transformer.ts
|
|
268
435
|
var shadowTransformer = (value) => {
|
|
269
436
|
return [value.hOffset, value.vOffset, value.blur, value.spread, value.color, value.position].filter(Boolean).join(" ");
|
|
270
437
|
};
|
|
271
438
|
var shadow_transformer_default = shadowTransformer;
|
|
272
439
|
|
|
273
|
-
// src/
|
|
440
|
+
// src/renderers/style-transformers/size-transformer.ts
|
|
274
441
|
var sizeTransformer = (value) => {
|
|
275
442
|
return `${value.size}${value.unit}`;
|
|
276
443
|
};
|
|
277
444
|
var size_transformer_default = sizeTransformer;
|
|
278
445
|
|
|
279
|
-
// src/
|
|
446
|
+
// src/renderers/style-transformers/stroke-transformer.ts
|
|
280
447
|
var strokeTransformer = (value) => {
|
|
281
448
|
return `${value.width} ${value.color}`;
|
|
282
449
|
};
|
|
283
450
|
var stroke_transformer_default = strokeTransformer;
|
|
284
451
|
|
|
285
|
-
// src/
|
|
286
|
-
var
|
|
452
|
+
// src/renderers/style-transformers/index.ts
|
|
453
|
+
var styleTransformers = {
|
|
287
454
|
size: size_transformer_default,
|
|
288
455
|
shadow: shadow_transformer_default,
|
|
289
456
|
stroke: stroke_transformer_default,
|
|
@@ -291,182 +458,28 @@ var transformers_default = {
|
|
|
291
458
|
color: primitiveTransformer,
|
|
292
459
|
number: primitiveTransformer,
|
|
293
460
|
string: primitiveTransformer,
|
|
461
|
+
url: primitiveTransformer,
|
|
294
462
|
dimensions: dimensions_default,
|
|
295
463
|
"background-color-overlay": background_color_overlay_transformer_default,
|
|
296
464
|
"background-image-overlay": background_image_overlay_transformer_default,
|
|
465
|
+
"background-image-position-offset": background_image_position_offset_transformer_default,
|
|
466
|
+
"background-image-size-scale": background_image_size_scale_transformer_default,
|
|
297
467
|
"background-overlay": create_combine_array_transformer_default(","),
|
|
298
468
|
"box-shadow": create_combine_array_transformer_default(","),
|
|
299
469
|
"border-width": create_edge_sizes_transformer_default((edgeKey) => `border-${edgeKey}-width`),
|
|
300
470
|
"border-radius": create_corner_sizes_transformer_default((cornerKey) => `border-${cornerKey}-radius`),
|
|
301
471
|
"image-attachment-id": imageAttachmentTransformer,
|
|
302
472
|
"image-src": imageSrcTransformer,
|
|
473
|
+
image: imageTransformer,
|
|
303
474
|
"layout-direction": layout_direction_transformer_default
|
|
304
475
|
};
|
|
305
476
|
|
|
306
|
-
// src/styles-renderer/render.ts
|
|
307
|
-
import {
|
|
308
|
-
getStylesSchema
|
|
309
|
-
} from "@elementor/editor-styles";
|
|
310
|
-
|
|
311
|
-
// src/styles-renderer/errors.ts
|
|
312
|
-
import { createError } from "@elementor/utils";
|
|
313
|
-
var UnknownStyleTypeError = createError({
|
|
314
|
-
code: "unknown_style_type",
|
|
315
|
-
message: "Unknown style type"
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
// src/styles-renderer/resolve.ts
|
|
319
|
-
import { isTransformable } from "@elementor/editor-props";
|
|
320
|
-
var TRANSFORM_DEPTH_LIMIT = 3;
|
|
321
|
-
async function resolve({ props, schema, transformers, signal }) {
|
|
322
|
-
const promises = Promise.all(
|
|
323
|
-
Object.entries(schema).map(async ([propKey, propType]) => {
|
|
324
|
-
const value = props[propKey] ?? propType.default;
|
|
325
|
-
const transformed = await transform(value, propKey, propType, transformers, 0, signal);
|
|
326
|
-
if (transformed === null) {
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (isMultiProps(transformed)) {
|
|
330
|
-
return getMultiPropsValue(transformed);
|
|
331
|
-
}
|
|
332
|
-
return { [propKey]: transformed };
|
|
333
|
-
})
|
|
334
|
-
);
|
|
335
|
-
return Object.assign({}, ...(await promises).filter(Boolean));
|
|
336
|
-
}
|
|
337
|
-
async function transform(value, propKey, propType, transformers, depth = 0, signal) {
|
|
338
|
-
if (!value && value !== 0) {
|
|
339
|
-
return null;
|
|
340
|
-
}
|
|
341
|
-
if (!isTransformable(value)) {
|
|
342
|
-
return value;
|
|
343
|
-
}
|
|
344
|
-
if (depth > TRANSFORM_DEPTH_LIMIT) {
|
|
345
|
-
return null;
|
|
346
|
-
}
|
|
347
|
-
if (value.disabled === true) {
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
if (propType.kind === "union") {
|
|
351
|
-
propType = propType.prop_types[value.$$type];
|
|
352
|
-
if (!propType) {
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
let resolvedValue = value.value;
|
|
357
|
-
if (propType.kind === "object") {
|
|
358
|
-
resolvedValue = await resolve({
|
|
359
|
-
transformers,
|
|
360
|
-
props: resolvedValue,
|
|
361
|
-
schema: propType.shape,
|
|
362
|
-
signal
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
if (propType.kind === "array") {
|
|
366
|
-
resolvedValue = await Promise.all(
|
|
367
|
-
resolvedValue.map(
|
|
368
|
-
(item) => transform(item, propKey, propType.item_prop_type, transformers, depth, signal)
|
|
369
|
-
)
|
|
370
|
-
);
|
|
371
|
-
}
|
|
372
|
-
const transformer = transformers[value.$$type];
|
|
373
|
-
if (!transformer) {
|
|
374
|
-
return null;
|
|
375
|
-
}
|
|
376
|
-
try {
|
|
377
|
-
const transformed = await transformer(resolvedValue, { key: propKey, signal });
|
|
378
|
-
return transform(transformed, propKey, propType, transformers, depth + 1, signal);
|
|
379
|
-
} catch {
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
// src/styles-renderer/render.ts
|
|
385
|
-
var SELECTORS_MAP = {
|
|
386
|
-
class: "."
|
|
387
|
-
};
|
|
388
|
-
async function render({
|
|
389
|
-
transformers,
|
|
390
|
-
styles,
|
|
391
|
-
breakpoints,
|
|
392
|
-
selectorPrefix = "",
|
|
393
|
-
signal
|
|
394
|
-
}) {
|
|
395
|
-
const stylesCssPromises = styles.map(async (style) => {
|
|
396
|
-
const variantCssPromises = Object.values(style.variants).map(async (variant) => {
|
|
397
|
-
const css = await propsToCss(variant.props, transformers, signal);
|
|
398
|
-
return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
|
|
399
|
-
});
|
|
400
|
-
const variantsCss = await Promise.all(variantCssPromises);
|
|
401
|
-
return wrapCssWithStyleElement(style.id, variantsCss.join(""));
|
|
402
|
-
});
|
|
403
|
-
const stylesCss = await Promise.all(stylesCssPromises);
|
|
404
|
-
return stylesCss.join("");
|
|
405
|
-
}
|
|
406
|
-
function createStyleWrapper(value = "", wrapper) {
|
|
407
|
-
return {
|
|
408
|
-
forStyle: ({ id, type }) => {
|
|
409
|
-
const symbol = SELECTORS_MAP[type];
|
|
410
|
-
if (!symbol) {
|
|
411
|
-
throw new UnknownStyleTypeError({ context: { type } });
|
|
412
|
-
}
|
|
413
|
-
return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
|
|
414
|
-
},
|
|
415
|
-
withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
|
|
416
|
-
withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
|
|
417
|
-
withMediaQuery: (breakpoint) => {
|
|
418
|
-
if (!breakpoint?.type) {
|
|
419
|
-
return createStyleWrapper(value, wrapper);
|
|
420
|
-
}
|
|
421
|
-
const size2 = `${breakpoint.type}:${breakpoint.width}px`;
|
|
422
|
-
return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
|
|
423
|
-
},
|
|
424
|
-
wrap: (css) => {
|
|
425
|
-
const res = `${value}{${css}}`;
|
|
426
|
-
if (!wrapper) {
|
|
427
|
-
return res;
|
|
428
|
-
}
|
|
429
|
-
return wrapper(res);
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
async function propsToCss(props, transformers, signal) {
|
|
434
|
-
const schema = getStylesSchema();
|
|
435
|
-
const transformed = await resolve({ props, schema, transformers, signal });
|
|
436
|
-
return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
|
|
437
|
-
acc.push(propName + ":" + propValue + ";");
|
|
438
|
-
return acc;
|
|
439
|
-
}, []).join("");
|
|
440
|
-
}
|
|
441
|
-
function wrapCssWithStyleElement(id, css) {
|
|
442
|
-
return `<style data-style-id="${id}">${css}</style>`;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
// src/styles-renderer/enqueue-used-fonts.ts
|
|
446
|
-
import { ensureError } from "@elementor/utils";
|
|
447
|
-
|
|
448
477
|
// src/sync/enqueue-font.ts
|
|
449
478
|
var enqueueFont = (fontFamily, context = "preview") => {
|
|
450
479
|
const extendedWindow = window;
|
|
451
480
|
return extendedWindow.elementor?.helpers?.enqueueFont?.(fontFamily, context) ?? null;
|
|
452
481
|
};
|
|
453
482
|
|
|
454
|
-
// src/styles-renderer/enqueue-used-fonts.ts
|
|
455
|
-
function enqueueUsedFonts(styles) {
|
|
456
|
-
try {
|
|
457
|
-
styles.forEach((styleDef) => {
|
|
458
|
-
Object.values(styleDef.variants).forEach((variant) => {
|
|
459
|
-
const fontFamily = variant.props["font-family"];
|
|
460
|
-
if (fontFamily?.value) {
|
|
461
|
-
enqueueFont(fontFamily.value);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
} catch (error) {
|
|
466
|
-
console.error(`Cannot enqueue font': ${ensureError(error).message}`);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
483
|
// src/sync/get-canvas-iframe-body.ts
|
|
471
484
|
function getCanvasIframeBody() {
|
|
472
485
|
const extendedWindow = window;
|
|
@@ -478,23 +491,25 @@ var WRAPPER_DATA_ATTR = "data-styles-container";
|
|
|
478
491
|
var SELECTOR_PREFIX = ".elementor";
|
|
479
492
|
function initStylesRenderer() {
|
|
480
493
|
let abortController = null;
|
|
494
|
+
const resolve = createPropsResolver(styleTransformers, { onPropResolve: enqueueUsedFonts });
|
|
481
495
|
listenTo(v1ReadyEvent(), () => {
|
|
482
496
|
stylesRepository.subscribe(async () => {
|
|
483
497
|
const styleContainer = getStylesContainer();
|
|
484
|
-
const breakpoints = getBreakpointsMap();
|
|
485
498
|
const styles = stylesRepository.all().reverse();
|
|
499
|
+
const breakpoints = getBreakpointsMap();
|
|
500
|
+
const schema = getStylesSchema();
|
|
486
501
|
if (abortController) {
|
|
487
502
|
abortController.abort();
|
|
488
503
|
}
|
|
489
504
|
abortController = new AbortController();
|
|
490
|
-
styleContainer.innerHTML = await
|
|
491
|
-
transformers: transformers_default,
|
|
505
|
+
styleContainer.innerHTML = await renderStyles({
|
|
492
506
|
styles,
|
|
507
|
+
resolve,
|
|
493
508
|
breakpoints,
|
|
494
509
|
selectorPrefix: SELECTOR_PREFIX,
|
|
495
|
-
signal: abortController.signal
|
|
510
|
+
signal: abortController.signal,
|
|
511
|
+
schema
|
|
496
512
|
});
|
|
497
|
-
enqueueUsedFonts(styles);
|
|
498
513
|
});
|
|
499
514
|
});
|
|
500
515
|
}
|
|
@@ -514,6 +529,12 @@ function createStylesContainer() {
|
|
|
514
529
|
el.setAttribute(WRAPPER_DATA_ATTR, "");
|
|
515
530
|
return el;
|
|
516
531
|
}
|
|
532
|
+
function enqueueUsedFonts({ key, value }) {
|
|
533
|
+
if (key !== "font-family" || typeof value !== "string") {
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
enqueueFont(value);
|
|
537
|
+
}
|
|
517
538
|
|
|
518
539
|
// src/init.tsx
|
|
519
540
|
function init() {
|