@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.
- package/.turbo/turbo-build.log +9 -9
- package/CHANGELOG.md +57 -0
- package/dist/index.js +241 -215
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +243 -217
- 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 +214 -16
- package/src/renderers/__tests__/create-props-resolver.test.ts +175 -0
- package/src/renderers/__tests__/create-props-resolver.transformers.test.ts +325 -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 +7 -9
- 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/style-transformers/stroke-transformer.ts +16 -0
- 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/transformers/stroke-transformer.ts +0 -9
- 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/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,28 +333,14 @@ 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
|
|
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
|
|
191
|
-
var validCorners = ["top-left", "top-right", "bottom-left", "bottom-right"];
|
|
342
|
+
// src/renderers/style-transformers/create-corner-sizes-transformer.ts
|
|
343
|
+
var validCorners = ["start-start", "start-end", "end-start", "end-end"];
|
|
192
344
|
var createCornerSizesTransformer = (keyGenerator) => (value) => {
|
|
193
345
|
const props = Object.entries(value).reduce((acc, [corner, cornerValue]) => {
|
|
194
346
|
if (validCorners.includes(corner)) {
|
|
@@ -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,36 @@ 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
|
+
const parsed = {
|
|
449
|
+
"-webkit-text-stroke": `${value.width} ${value.color}`,
|
|
450
|
+
stroke: `${value.color}`,
|
|
451
|
+
"stroke-width": `${value.width}`
|
|
452
|
+
};
|
|
453
|
+
return createMultiPropsValue(parsed);
|
|
282
454
|
};
|
|
283
455
|
var stroke_transformer_default = strokeTransformer;
|
|
284
456
|
|
|
285
|
-
// src/
|
|
286
|
-
var
|
|
457
|
+
// src/renderers/style-transformers/index.ts
|
|
458
|
+
var styleTransformers = {
|
|
287
459
|
size: size_transformer_default,
|
|
288
460
|
shadow: shadow_transformer_default,
|
|
289
461
|
stroke: stroke_transformer_default,
|
|
@@ -291,182 +463,28 @@ var transformers_default = {
|
|
|
291
463
|
color: primitiveTransformer,
|
|
292
464
|
number: primitiveTransformer,
|
|
293
465
|
string: primitiveTransformer,
|
|
466
|
+
url: primitiveTransformer,
|
|
294
467
|
dimensions: dimensions_default,
|
|
295
468
|
"background-color-overlay": background_color_overlay_transformer_default,
|
|
296
469
|
"background-image-overlay": background_image_overlay_transformer_default,
|
|
470
|
+
"background-image-position-offset": background_image_position_offset_transformer_default,
|
|
471
|
+
"background-image-size-scale": background_image_size_scale_transformer_default,
|
|
297
472
|
"background-overlay": create_combine_array_transformer_default(","),
|
|
298
473
|
"box-shadow": create_combine_array_transformer_default(","),
|
|
299
474
|
"border-width": create_edge_sizes_transformer_default((edgeKey) => `border-${edgeKey}-width`),
|
|
300
475
|
"border-radius": create_corner_sizes_transformer_default((cornerKey) => `border-${cornerKey}-radius`),
|
|
301
476
|
"image-attachment-id": imageAttachmentTransformer,
|
|
302
477
|
"image-src": imageSrcTransformer,
|
|
478
|
+
image: imageTransformer,
|
|
303
479
|
"layout-direction": layout_direction_transformer_default
|
|
304
480
|
};
|
|
305
481
|
|
|
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
482
|
// src/sync/enqueue-font.ts
|
|
449
483
|
var enqueueFont = (fontFamily, context = "preview") => {
|
|
450
484
|
const extendedWindow = window;
|
|
451
485
|
return extendedWindow.elementor?.helpers?.enqueueFont?.(fontFamily, context) ?? null;
|
|
452
486
|
};
|
|
453
487
|
|
|
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
488
|
// src/sync/get-canvas-iframe-body.ts
|
|
471
489
|
function getCanvasIframeBody() {
|
|
472
490
|
const extendedWindow = window;
|
|
@@ -478,23 +496,25 @@ var WRAPPER_DATA_ATTR = "data-styles-container";
|
|
|
478
496
|
var SELECTOR_PREFIX = ".elementor";
|
|
479
497
|
function initStylesRenderer() {
|
|
480
498
|
let abortController = null;
|
|
499
|
+
const resolve = createPropsResolver(styleTransformers, { onPropResolve: enqueueUsedFonts });
|
|
481
500
|
listenTo(v1ReadyEvent(), () => {
|
|
482
501
|
stylesRepository.subscribe(async () => {
|
|
483
502
|
const styleContainer = getStylesContainer();
|
|
484
|
-
const breakpoints = getBreakpointsMap();
|
|
485
503
|
const styles = stylesRepository.all().reverse();
|
|
504
|
+
const breakpoints = getBreakpointsMap();
|
|
505
|
+
const schema = getStylesSchema();
|
|
486
506
|
if (abortController) {
|
|
487
507
|
abortController.abort();
|
|
488
508
|
}
|
|
489
509
|
abortController = new AbortController();
|
|
490
|
-
styleContainer.innerHTML = await
|
|
491
|
-
transformers: transformers_default,
|
|
510
|
+
styleContainer.innerHTML = await renderStyles({
|
|
492
511
|
styles,
|
|
512
|
+
resolve,
|
|
493
513
|
breakpoints,
|
|
494
514
|
selectorPrefix: SELECTOR_PREFIX,
|
|
495
|
-
signal: abortController.signal
|
|
515
|
+
signal: abortController.signal,
|
|
516
|
+
schema
|
|
496
517
|
});
|
|
497
|
-
enqueueUsedFonts(styles);
|
|
498
518
|
});
|
|
499
519
|
});
|
|
500
520
|
}
|
|
@@ -514,6 +534,12 @@ function createStylesContainer() {
|
|
|
514
534
|
el.setAttribute(WRAPPER_DATA_ATTR, "");
|
|
515
535
|
return el;
|
|
516
536
|
}
|
|
537
|
+
function enqueueUsedFonts({ key, value }) {
|
|
538
|
+
if (key !== "font-family" || typeof value !== "string") {
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
enqueueFont(value);
|
|
542
|
+
}
|
|
517
543
|
|
|
518
544
|
// src/init.tsx
|
|
519
545
|
function init() {
|