@elementor/editor-interactions 4.0.0-667 → 4.0.0-668

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.mjs CHANGED
@@ -1058,37 +1058,145 @@ var documentElementsInteractionsProvider = createInteractionsProvider({
1058
1058
  }
1059
1059
  });
1060
1060
 
1061
+ // src/commands/paste-interactions.ts
1062
+ import {
1063
+ getContainer,
1064
+ getElementInteractions as getElementInteractions3,
1065
+ getElementLabel,
1066
+ getWidgetsCache,
1067
+ updateElementInteractions as updateElementInteractions2
1068
+ } from "@elementor/editor-elements";
1069
+ import {
1070
+ __privateListenTo as listenTo2,
1071
+ commandStartEvent,
1072
+ undoable
1073
+ } from "@elementor/editor-v1-adapters";
1074
+ import { __ as __6 } from "@wordpress/i18n";
1075
+
1076
+ // src/commands/get-clipboard-elements.ts
1077
+ function getClipboardElements(storageKey = "clipboard") {
1078
+ try {
1079
+ const storedData = JSON.parse(localStorage.getItem("elementor") ?? "{}");
1080
+ return storedData[storageKey]?.elements;
1081
+ } catch {
1082
+ return void 0;
1083
+ }
1084
+ }
1085
+
1086
+ // src/commands/paste-interactions.ts
1087
+ function isAtomicContainer(container) {
1088
+ const type = container?.model.get("widgetType") || container?.model.get("elType");
1089
+ const widgetsCache = getWidgetsCache();
1090
+ const elementConfig = widgetsCache?.[type];
1091
+ return Boolean(elementConfig?.atomic_props_schema);
1092
+ }
1093
+ function getTitleForContainers(containers) {
1094
+ return containers.length > 1 ? __6("Elements", "elementor") : getElementLabel(containers[0].id);
1095
+ }
1096
+ function normalizeClipboardInteractions(raw) {
1097
+ if (!raw) {
1098
+ return null;
1099
+ }
1100
+ const parsed = typeof raw === "string" ? JSON.parse(raw) : raw;
1101
+ if (!parsed?.items?.length) {
1102
+ return null;
1103
+ }
1104
+ return { version: parsed.version ?? 1, items: parsed.items };
1105
+ }
1106
+ function regenerateInteractionIds(interactions) {
1107
+ const cloned = structuredClone(interactions);
1108
+ cloned.items?.forEach((item) => {
1109
+ if (item.$$type === "interaction-item" && item.value) {
1110
+ item.value.interaction_id = createString(generateTempInteractionId());
1111
+ }
1112
+ });
1113
+ return cloned;
1114
+ }
1115
+ function initPasteInteractionsCommand() {
1116
+ const undoablePasteInteractions = undoable(
1117
+ {
1118
+ do: ({ containers, newInteractions }) => {
1119
+ const pasted = regenerateInteractionIds(newInteractions);
1120
+ return containers.map((container) => {
1121
+ const elementId = container.id;
1122
+ const previous = getElementInteractions3(elementId);
1123
+ updateElementInteractions2({
1124
+ elementId,
1125
+ interactions: pasted
1126
+ });
1127
+ return { elementId, previous: previous ?? { version: 1, items: [] } };
1128
+ });
1129
+ },
1130
+ undo: (_, revertData) => {
1131
+ revertData.forEach(({ elementId, previous }) => {
1132
+ updateElementInteractions2({
1133
+ elementId,
1134
+ interactions: previous.items?.length ? previous : void 0
1135
+ });
1136
+ });
1137
+ }
1138
+ },
1139
+ {
1140
+ title: ({ containers }) => getTitleForContainers(containers),
1141
+ subtitle: __6("Interactions Pasted", "elementor")
1142
+ }
1143
+ );
1144
+ listenTo2(commandStartEvent("document/elements/paste-interactions"), (e) => {
1145
+ const args = e.args;
1146
+ const containers = args.containers ?? (args.container ? [args.container] : []);
1147
+ const storageKey = args.storageKey ?? "clipboard";
1148
+ if (!containers.length) {
1149
+ return;
1150
+ }
1151
+ const clipboardElements = getClipboardElements(storageKey);
1152
+ const [clipboardElement] = clipboardElements ?? [];
1153
+ if (!clipboardElement) {
1154
+ return;
1155
+ }
1156
+ const newInteractions = normalizeClipboardInteractions(clipboardElement.interactions);
1157
+ if (!newInteractions) {
1158
+ return;
1159
+ }
1160
+ const existingContainers = containers.filter((c) => getContainer(c.id));
1161
+ const validContainers = existingContainers.filter(isAtomicContainer);
1162
+ if (!validContainers.length) {
1163
+ return;
1164
+ }
1165
+ undoablePasteInteractions({ containers: validContainers, newInteractions });
1166
+ });
1167
+ }
1168
+
1061
1169
  // src/components/controls/direction.tsx
