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