@elementor/editor-canvas 3.33.0-233 → 3.33.0-235

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/dist/index.js CHANGED
@@ -45,6 +45,7 @@ module.exports = __toCommonJS(index_exports);
45
45
 
46
46
  // src/init.tsx
47
47
  var import_editor = require("@elementor/editor");
48
+ var import_editor_interactions2 = require("@elementor/editor-interactions");
48
49
 
49
50
  // src/components/classes-rename.tsx
50
51
  var import_react = require("react");
@@ -239,27 +240,143 @@ function useElementsDom() {
239
240
  );
240
241
  }
241
242
 
242
- // src/components/style-renderer.tsx
243
+ // src/components/interactions-renderer.tsx
243
244
  var React3 = __toESM(require("react"));
244
- var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
245
+ var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
245
246
  var import_ui2 = require("@elementor/ui");
246
247
 
247
- // src/hooks/use-documents-css-links.ts
248
+ // src/hooks/use-interactions-items.ts
249
+ var import_react7 = require("react");
250
+ var import_editor_interactions = require("@elementor/editor-interactions");
248
251
  var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
249
252
 
253
+ // src/hooks/use-on-mount.ts
254
+ var import_react6 = require("react");
255
+ function useOnMount(cb) {
256
+ const mounted = (0, import_react6.useRef)(false);
257
+ (0, import_react6.useEffect)(() => {
258
+ if (!mounted.current) {
259
+ mounted.current = true;
260
+ cb();
261
+ }
262
+ }, []);
263
+ }
264
+
265
+ // src/hooks/use-interactions-items.ts
266
+ function useInteractionsItems() {
267
+ const [interactionItems, setInteractionItems] = (0, import_react7.useState)({});
268
+ const providerAndSubscribers = (0, import_react7.useMemo)(() => {
269
+ try {
270
+ const providers = import_editor_interactions.interactionsRepository.getProviders();
271
+ const mapped = providers.map((provider) => {
272
+ return {
273
+ provider,
274
+ subscriber: createProviderSubscriber({
275
+ provider,
276
+ setInteractionItems
277
+ })
278
+ };
279
+ });
280
+ return mapped;
281
+ } catch {
282
+ return [];
283
+ }
284
+ }, []);
285
+ (0, import_react7.useEffect)(() => {
286
+ if (providerAndSubscribers.length === 0) {
287
+ return;
288
+ }
289
+ const unsubscribes = providerAndSubscribers.map(({ provider, subscriber }) => {
290
+ const safeSubscriber = () => {
291
+ try {
292
+ subscriber();
293
+ } catch {
294
+ }
295
+ };
296
+ const unsubscribe = provider.subscribe(safeSubscriber);
297
+ return unsubscribe;
298
+ });
299
+ return () => {
300
+ unsubscribes.forEach((unsubscribe) => unsubscribe());
301
+ };
302
+ }, [providerAndSubscribers]);
303
+ useOnMount(() => {
304
+ if (providerAndSubscribers.length === 0) {
305
+ return;
306
+ }
307
+ (0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", async () => {
308
+ providerAndSubscribers.forEach(({ subscriber }) => {
309
+ try {
310
+ subscriber();
311
+ } catch {
312
+ }
313
+ });
314
+ });
315
+ });
316
+ return (0, import_react7.useMemo)(
317
+ () => Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items),
318
+ [interactionItems]
319
+ );
320
+ }
321
+ function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
322
+ return providerA.priority - providerB.priority;
323
+ }
324
+ function createProviderSubscriber({ provider, setInteractionItems }) {
325
+ return () => {
326
+ try {
327
+ const items = provider.actions.all();
328
+ const providerKey = provider.getKey();
329
+ setInteractionItems((prev) => ({
330
+ ...prev,
331
+ [providerKey]: { provider, items }
332
+ }));
333
+ } catch {
334
+ }
335
+ };
336
+ }
337
+
250
338
  // src/sync/get-canvas-iframe-document.ts
251
339
  function getCanvasIframeDocument() {
252
340
  const extendedWindow = window;
253
341
  return extendedWindow.elementor?.$preview?.[0]?.contentDocument;
254
342
  }
255
343
 
