@elementor/editor-canvas 0.13.1 → 0.15.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 (34) hide show
  1. package/.turbo/turbo-build.log +10 -10
  2. package/CHANGELOG.md +33 -0
  3. package/dist/index.d.mts +9 -8
  4. package/dist/index.d.ts +9 -8
  5. package/dist/index.js +184 -31
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +192 -34
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +9 -8
  10. package/src/__tests__/__mocks__/styles-schema.ts +3 -3
  11. package/src/__tests__/settings-props-resolver.test.ts +1 -1
  12. package/src/__tests__/styles-prop-resolver.test.ts +7 -7
  13. package/src/components/__tests__/elements-overlays.test.tsx +40 -35
  14. package/src/components/element-overlay.tsx +3 -2
  15. package/src/components/elements-overlays.tsx +26 -9
  16. package/src/hooks/use-floating-on-element.ts +9 -6
  17. package/src/init-settings-transformers.ts +1 -5
  18. package/src/init-style-transformers.ts +2 -6
  19. package/src/init-styles-renderer.ts +1 -1
  20. package/src/legacy/__tests__/signalized-process.test.ts +80 -0
  21. package/src/legacy/create-element-type.ts +2 -2
  22. package/src/legacy/create-templated-element-type.ts +131 -0
  23. package/src/legacy/init-legacy-views.ts +7 -1
  24. package/src/legacy/signalized-process.ts +35 -0
  25. package/src/legacy/types.ts +27 -3
  26. package/src/renderers/__tests__/create-dom-renderer.test.ts +66 -0
  27. package/src/renderers/__tests__/create-props-resolver.test.ts +123 -15
  28. package/src/renderers/create-dom-renderer.ts +56 -0
  29. package/src/renderers/create-props-resolver.ts +10 -8
  30. package/src/renderers/render-styles.ts +4 -0
  31. package/src/transformers/create-transformers-registry.ts +16 -5
  32. package/src/transformers/styles/background-image-position-offset-transformer.ts +1 -1
  33. package/src/transformers/styles/background-image-size-scale-transformer.ts +1 -1
  34. package/src/transformers/types.ts +1 -5
@@ -1,5 +1,5 @@
1
1
 
2
- > @elementor/editor-canvas@0.13.1 build
2
+ > @elementor/editor-canvas@0.15.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- ESM dist/index.mjs 29.82 KB
14
- ESM dist/index.mjs.map 62.58 KB
15
- ESM ⚡️ Build success in 181ms
16
- CJS dist/index.js 32.49 KB
17
- CJS dist/index.js.map 62.41 KB
18
- CJS ⚡️ Build success in 184ms
13
+ CJS dist/index.js 36.53 KB
14
+ CJS dist/index.js.map 72.22 KB
15
+ CJS ⚡️ Build success in 226ms
16
+ ESM dist/index.mjs 33.81 KB
17
+ ESM dist/index.mjs.map 72.44 KB
18
+ ESM ⚡️ Build success in 228ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 20884ms
21
- DTS dist/index.d.mts 751.00 B
22
- DTS dist/index.d.ts 751.00 B
20
+ DTS ⚡️ Build success in 20459ms
21
+ DTS dist/index.d.mts 972.00 B
22
+ DTS dist/index.d.ts 972.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @elementor/editor-canvas
2
2
 
3
+ ## 0.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 593f222: Render widgets faster using DOM renderer
8
+
9
+ ### Patch Changes
10
+
11
+ - 3e108d9: update elementor/ui
12
+ - Updated dependencies [3e108d9]
13
+ - Updated dependencies [202ff33]
14
+ - Updated dependencies [593f222]
15
+ - @elementor/editor@0.18.4
16
+ - @elementor/editor-styles-repository@0.8.0
17
+ - @elementor/editor-elements@0.6.6
18
+
19
+ ## 0.14.0
20
+
21
+ ### Minor Changes
22
+
23
+ - efd54a9: Add fallback transformer to the transformers registry
24
+ - b0a15b9: Create DOM renderer
25
+
26
+ ### Patch Changes
27
+
28
+ - 5387bcf: Fix overlay on settings change
29
+ - Updated dependencies [5387bcf]
30
+ - Updated dependencies [efd54a9]
31
+ - @elementor/editor-elements@0.6.5
32
+ - @elementor/editor-props@0.11.1
33
+ - @elementor/editor-styles-repository@0.7.8
34
+ - @elementor/editor-styles@0.6.4
35
+
3
36
  ## 0.13.1