1062
1170
  import * as React12 from "react";
1063
1171
  import { useMemo as useMemo4 } from "react";
1064
1172
  import { ToggleButtonGroupUi } from "@elementor/editor-controls";
1065
1173
  import { ArrowDownSmallIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpSmallIcon } from "@elementor/icons";
1066
- import { __ as __6 } from "@wordpress/i18n";
1174
+ import { __ as __7 } from "@wordpress/i18n";
1067
1175
  function Direction({ value, onChange, interactionType }) {
1068
1176
  const options = useMemo4(() => {
1069
1177
  const isIn = interactionType === "in";
1070
1178
  return [
1071
1179
  {
1072
1180
  value: "top",
1073
- label: isIn ? __6("From top", "elementor") : __6("To top", "elementor"),
1181
+ label: isIn ? __7("From top", "elementor") : __7("To top", "elementor"),
1074
1182
  renderContent: ({ size }) => isIn ? /* @__PURE__ */ React12.createElement(ArrowDownSmallIcon, { fontSize: size }) : /* @__PURE__ */ React12.createElement(ArrowUpSmallIcon, { fontSize: size }),
1075
1183
  showTooltip: true
1076
1184
  },
1077
1185
  {
1078
1186
  value: "bottom",
1079
- label: interactionType === "in" ? __6("From bottom", "elementor") : __6("To bottom", "elementor"),
1187
+ label: interactionType === "in" ? __7("From bottom", "elementor") : __7("To bottom", "elementor"),
1080
1188
  renderContent: ({ size }) => isIn ? /* @__PURE__ */ React12.createElement(ArrowUpSmallIcon, { fontSize: size }) : /* @__PURE__ */ React12.createElement(ArrowDownSmallIcon, { fontSize: size }),
1081
1189
  showTooltip: true
1082
1190
  },
1083
1191
  {
1084
1192
  value: "left",
1085
- label: interactionType === "in" ? __6("From left", "elementor") : __6("To left", "elementor"),
1193
+ label: interactionType === "in" ? __7("From left", "elementor") : __7("To left", "elementor"),
1086
1194
  renderContent: ({ size }) => isIn ? /* @__PURE__ */ React12.createElement(ArrowRightIcon, { fontSize: size }) : /* @__PURE__ */ React12.createElement(ArrowLeftIcon, { fontSize: size }),
1087
1195
  showTooltip: true
1088
1196
  },
1089
1197
  {
1090
1198
  value: "right",
1091
- label: interactionType === "in" ? __6("From right", "elementor") : __6("To right", "elementor"),
1199
+ label: interactionType === "in" ? __7("From right", "elementor") : __7("To right", "elementor"),
1092
1200
  renderContent: ({ size }) => isIn ? /* @__PURE__ */ React12.createElement(ArrowLeftIcon, { fontSize: size }) : /* @__PURE__ */ React12.createElement(ArrowRightIcon, { fontSize: size }),
1093
1201
  showTooltip: true
1094
1202
  }
@@ -1099,21 +1207,21 @@ function Direction({ value, onChange, interactionType }) {
1099
1207
 
1100
1208
  // src/components/controls/easing.tsx
1101
1209
  import * as React15 from "react";
1102
- import { __ as __9 } from "@wordpress/i18n";
1210
+ import { __ as __10 } from "@wordpress/i18n";
1103
1211
 
1104
1212
  // src/ui/promotion-select.tsx
1105
1213
  import * as React14 from "react";
1106
1214
  import { useRef as useRef4 } from "react";
1107
1215
  import { MenuListItem } from "@elementor/editor-ui";
1108
1216
  import { MenuSubheader, Select } from "@elementor/ui";
1109
- import { __ as __8 } from "@wordpress/i18n";
1217
+ import { __ as __9 } from "@wordpress/i18n";
1110
1218
 
1111
1219
  // src/ui/interactions-promotion-chip.tsx
1112
1220
  import * as React13 from "react";
1113
1221
  import { forwardRef, useImperativeHandle, useState as useState5 } from "react";
1114
1222
  import { PromotionChip, PromotionPopover, useCanvasClickHandler } from "@elementor/editor-ui";
1115
1223
  import { Box as Box3 } from "@elementor/ui";
1116
- import { __ as __7 } from "@wordpress/i18n";
1224
+ import { __ as __8 } from "@wordpress/i18n";
1117
1225
  var InteractionsPromotionChip = forwardRef(
1118
1226
  ({ content, upgradeUrl, anchorRef }, ref) => {
1119
1227
  const [isOpen, setIsOpen] = useState5(false);
@@ -1128,9 +1236,9 @@ var InteractionsPromotionChip = forwardRef(
1128
1236
  PromotionPopover,
1129
1237
  {
1130
1238
  open: isOpen,
1131
- title: __7("Interactions", "elementor"),
1239
+ title: __8("Interactions", "elementor"),
1132
1240
  content,
1133
- ctaText: __7("Upgrade now", "elementor"),
1241
+ ctaText: __8("Upgrade now", "elementor"),
1134
1242
  ctaUrl: upgradeUrl,
1135
1243
  anchorRef,
1136
1244
  placement: anchorRef ? "right-start" : void 0,
@@ -1192,7 +1300,7 @@ function PromotionSelect({
1192
1300
  promotionRef.current?.toggle();
1193
1301
  }
1194
1302
  },
1195
- promotionLabel ?? __8("PRO features", "elementor"),
1303
+ promotionLabel ?? __9("PRO features", "elementor"),
1196
1304
  /* @__PURE__ */ React14.createElement(
1197
1305
  InteractionsPromotionChip,
1198
1306
  {
@@ -1209,13 +1317,13 @@ function PromotionSelect({
1209
1317
 
1210
1318
  // src/components/controls/easing.tsx
1211
1319
  var EASING_OPTIONS = {
1212
- easeIn: __9("Ease In", "elementor"),
1213
- easeInOut: __9("Ease In Out", "elementor"),
1214
- easeOut: __9("Ease Out", "elementor"),
1215
- backIn: __9("Back In", "elementor"),
1216
- backInOut: __9("Back In Out", "elementor"),
1217
- backOut: __9("Back Out", "elementor"),
1218
- linear: __9("Linear", "elementor")
1320
+ easeIn: __10("Ease In", "elementor"),
1321
+ easeInOut: __10("Ease In Out", "elementor"),
1322
+ easeOut: __10("Ease Out", "elementor"),
1323
+ backIn: __10("Back In", "elementor"),
1324
+ backInOut: __10("Back In Out", "elementor"),
1325
+ backOut: __10("Back Out", "elementor"),
1326
+ linear: __10("Linear", "elementor")
1219
1327
  };
1220
1328
  var BASE_EASINGS = ["easeIn"];
1221
1329
  function Easing({}) {
@@ -1231,7 +1339,7 @@ function Easing({}) {
1231
1339
  value: DEFAULT_VALUES.easing,
1232
1340
  baseOptions,
1233
1341
  disabledOptions,
1234
- promotionContent: __9("Upgrade to control the smoothness of the interaction.", "elementor"),
1342
+ promotionContent: __10("Upgrade to control the smoothness of the interaction.", "elementor"),
1235
1343
  upgradeUrl: "https://go.elementor.com/go-pro-interactions-easing-modal/"
1236
1344
  }
1237
1345
  );
@@ -1239,12 +1347,12 @@ function Easing({}) {
1239
1347
 
1240
1348
  // src/components/controls/effect.tsx
1241
1349
  import * as React16 from "react";
1242
- import { __ as __10 } from "@wordpress/i18n";
1350
+ import { __ as __11 } from "@wordpress/i18n";
1243
1351
  var EFFECT_OPTIONS = {
1244
- fade: __10("Fade", "elementor"),
1245
- slide: __10("Slide", "elementor"),
1246
- scale: __10("Scale", "elementor"),
1247
- custom: __10("Custom", "elementor")
1352
+ fade: __11("Fade", "elementor"),
1353
+ slide: __11("Slide", "elementor"),
1354
+ scale: __11("Scale", "elementor"),
1355
+ custom: __11("Custom", "elementor")
1248
1356
  };
1249
1357
  var BASE_EFFECTS = ["fade", "slide", "scale"];
1250
1358
  function Effect({ value, onChange }) {
@@ -1261,8 +1369,8 @@ function Effect({ value, onChange }) {
1261
1369
  onChange,
1262
1370
  baseOptions,
1263
1371
  disabledOptions,
1264
- promotionLabel: __10("PRO effects", "elementor"),
1265
- promotionContent: __10(
1372
+ promotionLabel: __11("PRO effects", "elementor"),
1373
+ promotionContent: __11(
1266
1374
  "Upgrade to further customize your animation with opacity, scale, move, rotate and more.",
1267
1375
  "elementor"
1268
1376
  ),
@@ -1274,19 +1382,19 @@ function Effect({ value, onChange }) {
1274
1382
  // src/components/controls/effect-type.tsx
1275
1383
  import * as React17 from "react";
1276
1384
  import { ToggleButtonGroupUi as ToggleButtonGroupUi2 } from "@elementor/editor-controls";
1277
- import { __ as __11 } from "@wordpress/i18n";
1385
+ import { __ as __12 } from "@wordpress/i18n";
1278
1386
  function EffectType({ value, onChange }) {
1279
1387
  const options = [
1280
1388
  {
1281
1389
  value: "in",
1282
- label: __11("In", "elementor"),
1283
- renderContent: () => __11("In", "elementor"),
1390
+ label: __12("In", "elementor"),
1391
+ renderContent: () => __12("In", "elementor"),
1284
1392
  showTooltip: true
1285
1393
  },
1286
1394
  {
1287
1395
  value: "out",
1288
- label: __11("Out", "elementor"),
1289
- renderContent: () => __11("Out", "elementor"),
1396
+ label: __12("Out", "elementor"),
1397
+ renderContent: () => __12("Out", "elementor"),
1290
1398
  showTooltip: true
1291
1399
  }
1292
1400
  ];
@@ -1298,10 +1406,10 @@ import * as React18 from "react";
1298
1406
  import { ToggleButtonGroupUi as ToggleButtonGroupUi3 } from "@elementor/editor-controls";
1299
1407
  import { CheckIcon, MinusIcon } from "@elementor/icons";
1300
1408
  import { Box as Box4 } from "@elementor/ui";
1301
- import { __ as __12 } from "@wordpress/i18n";
1409
+ import { __ as __13 } from "@wordpress/i18n";
1302
1410
  var REPLAY_OPTIONS = {
1303
- no: __12("No", "elementor"),
1304
- yes: __12("Yes", "elementor")
1411
+ no: __13("No", "elementor"),
1412
+ yes: __13("Yes", "elementor")
1305
1413
  };
1306
1414
  var BASE_REPLAY = ["no"];
1307
1415
  var OVERLAY_GRID = "1 / 1";
@@ -1326,7 +1434,7 @@ function Replay({ onChange, anchorRef }) {
1326
1434
  return /* @__PURE__ */ React18.createElement(Box4, { sx: { display: "grid", alignItems: "center" } }, /* @__PURE__ */ React18.createElement(Box4, { sx: { gridArea: OVERLAY_GRID } }, /* @__PURE__ */ React18.createElement(ToggleButtonGroupUi3, { items: options, exclusive: true, onChange, value: false })), /* @__PURE__ */ React18.createElement(Box4, { sx: { gridArea: OVERLAY_GRID, marginInlineEnd: CHIP_OFFSET, justifySelf: "end" } }, /* @__PURE__ */ React18.createElement(
1327
1435
  InteractionsPromotionChip,
1328
1436
  {
1329
- content: __12("Upgrade to run the animation every time its trigger occurs.", "elementor"),
1437
+ content: __13("Upgrade to run the animation every time its trigger occurs.", "elementor"),
1330
1438
  upgradeUrl: "https://go.elementor.com/go-pro-interactions-replay-modal/",
1331
1439
  anchorRef
1332
1440
  }
@@ -1335,13 +1443,13 @@ function Replay({ onChange, anchorRef }) {
1335
1443
 
1336
1444
  // src/components/controls/trigger.tsx
1337
1445
  import * as React19 from "react";
1338
- import { __ as __13 } from "@wordpress/i18n";
1446
+ import { __ as __14 } from "@wordpress/i18n";
1339
1447
  var TRIGGER_OPTIONS = {
1340
- load: __13("Page load", "elementor"),
1341
- scrollIn: __13("Scroll into view", "elementor"),
1342
- scrollOn: __13("While scrolling", "elementor"),
1343
- hover: __13("On hover", "elementor"),
1344
- click: __13("On click", "elementor")
1448
+ load: __14("Page load", "elementor"),
1449
+ scrollIn: __14("Scroll into view", "elementor"),
1450
+ scrollOn: __14("While scrolling", "elementor"),
1451
+ hover: __14("On hover", "elementor"),
1452
+ click: __14("On click", "elementor")
1345
1453
  };
1346
1454
  var BASE_TRIGGERS = ["load", "scrollIn"];
1347
1455
  function Trigger({ value, onChange }) {
@@ -1358,15 +1466,15 @@ function Trigger({ value, onChange }) {
1358
1466
  onChange,
1359
1467
  baseOptions,
1360
1468
  disabledOptions,
1361
- promotionLabel: __13("PRO triggers", "elementor"),
1362
- promotionContent: __13("Upgrade to unlock more interactions triggers.", "elementor"),
1469
+ promotionLabel: __14("PRO triggers", "elementor"),
1470
+ promotionContent: __14("Upgrade to unlock more interactions triggers.", "elementor"),
1363
1471
  upgradeUrl: "https://go.elementor.com/go-pro-interactions-triggers-modal/"
1364
1472
  }
1365
1473
  );
1366
1474
  }
1367
1475
 
1368
1476
  // src/hooks/on-duplicate.ts
1369
- import { getAllDescendants, getContainer } from "@elementor/editor-elements";
1477
+ import { getAllDescendants, getContainer as getContainer2 } from "@elementor/editor-elements";
1370
1478
  import { registerDataHook } from "@elementor/editor-v1-adapters";
1371
1479
  function initCleanInteractionIdsOnDuplicate() {
1372
1480
  registerDataHook("after", "document/elements/duplicate", (_args, result) => {
@@ -1377,7 +1485,7 @@ function initCleanInteractionIdsOnDuplicate() {
1377
1485
  });
1378
1486
  }
1379
1487
  function cleanInteractionIdsRecursive(elementId) {
1380
- const container = getContainer(elementId);
1488
+ const container = getContainer2(elementId);
1381
1489
  if (!container) {
1382
1490
  return;
1383
1491
  }
@@ -1386,7 +1494,7 @@ function cleanInteractionIdsRecursive(elementId) {
1386
1494
  });
1387
1495
  }
1388
1496
  function cleanInteractionIds(elementId) {
1389
- const container = getContainer(elementId);
1497
+ const container = getContainer2(elementId);
1390
1498
  if (!container) {
1391
1499
  return;
1392
1500
  }
@@ -1485,7 +1593,7 @@ var initInteractionsSchemaResource = (reg) => {
1485
1593
  };
1486
1594
 
1487
1595
  // src/mcp/tools/manage-element-interaction-tool.ts
1488
- import { updateElementInteractions as updateElementInteractions2 } from "@elementor/editor-elements";
1596
+ import { updateElementInteractions as updateElementInteractions3 } from "@elementor/editor-elements";
1489
1597
  import { z as z2 } from "@elementor/schema";
1490
1598
  import { isProActive as isProActive2 } from "@elementor/utils";
1491
1599
  var EMPTY_INTERACTIONS = {
@@ -1616,7 +1724,7 @@ var initManageElementInteractionTool = (reg) => {
1616
1724
  items: updatedItems
1617
1725
  };
1618
1726
  try {
1619
- updateElementInteractions2({ elementId, interactions: updatedInteractions });
1727
+ updateElementInteractions3({ elementId, interactions: updatedInteractions });
1620
1728
  } catch (error) {
1621
1729
  throw new Error(
1622
1730
  `Failed to update interactions for element "${elementId}": ${error instanceof Error ? error.message : "Unknown error"}`
@@ -1707,6 +1815,7 @@ function init() {
1707
1815
  try {
1708
1816
  interactionsRepository.register(documentElementsInteractionsProvider);
1709
1817
  initCleanInteractionIdsOnDuplicate();
1818
+ initPasteInteractionsCommand();
1710
1819
  registerInteractionsControl({
1711
1820
  type: "trigger",
1712
1821
  component: Trigger,