@elementor/editor-canvas 0.15.4 → 0.18.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 (38) hide show
  1. package/.turbo/turbo-build.log +10 -10
  2. package/CHANGELOG.md +61 -0
  3. package/dist/index.d.mts +6 -1
  4. package/dist/index.d.ts +6 -1
  5. package/dist/index.js +455 -289
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +445 -277
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +8 -7
  10. package/src/__tests__/styles-prop-resolver.test.ts +1 -0
  11. package/src/components/__tests__/style-renderer.test.tsx +65 -0
  12. package/src/components/style-renderer.tsx +30 -0
  13. package/src/hooks/__tests__/use-style-items.test.ts +133 -0
  14. package/src/hooks/__tests__/use-style-prop-resolver.test.ts +51 -0
  15. package/src/hooks/use-floating-on-element.ts +2 -2
  16. package/src/hooks/use-on-mount.ts +13 -0
  17. package/src/hooks/use-style-items.ts +78 -0
  18. package/src/hooks/use-style-prop-resolver.ts +22 -0
  19. package/src/hooks/use-style-renderer.ts +19 -0
  20. package/src/index.ts +2 -3
  21. package/src/init.tsx +9 -2
  22. package/src/legacy/create-element-type.ts +14 -0
  23. package/src/legacy/create-templated-element-type.ts +1 -1
  24. package/src/legacy/types.ts +9 -0
  25. package/src/prevent-link-in-link-commands.ts +132 -0
  26. package/src/renderers/__tests__/{render-styles.test.ts → create-styles-renderer.test.ts} +35 -19
  27. package/src/renderers/{render-styles.ts → create-styles-renderer.ts} +35 -32
  28. package/src/style-commands/__tests__/paste-style.test.ts +5 -5
  29. package/src/style-commands/__tests__/reset-style.test.ts +2 -2
  30. package/src/style-commands/undoable-actions/paste-element-style.ts +3 -3
  31. package/src/style-commands/undoable-actions/reset-element-style.ts +2 -2
  32. package/src/sync/{get-canvas-iframe-body.ts → get-canvas-iframe-head.ts} +2 -2
  33. package/src/sync/types.ts +7 -0
  34. package/src/utils/abort-previous-runs.ts +16 -0
  35. package/src/__tests__/init-styles-renderer.test.ts +0 -112
  36. package/src/init-styles-renderer.ts +0 -84
  37. /package/src/{legacy → utils}/__tests__/signalized-process.test.ts +0 -0
  38. /package/src/{legacy → utils}/signalized-process.ts +0 -0
package/dist/index.js CHANGED
@@ -30,6 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ createTransformer: () => createTransformer,
34
+ init: () => init,
33
35
  settingsTransformersRegistry: () => settingsTransformersRegistry,
34
36
  styleTransformersRegistry: () => styleTransformersRegistry
35
37
  });
@@ -97,8 +99,8 @@ function useFloatingOnElement({ element, isSelected }) {
97
99
  (0, import_react3.size)({
98
100
  apply({ elements, rects }) {
99
101
  Object.assign(elements.floating.style, {
100
- width: `${rects.reference.width}px`,
101
- height: `${rects.reference.height}px`
102
+ width: `${rects.reference.width + 2}px`,
103
+ height: `${rects.reference.height + 2}px`
102
104
  });
103
105
  }
104
106
  }),
@@ -164,6 +166,149 @@ function useElementsDom() {
164
166
  );
165
167
  }
166
168
 