4
37
 
5
38
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,23 +1,24 @@
1
+ import * as _elementor_editor_props from '@elementor/editor-props';
2
+
1
3
  type UnbrandedTransformer<TValue> = (value: TValue, options: {
2
4
  key: string;
3
5
  signal?: AbortSignal;
4
6
  }) => unknown;
5
- declare const brand: unique symbol;
6
7
  type Transformer<TValue> = UnbrandedTransformer<TValue> & {
7
- [brand]: true;
8
+ __transformer: true;
8
9
  };
9
- type TransformerName = string;
10
10
  type AnyTransformer = Transformer<any>;
11
- type TransformersMap = Record<string, AnyTransformer>;
12
11
 
13
12
  declare const styleTransformersRegistry: {
14
- register(name: TransformerName, transformer: AnyTransformer): /*elided*/ any;
15
- all(): TransformersMap;
13
+ register(type: _elementor_editor_props.PropTypeKey, transformer: AnyTransformer): /*elided*/ any;
14
+ registerFallback(transformer: AnyTransformer): /*elided*/ any;
15
+ get(type: _elementor_editor_props.PropTypeKey): AnyTransformer | null;
16
16
  };
17
17
 
18
18
  declare const settingsTransformersRegistry: {
19
- register(name: TransformerName, transformer: AnyTransformer): /*elided*/ any;
20
- all(): TransformersMap;
19
+ register(type: _elementor_editor_props.PropTypeKey, transformer: AnyTransformer): /*elided*/ any;
20
+ registerFallback(transformer: AnyTransformer): /*elided*/ any;
21
+ get(type: _elementor_editor_props.PropTypeKey): AnyTransformer | null;
21
22
  };
22
23
 
23
24
  export { settingsTransformersRegistry, styleTransformersRegistry };
package/dist/index.d.ts CHANGED
@@ -1,23 +1,24 @@
1
+ import * as _elementor_editor_props from '@elementor/editor-props';
2
+
1
3
  type UnbrandedTransformer<TValue> = (value: TValue, options: {
2
4
  key: string;
3
5
  signal?: AbortSignal;
4
6
  }) => unknown;
5
- declare const brand: unique symbol;
6
7
  type Transformer<TValue> = UnbrandedTransformer<TValue> & {
7
- [brand]: true;
8
+ __transformer: true;
8
9
  };
9
- type TransformerName = string;
10
10
  type AnyTransformer = Transformer<any>;
11
- type TransformersMap = Record<string, AnyTransformer>;
12
11
 
13
12
  declare const styleTransformersRegistry: {
14
- register(name: TransformerName, transformer: AnyTransformer): /*elided*/ any;
15
- all(): TransformersMap;
13
+ register(type: _elementor_editor_props.PropTypeKey, transformer: AnyTransformer): /*elided*/ any;
14
+ registerFallback(transformer: AnyTransformer): /*elided*/ any;
15
+ get(type: _elementor_editor_props.PropTypeKey): AnyTransformer | null;
16
16
  };
17
17
 
18
18
  declare const settingsTransformersRegistry: {
19
- register(name: TransformerName, transformer: AnyTransformer): /*elided*/ any;
20
- all(): TransformersMap;
19
+ register(type: _elementor_editor_props.PropTypeKey, transformer: AnyTransformer): /*elided*/ any;
20
+ registerFallback(transformer: AnyTransformer): /*elided*/ any;
21
+ get(type: _elementor_editor_props.PropTypeKey): AnyTransformer | null;
21
22
  };
22
23
 
23
24
  export { settingsTransformersRegistry, styleTransformersRegistry };