344
+ // src/components/interactions-renderer.tsx
345
+ function InteractionsRenderer() {
346
+ const container = usePortalContainer();
347
+ const interactionItems = useInteractionsItems();
348
+ if (!container) {
349
+ return null;
350
+ }
351
+ const interactionsData = JSON.stringify(interactionItems);
352
+ return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, /* @__PURE__ */ React3.createElement(
353
+ "script",
354
+ {
355
+ type: "application/json",
356
+ "data-e-interactions": "true",
357
+ dangerouslySetInnerHTML: {
358
+ __html: interactionsData
359
+ }
360
+ }
361
+ ));
362
+ }
363
+ function usePortalContainer() {
364
+ return (0, import_editor_v1_adapters3.__privateUseListenTo)((0, import_editor_v1_adapters3.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
365
+ }
366
+
367
+ // src/components/style-renderer.tsx
368
+ var React4 = __toESM(require("react"));
369
+ var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
370
+ var import_ui3 = require("@elementor/ui");
371
+
256
372
  // src/hooks/use-documents-css-links.ts
373
+ var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
257
374
  var REMOVED_ATTR = "data-e-removed";
258
375
  var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
259
376
  var CSS_LINK_ID_PREFIX = "elementor-post-";
260
377
  var CSS_LINK_ID_SUFFIX = "-css";
261
378
  function useDocumentsCssLinks() {
262
- return (0, import_editor_v1_adapters2.__privateUseListenTo)((0, import_editor_v1_adapters2.commandEndEvent)("editor/documents/attach-preview"), () => {
379
+ return (0, import_editor_v1_adapters4.__privateUseListenTo)((0, import_editor_v1_adapters4.commandEndEvent)("editor/documents/attach-preview"), () => {
263
380
  const iframeDocument = getCanvasIframeDocument();
264
381
  if (!iframeDocument) {
265
382
  return [];
@@ -300,11 +417,11 @@ function getLinkAttrs(el) {
300
417
  }
301
418
 
302
419
  // src/hooks/use-style-items.ts
303
- var import_react9 = require("react");
420
+ var import_react10 = require("react");
304
421
  var import_editor_responsive2 = require("@elementor/editor-responsive");
305
422
  var import_editor_styles3 = require("@elementor/editor-styles");
306
423
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
307
- var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
424
+ var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
308
425
 
309
426
  // src/utils/abort-previous-runs.ts
310
427
  function abortPreviousRuns(cb) {
@@ -337,20 +454,8 @@ function signalizedProcess(signal, steps = []) {
337
454
  };
338
455
  }
339
456
 
340
- // src/hooks/use-on-mount.ts
341
- var import_react6 = require("react");
342
- function useOnMount(cb) {
343
- const mounted = (0, import_react6.useRef)(false);
344
- (0, import_react6.useEffect)(() => {
345
- if (!mounted.current) {
346
- mounted.current = true;
347
- cb();
348
- }
349
- }, []);
350
- }
351
-
352
457
  // src/hooks/use-style-prop-resolver.ts
353
- var import_react7 = require("react");
458
+ var import_react8 = require("react");
354
459
  var import_editor_styles = require("@elementor/editor-styles");
355
460
 
356
461
  // src/renderers/create-props-resolver.ts
@@ -472,7 +577,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
472
577
 
473
578
  // src/hooks/use-style-prop-resolver.ts
474
579
  function useStylePropResolver() {
475
- return (0, import_react7.useMemo)(() => {
580
+ return (0, import_react8.useMemo)(() => {
476
581
  return createPropsResolver({
477
582
  transformers: styleTransformersRegistry,
478
583
  schema: (0, import_editor_styles.getStylesSchema)(),
@@ -487,7 +592,7 @@ function useStylePropResolver() {
487
592
  }
488
593
 
489
594
  // src/hooks/use-style-renderer.ts
490
- var import_react8 = require("react");
595
+ var import_react9 = require("react");
491
596
  var import_editor_responsive = require("@elementor/editor-responsive");
492
597
 
493
598
  // src/renderers/create-styles-renderer.ts
@@ -588,7 +693,7 @@ function customCssToString(customCss) {
588
693
  var SELECTOR_PREFIX = ".elementor";
589
694
  function useStyleRenderer(resolve) {
590
695
  const breakpoints = (0, import_editor_responsive.useBreakpointsMap)();
591
- return (0, import_react8.useMemo)(() => {
696
+ return (0, import_react9.useMemo)(() => {
592
697
  return createStylesRenderer({
593
698
  selectorPrefix: SELECTOR_PREFIX,
594
699
  breakpoints,
@@ -601,12 +706,12 @@ function useStyleRenderer(resolve) {
601
706
  function useStyleItems() {
602
707
  const resolve = useStylePropResolver();
603
708
  const renderStyles = useStyleRenderer(resolve);
604
- const [styleItems, setStyleItems] = (0, import_react9.useState)({});
605
- const providerAndSubscribers = (0, import_react9.useMemo)(() => {
709
+ const [styleItems, setStyleItems] = (0, import_react10.useState)({});
710
+ const providerAndSubscribers = (0, import_react10.useMemo)(() => {
606
711
  return import_editor_styles_repository2.stylesRepository.getProviders().map((provider) => {
607
712
  return {
608
713
  provider,
609
- subscriber: createProviderSubscriber({
714
+ subscriber: createProviderSubscriber2({
610
715
  provider,
611
716
  renderStyles,
612
717
  setStyleItems
@@ -614,7 +719,7 @@ function useStyleItems() {
614
719
  };
615
720
  });
616
721
  }, [renderStyles]);
617
- (0, import_react9.useEffect)(() => {
722
+ (0, import_react10.useEffect)(() => {
618
723
  const unsubscribes = providerAndSubscribers.map(
619
724
  ({ provider, subscriber }) => provider.subscribe(subscriber)
620
725
  );
@@ -623,20 +728,20 @@ function useStyleItems() {
623
728
  };
624
729
  }, [providerAndSubscribers]);
625
730
  useOnMount(() => {
626
- (0, import_editor_v1_adapters3.registerDataHook)("after", "editor/documents/attach-preview", async () => {
731
+ (0, import_editor_v1_adapters5.registerDataHook)("after", "editor/documents/attach-preview", async () => {
627
732
  const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
628
733
  await Promise.all(promises);
629
734
  });
630
735
  });
631
736
  const breakpointsOrder = (0, import_editor_responsive2.getBreakpoints)().map((breakpoint) => breakpoint.id);
632
- return (0, import_react9.useMemo)(
633
- () => Object.values(styleItems).sort(sortByProviderPriority).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
737
+ return (0, import_react10.useMemo)(
738
+ () => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
634
739
  // eslint-disable-next-line
635
740
  // eslint-disable-next-line react-hooks/exhaustive-deps
636
741
  [styleItems, breakpointsOrder.join("-")]
637
742
  );
638
743
  }
639
- function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
744
+ function sortByProviderPriority2({ provider: providerA }, { provider: providerB }) {
640
745
  return providerA.priority - providerB.priority;
641
746
  }
642
747
  function sortByBreakpoint(breakpointsOrder) {
@@ -651,7 +756,7 @@ function sortByStateType({ state: stateA }, { state: stateB }) {
651
756
  }
652
757
  return 0;
653
758
  }
654
- function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
759
+ function createProviderSubscriber2({ provider, renderStyles, setStyleItems }) {
655
760
  return abortPreviousRuns(
656
761
  (abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
657
762
  const styles = provider.actions.all().map((__5, index, items) => {
@@ -697,16 +802,16 @@ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
697
802
 
698
803
  // src/components/style-renderer.tsx
699
804
  function StyleRenderer() {
700
- const container = usePortalContainer();
805
+ const container = usePortalContainer2();
701
806
  const styleItems = useStyleItems();
702
807
  const linksAttrs = useDocumentsCssLinks();
703
808
  if (!container) {
704
809
  return null;
705
810
  }
706
- return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React3.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React3.createElement("link", { ...attrs, key: attrs.id })));
811
+ return /* @__PURE__ */ React4.createElement(import_ui3.Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React4.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React4.createElement("link", { ...attrs, key: attrs.id })));
707
812
  }
708
- function usePortalContainer() {
709
- return (0, import_editor_v1_adapters4.__privateUseListenTo)((0, import_editor_v1_adapters4.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
813
+ function usePortalContainer2() {
814
+ return (0, import_editor_v1_adapters6.__privateUseListenTo)((0, import_editor_v1_adapters6.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
710
815
  }
711
816
 
712
817
  // src/settings-transformers-registry.ts
@@ -1127,7 +1232,7 @@ function initStyleTransformers() {
1127
1232
 
1128
1233
  // src/legacy/init-legacy-views.ts
1129
1234
  var import_editor_elements2 = require("@elementor/editor-elements");
1130
- var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
1235
+ var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
1131
1236
 
1132
1237
  // src/renderers/create-dom-renderer.ts
1133
1238
  var import_twing = require("@elementor/twing");
@@ -1354,7 +1459,7 @@ function registerElementType(type, elementTypeGenerator) {
1354
1459
  elementsLegacyTypes[type] = elementTypeGenerator;
1355
1460
  }
1356
1461
  function initLegacyViews() {
1357
- (0, import_editor_v1_adapters5.__privateListenTo)((0, import_editor_v1_adapters5.v1ReadyEvent)(), () => {
1462
+ (0, import_editor_v1_adapters7.__privateListenTo)((0, import_editor_v1_adapters7.v1ReadyEvent)(), () => {
1358
1463
  const config = (0, import_editor_elements2.getWidgetsCache)() ?? {};
1359
1464
  const legacyWindow = window;
1360
1465
  const renderer = createDomRenderer();
@@ -1378,14 +1483,14 @@ function initLegacyViews() {
1378
1483
  // src/prevent-link-in-link-commands.ts
1379
1484
  var import_editor_elements3 = require("@elementor/editor-elements");
1380
1485
  var import_editor_notifications = require("@elementor/editor-notifications");
1381
- var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
1486
+ var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
1382
1487
  var import_i18n = require("@wordpress/i18n");
1383
1488
  function initLinkInLinkPrevention() {
1384
- (0, import_editor_v1_adapters6.blockCommand)({
1489
+ (0, import_editor_v1_adapters8.blockCommand)({
1385
1490
  command: "document/elements/paste",
1386
1491
  condition: blockLinkInLinkPaste
1387
1492
  });
1388
- (0, import_editor_v1_adapters6.blockCommand)({
1493
+ (0, import_editor_v1_adapters8.blockCommand)({
1389
1494
  command: "document/elements/move",
1390
1495
  condition: blockLinkInLinkMove
1391
1496
  });
@@ -1459,12 +1564,12 @@ function shouldBlock(sourceElements, targetElements) {
1459
1564
  }
1460
1565
 
1461
1566
  // src/style-commands/paste-style.ts
1462
- var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
1567
+ var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
1463
1568
 
1464
1569
  // src/style-commands/undoable-actions/paste-element-style.ts
1465
1570
  var import_editor_elements5 = require("@elementor/editor-elements");
1466
1571
  var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
1467
- var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
1572
+ var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
1468
1573
  var import_i18n3 = require("@wordpress/i18n");
1469
1574
 
1470
1575
  // src/style-commands/utils.ts
@@ -1510,7 +1615,7 @@ function getTitleForContainers(containers) {
1510
1615
  }
1511
1616
 
1512
1617
  // src/style-commands/undoable-actions/paste-element-style.ts
1513
- var undoablePasteElementStyle = () => (0, import_editor_v1_adapters7.undoable)(
1618
+ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
1514
1619
  {
1515
1620
  do: ({ containers, newStyle }) => {
1516
1621
  return containers.map((container) => {
@@ -1586,12 +1691,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters7.undoable)(
1586
1691
  // src/style-commands/paste-style.ts
1587
1692
  function initPasteStyleCommand() {
1588
1693
  const pasteElementStyleCommand = undoablePasteElementStyle();
1589
- (0, import_editor_v1_adapters8.blockCommand)({
1694
+ (0, import_editor_v1_adapters10.blockCommand)({
1590
1695
  command: "document/elements/paste-style",
1591
1696
  condition: hasAtomicWidgets
1592
1697
  });
1593
- (0, import_editor_v1_adapters8.__privateListenTo)(
1594
- (0, import_editor_v1_adapters8.commandStartEvent)("document/elements/paste-style"),
1698
+ (0, import_editor_v1_adapters10.__privateListenTo)(
1699
+ (0, import_editor_v1_adapters10.commandStartEvent)("document/elements/paste-style"),
1595
1700
  (e) => pasteStyles(e.args, pasteElementStyleCommand)
1596
1701
  );
1597
1702
  }
@@ -1615,14 +1720,14 @@ function pasteStyles(args, pasteCallback) {
1615
1720
  }
1616
1721
 
1617
1722
  // src/style-commands/reset-style.ts
1618
- var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
1723
+ var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
1619
1724
 
1620
1725
  // src/style-commands/undoable-actions/reset-element-style.ts
1621
1726
  var import_editor_elements6 = require("@elementor/editor-elements");
1622
1727
  var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
1623
- var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
1728
+ var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
1624
1729
  var import_i18n4 = require("@wordpress/i18n");
1625
- var undoableResetElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
1730
+ var undoableResetElementStyle = () => (0, import_editor_v1_adapters11.undoable)(
1626
1731
  {
1627
1732
  do: ({ containers }) => {
1628
1733
  return containers.map((container) => {
@@ -1666,12 +1771,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
1666
1771
  // src/style-commands/reset-style.ts
1667
1772
  function initResetStyleCommand() {
1668
1773
  const resetElementStyles = undoableResetElementStyle();
1669
- (0, import_editor_v1_adapters10.blockCommand)({
1774
+ (0, import_editor_v1_adapters12.blockCommand)({
1670
1775
  command: "document/elements/reset-style",
1671
1776
  condition: hasAtomicWidgets
1672
1777
  });
1673
- (0, import_editor_v1_adapters10.__privateListenTo)(
1674
- (0, import_editor_v1_adapters10.commandStartEvent)("document/elements/reset-style"),
1778
+ (0, import_editor_v1_adapters12.__privateListenTo)(
1779
+ (0, import_editor_v1_adapters12.commandStartEvent)("document/elements/reset-style"),
1675
1780
  (e) => resetStyles(e.args, resetElementStyles)
1676
1781
  );
1677
1782
  }
@@ -1697,6 +1802,7 @@ function init() {
1697
1802
  initLinkInLinkPrevention();
1698
1803
  initLegacyViews();
1699
1804
  initSettingsTransformers();
1805
+ (0, import_editor_interactions2.init)();
1700
1806
  (0, import_editor.injectIntoTop)({
1701
1807
  id: "elements-overlays",
1702
1808
  component: ElementsOverlays
@@ -1705,6 +1811,10 @@ function init() {
1705
1811
  id: "canvas-style-render",
1706
1812
  component: StyleRenderer
1707
1813
  });
1814
+ (0, import_editor.injectIntoTop)({
1815
+ id: "canvas-interactions-render",
1816
+ component: InteractionsRenderer
1817
+ });
1708
1818
  (0, import_editor.injectIntoLogic)({
1709
1819
  id: "classes-rename",
1710
1820
  component: ClassesRename
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  // src/init.tsx
2
2
  import { injectIntoLogic, injectIntoTop } from "@elementor/editor";
3
+ import { init as initInteractionsRepository } from "@elementor/editor-interactions";
3
4
 
4
5
  // src/components/classes-rename.tsx
5
6
  import { useEffect } from "react";
@@ -199,13 +200,100 @@ function useElementsDom() {
199
200
  );
200
201
  }
201
202
 
202
- // src/components/style-renderer.tsx
203
+ // src/components/interactions-renderer.tsx
203
204
  import * as React3 from "react";
204
- import { __privateUseListenTo as useListenTo3, commandEndEvent as commandEndEvent2 } from "@elementor/editor-v1-adapters";
205
+ import { __privateUseListenTo as useListenTo2, commandEndEvent } from "@elementor/editor-v1-adapters";
205
206
  import { Portal } from "@elementor/ui";
206
207
 
207
- // src/hooks/use-documents-css-links.ts
208
- import { __privateUseListenTo as useListenTo2, commandEndEvent } from "@elementor/editor-v1-adapters";
208
+ // src/hooks/use-interactions-items.ts
209
+ import { useEffect as useEffect5, useMemo, useState as useState2 } from "react";
210
+ import { interactionsRepository } from "@elementor/editor-interactions";
211
+ import { registerDataHook } from "@elementor/editor-v1-adapters";
212
+
213
+ // src/hooks/use-on-mount.ts
214
+ import { useEffect as useEffect4, useRef } from "react";
215
+ function useOnMount(cb) {
216
+ const mounted = useRef(false);
217
+ useEffect4(() => {
218
+ if (!mounted.current) {
219
+ mounted.current = true;
220
+ cb();
221
+ }
222
+ }, []);
223
+ }
224
+
225
+ // src/hooks/use-interactions-items.ts
226
+ function useInteractionsItems() {
227
+ const [interactionItems, setInteractionItems] = useState2({});
228
+ const providerAndSubscribers = useMemo(() => {
229
+ try {
230
+ const providers = interactionsRepository.getProviders();
231
+ const mapped = providers.map((provider) => {
232
+ return {
233
+ provider,
234
+ subscriber: createProviderSubscriber({
235
+ provider,
236
+ setInteractionItems
237
+ })
238
+ };
239
+ });
240
+ return mapped;
241
+ } catch {
242
+ return [];
243
+ }
244
+ }, []);
245
+ useEffect5(() => {
246
+ if (providerAndSubscribers.length === 0) {
247
+ return;
248
+ }
249
+ const unsubscribes = providerAndSubscribers.map(({ provider, subscriber }) => {
250
+ const safeSubscriber = () => {
251
+ try {
252
+ subscriber();
253
+ } catch {
254
+ }
255
+ };
256
+ const unsubscribe = provider.subscribe(safeSubscriber);
257
+ return unsubscribe;
258
+ });
259
+ return () => {
260
+ unsubscribes.forEach((unsubscribe) => unsubscribe());
261
+ };
262
+ }, [providerAndSubscribers]);
263
+ useOnMount(() => {
264
+ if (providerAndSubscribers.length === 0) {
265
+ return;
266
+ }
267
+ registerDataHook("after", "editor/documents/attach-preview", async () => {
268
+ providerAndSubscribers.forEach(({ subscriber }) => {
269
+ try {
270
+ subscriber();
271
+ } catch {
272
+ }
273
+ });
274
+ });
275
+ });
276
+ return useMemo(
277
+ () => Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items),
278
+ [interactionItems]
279
+ );
280
+ }
281
+ function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
282
+ return providerA.priority - providerB.priority;
283
+ }
284
+ function createProviderSubscriber({ provider, setInteractionItems }) {
285
+ return () => {
286
+ try {
287
+ const items = provider.actions.all();
288
+ const providerKey = provider.getKey();
289
+ setInteractionItems((prev) => ({
290
+ ...prev,
291
+ [providerKey]: { provider, items }
292
+ }));
293
+ } catch {
294
+ }
295
+ };
296
+ }
209
297
 
210
298
  // src/sync/get-canvas-iframe-document.ts
211
299
  function getCanvasIframeDocument() {
@@ -213,13 +301,42 @@ function getCanvasIframeDocument() {
213
301
  return extendedWindow.elementor?.$preview?.[0]?.contentDocument;
214
302
  }
215
303
 
304
+ // src/components/interactions-renderer.tsx
305
+ function InteractionsRenderer() {
306
+ const container = usePortalContainer();
307
+ const interactionItems = useInteractionsItems();
308
+ if (!container) {
309
+ return null;
310
+ }
311
+ const interactionsData = JSON.stringify(interactionItems);
312
+ return /* @__PURE__ */ React3.createElement(Portal, { container }, /* @__PURE__ */ React3.createElement(
313
+ "script",
314
+ {
315
+ type: "application/json",
316
+ "data-e-interactions": "true",
317
+ dangerouslySetInnerHTML: {
318
+ __html: interactionsData
319
+ }
320
+ }
321
+ ));
322
+ }
323
+ function usePortalContainer() {
324
+ return useListenTo2(commandEndEvent("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
325
+ }
326
+
327
+ // src/components/style-renderer.tsx
328
+ import * as React4 from "react";
329
+ import { __privateUseListenTo as useListenTo4, commandEndEvent as commandEndEvent3 } from "@elementor/editor-v1-adapters";
330
+ import { Portal as Portal2 } from "@elementor/ui";
331
+
216
332
  // src/hooks/use-documents-css-links.ts
333
+ import { __privateUseListenTo as useListenTo3, commandEndEvent as commandEndEvent2 } from "@elementor/editor-v1-adapters";
217
334
  var REMOVED_ATTR = "data-e-removed";
218
335
  var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
219
336
  var CSS_LINK_ID_PREFIX = "elementor-post-";
220
337
  var CSS_LINK_ID_SUFFIX = "-css";
221
338
  function useDocumentsCssLinks() {
222
- return useListenTo2(commandEndEvent("editor/documents/attach-preview"), () => {
339
+ return useListenTo3(commandEndEvent2("editor/documents/attach-preview"), () => {
223
340
  const iframeDocument = getCanvasIframeDocument();
224
341
  if (!iframeDocument) {
225
342
  return [];
@@ -260,11 +377,11 @@ function getLinkAttrs(el) {
260
377
  }
261
378
 
262
379
  // src/hooks/use-style-items.ts
263
- import { useEffect as useEffect5, useMemo as useMemo3, useState as useState2 } from "react";
380
+ import { useEffect as useEffect6, useMemo as useMemo4, useState as useState3 } from "react";
264
381
  import { getBreakpoints } from "@elementor/editor-responsive";
265
382
  import { isClassState as isClassState2 } from "@elementor/editor-styles";
266
383
  import { stylesRepository as stylesRepository2 } from "@elementor/editor-styles-repository";
267
- import { registerDataHook } from "@elementor/editor-v1-adapters";
384
+ import { registerDataHook as registerDataHook2 } from "@elementor/editor-v1-adapters";
268
385
 
269
386
  // src/utils/abort-previous-runs.ts
270
387
  function abortPreviousRuns(cb) {
@@ -297,20 +414,8 @@ function signalizedProcess(signal, steps = []) {
297
414
  };
298
415
  }
299
416
 
300
- // src/hooks/use-on-mount.ts
301
- import { useEffect as useEffect4, useRef } from "react";
302
- function useOnMount(cb) {
303
- const mounted = useRef(false);
304
- useEffect4(() => {
305
- if (!mounted.current) {
306
- mounted.current = true;
307
- cb();
308
- }
309
- }, []);
310
- }
311
-
312
417
  // src/hooks/use-style-prop-resolver.ts
313
- import { useMemo } from "react";
418
+ import { useMemo as useMemo2 } from "react";
314
419
  import { getStylesSchema } from "@elementor/editor-styles";
315
420
 
316
421
  // src/renderers/create-props-resolver.ts
@@ -434,7 +539,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
434
539
 
435
540
  // src/hooks/use-style-prop-resolver.ts
436
541
  function useStylePropResolver() {
437
- return useMemo(() => {
542
+ return useMemo2(() => {
438
543
  return createPropsResolver({
439
544
  transformers: styleTransformersRegistry,
440
545
  schema: getStylesSchema(),
@@ -449,7 +554,7 @@ function useStylePropResolver() {
449
554
  }
450
555
 
451
556
  // src/hooks/use-style-renderer.ts
452
- import { useMemo as useMemo2 } from "react";
557
+ import { useMemo as useMemo3 } from "react";
453
558
  import { useBreakpointsMap } from "@elementor/editor-responsive";
454
559
 
455
560
  // src/renderers/create-styles-renderer.ts
@@ -553,7 +658,7 @@ function customCssToString(customCss) {
553
658
  var SELECTOR_PREFIX = ".elementor";
554
659
  function useStyleRenderer(resolve) {
555
660
  const breakpoints = useBreakpointsMap();
556
- return useMemo2(() => {
661
+ return useMemo3(() => {
557
662
  return createStylesRenderer({
558
663
  selectorPrefix: SELECTOR_PREFIX,
559
664
  breakpoints,
@@ -566,12 +671,12 @@ function useStyleRenderer(resolve) {
566
671
  function useStyleItems() {
567
672
  const resolve = useStylePropResolver();
568
673
  const renderStyles = useStyleRenderer(resolve);
569
- const [styleItems, setStyleItems] = useState2({});
570
- const providerAndSubscribers = useMemo3(() => {
674
+ const [styleItems, setStyleItems] = useState3({});
675
+ const providerAndSubscribers = useMemo4(() => {
571
676
  return stylesRepository2.getProviders().map((provider) => {
572
677
  return {
573
678
  provider,
574
- subscriber: createProviderSubscriber({
679
+ subscriber: createProviderSubscriber2({
575
680
  provider,
576
681
  renderStyles,
577
682
  setStyleItems
@@ -579,7 +684,7 @@ function useStyleItems() {
579
684
  };
580
685
  });
581
686
  }, [renderStyles]);
582
- useEffect5(() => {
687
+ useEffect6(() => {
583
688
  const unsubscribes = providerAndSubscribers.map(
584
689
  ({ provider, subscriber }) => provider.subscribe(subscriber)
585
690
  );
@@ -588,20 +693,20 @@ function useStyleItems() {
588
693
  };
589
694
  }, [providerAndSubscribers]);
590
695
  useOnMount(() => {
591
- registerDataHook("after", "editor/documents/attach-preview", async () => {
696
+ registerDataHook2("after", "editor/documents/attach-preview", async () => {
592
697
  const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
593
698
  await Promise.all(promises);
594
699
  });
595
700
  });
596
701
  const breakpointsOrder = getBreakpoints().map((breakpoint) => breakpoint.id);
597
- return useMemo3(
598
- () => Object.values(styleItems).sort(sortByProviderPriority).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
702
+ return useMemo4(
703
+ () => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
599
704
  // eslint-disable-next-line
600
705
  // eslint-disable-next-line react-hooks/exhaustive-deps
601
706
  [styleItems, breakpointsOrder.join("-")]
602
707
  );
603
708
  }
604
- function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
709
+ function sortByProviderPriority2({ provider: providerA }, { provider: providerB }) {
605
710
  return providerA.priority - providerB.priority;
606
711
  }
607
712
  function sortByBreakpoint(breakpointsOrder) {
@@ -616,7 +721,7 @@ function sortByStateType({ state: stateA }, { state: stateB }) {
616
721
  }
617
722
  return 0;
618
723
  }
619
- function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
724
+ function createProviderSubscriber2({ provider, renderStyles, setStyleItems }) {
620
725
  return abortPreviousRuns(
621
726
  (abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
622
727
  const styles = provider.actions.all().map((__5, index, items) => {
@@ -662,16 +767,16 @@ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
662
767
 
663
768
  // src/components/style-renderer.tsx
664
769
  function StyleRenderer() {
665
- const container = usePortalContainer();
770
+ const container = usePortalContainer2();
666
771
  const styleItems = useStyleItems();
667
772
  const linksAttrs = useDocumentsCssLinks();
668
773
  if (!container) {
669
774
  return null;
670
775
  }
671
- return /* @__PURE__ */ React3.createElement(Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React3.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React3.createElement("link", { ...attrs, key: attrs.id })));
776
+ return /* @__PURE__ */ React4.createElement(Portal2, { container }, styleItems.map((item, i) => /* @__PURE__ */ React4.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React4.createElement("link", { ...attrs, key: attrs.id })));
672
777
  }
673
- function usePortalContainer() {
674
- return useListenTo3(commandEndEvent2("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
778
+ function usePortalContainer2() {
779
+ return useListenTo4(commandEndEvent3("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
675
780
  }
676
781
 
677
782
  // src/settings-transformers-registry.ts
@@ -1679,6 +1784,7 @@ function init() {
1679
1784
  initLinkInLinkPrevention();
1680
1785
  initLegacyViews();
1681
1786
  initSettingsTransformers();
1787
+ initInteractionsRepository();
1682
1788
  injectIntoTop({
1683
1789
  id: "elements-overlays",
1684
1790
  component: ElementsOverlays
@@ -1687,6 +1793,10 @@ function init() {
1687
1793
  id: "canvas-style-render",
1688
1794
  component: StyleRenderer
1689
1795
  });
1796
+ injectIntoTop({
1797
+ id: "canvas-interactions-render",
1798
+ component: InteractionsRenderer
1799
+ });
1690
1800
  injectIntoLogic({
1691
1801
  id: "classes-rename",
1692
1802
  component: ClassesRename
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-canvas",
3
3
  "description": "Elementor Editor Canvas",
4
- "version": "3.33.0-233",
4
+ "version": "3.33.0-235",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -37,20 +37,21 @@
37
37
  "react-dom": "^18.3.1"
38
38
  },
39
39
  "dependencies": {
40
- "@elementor/editor": "3.33.0-233",
41
- "@elementor/editor-controls": "3.33.0-233",
42
- "@elementor/editor-documents": "3.33.0-233",
43
- "@elementor/editor-elements": "3.33.0-233",
44
- "@elementor/editor-notifications": "3.33.0-233",
45
- "@elementor/editor-props": "3.33.0-233",
46
- "@elementor/editor-responsive": "3.33.0-233",
47
- "@elementor/editor-styles": "3.33.0-233",
48
- "@elementor/editor-styles-repository": "3.33.0-233",
49
- "@elementor/editor-v1-adapters": "3.33.0-233",
50
- "@elementor/twing": "3.33.0-233",
40
+ "@elementor/editor": "3.33.0-235",
41
+ "@elementor/editor-controls": "3.33.0-235",
42
+ "@elementor/editor-documents": "3.33.0-235",
43
+ "@elementor/editor-elements": "3.33.0-235",
44
+ "@elementor/editor-interactions": "3.33.0-235",
45
+ "@elementor/editor-notifications": "3.33.0-235",
46
+ "@elementor/editor-props": "3.33.0-235",
47
+ "@elementor/editor-responsive": "3.33.0-235",
48
+ "@elementor/editor-styles": "3.33.0-235",
49
+ "@elementor/editor-styles-repository": "3.33.0-235",
50
+ "@elementor/editor-v1-adapters": "3.33.0-235",
51
+ "@elementor/twing": "3.33.0-235",
51
52
  "@elementor/ui": "1.36.12",
52
- "@elementor/utils": "3.33.0-233",
53
- "@elementor/wp-media": "3.33.0-233",
53
+ "@elementor/utils": "3.33.0-235",
54
+ "@elementor/wp-media": "3.33.0-235",
54
55
  "@floating-ui/react": "^0.27.5",
55
56
  "@wordpress/i18n": "^5.13.0"
56
57
  },
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';
3
+ import { Portal } from '@elementor/ui';
4
+
5
+ import { useInteractionsItems } from '../hooks/use-interactions-items';
6
+ import { getCanvasIframeDocument } from '../sync/get-canvas-iframe-document';
7
+
8
+ export function InteractionsRenderer() {
9
+ const container = usePortalContainer();
10
+ const interactionItems = useInteractionsItems();
11
+
12
+ if ( ! container ) {
13
+ return null;
14
+ }
15
+
16
+ const interactionsData = JSON.stringify( interactionItems );
17
+
18
+ return (
19
+ <Portal container={ container }>
20
+ <script
21
+ type="application/json"
22
+ data-e-interactions="true"
23
+ dangerouslySetInnerHTML={ {
24
+ __html: interactionsData,
25
+ } }
26
+ />
27
+ </Portal>
28
+ );
29
+ }
30
+
31
+ function usePortalContainer() {
32
+ return useListenTo( commandEndEvent( 'editor/documents/attach-preview' ), () => getCanvasIframeDocument()?.head );
33
+ }
@@ -0,0 +1,107 @@
1
+ import { type Dispatch, type SetStateAction, useEffect, useMemo, useState } from 'react';
2
+ import { type InteractionItem, interactionsRepository } from '@elementor/editor-interactions';
3
+ import { registerDataHook } from '@elementor/editor-v1-adapters';
4
+
5
+ import { useOnMount } from './use-on-mount';
6
+
7
+ type ProviderAndInteractionItems = {
8
+ provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
9
+ items: InteractionItem[];
10
+ };
11
+
12
+ type ProviderAndSubscriber = {
13
+ provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
14
+ subscriber: () => void;
15
+ };
16
+
17
+ type ProviderAndInteractionItemsMap = Record< string, ProviderAndInteractionItems >;
18
+
19
+ export function useInteractionsItems() {
20
+ const [ interactionItems, setInteractionItems ] = useState< ProviderAndInteractionItemsMap >( {} );
21
+
22
+ const providerAndSubscribers = useMemo( () => {
23
+ try {
24
+ const providers = interactionsRepository.getProviders();
25
+ const mapped = providers.map( ( provider ): ProviderAndSubscriber => {
26
+ return {
27
+ provider,
28
+ subscriber: createProviderSubscriber( {
29
+ provider,
30
+ setInteractionItems,
31
+ } ),
32
+ };
33
+ } );
34
+ return mapped;
35
+ } catch {
36
+ return [];
37
+ }
38
+ }, [] );
39
+
40
+ useEffect( () => {
41
+ if ( providerAndSubscribers.length === 0 ) {
42
+ return;
43
+ }
44
+
45
+ const unsubscribes = providerAndSubscribers.map( ( { provider, subscriber } ) => {
46
+ const safeSubscriber = () => {
47
+ try {
48
+ subscriber();
49
+ } catch {}
50
+ };
51
+ const unsubscribe = provider.subscribe( safeSubscriber );
52
+ return unsubscribe;
53
+ } );
54
+
55
+ return () => {
56
+ unsubscribes.forEach( ( unsubscribe ) => unsubscribe() );
57
+ };
58
+ }, [ providerAndSubscribers ] );
59
+
60
+ useOnMount( () => {
61
+ if ( providerAndSubscribers.length === 0 ) {
62
+ return;
63
+ }
64
+
65
+ registerDataHook( 'after', 'editor/documents/attach-preview', async () => {
66
+ providerAndSubscribers.forEach( ( { subscriber } ) => {
67
+ try {
68
+ subscriber();
69
+ } catch {}
70
+ } );
71
+ } );
72
+ } );
73
+
74
+ return useMemo(
75
+ () =>
76
+ Object.values( interactionItems )
77
+ .sort( sortByProviderPriority )
78
+ .flatMap( ( { items } ) => items ),
79
+ [ interactionItems ]
80
+ );
81
+ }
82
+
83
+ function sortByProviderPriority(
84
+ { provider: providerA }: ProviderAndInteractionItems,
85
+ { provider: providerB }: ProviderAndInteractionItems
86
+ ) {
87
+ return providerA.priority - providerB.priority;
88
+ }
89
+
90
+ type CreateProviderSubscriberArgs = {
91
+ provider: ReturnType< typeof interactionsRepository.getProviders >[ 0 ];
92
+ setInteractionItems: Dispatch< SetStateAction< ProviderAndInteractionItemsMap > >;
93
+ };
94
+
95
+ function createProviderSubscriber( { provider, setInteractionItems }: CreateProviderSubscriberArgs ) {
96
+ return () => {
97
+ try {
98
+ const items = provider.actions.all();
99
+ const providerKey = provider.getKey();
100
+
101
+ setInteractionItems( ( prev ) => ( {
102
+ ...prev,
103
+ [ providerKey ]: { provider, items },
104
+ } ) );
105
+ } catch {}
106
+ };
107
+ }
package/src/init.tsx CHANGED
@@ -1,7 +1,9 @@
1
1
  import { injectIntoLogic, injectIntoTop } from '@elementor/editor';
2
+ import { init as initInteractionsRepository } from '@elementor/editor-interactions';
2
3
 
3
4
  import { ClassesRename } from './components/classes-rename';
4
5
  import { ElementsOverlays } from './components/elements-overlays';
6
+ import { InteractionsRenderer } from './components/interactions-renderer';
5
7
  import { StyleRenderer } from './components/style-renderer';
6
8
  import { initSettingsTransformers } from './init-settings-transformers';
7
9
  import { initStyleTransformers } from './init-style-transformers';
@@ -19,6 +21,8 @@ export function init() {
19
21
 
20
22
  initSettingsTransformers();
21
23
 
24
+ initInteractionsRepository();
25
+
22
26
  injectIntoTop( {
23
27
  id: 'elements-overlays',
24
28
  component: ElementsOverlays,
@@ -29,6 +33,11 @@ export function init() {
29
33
  component: StyleRenderer,
30
34
  } );
31
35
 
36
+ injectIntoTop( {
37
+ id: 'canvas-interactions-render',
38
+ component: InteractionsRenderer,
39
+ } );
40
+
32
41
  injectIntoLogic( {
33
42
  id: 'classes-rename',
34
43
  component: ClassesRename,
package/src/sync/types.ts CHANGED
@@ -39,5 +39,10 @@ export type CanvasExtendedWindow = Window & {
39
39
  storage?: {
40
40
  get: ( key?: string ) => StorageContent;
41
41
  };
42
+ config?: {
43
+ urls?: {
44
+ assets?: string;
45
+ };
46
+ };
42
47
  };
43
48
  };