169
+ // src/components/style-renderer.tsx
170
+ var React3 = __toESM(require("react"));
171
+ var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
172
+ var import_ui2 = require("@elementor/ui");
173
+
174
+ // src/hooks/use-style-items.ts
175
+ var import_react8 = require("react");
176
+ var import_editor_styles_repository = require("@elementor/editor-styles-repository");
177
+ var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
178
+
179
+ // src/utils/abort-previous-runs.ts
180
+ function abortPreviousRuns(cb) {
181
+ let abortController = null;
182
+ return (...args) => {
183
+ if (abortController) {
184
+ abortController.abort();
185
+ }
186
+ abortController = new AbortController();
187
+ return cb(abortController, ...args);
188
+ };
189
+ }
190
+
191
+ // src/utils/signalized-process.ts
192
+ function signalizedProcess(signal, steps = []) {
193
+ return {
194
+ then: (cb) => {
195
+ steps.push(cb);
196
+ return signalizedProcess(signal, steps);
197
+ },
198
+ execute: async () => {
199
+ let lastResult;
200
+ for (const step of steps) {
201
+ if (signal.aborted) {
202
+ break;
203
+ }
204
+ lastResult = await step(lastResult, signal);
205
+ }
206
+ }
207
+ };
208
+ }
209
+
210
+ // src/hooks/use-on-mount.ts
211
+ var import_react5 = require("react");
212
+ function useOnMount(cb) {
213
+ const mounted = (0, import_react5.useRef)(false);
214
+ (0, import_react5.useEffect)(() => {
215
+ if (!mounted.current) {
216
+ mounted.current = true;
217
+ cb();
218
+ }
219
+ }, []);
220
+ }
221
+
222
+ // src/hooks/use-style-prop-resolver.ts
223
+ var import_react6 = require("react");
224
+ var import_editor_styles = require("@elementor/editor-styles");
225
+
226
+ // src/renderers/create-props-resolver.ts
227
+ var import_editor_props = require("@elementor/editor-props");
228
+
229
+ // src/renderers/multi-props.ts
230
+ var isMultiProps = (propValue) => {
231
+ return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
232
+ };
233
+ var createMultiPropsValue = (props) => {
234
+ return {
235
+ "$$multi-props": true,
236
+ value: props
237
+ };
238
+ };
239
+ var getMultiPropsValue = (multiProps) => {
240
+ return multiProps.value;
241
+ };
242
+
243
+ // src/renderers/create-props-resolver.ts
244
+ var TRANSFORM_DEPTH_LIMIT = 3;
245
+ function createPropsResolver({ transformers, schema: initialSchema, onPropResolve }) {
246
+ async function resolve({ props, schema, signal }) {
247
+ schema = schema ?? initialSchema;
248
+ const promises = Promise.all(
249
+ Object.entries(schema).map(async ([key, type]) => {
250
+ const value = props[key] ?? type.default;
251
+ const transformed = await transform({ value, key, type, signal });
252
+ onPropResolve?.({ key, value: transformed });
253
+ if (isMultiProps(transformed)) {
254
+ return getMultiPropsValue(transformed);
255
+ }
256
+ return { [key]: transformed };
257
+ })
258
+ );
259
+ return Object.assign({}, ...(await promises).filter(Boolean));
260
+ }
261
+ async function transform({ value, key, type, signal, depth = 0 }) {
262
+ if (value === null || value === void 0) {
263
+ return null;
264
+ }
265
+ if (!(0, import_editor_props.isTransformable)(value)) {
266
+ return value;
267
+ }
268
+ if (depth > TRANSFORM_DEPTH_LIMIT) {
269
+ return null;
270
+ }
271
+ if (value.disabled === true) {
272
+ return null;
273
+ }
274
+ if (type.kind === "union") {
275
+ type = type.prop_types[value.$$type];
276
+ if (!type) {
277
+ return null;
278
+ }
279
+ }
280
+ if (value.$$type !== type.key) {
281
+ return null;
282
+ }
283
+ let resolvedValue = value.value;
284
+ if (type.kind === "object") {
285
+ resolvedValue = await resolve({
286
+ props: resolvedValue,
287
+ schema: type.shape,
288
+ signal
289
+ });
290
+ }
291
+ if (type.kind === "array") {
292
+ resolvedValue = await Promise.all(
293
+ resolvedValue.map(
294
+ (item) => transform({ value: item, key, type: type.item_prop_type, depth, signal })
295
+ )
296
+ );
297
+ }
298
+ const transformer = transformers.get(value.$$type);
299
+ if (!transformer) {
300
+ return null;
301
+ }
302
+ try {
303
+ const transformed = await transformer(resolvedValue, { key, signal });
304
+ return transform({ value: transformed, key, type, signal, depth: depth + 1 });
305
+ } catch {
306
+ return null;
307
+ }
308
+ }
309
+ return resolve;
310
+ }
311
+
167
312
  // src/transformers/create-transformers-registry.ts
168
313
  function createTransformersRegistry() {
169
314
  const transformers = {};
@@ -183,6 +328,176 @@ function createTransformersRegistry() {
183
328
  };
184
329
  }
185
330
 
