@elementor/editor-canvas 3.33.0-234 → 3.33.0-236
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.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +164 -52
- package/dist/index.mjs +147 -36
- package/package.json +15 -14
- package/src/components/interactions-renderer.tsx +33 -0
- package/src/hooks/use-interactions-items.ts +107 -0
- package/src/index.ts +1 -0
- package/src/init.tsx +9 -0
- package/src/sync/types.ts +5 -0
package/dist/index.d.mts
CHANGED
|
@@ -179,4 +179,6 @@ type ElementLegacyType = {
|
|
|
179
179
|
};
|
|
180
180
|
declare function registerElementType(type: string, elementTypeGenerator: ElementLegacyType[keyof ElementLegacyType]): void;
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
declare function getCanvasIframeDocument(): Document | null | undefined;
|
|
183
|
+
|
|
184
|
+
export { type AnyTransformer, type BackboneModel, type CreateTemplatedElementTypeOptions, type ElementModel, ElementType, ElementView, type LegacyWindow, type PropsResolver, createPropsResolver, createTemplatedElementView, createTransformer, createTransformersRegistry, endDragElementFromPanel, getCanvasIframeDocument, init, registerElementType, settingsTransformersRegistry, startDragElementFromPanel, styleTransformersRegistry };
|
package/dist/index.d.ts
CHANGED
|
@@ -179,4 +179,6 @@ type ElementLegacyType = {
|
|
|
179
179
|
};
|
|
180
180
|
declare function registerElementType(type: string, elementTypeGenerator: ElementLegacyType[keyof ElementLegacyType]): void;
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
declare function getCanvasIframeDocument(): Document | null | undefined;
|
|
183
|
+
|
|
184
|
+
export { type AnyTransformer, type BackboneModel, type CreateTemplatedElementTypeOptions, type ElementModel, ElementType, ElementView, type LegacyWindow, type PropsResolver, createPropsResolver, createTemplatedElementView, createTransformer, createTransformersRegistry, endDragElementFromPanel, getCanvasIframeDocument, init, registerElementType, settingsTransformersRegistry, startDragElementFromPanel, styleTransformersRegistry };
|
package/dist/index.js
CHANGED
|
@@ -35,6 +35,7 @@ __export(index_exports, {
|
|
|
35
35
|
createTransformer: () => createTransformer,
|
|
36
36
|
createTransformersRegistry: () => createTransformersRegistry,
|
|
37
37
|
endDragElementFromPanel: () => endDragElementFromPanel,
|
|
38
|
+
getCanvasIframeDocument: () => getCanvasIframeDocument,
|
|
38
39
|
init: () => init,
|
|
39
40
|
registerElementType: () => registerElementType,
|
|
40
41
|
settingsTransformersRegistry: () => settingsTransformersRegistry,
|
|
@@ -45,6 +46,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
45
46
|
|
|
46
47
|
// src/init.tsx
|
|
47
48
|
var import_editor = require("@elementor/editor");
|
|
49
|
+
var import_editor_interactions2 = require("@elementor/editor-interactions");
|
|
48
50
|
|
|
49
51
|
// src/components/classes-rename.tsx
|
|
50
52
|
var import_react = require("react");
|
|
@@ -239,27 +241,143 @@ function useElementsDom() {
|
|
|
239
241
|
);
|
|
240
242
|
}
|
|
241
243
|
|
|
242
|
-
// src/components/
|
|
244
|
+
// src/components/interactions-renderer.tsx
|
|
243
245
|
var React3 = __toESM(require("react"));
|
|
244
|
-
var
|
|
246
|
+
var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
|
|
245
247
|
var import_ui2 = require("@elementor/ui");
|
|
246
248
|
|
|
247
|
-
// src/hooks/use-
|
|
249
|
+
// src/hooks/use-interactions-items.ts
|
|
250
|
+
var import_react7 = require("react");
|
|
251
|
+
var import_editor_interactions = require("@elementor/editor-interactions");
|
|
248
252
|
var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
|
|
249
253
|
|
|
254
|
+
// src/hooks/use-on-mount.ts
|
|
255
|
+
var import_react6 = require("react");
|
|
256
|
+
function useOnMount(cb) {
|
|
257
|
+
const mounted = (0, import_react6.useRef)(false);
|
|
258
|
+
(0, import_react6.useEffect)(() => {
|
|
259
|
+
if (!mounted.current) {
|
|
260
|
+
mounted.current = true;
|
|
261
|
+
cb();
|
|
262
|
+
}
|
|
263
|
+
}, []);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/hooks/use-interactions-items.ts
|
|
267
|
+
function useInteractionsItems() {
|
|
268
|
+
const [interactionItems, setInteractionItems] = (0, import_react7.useState)({});
|
|
269
|
+
const providerAndSubscribers = (0, import_react7.useMemo)(() => {
|
|
270
|
+
try {
|
|
271
|
+
const providers = import_editor_interactions.interactionsRepository.getProviders();
|
|
272
|
+
const mapped = providers.map((provider) => {
|
|
273
|
+
return {
|
|
274
|
+
provider,
|
|
275
|
+
subscriber: createProviderSubscriber({
|
|
276
|
+
provider,
|
|
277
|
+
setInteractionItems
|
|
278
|
+
})
|
|
279
|
+
};
|
|
280
|
+
});
|
|
281
|
+
return mapped;
|
|
282
|
+
} catch {
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
}, []);
|
|
286
|
+
(0, import_react7.useEffect)(() => {
|
|
287
|
+
if (providerAndSubscribers.length === 0) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const unsubscribes = providerAndSubscribers.map(({ provider, subscriber }) => {
|
|
291
|
+
const safeSubscriber = () => {
|
|
292
|
+
try {
|
|
293
|
+
subscriber();
|
|
294
|
+
} catch {
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const unsubscribe = provider.subscribe(safeSubscriber);
|
|
298
|
+
return unsubscribe;
|
|
299
|
+
});
|
|
300
|
+
return () => {
|
|
301
|
+
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
302
|
+
};
|
|
303
|
+
}, [providerAndSubscribers]);
|
|
304
|
+
useOnMount(() => {
|
|
305
|
+
if (providerAndSubscribers.length === 0) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
(0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", async () => {
|
|
309
|
+
providerAndSubscribers.forEach(({ subscriber }) => {
|
|
310
|
+
try {
|
|
311
|
+
subscriber();
|
|
312
|
+
} catch {
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
return (0, import_react7.useMemo)(
|
|
318
|
+
() => Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items),
|
|
319
|
+
[interactionItems]
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
|
|
323
|
+
return providerA.priority - providerB.priority;
|
|
324
|
+
}
|
|
325
|
+
function createProviderSubscriber({ provider, setInteractionItems }) {
|
|
326
|
+
return () => {
|
|
327
|
+
try {
|
|
328
|
+
const items = provider.actions.all();
|
|
329
|
+
const providerKey = provider.getKey();
|
|
330
|
+
setInteractionItems((prev) => ({
|
|
331
|
+
...prev,
|
|
332
|
+
[providerKey]: { provider, items }
|
|
333
|
+
}));
|
|
334
|
+
} catch {
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
250
339
|
// src/sync/get-canvas-iframe-document.ts
|
|
251
340
|
function getCanvasIframeDocument() {
|
|
252
341
|
const extendedWindow = window;
|
|
253
342
|
return extendedWindow.elementor?.$preview?.[0]?.contentDocument;
|
|
254
343
|
}
|
|
255
344
|
|
|
345
|
+
// src/components/interactions-renderer.tsx
|
|
346
|
+
function InteractionsRenderer() {
|
|
347
|
+
const container = usePortalContainer();
|
|
348
|
+
const interactionItems = useInteractionsItems();
|
|
349
|
+
if (!container) {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
const interactionsData = JSON.stringify(interactionItems);
|
|
353
|
+
return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, /* @__PURE__ */ React3.createElement(
|
|
354
|
+
"script",
|
|
355
|
+
{
|
|
356
|
+
type: "application/json",
|
|
357
|
+
"data-e-interactions": "true",
|
|
358
|
+
dangerouslySetInnerHTML: {
|
|
359
|
+
__html: interactionsData
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
));
|
|
363
|
+
}
|
|
364
|
+
function usePortalContainer() {
|
|
365
|
+
return (0, import_editor_v1_adapters3.__privateUseListenTo)((0, import_editor_v1_adapters3.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// src/components/style-renderer.tsx
|
|
369
|
+
var React4 = __toESM(require("react"));
|
|
370
|
+
var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
|
|
371
|
+
var import_ui3 = require("@elementor/ui");
|
|
372
|
+
|
|
256
373
|
// src/hooks/use-documents-css-links.ts
|
|
374
|
+
var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
|
|
257
375
|
var REMOVED_ATTR = "data-e-removed";
|
|
258
376
|
var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
|
|
259
377
|
var CSS_LINK_ID_PREFIX = "elementor-post-";
|
|
260
378
|
var CSS_LINK_ID_SUFFIX = "-css";
|
|
261
379
|
function useDocumentsCssLinks() {
|
|
262
|
-
return (0,
|
|
380
|
+
return (0, import_editor_v1_adapters4.__privateUseListenTo)((0, import_editor_v1_adapters4.commandEndEvent)("editor/documents/attach-preview"), () => {
|
|
263
381
|
const iframeDocument = getCanvasIframeDocument();
|
|
264
382
|
if (!iframeDocument) {
|
|
265
383
|
return [];
|
|
@@ -300,11 +418,11 @@ function getLinkAttrs(el) {
|
|
|
300
418
|
}
|
|
301
419
|
|
|
302
420
|
// src/hooks/use-style-items.ts
|
|
303
|
-
var
|
|
421
|
+
var import_react10 = require("react");
|
|
304
422
|
var import_editor_responsive2 = require("@elementor/editor-responsive");
|
|
305
423
|
var import_editor_styles3 = require("@elementor/editor-styles");
|
|
306
424
|
var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
|
|
307
|
-
var
|
|
425
|
+
var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
|
|
308
426
|
|
|
309
427
|
// src/utils/abort-previous-runs.ts
|
|
310
428
|
function abortPreviousRuns(cb) {
|
|
@@ -337,20 +455,8 @@ function signalizedProcess(signal, steps = []) {
|
|
|
337
455
|
};
|
|
338
456
|
}
|
|
339
457
|
|
|
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
458
|
// src/hooks/use-style-prop-resolver.ts
|
|
353
|
-
var
|
|
459
|
+
var import_react8 = require("react");
|
|
354
460
|
var import_editor_styles = require("@elementor/editor-styles");
|
|
355
461
|
|
|
356
462
|
// src/renderers/create-props-resolver.ts
|
|
@@ -472,7 +578,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
|
|
|
472
578
|
|
|
473
579
|
// src/hooks/use-style-prop-resolver.ts
|
|
474
580
|
function useStylePropResolver() {
|
|
475
|
-
return (0,
|
|
581
|
+
return (0, import_react8.useMemo)(() => {
|
|
476
582
|
return createPropsResolver({
|
|
477
583
|
transformers: styleTransformersRegistry,
|
|
478
584
|
schema: (0, import_editor_styles.getStylesSchema)(),
|
|
@@ -487,7 +593,7 @@ function useStylePropResolver() {
|
|
|
487
593
|
}
|
|
488
594
|
|
|
489
595
|
// src/hooks/use-style-renderer.ts
|
|
490
|
-
var
|
|
596
|
+
var import_react9 = require("react");
|
|
491
597
|
var import_editor_responsive = require("@elementor/editor-responsive");
|
|
492
598
|
|
|
493
599
|
// src/renderers/create-styles-renderer.ts
|
|
@@ -588,7 +694,7 @@ function customCssToString(customCss) {
|
|
|
588
694
|
var SELECTOR_PREFIX = ".elementor";
|
|
589
695
|
function useStyleRenderer(resolve) {
|
|
590
696
|
const breakpoints = (0, import_editor_responsive.useBreakpointsMap)();
|
|
591
|
-
return (0,
|
|
697
|
+
return (0, import_react9.useMemo)(() => {
|
|
592
698
|
return createStylesRenderer({
|
|
593
699
|
selectorPrefix: SELECTOR_PREFIX,
|
|
594
700
|
breakpoints,
|
|
@@ -601,12 +707,12 @@ function useStyleRenderer(resolve) {
|
|
|
601
707
|
function useStyleItems() {
|
|
602
708
|
const resolve = useStylePropResolver();
|
|
603
709
|
const renderStyles = useStyleRenderer(resolve);
|
|
604
|
-
const [styleItems, setStyleItems] = (0,
|
|
605
|
-
const providerAndSubscribers = (0,
|
|
710
|
+
const [styleItems, setStyleItems] = (0, import_react10.useState)({});
|
|
711
|
+
const providerAndSubscribers = (0, import_react10.useMemo)(() => {
|
|
606
712
|
return import_editor_styles_repository2.stylesRepository.getProviders().map((provider) => {
|
|
607
713
|
return {
|
|
608
714
|
provider,
|
|
609
|
-
subscriber:
|
|
715
|
+
subscriber: createProviderSubscriber2({
|
|
610
716
|
provider,
|
|
611
717
|
renderStyles,
|
|
612
718
|
setStyleItems
|
|
@@ -614,7 +720,7 @@ function useStyleItems() {
|
|
|
614
720
|
};
|
|
615
721
|
});
|
|
616
722
|
}, [renderStyles]);
|
|
617
|
-
(0,
|
|
723
|
+
(0, import_react10.useEffect)(() => {
|
|
618
724
|
const unsubscribes = providerAndSubscribers.map(
|
|
619
725
|
({ provider, subscriber }) => provider.subscribe(subscriber)
|
|
620
726
|
);
|
|
@@ -623,20 +729,20 @@ function useStyleItems() {
|
|
|
623
729
|
};
|
|
624
730
|
}, [providerAndSubscribers]);
|
|
625
731
|
useOnMount(() => {
|
|
626
|
-
(0,
|
|
732
|
+
(0, import_editor_v1_adapters5.registerDataHook)("after", "editor/documents/attach-preview", async () => {
|
|
627
733
|
const promises = providerAndSubscribers.map(async ({ subscriber }) => subscriber());
|
|
628
734
|
await Promise.all(promises);
|
|
629
735
|
});
|
|
630
736
|
});
|
|
631
737
|
const breakpointsOrder = (0, import_editor_responsive2.getBreakpoints)().map((breakpoint) => breakpoint.id);
|
|
632
|
-
return (0,
|
|
633
|
-
() => Object.values(styleItems).sort(
|
|
738
|
+
return (0, import_react10.useMemo)(
|
|
739
|
+
() => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
|
|
634
740
|
// eslint-disable-next-line
|
|
635
741
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
636
742
|
[styleItems, breakpointsOrder.join("-")]
|
|
637
743
|
);
|
|
638
744
|
}
|
|
639
|
-
function
|
|
745
|
+
function sortByProviderPriority2({ provider: providerA }, { provider: providerB }) {
|
|
640
746
|
return providerA.priority - providerB.priority;
|
|
641
747
|
}
|
|
642
748
|
function sortByBreakpoint(breakpointsOrder) {
|
|
@@ -651,7 +757,7 @@ function sortByStateType({ state: stateA }, { state: stateB }) {
|
|
|
651
757
|
}
|
|
652
758
|
return 0;
|
|
653
759
|
}
|
|
654
|
-
function
|
|
760
|
+
function createProviderSubscriber2({ provider, renderStyles, setStyleItems }) {
|
|
655
761
|
return abortPreviousRuns(
|
|
656
762
|
(abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
|
|
657
763
|
const styles = provider.actions.all().map((__5, index, items) => {
|
|
@@ -697,16 +803,16 @@ function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
|
|
|
697
803
|
|
|
698
804
|
// src/components/style-renderer.tsx
|
|
699
805
|
function StyleRenderer() {
|
|
700
|
-
const container =
|
|
806
|
+
const container = usePortalContainer2();
|
|
701
807
|
const styleItems = useStyleItems();
|
|
702
808
|
const linksAttrs = useDocumentsCssLinks();
|
|
703
809
|
if (!container) {
|
|
704
810
|
return null;
|
|
705
811
|
}
|
|
706
|
-
return /* @__PURE__ */
|
|
812
|
+
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
813
|
}
|
|
708
|
-
function
|
|
709
|
-
return (0,
|
|
814
|
+
function usePortalContainer2() {
|
|
815
|
+
return (0, import_editor_v1_adapters6.__privateUseListenTo)((0, import_editor_v1_adapters6.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
|
|
710
816
|
}
|
|
711
817
|
|
|
712
818
|
// src/settings-transformers-registry.ts
|
|
@@ -1127,7 +1233,7 @@ function initStyleTransformers() {
|
|
|
1127
1233
|
|
|
1128
1234
|
// src/legacy/init-legacy-views.ts
|
|
1129
1235
|
var import_editor_elements2 = require("@elementor/editor-elements");
|
|
1130
|
-
var
|
|
1236
|
+
var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
|
|
1131
1237
|
|
|
1132
1238
|
// src/renderers/create-dom-renderer.ts
|
|
1133
1239
|
var import_twing = require("@elementor/twing");
|
|
@@ -1354,7 +1460,7 @@ function registerElementType(type, elementTypeGenerator) {
|
|
|
1354
1460
|
elementsLegacyTypes[type] = elementTypeGenerator;
|
|
1355
1461
|
}
|
|
1356
1462
|
function initLegacyViews() {
|
|
1357
|
-
(0,
|
|
1463
|
+
(0, import_editor_v1_adapters7.__privateListenTo)((0, import_editor_v1_adapters7.v1ReadyEvent)(), () => {
|
|
1358
1464
|
const config = (0, import_editor_elements2.getWidgetsCache)() ?? {};
|
|
1359
1465
|
const legacyWindow = window;
|
|
1360
1466
|
const renderer = createDomRenderer();
|
|
@@ -1378,14 +1484,14 @@ function initLegacyViews() {
|
|
|
1378
1484
|
// src/prevent-link-in-link-commands.ts
|
|
1379
1485
|
var import_editor_elements3 = require("@elementor/editor-elements");
|
|
1380
1486
|
var import_editor_notifications = require("@elementor/editor-notifications");
|
|
1381
|
-
var
|
|
1487
|
+
var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
|
|
1382
1488
|
var import_i18n = require("@wordpress/i18n");
|
|
1383
1489
|
function initLinkInLinkPrevention() {
|
|
1384
|
-
(0,
|
|
1490
|
+
(0, import_editor_v1_adapters8.blockCommand)({
|
|
1385
1491
|
command: "document/elements/paste",
|
|
1386
1492
|
condition: blockLinkInLinkPaste
|
|
1387
1493
|
});
|
|
1388
|
-
(0,
|
|
1494
|
+
(0, import_editor_v1_adapters8.blockCommand)({
|
|
1389
1495
|
command: "document/elements/move",
|
|
1390
1496
|
condition: blockLinkInLinkMove
|
|
1391
1497
|
});
|
|
@@ -1459,12 +1565,12 @@ function shouldBlock(sourceElements, targetElements) {
|
|
|
1459
1565
|
}
|
|
1460
1566
|
|
|
1461
1567
|
// src/style-commands/paste-style.ts
|
|
1462
|
-
var
|
|
1568
|
+
var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
|
|
1463
1569
|
|
|
1464
1570
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
1465
1571
|
var import_editor_elements5 = require("@elementor/editor-elements");
|
|
1466
1572
|
var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
|
|
1467
|
-
var
|
|
1573
|
+
var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
|
|
1468
1574
|
var import_i18n3 = require("@wordpress/i18n");
|
|
1469
1575
|
|
|
1470
1576
|
// src/style-commands/utils.ts
|
|
@@ -1510,7 +1616,7 @@ function getTitleForContainers(containers) {
|
|
|
1510
1616
|
}
|
|
1511
1617
|
|
|
1512
1618
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
1513
|
-
var undoablePasteElementStyle = () => (0,
|
|
1619
|
+
var undoablePasteElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
|
|
1514
1620
|
{
|
|
1515
1621
|
do: ({ containers, newStyle }) => {
|
|
1516
1622
|
return containers.map((container) => {
|
|
@@ -1586,12 +1692,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters7.undoable)(
|
|
|
1586
1692
|
// src/style-commands/paste-style.ts
|
|
1587
1693
|
function initPasteStyleCommand() {
|
|
1588
1694
|
const pasteElementStyleCommand = undoablePasteElementStyle();
|
|
1589
|
-
(0,
|
|
1695
|
+
(0, import_editor_v1_adapters10.blockCommand)({
|
|
1590
1696
|
command: "document/elements/paste-style",
|
|
1591
1697
|
condition: hasAtomicWidgets
|
|
1592
1698
|
});
|
|
1593
|
-
(0,
|
|
1594
|
-
(0,
|
|
1699
|
+
(0, import_editor_v1_adapters10.__privateListenTo)(
|
|
1700
|
+
(0, import_editor_v1_adapters10.commandStartEvent)("document/elements/paste-style"),
|
|
1595
1701
|
(e) => pasteStyles(e.args, pasteElementStyleCommand)
|
|
1596
1702
|
);
|
|
1597
1703
|
}
|
|
@@ -1615,14 +1721,14 @@ function pasteStyles(args, pasteCallback) {
|
|
|
1615
1721
|
}
|
|
1616
1722
|
|
|
1617
1723
|
// src/style-commands/reset-style.ts
|
|
1618
|
-
var
|
|
1724
|
+
var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
|
|
1619
1725
|
|
|
1620
1726
|
// src/style-commands/undoable-actions/reset-element-style.ts
|
|
1621
1727
|
var import_editor_elements6 = require("@elementor/editor-elements");
|
|
1622
1728
|
var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
|
|
1623
|
-
var
|
|
1729
|
+
var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
|
|
1624
1730
|
var import_i18n4 = require("@wordpress/i18n");
|
|
1625
|
-
var undoableResetElementStyle = () => (0,
|
|
1731
|
+
var undoableResetElementStyle = () => (0, import_editor_v1_adapters11.undoable)(
|
|
1626
1732
|
{
|
|
1627
1733
|
do: ({ containers }) => {
|
|
1628
1734
|
return containers.map((container) => {
|
|
@@ -1666,12 +1772,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters9.undoable)(
|
|
|
1666
1772
|
// src/style-commands/reset-style.ts
|
|
1667
1773
|
function initResetStyleCommand() {
|
|
1668
1774
|
const resetElementStyles = undoableResetElementStyle();
|
|
1669
|
-
(0,
|
|
1775
|
+
(0, import_editor_v1_adapters12.blockCommand)({
|
|
1670
1776
|
command: "document/elements/reset-style",
|
|
1671
1777
|
condition: hasAtomicWidgets
|
|
1672
1778
|
});
|
|
1673
|
-
(0,
|
|
1674
|
-
(0,
|
|
1779
|
+
(0, import_editor_v1_adapters12.__privateListenTo)(
|
|
1780
|
+
(0, import_editor_v1_adapters12.commandStartEvent)("document/elements/reset-style"),
|
|
1675
1781
|
(e) => resetStyles(e.args, resetElementStyles)
|
|
1676
1782
|
);
|
|
1677
1783
|
}
|
|
@@ -1697,6 +1803,7 @@ function init() {
|
|
|
1697
1803
|
initLinkInLinkPrevention();
|
|
1698
1804
|
initLegacyViews();
|
|
1699
1805
|
initSettingsTransformers();
|
|
1806
|
+
(0, import_editor_interactions2.init)();
|
|
1700
1807
|
(0, import_editor.injectIntoTop)({
|
|
1701
1808
|
id: "elements-overlays",
|
|
1702
1809
|
component: ElementsOverlays
|
|
@@ -1705,6 +1812,10 @@ function init() {
|
|
|
1705
1812
|
id: "canvas-style-render",
|
|
1706
1813
|
component: StyleRenderer
|
|
1707
1814
|
});
|
|
1815
|
+
(0, import_editor.injectIntoTop)({
|
|
1816
|
+
id: "canvas-interactions-render",
|
|
1817
|
+
component: InteractionsRenderer
|
|
1818
|
+
});
|
|
1708
1819
|
(0, import_editor.injectIntoLogic)({
|
|
1709
1820
|
id: "classes-rename",
|
|
1710
1821
|
component: ClassesRename
|
|
@@ -1752,6 +1863,7 @@ var getLegacyPanelElementView = ({ settings, ...rest }) => {
|
|
|
1752
1863
|
createTransformer,
|
|
1753
1864
|
createTransformersRegistry,
|
|
1754
1865
|
endDragElementFromPanel,
|
|
1866
|
+
getCanvasIframeDocument,
|
|
1755
1867
|
init,
|
|
1756
1868
|
registerElementType,
|
|
1757
1869
|
settingsTransformersRegistry,
|
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/
|
|
203
|
+
// src/components/interactions-renderer.tsx
|
|
203
204
|
import * as React3 from "react";
|
|
204
|
-
import { __privateUseListenTo as
|
|
205
|
+
import { __privateUseListenTo as useListenTo2, commandEndEvent } from "@elementor/editor-v1-adapters";
|
|
205
206
|
import { Portal } from "@elementor/ui";
|
|
206
207
|
|
|
207
|
-
// src/hooks/use-
|
|
208
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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] =
|
|
570
|
-
const providerAndSubscribers =
|
|
674
|
+
const [styleItems, setStyleItems] = useState3({});
|
|
675
|
+
const providerAndSubscribers = useMemo4(() => {
|
|
571
676
|
return stylesRepository2.getProviders().map((provider) => {
|
|
572
677
|
return {
|
|
573
678
|
provider,
|
|
574
|
-
subscriber:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
598
|
-
() => Object.values(styleItems).sort(
|
|
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
|
|
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
|
|
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 =
|
|
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__ */
|
|
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
|
|
674
|
-
return
|
|
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
|
|
@@ -1733,6 +1843,7 @@ export {
|
|
|
1733
1843
|
createTransformer,
|
|
1734
1844
|
createTransformersRegistry,
|
|
1735
1845
|
endDragElementFromPanel,
|
|
1846
|
+
getCanvasIframeDocument,
|
|
1736
1847
|
init,
|
|
1737
1848
|
registerElementType,
|
|
1738
1849
|
settingsTransformersRegistry,
|
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-
|
|
4
|
+
"version": "3.33.0-236",
|
|
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-
|
|
41
|
-
"@elementor/editor-controls": "3.33.0-
|
|
42
|
-
"@elementor/editor-documents": "3.33.0-
|
|
43
|
-
"@elementor/editor-elements": "3.33.0-
|
|
44
|
-
"@elementor/editor-
|
|
45
|
-
"@elementor/editor-
|
|
46
|
-
"@elementor/editor-
|
|
47
|
-
"@elementor/editor-
|
|
48
|
-
"@elementor/editor-styles
|
|
49
|
-
"@elementor/editor-
|
|
50
|
-
"@elementor/
|
|
40
|
+
"@elementor/editor": "3.33.0-236",
|
|
41
|
+
"@elementor/editor-controls": "3.33.0-236",
|
|
42
|
+
"@elementor/editor-documents": "3.33.0-236",
|
|
43
|
+
"@elementor/editor-elements": "3.33.0-236",
|
|
44
|
+
"@elementor/editor-interactions": "3.33.0-236",
|
|
45
|
+
"@elementor/editor-notifications": "3.33.0-236",
|
|
46
|
+
"@elementor/editor-props": "3.33.0-236",
|
|
47
|
+
"@elementor/editor-responsive": "3.33.0-236",
|
|
48
|
+
"@elementor/editor-styles": "3.33.0-236",
|
|
49
|
+
"@elementor/editor-styles-repository": "3.33.0-236",
|
|
50
|
+
"@elementor/editor-v1-adapters": "3.33.0-236",
|
|
51
|
+
"@elementor/twing": "3.33.0-236",
|
|
51
52
|
"@elementor/ui": "1.36.12",
|
|
52
|
-
"@elementor/utils": "3.33.0-
|
|
53
|
-
"@elementor/wp-media": "3.33.0-
|
|
53
|
+
"@elementor/utils": "3.33.0-236",
|
|
54
|
+
"@elementor/wp-media": "3.33.0-236",
|
|
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/index.ts
CHANGED
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,
|