package/dist/index.js CHANGED
@@ -91,10 +91,7 @@ function useFloatingOnElement({ element, isSelected }) {
91
91
  // Must be controlled for interactions (like hover) to work.
92
92
  open: isOpen || isSelected,
93
93
  onOpenChange: setIsOpen,
94
- // Add an animation frame to support scroll events (without it the floating element will stay in the same position).
95
- whileElementsMounted: (...args) => (0, import_react3.autoUpdate)(...args, { animationFrame: true }),
96
- // The first element in the canvas is `display: contents` so we need to use the first child.
97
- elements: { reference: element.firstElementChild },
94
+ whileElementsMounted: import_react3.autoUpdate,
98
95
  middleware: [
99
96
  // Match the floating element's size to the reference element.
100
97
  (0, import_react3.size)({
@@ -109,6 +106,9 @@ function useFloatingOnElement({ element, isSelected }) {
109
106
  (0, import_react3.offset)(({ rects }) => -rects.reference.height / 2 - rects.floating.height / 2)
110
107
  ]
111
108
  });
109
+ (0, import_react2.useEffect)(() => {
110
+ refs.setReference(element);
111
+ }, [element, refs]);
112
112
  return {
113
113
  isVisible: isOpen || isSelected,
114
114
  context,
@@ -127,7 +127,7 @@ var OverlayBox = (0, import_ui.styled)(import_ui.Box, { shouldForwardProp: (prop
127
127
  outlineOffset: isSelected ? "-2px" : "-1px",
128
128
  pointerEvents: "none"
129
129
  }));
130
- function ElementOverlay({ element, isSelected }) {
130
+ function ElementOverlay({ element, isSelected, id }) {
131
131
  const { context, floating, isVisible } = useFloatingOnElement({ element, isSelected });
132
132
  const { getFloatingProps, getReferenceProps } = (0, import_react4.useInteractions)([(0, import_react4.useHover)(context)]);
133
133
  useBindReactPropsToElement(element, getReferenceProps);
@@ -137,7 +137,7 @@ function ElementOverlay({ element, isSelected }) {
137
137
  ref: floating.setRef,
138
138
  isSelected,
139
139
  style: floating.styles,
140
- "data-element-overlay": element.dataset.id,
140
+ "data-element-overlay": id,
141
141
  role: "presentation",
142
142
  ...getFloatingProps()
143
143
  }
@@ -147,31 +147,38 @@ function ElementOverlay({ element, isSelected }) {
147
147
  // src/components/elements-overlays.tsx
148
148
  function ElementsOverlays() {
149
149
  const selected = (0, import_editor_elements.useSelectedElement)();
150
- const domElements = (0, import_editor_elements.useElementsDomRef)();
150
+ const elements = useElementsDom();
151
151
  const currentEditMode = (0, import_editor_v1_adapters.useEditMode)();
152
152
  const isEditMode = currentEditMode === "edit";
153
153
  const isKitRouteActive = (0, import_editor_v1_adapters.__privateUseIsRouteActive)("panel/global");
154
154
  const isActive = isEditMode && !isKitRouteActive;
155
- return isActive && domElements.map((el) => /* @__PURE__ */ React2.createElement(
156
- ElementOverlay,
157
- {
158
- element: el,
159
- key: el.dataset.id,
160
- isSelected: selected.element?.id === el.dataset.id
155
+ return isActive && elements.map(([id, element]) => /* @__PURE__ */ React2.createElement(ElementOverlay, { key: id, id, element, isSelected: selected.element?.id === id }));
156
+ }
157
+ var ELEMENTS_DATA_ATTR = "atomic";
158
+ function useElementsDom() {
159
+ return (0, import_editor_v1_adapters.__privateUseListenTo)(
160
+ [(0, import_editor_v1_adapters.windowEvent)("elementor/editor/element-rendered"), (0, import_editor_v1_adapters.windowEvent)("elementor/editor/element-destroyed")],
161
+ () => {
162
+ return (0, import_editor_elements.getElements)().filter((el) => ELEMENTS_DATA_ATTR in (el.view?.el?.dataset ?? {})).map((element) => [element.id, element.view?.getDomElement?.()?.get?.(0)]).filter((item) => !!item[1]);
161
163
  }
162
- ));
164
+ );
163
165
  }
164
166
 
165
167
  // src/transformers/create-transformers-registry.ts
166
168
  function createTransformersRegistry() {
167
169
  const transformers = {};
170
+ let fallbackTransformer = null;
168
171
  return {
169
- register(name, transformer) {
170
- transformers[name] = transformer;
172
+ register(type, transformer) {
173
+ transformers[type] = transformer;
171
174
  return this;
172
175
  },
173
- all() {
174
- return transformers;
176
+ registerFallback(transformer) {
177
+ fallbackTransformer = transformer;
178
+ return this;
179
+ },
180
+ get(type) {
181
+ return transformers[type] ?? fallbackTransformer;
175
182
  }
176
183
  };
177
184
  }
@@ -237,7 +244,7 @@ var plainTransformer = createTransformer((value) => {
237
244
 
238
245
  // src/init-settings-transformers.ts
239
246
  function initSettingsTransformers() {
240
- settingsTransformersRegistry.register("string", plainTransformer).register("url", plainTransformer).register("number", plainTransformer).register("boolean", plainTransformer).register("classes", arrayTransformer).register("link", linkTransformer).register("image", imageTransformer).register("image-src", imageSrcTransformer).register("image-attachment-id", plainTransformer);
247
+ settingsTransformersRegistry.register("classes", arrayTransformer).register("link", linkTransformer).register("image", imageTransformer).register("image-src", imageSrcTransformer).registerFallback(plainTransformer);
241
248
  }
242
249
 
243
250
  // src/style-transformers-registry.ts
@@ -279,12 +286,12 @@ var backgroundImageOverlayTransformer = createTransformer((value) => {
279
286
 
280
287
  // src/transformers/styles/background-image-position-offset-transformer.ts
281
288
  var backgroundImagePositionOffsetTransformer = createTransformer(
282
- ({ x = "0px", y = "0px" }) => `${x} ${y}`
289
+ ({ x, y }) => `${x ?? "0px"} ${y ?? "0px"}`
283
290
  );
284
291
 
285
292
  // src/transformers/styles/background-image-size-scale-transformer.ts
286
293
  var backgroundImageSizeScaleTransformer = createTransformer(
287
- ({ width = "auto", height = "auto" }) => `${width} ${height}`
294
+ ({ width, height }) => `${width ?? "auto"} ${height ?? "auto"}`
288
295
  );
289
296
 
290
297
  // src/transformers/styles/background-transformer.ts
@@ -354,7 +361,7 @@ function initStyleTransformers() {
354
361
  ["block-start", "block-end", "inline-start", "inline-end"],
355
362
  ({ propKey, key }) => `${propKey}-${key}`
356
363
  )
357
- ).register("color", plainTransformer).register("number", plainTransformer).register("string", plainTransformer).register("url", plainTransformer).register("box-shadow", createCombineArrayTransformer(",")).register("background", backgroundTransformer).register("background-overlay", createCombineArrayTransformer(",")).register("background-color-overlay", backgroundColorOverlayTransformer).register("background-image-overlay", backgroundImageOverlayTransformer).register("background-gradient-overlay", backgroundGradientOverlayTransformer).register("gradient-color-stop", createCombineArrayTransformer(",")).register("color-stop", colorStopTransformer).register("background-image-position-offset", backgroundImagePositionOffsetTransformer).register("background-image-size-scale", backgroundImageSizeScaleTransformer).register("image-attachment-id", plainTransformer).register("image-src", imageSrcTransformer).register("image", imageTransformer).register(
364
+ ).register("box-shadow", createCombineArrayTransformer(",")).register("background", backgroundTransformer).register("background-overlay", createCombineArrayTransformer(",")).register("background-color-overlay", backgroundColorOverlayTransformer).register("background-image-overlay", backgroundImageOverlayTransformer).register("background-gradient-overlay", backgroundGradientOverlayTransformer).register("gradient-color-stop", createCombineArrayTransformer(",")).register("color-stop", colorStopTransformer).register("background-image-position-offset", backgroundImagePositionOffsetTransformer).register("background-image-size-scale", backgroundImageSizeScaleTransformer).register("image-src", imageSrcTransformer).register("image", imageTransformer).register(
358
365
  "layout-direction",
359
366
  createMultiPropsTransformer(["row", "column"], ({ propKey, key }) => `${key}-${propKey}`)
360
367
  ).register(
@@ -369,7 +376,7 @@ function initStyleTransformers() {
369
376
  ["start-start", "start-end", "end-start", "end-end"],
370
377
  ({ key }) => `border-${key}-radius`
371
378
  )
372
- );
379
+ ).registerFallback(plainTransformer);
373
380
  }
374
381
 
375
382
  // src/init-styles-renderer.ts
@@ -388,9 +395,6 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
388
395
  Object.entries(schema).map(async ([key, type]) => {
389
396
  const value = props[key] ?? type.default;
390
397
  const transformed = await transform({ value, key, type, signal });
391
- if (transformed === null) {
392
- return;
393
- }
394
398
  onPropResolve?.({ key, value: transformed });
395
399
  if (isMultiProps(transformed)) {
396
400
  return getMultiPropsValue(transformed);
@@ -419,6 +423,9 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
419
423
  return null;
420
424
  }
421
425
  }
426
+ if (value.$$type !== type.key) {
427
+ return null;
428
+ }
422
429
  let resolvedValue = value.value;
423
430
  if (type.kind === "object") {
424
431
  resolvedValue = await resolve({
@@ -434,7 +441,7 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
434
441
  )
435
442
  );
436
443
  }
437
- const transformer = transformers[value.$$type];
444
+ const transformer = transformers.get(value.$$type);
438
445
  if (!transformer) {
439
446
  return null;
440
447
  }
@@ -507,6 +514,9 @@ function createStyleWrapper(value = "", wrapper) {
507
514
  async function propsToCss({ props, resolve, signal }) {
508
515
  const transformed = await resolve({ props, signal });
509
516
  return Object.entries(transformed).reduce((acc, [propName, propValue]) => {
517
+ if (propValue === null) {
518
+ return acc;
519
+ }
510
520
  acc.push(propName + ":" + propValue + ";");
511
521
  return acc;
512
522
  }, []).join("");
@@ -534,7 +544,7 @@ function initStylesRenderer() {
534
544
  (0, import_editor_v1_adapters2.__privateListenTo)((0, import_editor_v1_adapters2.v1ReadyEvent)(), () => {
535
545
  let abortController = null;
536
546
  const resolve = createPropsResolver({
537
- transformers: styleTransformersRegistry.all(),
547
+ transformers: styleTransformersRegistry,
538
548
  schema: (0, import_editor_styles.getStylesSchema)(),
539
549
  onPropResolve: enqueueUsedFonts
540
550
  });
@@ -585,6 +595,51 @@ function enqueueUsedFonts({ key, value }) {
585
595
  var import_editor_elements2 = require("@elementor/editor-elements");
586
596
  var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
587
597
 
598
+ // src/renderers/create-dom-renderer.ts
599
+ var import_twing = require("@elementor/twing");
600
+ function createDomRenderer() {
601
+ const loader = (0, import_twing.createArrayLoader)({});
602
+ const environment = (0, import_twing.createEnvironment)(loader);
603
+ environment.registerEscapingStrategy(escapeHtmlTag, "html_tag");
604
+ environment.registerEscapingStrategy(escapeURL, "full_url");
605
+ return {
606
+ register: loader.setTemplate,
607
+ render: environment.render
608
+ };
609
+ }
610
+ function escapeHtmlTag(value) {
611
+ const allowedTags = [
612
+ "a",
613
+ "article",
614
+ "aside",
615
+ "button",
616
+ "div",
617
+ "footer",
618
+ "h1",
619
+ "h2",
620
+ "h3",
621
+ "h4",
622
+ "h5",
623
+ "h6",
624
+ "header",
625
+ "main",
626
+ "nav",
627
+ "p",
628
+ "section",
629
+ "span"
630
+ ];
631
+ return allowedTags.includes(value) ? value : "div";
632
+ }
633
+ function escapeURL(value) {
634
+ const allowedProtocols = ["http:", "https:", "mailto:", "tel:"];
635
+ try {
636
+ const parsed = new URL(value);
637
+ return allowedProtocols.includes(parsed.protocol) ? value : "";
638
+ } catch {
639
+ return "";
640
+ }
641
+ }
642
+
588
643
  // src/legacy/create-element-type.ts
589
644
  function createElementType(type) {
590
645
  const legacyWindow = window;
@@ -593,11 +648,11 @@ function createElementType(type) {
593
648
  return type;
594
649
  }
595
650
  getView() {
596
- return createElementView();
651
+ return createElementViewClassDeclaration();
597
652
  }
598
653
  };
599
654
  }
600
- function createElementView() {
655
+ function createElementViewClassDeclaration() {
601
656
  const legacyWindow = window;
602
657
  return class extends legacyWindow.elementor.modules.elements.views.Widget {
603
658
  // Dispatch `render` event so the overlay layer will be updated
@@ -648,16 +703,114 @@ function createElementView() {
648
703
  };
649
704
  }
650
705
 
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
+ // src/legacy/create-templated-element-type.ts
726
+ function createTemplatedElementType({ type, renderer, element }) {
727
+ const legacyWindow = window;
728
+ Object.entries(element.twig_templates).forEach(([key, template]) => {
729
+ renderer.register(key, template);
730
+ });
731
+ const propsResolver = createPropsResolver({
732
+ transformers: settingsTransformersRegistry,
733
+ schema: element.atomic_props_schema
734
+ });
735
+ return class extends legacyWindow.elementor.modules.elements.types.Widget {
736
+ getType() {
737
+ return type;
738
+ }
739
+ getView() {
740
+ return createTemplatedElementViewClassDeclaration({
741
+ type,
742
+ renderer,
743
+ propsResolver,
744
+ baseStylesDictionary: element.base_styles_dictionary,
745
+ templateKey: element.twig_main_template
746
+ });
747
+ }
748
+ };
749
+ }
750
+ function canBeTemplated(element) {
751
+ return !!(element.atomic_props_schema && element.twig_templates && element.twig_main_template && element.base_styles_dictionary);
752
+ }
753
+ function createTemplatedElementViewClassDeclaration({
754
+ type,
755
+ renderer,
756
+ propsResolver: resolveProps,
757
+ templateKey,
758
+ baseStylesDictionary
759
+ }) {
760
+ const BaseView = createElementViewClassDeclaration();
761
+ return class extends BaseView {
762
+ #abortController = null;
763
+ getTemplateType() {
764
+ return "twig";
765
+ }
766
+ renderOnChange() {
767
+ this.render();
768
+ }
769
+ // Overriding Marionette original render method to inject our renderer.
770
+ async _renderTemplate() {
771
+ this.#beforeRenderTemplate();
772
+ this.#abortController?.abort();
773
+ this.#abortController = new AbortController();
774
+ const process = signalizedProcess(this.#abortController.signal).then((_, signal) => {
775
+ const settings = this.model.get("settings").toJSON();
776
+ return resolveProps({
777
+ props: settings,
778
+ signal
779
+ });
780
+ }).then((resolvedSettings) => {
781
+ const context = {
782
+ id: this.model.get("id"),
783
+ type,
784
+ settings: resolvedSettings,
785
+ base_styles: baseStylesDictionary
786
+ };
787
+ return renderer.render(templateKey, context);
788
+ }).then((html) => this.$el.html(html));
789
+ await process.execute();
790
+ this.#afterRenderTemplate();
791
+ }
792
+ // Emulating the original Marionette behavior.
793
+ #beforeRenderTemplate() {
794
+ this.triggerMethod("before:render:template");
795
+ }
796
+ #afterRenderTemplate() {
797
+ this.bindUIElements();
798
+ this.triggerMethod("render:template");
799
+ }
800
+ };
801
+ }
802
+
651
803
  // src/legacy/init-legacy-views.ts
652
804
  function initLegacyViews() {
653
805
  (0, import_editor_v1_adapters3.__privateListenTo)((0, import_editor_v1_adapters3.v1ReadyEvent)(), () => {
654
806
  const config = (0, import_editor_elements2.getWidgetsCache)() ?? {};
655
807
  const legacyWindow = window;
808
+ const renderer = createDomRenderer();
656
809
  Object.entries(config).forEach(([type, element]) => {
657
810
  if (!element.atomic) {
658
811
  return;
659
812
  }
660
- const ElementType = createElementType(type);
813
+ const ElementType = canBeTemplated(element) ? createTemplatedElementType({ type, renderer, element }) : createElementType(type);
661
814
  legacyWindow.elementor.elementsManager.registerElementType(new ElementType());
662
815
  });
663
816
  });