331
+ // src/style-transformers-registry.ts
332
+ var styleTransformersRegistry = createTransformersRegistry();
333
+
334
+ // src/sync/enqueue-font.ts
335
+ var enqueueFont = (fontFamily, context = "preview") => {
336
+ const extendedWindow = window;
337
+ return extendedWindow.elementor?.helpers?.enqueueFont?.(fontFamily, context) ?? null;
338
+ };
339
+
340
+ // src/hooks/use-style-prop-resolver.ts
341
+ function useStylePropResolver() {
342
+ return (0, import_react6.useMemo)(() => {
343
+ return createPropsResolver({
344
+ transformers: styleTransformersRegistry,
345
+ schema: (0, import_editor_styles.getStylesSchema)(),
346
+ onPropResolve: ({ key, value }) => {
347
+ if (key !== "font-family" || typeof value !== "string") {
348
+ return;
349
+ }
350
+ enqueueFont(value);
351
+ }
352
+ });
353
+ }, []);
354
+ }
355
+
356
+ // src/hooks/use-style-renderer.ts
357
+ var import_react7 = require("react");
358
+ var import_editor_responsive = require("@elementor/editor-responsive");
359
+
360
+ // src/renderers/errors.ts
361
+ var import_utils = require("@elementor/utils");
362
+ var UnknownStyleTypeError = (0, import_utils.createError)({
363
+ code: "unknown_style_type",
364
+ message: "Unknown style type"
365
+ });
366
+
367
+ // src/renderers/create-styles-renderer.ts
368
+ var SELECTORS_MAP = {
369
+ class: "."
370
+ };
371
+ function createStylesRenderer({ resolve, breakpoints, selectorPrefix = "" }) {
372
+ return async ({ styles, signal }) => {
373
+ const stylesCssPromises = styles.map(async (style) => {
374
+ const variantCssPromises = Object.values(style.variants).map(async (variant) => {
375
+ const css = await propsToCss({ props: variant.props, resolve, signal });
376
+ return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
377
+ });
378
+ const variantsCss = await Promise.all(variantCssPromises);
379
+ return {
380
+ id: style.id,
381
+ value: variantsCss.join("")
382
+ };
383
+ });
384
+ return await Promise.all(stylesCssPromises);
385
+ };
386
+ }
387
+ function createStyleWrapper(value = "", wrapper) {
388
+ return {
389
+ forStyle: ({ id, type }) => {
390
+ const symbol = SELECTORS_MAP[type];
391
+ if (!symbol) {
392
+ throw new UnknownStyleTypeError({ context: { type } });
393
+ }
394
+ return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
395
+ },
396
+ withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
397
+ withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
398
+ withMediaQuery: (breakpoint) => {
399
+ if (!breakpoint?.type) {
400
+ return createStyleWrapper(value, wrapper);
401
+ }
402
+ const size2 = `${breakpoint.type}:${breakpoint.width}px`;
403
+ return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
404
+ },
405
+ wrap: (css) => {
406
+ const res = `${value}{${css}}`;
407
+ if (!wrapper) {
408
+ return res;
409
+ }
410
+ return wrapper(res);
411
+ }
412
+ };
413
+ }
414
+ async function propsToCss({ props, resolve, signal }) {
415
+ const transformed = await resolve({ props, signal });
416
+ return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
417
+ if (propValue === null) {
418
+ return acc;
419
+ }
420
+ acc.push(propName + ":" + propValue + ";");
421
+ return acc;
422
+ }, []).join("");
423
+ }
424
+
425
+ // src/hooks/use-style-renderer.ts
426
+ var SELECTOR_PREFIX = ".elementor";
427
+ function useStyleRenderer(resolve) {
428
+ const breakpoints = (0, import_editor_responsive.useBreakpointsMap)();
429
+ return (0, import_react7.useMemo)(() => {
430
+ return createStylesRenderer({
431
+ selectorPrefix: SELECTOR_PREFIX,
432
+ breakpoints,
433
+ resolve
434
+ });
435
+ }, [resolve, breakpoints]);
436
+ }
437
+
438
+ // src/hooks/use-style-items.ts
439
+ function useStyleItems() {
440
+ const resolve = useStylePropResolver();
441
+ const renderStyles = useStyleRenderer(resolve);
442
+ const [styleItems, setStyleItems] = (0, import_react8.useState)({});
443
+ const providerAndSubscribers = (0, import_react8.useMemo)(() => {
444
+ return import_editor_styles_repository.stylesRepository.getProviders().map((provider) => {
445
+ return {
446
+ provider,
447
+ subscriber: createProviderSubscriber({
448
+ provider,
449
+ renderStyles,
450
+ setStyleItems
451
+ })
452
+ };
453
+ });
454
+ }, [renderStyles]);
455
+ (0, import_react8.useEffect)(() => {
456
+ const unsubscribes = providerAndSubscribers.map(
457
+ ({ provider, subscriber }) => provider.subscribe(subscriber)
458
+ );
459
+ return () => {
460
+ unsubscribes.forEach((unsubscribe) => unsubscribe());
461
+ };
462
+ }, [providerAndSubscribers]);
463
+ useOnMount(() => {
464
+ (0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", async () => {
465
+ const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
466
+ await Promise.all(promises);
467
+ });
468
+ });
469
+ return Object.values(styleItems).sort(({ provider: providerA }, { provider: providerB }) => providerA.priority - providerB.priority).flatMap(({ items }) => items);
470
+ }
471
+ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
472
+ return abortPreviousRuns(
473
+ (abortController) => signalizedProcess(abortController.signal).then((_, signal) => renderStyles({ styles: provider.actions.all(), signal })).then((items) => {
474
+ setStyleItems((prev) => ({
475
+ ...prev,
476
+ [provider.getKey()]: { provider, items }
477
+ }));
478
+ }).execute()
479
+ );
480
+ }
481
+
482
+ // src/sync/get-canvas-iframe-head.ts
483
+ function getCanvasIframeHead() {
484
+ const extendedWindow = window;
485
+ return extendedWindow.elementor?.$preview?.[0]?.contentDocument?.head;
486
+ }
487
+
488
+ // src/components/style-renderer.tsx
489
+ function StyleRenderer() {
490
+ const container = usePortalContainer();
491
+ const styleItems = useStyleItems();
492
+ if (!container) {
493
+ return null;
494
+ }
495
+ return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, styleItems.map((item) => /* @__PURE__ */ React3.createElement("style", { "data-e-style-id": item.id, key: item.id }, item.value)));
496
+ }
497
+ function usePortalContainer() {
498
+ return (0, import_editor_v1_adapters3.__privateUseListenTo)((0, import_editor_v1_adapters3.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeHead());
499
+ }
500
+
186
501
  // src/settings-transformers-registry.ts
187
502
  var settingsTransformersRegistry = createTransformersRegistry();
188
503
 
@@ -247,9 +562,6 @@ function initSettingsTransformers() {
247
562
  settingsTransformersRegistry.register("classes", arrayTransformer).register("link", linkTransformer).register("image", imageTransformer).register("image-src", imageSrcTransformer).registerFallback(plainTransformer);
248
563
  }
249
564
 
250
- // src/style-transformers-registry.ts
251
- var styleTransformersRegistry = createTransformersRegistry();
252
-
253
565
  // src/transformers/styles/background-color-overlay-transformer.ts
254
566
  var backgroundColorOverlayTransformer = createTransformer((value) => {
255
567
  const { color = null } = value;
@@ -311,20 +623,6 @@ var createCombineArrayTransformer = (delimiter) => {
311
623
  return createTransformer((value) => value.filter(Boolean).join(delimiter));
312
624
  };
313
625
 
314
- // src/renderers/multi-props.ts
315
- var isMultiProps = (propValue) => {
316
- return !!propValue && typeof propValue === "object" && "$$multi-props" in propValue && propValue["$$multi-props"] === true;
317
- };
318
- var createMultiPropsValue = (props) => {
319
- return {
320
- "$$multi-props": true,
321
- value: props
322
- };
323
- };
324
- var getMultiPropsValue = (multiProps) => {
325
- return multiProps.value;
326
- };
327
-
328
626
  // src/transformers/styles/create-multi-props-transformer.ts
329
627
  var createMultiPropsTransformer = (keys, keyGenerator) => {
330
628
  return createTransformer((value, { key: propKey }) => {
@@ -379,221 +677,9 @@ function initStyleTransformers() {
379
677
  ).registerFallback(plainTransformer);
380
678
  }
381
679
 
382
- // src/init-styles-renderer.ts
383
- var import_editor_responsive = require("@elementor/editor-responsive");
384
- var import_editor_styles = require("@elementor/editor-styles");
385
- var import_editor_styles_repository = require("@elementor/editor-styles-repository");
386
- var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
387
-
388
- // src/renderers/create-props-resolver.ts
389
- var import_editor_props = require("@elementor/editor-props");
390
- var TRANSFORM_DEPTH_LIMIT = 3;
391
- function createPropsResolver({ transformers, schema: initialSchema, onPropResolve }) {
392
- async function resolve({ props, schema, signal }) {
393
- schema = schema ?? initialSchema;
394
- const promises = Promise.all(
395
- Object.entries(schema).map(async ([key, type]) => {
396
- const value = props[key] ?? type.default;
397
- const transformed = await transform({ value, key, type, signal });
398
- onPropResolve?.({ key, value: transformed });
399
- if (isMultiProps(transformed)) {
400
- return getMultiPropsValue(transformed);
401
- }
402
- return { [key]: transformed };
403
- })
404
- );
405
- return Object.assign({}, ...(await promises).filter(Boolean));
406
- }
407
- async function transform({ value, key, type, signal, depth = 0 }) {
408
- if (value === null || value === void 0) {
409
- return null;
410
- }
411
- if (!(0, import_editor_props.isTransformable)(value)) {
412
- return value;
413
- }
414
- if (depth > TRANSFORM_DEPTH_LIMIT) {
415
- return null;
416
- }
417
- if (value.disabled === true) {
418
- return null;
419
- }
420
- if (type.kind === "union") {
421
- type = type.prop_types[value.$$type];
422
- if (!type) {
423
- return null;
424
- }
425
- }
426
- if (value.$$type !== type.key) {
427
- return null;
428
- }
429
- let resolvedValue = value.value;
430
- if (type.kind === "object") {
431
- resolvedValue = await resolve({
432
- props: resolvedValue,
433
- schema: type.shape,
434
- signal
435
- });
436
- }
437
- if (type.kind === "array") {
438
- resolvedValue = await Promise.all(
439
- resolvedValue.map(
440
- (item) => transform({ value: item, key, type: type.item_prop_type, depth, signal })
441
- )
442
- );
443
- }
444
- const transformer = transformers.get(value.$$type);
445
- if (!transformer) {
446
- return null;
447
- }
448
- try {
449
- const transformed = await transformer(resolvedValue, { key, signal });
450
- return transform({ value: transformed, key, type, signal, depth: depth + 1 });
451
- } catch {
452
- return null;
453
- }
454
- }
455
- return resolve;
456
- }
457
-
458
- // src/renderers/errors.ts
459
- var import_utils = require("@elementor/utils");
460
- var UnknownStyleTypeError = (0, import_utils.createError)({
461
- code: "unknown_style_type",
462
- message: "Unknown style type"
463
- });
464
-
465
- // src/renderers/render-styles.ts
466
- var SELECTORS_MAP = {
467
- class: "."
468
- };
469
- async function renderStyles({
470
- resolve,
471
- styles,
472
- breakpoints,
473
- selectorPrefix = "",
474
- signal
475
- }) {
476
- const stylesCssPromises = styles.map(async (style) => {
477
- const variantCssPromises = Object.values(style.variants).map(async (variant) => {
478
- const css = await propsToCss({ props: variant.props, resolve, signal });
479
- return createStyleWrapper().forStyle(style).withPrefix(selectorPrefix).withState(variant.meta.state).withMediaQuery(variant.meta.breakpoint ? breakpoints[variant.meta.breakpoint] : null).wrap(css);
480
- });
481
- const variantsCss = await Promise.all(variantCssPromises);
482
- return wrapCssWithStyleElement(style.id, variantsCss.join(""));
483
- });
484
- const stylesCss = await Promise.all(stylesCssPromises);
485
- return stylesCss.join("");
486
- }
487
- function createStyleWrapper(value = "", wrapper) {
488
- return {
489
- forStyle: ({ id, type }) => {
490
- const symbol = SELECTORS_MAP[type];
491
- if (!symbol) {
492
- throw new UnknownStyleTypeError({ context: { type } });
493
- }
494
- return createStyleWrapper(`${value}${symbol}${id}`, wrapper);
495
- },
496
- withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
497
- withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
498
- withMediaQuery: (breakpoint) => {
499
- if (!breakpoint?.type) {
500
- return createStyleWrapper(value, wrapper);
501
- }
502
- const size2 = `${breakpoint.type}:${breakpoint.width}px`;
503
- return createStyleWrapper(value, (css) => `@media(${size2}){${css}}`);
504
- },
505
- wrap: (css) => {
506
- const res = `${value}{${css}}`;
507
- if (!wrapper) {
508
- return res;
509
- }
510
- return wrapper(res);
511
- }
512
- };
513
- }
514
- async function propsToCss({ props, resolve, signal }) {
515
- const transformed = await resolve({ props, signal });
516
- return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
517
- if (propValue === null) {
518
- return acc;
519
- }
520
- acc.push(propName + ":" + propValue + ";");
521
- return acc;
522
- }, []).join("");
523
- }
524
- function wrapCssWithStyleElement(id, css) {
525
- return `<style data-style-id="${id}">${css}</style>`;
526
- }
527
-
528
- // src/sync/enqueue-font.ts
529
- var enqueueFont = (fontFamily, context = "preview") => {
530
- const extendedWindow = window;
531
- return extendedWindow.elementor?.helpers?.enqueueFont?.(fontFamily, context) ?? null;
532
- };
533
-
534
- // src/sync/get-canvas-iframe-body.ts
535
- function getCanvasIframeBody() {
536
- const extendedWindow = window;
537
- return extendedWindow.elementor?.$preview?.[0]?.contentDocument?.body;
538
- }
539
-
540
- // src/init-styles-renderer.ts
541
- var WRAPPER_DATA_ATTR = "data-styles-container";
542
- var SELECTOR_PREFIX = ".elementor";
543
- function initStylesRenderer() {
544
- (0, import_editor_v1_adapters2.__privateListenTo)((0, import_editor_v1_adapters2.v1ReadyEvent)(), () => {
545
- let abortController = null;
546
- const resolve = createPropsResolver({
547
- transformers: styleTransformersRegistry,
548
- schema: (0, import_editor_styles.getStylesSchema)(),
549
- onPropResolve: enqueueUsedFonts
550
- });
551
- const injectStyleElements = async () => {
552
- const styleContainer = getStylesContainer();
553
- const styles = import_editor_styles_repository.stylesRepository.all().reverse();
554
- const breakpoints = (0, import_editor_responsive.getBreakpointsMap)();
555
- if (abortController) {
556
- abortController.abort();
557
- }
558
- abortController = new AbortController();
559
- styleContainer.innerHTML = await renderStyles({
560
- styles,
561
- resolve,
562
- breakpoints,
563
- selectorPrefix: SELECTOR_PREFIX,
564
- signal: abortController.signal
565
- });
566
- };
567
- import_editor_styles_repository.stylesRepository.subscribe(injectStyleElements);
568
- (0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", injectStyleElements);
569
- });
570
- }
571
- function getStylesContainer() {
572
- const preview = getCanvasIframeBody();
573
- const stylesContainer = preview?.querySelector(`[${WRAPPER_DATA_ATTR}]`);
574
- if (stylesContainer) {
575
- return stylesContainer;
576
- }
577
- const el = createStylesContainer();
578
- preview?.prepend(el);
579
- return el;
580
- }
581
- function createStylesContainer() {
582
- const el = document.createElement("div");
583
- el.style.display = "none";
584
- el.setAttribute(WRAPPER_DATA_ATTR, "");
585
- return el;
586
- }
587
- function enqueueUsedFonts({ key, value }) {
588
- if (key !== "font-family" || typeof value !== "string") {
589
- return;
590
- }
591
- enqueueFont(value);
592
- }
593
-
594
680
  // src/legacy/init-legacy-views.ts
595
681
  var import_editor_elements2 = require("@elementor/editor-elements");
596
- var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
682
+ var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
597
683
 
598
684
  // src/renderers/create-dom-renderer.ts
599
685
  var import_twing = require("@elementor/twing");
@@ -659,11 +745,13 @@ function createElementViewClassDeclaration() {
659
745
  onRender(...args) {
660
746
  super.onRender(...args);
661
747
  this.#dispatchEvent("elementor/preview/atomic-widget/render");
748
+ this.#dispatchPreviewEvent("elementor/element/render");
662
749
  }
663
750
  // Dispatch `destroy` event so the overlay layer will be updated
664
751
  onDestroy(...args) {
665
752
  super.onDestroy(...args);
666
753
  this.#dispatchEvent("elementor/preview/atomic-widget/destroy");
754
+ this.#dispatchPreviewEvent("elementor/element/destroy");
667
755
  }
668
756
  attributes() {
669
757
  return {
@@ -697,31 +785,23 @@ function createElementViewClassDeclaration() {
697
785
  })
698
786
  );
699
787
  }
788
+ #dispatchPreviewEvent(eventType) {
789
+ legacyWindow.elementor?.$preview?.[0]?.contentWindow.dispatchEvent(
790
+ new CustomEvent(eventType, {
791
+ detail: {
792
+ id: this.model.get("id"),
793
+ type: this.model.get("widgetType"),
794
+ element: this.getDomElement().get(0)
795
+ }
796
+ })
797
+ );
798
+ }
700
799
  getContextMenuGroups() {
701
800
  return super.getContextMenuGroups().filter((group) => group.name !== "save");
702
801
  }
703
802
  };
704
803
  }
705
804
 
706
- // src/legacy/signalized-process.ts
707
- function signalizedProcess(signal, steps = []) {
708
- return {
709
- then: (cb) => {
710
- steps.push(cb);
711
- return signalizedProcess(signal, steps);
712
- },
713
- execute: async () => {
714
- let lastResult;
715
- for (const step of steps) {
716
- if (signal.aborted) {
717
- break;
718
- }
719
- lastResult = await step(lastResult, signal);
720
- }
721
- }
722
- };
723
- }
724
-
725
805
  // src/legacy/create-templated-element-type.ts
726
806
  function createTemplatedElementType({ type, renderer, element }) {
727
807
  const legacyWindow = window;
@@ -802,7 +882,7 @@ function createTemplatedElementViewClassDeclaration({
802
882
 
803
883
  // src/legacy/init-legacy-views.ts
804
884
  function initLegacyViews() {
805
- (0, import_editor_v1_adapters3.__privateListenTo)((0, import_editor_v1_adapters3.v1ReadyEvent)(), () => {
885
+ (0, import_editor_v1_adapters4.__privateListenTo)((0, import_editor_v1_adapters4.v1ReadyEvent)(), () => {
806
886
  const config = (0, import_editor_elements2.getWidgetsCache)() ?? {};
807
887
  const legacyWindow = window;
808
888
  const renderer = createDomRenderer();
@@ -816,19 +896,102 @@ function initLegacyViews() {
816
896
  });
817
897
  }
818
898
 
819
- // src/style-commands/paste-style.ts
899
+ // src/prevent-link-in-link-commands.ts
900
+ var import_editor_elements3 = require("@elementor/editor-elements");
901
+ var import_editor_notifications = require("@elementor/editor-notifications");
820
902
  var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
903
+ var import_i18n = require("@wordpress/i18n");
904
+ function initLinkInLinkPrevention() {
905
+ (0, import_editor_v1_adapters5.blockCommand)({
906
+ command: "document/elements/paste",
907
+ condition: blockLinkInLinkPaste
908
+ });
909
+ (0, import_editor_v1_adapters5.blockCommand)({
910
+ command: "document/elements/move",
911
+ condition: blockLinkInLinkMove
912
+ });
913
+ }
914
+ var learnMoreActionProps = {
915
+ href: "https://go.elementor.com/element-link-inside-link-infotip",
916
+ target: "_blank",
917
+ color: "inherit",
918
+ variant: "text",
919
+ sx: {
920
+ marginInlineStart: "20px"
921
+ },
922
+ children: "Learn more"
923
+ };
924
+ function blockLinkInLinkPaste(args) {
925
+ const { containers = [args.container], storageType } = args;
926
+ const targetElements = containers;
927
+ if (storageType !== "localstorage") {
928
+ return false;
929
+ }
930
+ const data = window?.elementorCommon?.storage?.get();
931
+ if (!data?.clipboard?.elements) {
932
+ return false;
933
+ }
934
+ const sourceElements = data.clipboard.elements;
935
+ const notification = {
936
+ type: "default",
937
+ message: (0, import_i18n.__)(
938
+ "To paste a link to this element, first remove the link from it's parent container.",
939
+ "elementor"
940
+ ),
941
+ id: "paste-in-link-blocked",
942
+ additionalActionProps: [learnMoreActionProps]
943
+ };
944
+ const blocked = shouldBlock(sourceElements, targetElements);
945
+ if (blocked) {
946
+ (0, import_editor_notifications.notify)(notification);
947
+ }
948
+ return blocked;
949
+ }
950
+ function blockLinkInLinkMove(args) {
951
+ const { containers = [args.container], target } = args;
952
+ const sourceElements = containers;
953
+ const targetElement = target;
954
+ const notification = {
955
+ type: "default",
956
+ message: (0, import_i18n.__)("To drag a link to this element, first remove the link from it's parent container.", "elementor"),
957
+ id: "move-in-link-blocked",
958
+ additionalActionProps: [learnMoreActionProps]
959
+ };
960
+ const isBlocked = shouldBlock(sourceElements, [targetElement]);
961
+ if (isBlocked) {
962
+ (0, import_editor_notifications.notify)(notification);
963
+ }
964
+ return isBlocked;
965
+ }
966
+ function shouldBlock(sourceElements, targetElements) {
967
+ if (!sourceElements?.length || !targetElements?.length) {
968
+ return false;
969
+ }
970
+ const isSourceContainsAnAnchor = sourceElements.some((src) => {
971
+ return src?.id ? (0, import_editor_elements3.isElementAnchored)(src.id) || !!(0, import_editor_elements3.getAnchoredDescendantId)(src.id) : false;
972
+ });
973
+ if (!isSourceContainsAnAnchor) {
974
+ return false;
975
+ }
976
+ const isTargetContainsAnAnchor = targetElements.some((target) => {
977
+ return target?.id ? (0, import_editor_elements3.isElementAnchored)(target.id) || !!(0, import_editor_elements3.getAnchoredAncestorId)(target.id) : false;
978
+ });
979
+ return isTargetContainsAnAnchor;
980
+ }
981
+
982
+ // src/style-commands/paste-style.ts
983
+ var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
821
984
 
822
985
  // src/style-commands/undoable-actions/paste-element-style.ts
823
- var import_editor_elements4 = require("@elementor/editor-elements");
986
+ var import_editor_elements5 = require("@elementor/editor-elements");
824
987
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
825
- var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
826
- var import_i18n2 = require("@wordpress/i18n");
988
+ var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
989
+ var import_i18n3 = require("@wordpress/i18n");
827
990
 
828
991
  // src/style-commands/utils.ts
829
- var import_editor_elements3 = require("@elementor/editor-elements");
992
+ var import_editor_elements4 = require("@elementor/editor-elements");
830
993
  var import_editor_props2 = require("@elementor/editor-props");
831
- var import_i18n = require("@wordpress/i18n");
994
+ var import_i18n2 = require("@wordpress/i18n");
832
995
  function hasAtomicWidgets(args) {
833
996
  const { containers = [args.container] } = args;
834
997
  return containers.some(isAtomicWidget);
@@ -851,7 +1014,7 @@ function getClassesProp(container) {
851
1014
  }
852
1015
  function getContainerSchema(container) {
853
1016
  const type = container?.model.get("widgetType") || container?.model.get("elType");
854
- const widgetsCache = (0, import_editor_elements3.getWidgetsCache)();
1017
+ const widgetsCache = (0, import_editor_elements4.getWidgetsCache)();
855
1018
  const elementType = widgetsCache?.[type];
856
1019
  return elementType?.atomic_props_schema ?? null;
857
1020
  }
@@ -864,11 +1027,11 @@ function getClipboardElements(storageKey = "clipboard") {
864
1027
  }
865
1028
  }
866
1029
  function getTitleForContainers(containers) {
867
- return containers.length > 1 ? (0, import_i18n.__)("Elements", "elementor") : (0, import_editor_elements3.getElementLabel)(containers[0].id);
1030
+ return containers.length > 1 ? (0, import_i18n2.__)("Elements", "elementor") : (0, import_editor_elements4.getElementLabel)(containers[0].id);
868
1031
  }
869
1032
 
870
1033
  // src/style-commands/undoable-actions/paste-element-style.ts
871
- var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
1034
+ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters6.undoable)(
872
1035
  {
873
1036
  do: ({ containers, newStyle }) => {
874
1037
  return containers.map((container) => {
@@ -877,7 +1040,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
877
1040
  if (!classesProp) {
878
1041
  return null;
879
1042
  }
880
- const originalStyles = (0, import_editor_elements4.getElementStyles)(container.id);
1043
+ const originalStyles = (0, import_editor_elements5.getElementStyles)(container.id);
881
1044
  const [styleId, styleDef] = Object.entries(originalStyles ?? {})[0] ?? [];
882
1045
  const originalStyle = Object.keys(styleDef ?? {}).length ? styleDef : null;
883
1046
  const revertData = {
@@ -886,7 +1049,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
886
1049
  };
887
1050
  if (styleId) {
888
1051
  newStyle.variants.forEach(({ meta, props }) => {
889
- (0, import_editor_elements4.updateElementStyle)({
1052
+ (0, import_editor_elements5.updateElementStyle)({
890
1053
  elementId,
891
1054
  styleId,
892
1055
  meta,
@@ -896,10 +1059,10 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
896
1059
  } else {
897
1060
  const [firstVariant] = newStyle.variants;
898
1061
  const additionalVariants = newStyle.variants.slice(1);
899
- revertData.styleId = (0, import_editor_elements4.createElementStyle)({
1062
+ revertData.styleId = (0, import_editor_elements5.createElementStyle)({
900
1063
  elementId,
901
1064
  classesProp,
902
- label: import_editor_styles_repository2.LOCAL_STYLES_RESERVED_LABEL,
1065
+ label: import_editor_styles_repository2.ELEMENTS_STYLES_RESERVED_LABEL,
903
1066
  ...firstVariant,
904
1067
  additionalVariants
905
1068
  });
@@ -914,7 +1077,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
914
1077
  return;
915
1078
  }
916
1079
  if (!revertData.originalStyle) {
917
- (0, import_editor_elements4.deleteElementStyle)(container.id, revertData.styleId);
1080
+ (0, import_editor_elements5.deleteElementStyle)(container.id, revertData.styleId);
918
1081
  return;
919
1082
  }
920
1083
  const classesProp = getClassesProp(container);
@@ -923,10 +1086,10 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
923
1086
  }
924
1087
  const [firstVariant] = revertData.originalStyle.variants;
925
1088
  const additionalVariants = revertData.originalStyle.variants.slice(1);
926
- (0, import_editor_elements4.createElementStyle)({
1089
+ (0, import_editor_elements5.createElementStyle)({
927
1090
  elementId: container.id,
928
1091
  classesProp,
929
- label: import_editor_styles_repository2.LOCAL_STYLES_RESERVED_LABEL,
1092
+ label: import_editor_styles_repository2.ELEMENTS_STYLES_RESERVED_LABEL,
930
1093
  styleId: revertData.styleId,
931
1094
  ...firstVariant,
932
1095
  additionalVariants
@@ -936,19 +1099,19 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters4.undoable)(
936
1099
  },
937
1100
  {
938
1101
  title: ({ containers }) => getTitleForContainers(containers),
939
- subtitle: (0, import_i18n2.__)("Style Pasted", "elementor")
1102
+ subtitle: (0, import_i18n3.__)("Style Pasted", "elementor")
940
1103
  }
941
1104
  );
942
1105
 
943
1106
  // src/style-commands/paste-style.ts
944
1107
  function initPasteStyleCommand() {
945
1108
  const pasteElementStyleCommand = undoablePasteElementStyle();
946
- (0, import_editor_v1_adapters5.blockCommand)({
1109
+ (0, import_editor_v1_adapters7.blockCommand)({
947
1110
  command: "document/elements/paste-style",
948
1111
  condition: hasAtomicWidgets
949
1112
  });
950
- (0, import_editor_v1_adapters5.__privateListenTo)(
951
- (0, import_editor_v1_adapters5.commandStartEvent)("document/elements/paste-style"),
1113
+ (0, import_editor_v1_adapters7.__privateListenTo)(
1114
+ (0, import_editor_v1_adapters7.commandStartEvent)("document/elements/paste-style"),
952
1115
  (e) => pasteStyles(e.args, pasteElementStyleCommand)
953
1116
  );
954
1117
  }
@@ -972,21 +1135,21 @@ function pasteStyles(args, pasteCallback) {
972
1135
  }
973
1136
 
974
1137
  // src/style-commands/reset-style.ts
975
- var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
1138
+ var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
976
1139
 
977
1140
  // src/style-commands/undoable-actions/reset-element-style.ts
978
- var import_editor_elements5 = require("@elementor/editor-elements");
1141
+ var import_editor_elements6 = require("@elementor/editor-elements");
979
1142
  var import_editor_styles_repository3 = require("@elementor/editor-styles-repository");
980
- var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
981
- var import_i18n3 = require("@wordpress/i18n");
982
- var undoableResetElementStyle = () => (0, import_editor_v1_adapters6.undoable)(
1143
+ var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
1144
+ var import_i18n4 = require("@wordpress/i18n");
1145
+ var undoableResetElementStyle = () => (0, import_editor_v1_adapters8.undoable)(
983
1146
  {
984
1147
  do: ({ containers }) => {
985
1148
  return containers.map((container) => {
986
1149
  const elementId = container.model.get("id");
987
- const containerStyles = (0, import_editor_elements5.getElementStyles)(elementId);
1150
+ const containerStyles = (0, import_editor_elements6.getElementStyles)(elementId);
988
1151
  Object.keys(containerStyles ?? {}).forEach(
989
- (styleId) => (0, import_editor_elements5.deleteElementStyle)(elementId, styleId)
1152
+ (styleId) => (0, import_editor_elements6.deleteElementStyle)(elementId, styleId)
990
1153
  );
991
1154
  return containerStyles;
992
1155
  });
@@ -1002,11 +1165,11 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters6.undoable)(
1002
1165
  Object.entries(containerStyles ?? {}).forEach(([styleId, style]) => {
1003
1166
  const [firstVariant] = style.variants;
1004
1167
  const additionalVariants = style.variants.slice(1);
1005
- (0, import_editor_elements5.createElementStyle)({
1168
+ (0, import_editor_elements6.createElementStyle)({
1006
1169
  elementId,
1007
1170
  classesProp,
1008
1171
  styleId,
1009
- label: import_editor_styles_repository3.LOCAL_STYLES_RESERVED_LABEL,
1172
+ label: import_editor_styles_repository3.ELEMENTS_STYLES_RESERVED_LABEL,
1010
1173
  ...firstVariant,
1011
1174
  additionalVariants
1012
1175
  });
@@ -1016,19 +1179,19 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters6.undoable)(
1016
1179
  },
1017
1180
  {
1018
1181
  title: ({ containers }) => getTitleForContainers(containers),
1019
- subtitle: (0, import_i18n3.__)("Style Reset", "elementor")
1182
+ subtitle: (0, import_i18n4.__)("Style Reset", "elementor")
1020
1183
  }
1021
1184
  );
1022
1185
 
1023
1186
  // src/style-commands/reset-style.ts
1024
1187
  function initResetStyleCommand() {
1025
1188
  const resetElementStyles = undoableResetElementStyle();
1026
- (0, import_editor_v1_adapters7.blockCommand)({
1189
+ (0, import_editor_v1_adapters9.blockCommand)({
1027
1190
  command: "document/elements/reset-style",
1028
1191
  condition: hasAtomicWidgets
1029
1192
  });
1030
- (0, import_editor_v1_adapters7.__privateListenTo)(
1031
- (0, import_editor_v1_adapters7.commandStartEvent)("document/elements/reset-style"),
1193
+ (0, import_editor_v1_adapters9.__privateListenTo)(
1194
+ (0, import_editor_v1_adapters9.commandStartEvent)("document/elements/reset-style"),
1032
1195
  (e) => resetStyles(e.args, resetElementStyles)
1033
1196
  );
1034
1197
  }
@@ -1050,20 +1213,23 @@ function initStyleCommands() {
1050
1213
  // src/init.tsx
1051
1214
  function init() {
1052
1215
  initStyleTransformers();
1053
- initStylesRenderer();
1054
1216
  initStyleCommands();
1217
+ initLinkInLinkPrevention();
1055
1218
  initLegacyViews();
1056
1219
  initSettingsTransformers();
1057
1220
  (0, import_editor.injectIntoTop)({
1058
1221
  id: "elements-overlays",
1059
1222
  component: ElementsOverlays
1060
1223
  });
1224
+ (0, import_editor.injectIntoTop)({
1225
+ id: "canvas-style-render",
1226
+ component: StyleRenderer
1227
+ });
1061
1228
  }
1062
-
1063
- // src/index.ts
1064
- init();
1065
1229
  // Annotate the CommonJS export names for ESM import in node:
1066
1230
  0 && (module.exports = {
1231
+ createTransformer,
1232
+ init,
1067
1233
  settingsTransformersRegistry,
1068
1234
  styleTransformersRegistry
1069
1235
  });