@elementor/editor-elements 3.33.0-271 → 3.33.0-273

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
@@ -70,7 +70,7 @@ __export(index_exports, {
70
70
  });
71
71
  module.exports = __toCommonJS(index_exports);
72
72
 
73
- // src/hooks/use-element-setting.ts
73
+ // src/hooks/use-element-children.ts
74
74
  var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
75
75
 
76
76
  // src/sync/get-container.ts
@@ -88,6 +88,55 @@ var selectElement = (elementId) => {
88
88
  }
89
89
  };
90
90
 
91
+ // src/hooks/use-element-children.ts
92
+ function useElementChildren(elementId, childrenTypes) {
93
+ return (0, import_editor_v1_adapters2.__privateUseListenTo)(
94
+ [
95
+ (0, import_editor_v1_adapters2.v1ReadyEvent)(),
96
+ (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/create"),
97
+ (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/delete"),
98
+ (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/update"),
99
+ (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/set-settings")
100
+ ],
101
+ () => {
102
+ const container = getContainer(elementId);
103
+ const elementChildren = childrenTypes.reduce((acc, type) => {
104
+ acc[type] = [];
105
+ return acc;
106
+ }, {});
107
+ container?.children?.forEachRecursive?.(({ model, id }) => {
108
+ const elType = model.get("elType");
109
+ if (elType && elType in elementChildren) {
110
+ elementChildren[elType].push({ id });
111
+ }
112
+ });
113
+ return elementChildren;
114
+ },
115
+ [elementId]
116
+ );
117
+ }
118
+
119
+ // src/hooks/use-element-editor-settings.ts
120
+ var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
121
+
122
+ // src/sync/get-element-editor-settings.ts
123
+ function getElementEditorSettings(elementId) {
124
+ const container = getContainer(elementId);
125
+ return container?.model.get("editor_settings") ?? {};
126
+ }
127
+
128
+ // src/hooks/use-element-editor-settings.ts
129
+ var useElementEditorSettings = (elementId) => {
130
+ return (0, import_editor_v1_adapters3.__privateUseListenTo)(
131
+ (0, import_editor_v1_adapters3.windowEvent)("elementor/element/update_editor_settings"),
132
+ () => getElementEditorSettings(elementId),
133
+ [elementId]
134
+ );
135
+ };
136
+
137
+ // src/hooks/use-element-setting.ts
138
+ var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
139
+
91
140
  // src/sync/get-element-setting.ts
92
141
  var getElementSetting = (elementId, settingKey) => {
93
142
  const container = getContainer(elementId);
@@ -99,15 +148,15 @@ var getElementSettings = (elementId, settingKey) => {
99
148
 
100
149
  // src/hooks/use-element-setting.ts
101
150
  var useElementSetting = (elementId, settingKey) => {
102
- return (0, import_editor_v1_adapters2.__privateUseListenTo)(
103
- (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/set-settings"),
151
+ return (0, import_editor_v1_adapters4.__privateUseListenTo)(
152
+ (0, import_editor_v1_adapters4.commandEndEvent)("document/elements/set-settings"),
104
153
  () => getElementSetting(elementId, settingKey),
105
154
  [elementId, settingKey]
106
155
  );
107
156
  };
108
157
  var useElementSettings = (elementId, settingKeys) => {
109
- return (0, import_editor_v1_adapters2.__privateUseListenTo)(
110
- (0, import_editor_v1_adapters2.commandEndEvent)("document/elements/set-settings"),
158
+ return (0, import_editor_v1_adapters4.__privateUseListenTo)(
159
+ (0, import_editor_v1_adapters4.commandEndEvent)("document/elements/set-settings"),
111
160
  () => settingKeys.reduce((settings, key) => {
112
161
  const value = getElementSetting(elementId, key);
113
162
  if (value !== null) {
@@ -119,8 +168,28 @@ var useElementSettings = (elementId, settingKeys) => {
119
168
  );
120
169
  };
121
170
 
171
+ // src/hooks/use-parent-element.ts
172
+ var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
173
+ function useParentElement(elementId) {
174
+ return (0, import_editor_v1_adapters5.__privateUseListenTo)(
175
+ [(0, import_editor_v1_adapters5.commandEndEvent)("document/elements/create")],
176
+ () => {
177
+ if (!elementId) {
178
+ return null;
179
+ }
180
+ const extendedWindow = window;
181
+ const element = extendedWindow?.elementor?.getContainer?.(elementId);
182
+ if (!element) {
183
+ return null;
184
+ }
185
+ return element.parent;
186
+ },
187
+ [elementId]
188
+ );
189
+ }
190
+
122
191
  // src/hooks/use-selected-element.ts
123
- var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
192
+ var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
124
193
 
125
194
  // src/sync/get-widgets-cache.ts
126
195
  function getWidgetsCache() {
@@ -169,12 +238,12 @@ function getSelectedElements() {
169
238
 
170
239
  // src/hooks/use-selected-element.ts
171
240
  function useSelectedElement() {
172
- const elements = (0, import_editor_v1_adapters3.__privateUseListenTo)(
241
+ const elements = (0, import_editor_v1_adapters6.__privateUseListenTo)(
173
242
  [
174
- (0, import_editor_v1_adapters3.commandEndEvent)("document/elements/select"),
175
- (0, import_editor_v1_adapters3.commandEndEvent)("document/elements/deselect"),
176
- (0, import_editor_v1_adapters3.commandEndEvent)("document/elements/select-all"),
177
- (0, import_editor_v1_adapters3.commandEndEvent)("document/elements/deselect-all")
243
+ (0, import_editor_v1_adapters6.commandEndEvent)("document/elements/select"),
244
+ (0, import_editor_v1_adapters6.commandEndEvent)("document/elements/deselect"),
245
+ (0, import_editor_v1_adapters6.commandEndEvent)("document/elements/select-all"),
246
+ (0, import_editor_v1_adapters6.commandEndEvent)("document/elements/deselect-all")
178
247
  ],
179
248
  getSelectedElements
180
249
  );
@@ -186,73 +255,6 @@ function useSelectedElement() {
186
255
  return { element, elementType };
187
256
  }
188
257
 
189
- // src/hooks/use-parent-element.ts
190
- var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
191
- function useParentElement(elementId) {
192
- return (0, import_editor_v1_adapters4.__privateUseListenTo)(
193
- [(0, import_editor_v1_adapters4.commandEndEvent)("document/elements/create")],
194
- () => {
195
- if (!elementId) {
196
- return null;
197
- }
198
- const extendedWindow = window;
199
- const element = extendedWindow?.elementor?.getContainer?.(elementId);
200
- if (!element) {
201
- return null;
202
- }
203
- return element.parent;
204
- },
205
- [elementId]
206
- );
207
- }
208
-
209
- // src/hooks/use-element-children.ts
210
- var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
211
- function useElementChildren(elementId, childrenTypes) {
212
- return (0, import_editor_v1_adapters5.__privateUseListenTo)(
213
- [
214
- (0, import_editor_v1_adapters5.v1ReadyEvent)(),
215
- (0, import_editor_v1_adapters5.commandEndEvent)("document/elements/create"),
216
- (0, import_editor_v1_adapters5.commandEndEvent)("document/elements/delete"),
217
- (0, import_editor_v1_adapters5.commandEndEvent)("document/elements/update"),
218
- (0, import_editor_v1_adapters5.commandEndEvent)("document/elements/set-settings")
219
- ],
220
- () => {
221
- const container = getContainer(elementId);
222
- const elementChildren = childrenTypes.reduce((acc, type) => {
223
- acc[type] = [];
224
- return acc;
225
- }, {});
226
- container?.children?.forEachRecursive?.(({ model, id }) => {
227
- const elType = model.get("elType");
228
- if (elType && elType in elementChildren) {
229
- elementChildren[elType].push({ id });
230
- }
231
- });
232
- return elementChildren;
233
- },
234
- [elementId]
235
- );
236
- }
237
-
238
- // src/hooks/use-element-editor-settings.ts
239
- var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
240
-
241
- // src/sync/get-element-editor-settings.ts
242
- function getElementEditorSettings(elementId) {
243
- const container = getContainer(elementId);
244
- return container?.model.get("editor_settings") ?? {};
245
- }
246
-
247
- // src/hooks/use-element-editor-settings.ts
248
- var useElementEditorSettings = (elementId) => {
249
- return (0, import_editor_v1_adapters6.__privateUseListenTo)(
250
- (0, import_editor_v1_adapters6.windowEvent)("elementor/element/update_editor_settings"),
251
- () => getElementEditorSettings(elementId),
252
- [elementId]
253
- );
254
- };
255
-
256
258
  // src/sync/create-element.ts
257
259
  var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
258
260
  function createElement({ containerId, model, options }) {
@@ -267,26 +269,12 @@ function createElement({ containerId, model, options }) {
267
269
  });
268
270
  }
269
271
 
270
- // src/sync/update-element-editor-settings.ts
271
- var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
272
- var updateElementEditorSettings = ({
273
- elementId,
274
- settings
275
- }) => {
276
- const element = getContainer(elementId);
277
- if (!element) {
278
- throw new Error(`Element with id ${elementId} not found`);
279
- }
280
- const editorSettings = element.model.get("editor_settings") ?? {};
281
- element.model.set("editor_settings", { ...editorSettings, ...settings });
282
- setDocumentModifiedStatus(true);
283
- };
284
- function setDocumentModifiedStatus(status) {
285
- (0, import_editor_v1_adapters8.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
286
- }
272
+ // src/sync/create-elements.ts
273
+ var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
274
+ var import_i18n = require("@wordpress/i18n");
287
275
 
288
276
  // src/sync/delete-element.ts
289
- var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
277
+ var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
290
278
  function deleteElement({
291
279
  elementId,
292
280
  options = {}
@@ -295,113 +283,90 @@ function deleteElement({
295
283
  if (!container) {
296
284
  throw new Error(`Element with ID "${elementId}" not found`);
297
285
  }
298
- return (0, import_editor_v1_adapters9.__privateRunCommand)("document/elements/delete", {
286
+ return (0, import_editor_v1_adapters8.__privateRunCommand)("document/elements/delete", {
299
287
  container,
300
288
  options
301
289
  });
302
290
  }
303
291
 
304
- // src/sync/move-element.ts
305
- function moveElement({ elementId, targetContainerId, options = {} }) {
306
- const container = getContainer(elementId);
307
- const target = getContainer(targetContainerId);
308
- if (!container) {
309
- throw new Error(`Element with ID "${elementId}" not found`);
310
- }
311
- if (!target) {
312
- throw new Error(`Target container with ID "${targetContainerId}" not found`);
313
- }
314
- const modelToRecreate = container.model.toJSON();
315
- deleteElement({
316
- elementId,
317
- // prevent inner history from being created
318
- options: { ...options, useHistory: false }
319
- });
320
- const newContainer = createElement({
321
- containerId: targetContainerId,
322
- model: modelToRecreate,
323
- // prevent inner history from being created
324
- options: { edit: false, ...options, useHistory: false }
325
- });
326
- return newContainer;
327
- }
328
-
329
- // src/sync/move-elements.ts
330
- var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
331
- var import_i18n = require("@wordpress/i18n");
332
- var moveElements = ({
333
- moves: movesToMake,
292
+ // src/sync/create-elements.ts
293
+ var createElements = ({
294
+ elements,
334
295
  title,
335
- subtitle = (0, import_i18n.__)("Elements moved", "elementor")
296
+ subtitle = (0, import_i18n.__)("Item added", "elementor")
336
297
  }) => {
337
- const undoableMove = (0, import_editor_v1_adapters10.undoable)(
298
+ const undoableCreate = (0, import_editor_v1_adapters9.undoable)(
338
299
  {
339
- do: ({ moves }) => {
340
- const movedElements = [];
341
- moves.forEach((move) => {
342
- const { elementId } = move;
343
- const sourceContainer = getContainer(elementId);
344
- if (!sourceContainer) {
345
- throw new Error(`Element with ID "${elementId}" not found`);
346
- }
347
- const originalContainerId = sourceContainer.parent?.id || "";
348
- const originalIndex = sourceContainer.parent?.children?.indexOf(sourceContainer) ?? -1;
349
- const originalPosition = {
350
- elementId,
351
- originalContainerId,
352
- originalIndex
353
- };
354
- const element = moveElement({
355
- ...move,
356
- options: { ...move.options, useHistory: false }
300
+ do: ({ elements: elementsParam }) => {
301
+ const createdElements = [];
302
+ elementsParam.forEach((createParams) => {
303
+ const { options, ...elementParams } = createParams;
304
+ const element = createElement({
305
+ ...elementParams,
306
+ options: { ...options, useHistory: false }
357
307
  });
358
- movedElements.push({
308
+ const elementId = element.id;
309
+ createdElements.push({
359
310
  elementId,
360
- originalPosition,
361
- move,
362
- element
311
+ model: element.model?.toJSON() || {},
312
+ createParams: {
313
+ ...createParams
314
+ }
363
315
  });
364
316
  });
365
- return { movedElements };
317
+ return { createdElements };
366
318
  },
367
- undo: (_, { movedElements }) => {
368
- [...movedElements].reverse().forEach(({ originalPosition }) => {
369
- const { elementId, originalContainerId, originalIndex } = originalPosition;
370
- moveElement({
319
+ undo: (_, { createdElements }) => {
320
+ [...createdElements].reverse().forEach(({ elementId }) => {
321
+ deleteElement({
371
322
  elementId,
372
- targetContainerId: originalContainerId,
373
- options: {
374
- useHistory: false,
375
- at: originalIndex >= 0 ? originalIndex : void 0
376
- }
323
+ options: { useHistory: false }
377
324
  });
378
325
  });
379
326
  },
380
- redo: (_, { movedElements }) => {
381
- const newMovedElements = [];
382
- movedElements.forEach(({ move, originalPosition }) => {
383
- const element = moveElement({
384
- ...move,
385
- options: { ...move.options, useHistory: false }
386
- });
387
- newMovedElements.push({
388
- elementId: move.elementId,
389
- originalPosition,
390
- move,
391
- element
327
+ redo: (_, { createdElements }) => {
328
+ const newElements = [];
329
+ createdElements.forEach(({ createParams, model }) => {
330
+ const element = createElement({
331
+ containerId: createParams.containerId,
332
+ model,
333
+ options: { ...createParams.options, useHistory: false }
392
334
  });
393
- });
394
- return { movedElements: newMovedElements };
395
- }
396
- },
397
- {
335
+ const elementId = element.id;
336
+ const container = getContainer(elementId);
337
+ if (container) {
338
+ newElements.push({
339
+ elementId,
340
+ model: container.model.toJSON(),
341
+ createParams
342
+ });
343
+ }
344
+ });
345
+ return { createdElements: newElements };
346
+ }
347
+ },
348
+ {
398
349
  title,
399
350
  subtitle
400
351
  }
401
352
  );
402
- return undoableMove({ moves: movesToMake });
353
+ return undoableCreate({ elements });
403
354
  };
404
355
 
356
+ // src/sync/drop-element.ts
357
+ var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
358
+ function dropElement({ containerId, model, options }) {
359
+ const container = getContainer(containerId);
360
+ if (!container) {
361
+ throw new Error(`Container with ID "${containerId}" not found`);
362
+ }
363
+ return (0, import_editor_v1_adapters10.__privateRunCommandSync)("preview/drop", {
364
+ container,
365
+ model,
366
+ options
367
+ });
368
+ }
369
+
405
370
  // src/sync/duplicate-element.ts
406
371
  function duplicateElement({ elementId, options = {} }) {
407
372
  const elementToDuplicate = getContainer(elementId);
@@ -425,81 +390,15 @@ function duplicateElement({ elementId, options = {} }) {
425
390
  });
426
391
  }
427
392
 
428
- // src/sync/create-elements.ts
393
+ // src/sync/duplicate-elements.ts
429
394
  var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
430
395
  var import_i18n2 = require("@wordpress/i18n");
431
- var createElements = ({
432
- elements,
433
- title,
434
- subtitle = (0, import_i18n2.__)("Item added", "elementor")
435
- }) => {
436
- const undoableCreate = (0, import_editor_v1_adapters11.undoable)(
437
- {
438
- do: ({ elements: elementsParam }) => {
439
- const createdElements = [];
440
- elementsParam.forEach((createParams) => {
441
- const { options, ...elementParams } = createParams;
442
- const element = createElement({
443
- ...elementParams,
444
- options: { ...options, useHistory: false }
445
- });
446
- const elementId = element.id;
447
- createdElements.push({
448
- elementId,
449
- model: element.model?.toJSON() || {},
450
- createParams: {
451
- ...createParams
452
- }
453
- });
454
- });
455
- return { createdElements };
456
- },
457
- undo: (_, { createdElements }) => {
458
- [...createdElements].reverse().forEach(({ elementId }) => {
459
- deleteElement({
460
- elementId,
461
- options: { useHistory: false }
462
- });
463
- });
464
- },
465
- redo: (_, { createdElements }) => {
466
- const newElements = [];
467
- createdElements.forEach(({ createParams, model }) => {
468
- const element = createElement({
469
- containerId: createParams.containerId,
470
- model,
471
- options: { ...createParams.options, useHistory: false }
472
- });
473
- const elementId = element.id;
474
- const container = getContainer(elementId);
475
- if (container) {
476
- newElements.push({
477
- elementId,
478
- model: container.model.toJSON(),
479
- createParams
480
- });
481
- }
482
- });
483
- return { createdElements: newElements };
484
- }
485
- },
486
- {
487
- title,
488
- subtitle
489
- }
490
- );
491
- return undoableCreate({ elements });
492
- };
493
-
494
- // src/sync/duplicate-elements.ts
495
- var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
496
- var import_i18n3 = require("@wordpress/i18n");
497
396
  var duplicateElements = ({
498
397
  elementIds,
499
398
  title,
500
- subtitle = (0, import_i18n3.__)("Item duplicated", "elementor")
399
+ subtitle = (0, import_i18n2.__)("Item duplicated", "elementor")
501
400
  }) => {
502
- const undoableDuplicate = (0, import_editor_v1_adapters12.undoable)(
401
+ const undoableDuplicate = (0, import_editor_v1_adapters11.undoable)(
503
402
  {
504
403
  do: ({ elementIds: elementIdsToDuplicate }) => {
505
404
  const duplicatedElements = elementIdsToDuplicate.reduce((acc, elementId) => {
@@ -564,81 +463,23 @@ var duplicateElements = ({
564
463
  return undoableDuplicate({ elementIds });
565
464
  };
566
465
 
567
- // src/sync/remove-elements.ts
568
- var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
569
- var import_i18n4 = require("@wordpress/i18n");
570
- var removeElements = ({
571
- elementIds,
572
- title,
573
- subtitle = (0, import_i18n4.__)("Item removed", "elementor"),
574
- onRemoveElements,
575
- onRestoreElements
576
- }) => {
577
- const undoableRemove = (0, import_editor_v1_adapters13.undoable)(
578
- {
579
- do: ({ elementIds: elementIdsParam }) => {
580
- const removedElements = [];
581
- elementIdsParam.forEach((elementId) => {
582
- const container = getContainer(elementId);
583
- if (container) {
584
- const model = container.model.toJSON();
585
- const parent = container.parent;
586
- const at = container.view?._index ?? 0;
587
- removedElements.push({
588
- elementId,
589
- model,
590
- parent: parent ?? null,
591
- at
592
- });
593
- }
594
- });
595
- const results = elementIdsParam.map((elementId) => {
596
- return deleteElement({
597
- elementId,
598
- options: { useHistory: false }
599
- });
600
- });
601
- Promise.all(results).then(() => {
602
- onRemoveElements?.();
603
- });
604
- return { elementIds: elementIdsParam, removedElements };
605
- },
606
- undo: (_, { removedElements }) => {
607
- [...removedElements].reverse().forEach(({ model, parent, at }) => {
608
- if (parent && model) {
609
- createElement({
610
- containerId: parent.id,
611
- model,
612
- options: { useHistory: false, at }
613
- });
614
- }
615
- });
616
- onRestoreElements?.();
617
- },
618
- redo: (_, { elementIds: originalElementIds, removedElements }) => {
619
- originalElementIds.forEach((elementId) => {
620
- deleteElement({
621
- elementId,
622
- options: { useHistory: false }
623
- });
624
- });
625
- onRemoveElements?.();
626
- return { elementIds: originalElementIds, removedElements };
627
- }
628
- },
629
- {
630
- title,
631
- subtitle
632
- }
633
- );
634
- return undoableRemove({ elementIds });
466
+ // src/sync/generate-element-id.ts
467
+ var generateElementId = () => {
468
+ const extendedWindow = window;
469
+ return extendedWindow.elementorCommon?.helpers?.getUniqueId?.() ?? `el-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
635
470
  };
636
471
 
637
- // src/sync/get-element-styles.ts
638
- var getElementStyles = (elementID) => {
639
- const container = getContainer(elementID);
640
- return container?.model.get("styles") || null;
641
- };
472
+ // src/sync/get-current-document-container.ts
473
+ function getCurrentDocumentContainer() {
474
+ const extendedWindow = window;
475
+ return extendedWindow.elementor?.documents?.getCurrent?.()?.container ?? null;
476
+ }
477
+
478
+ // src/sync/get-current-document-id.ts
479
+ function getCurrentDocumentId() {
480
+ const extendedWindow = window;
481
+ return extendedWindow.elementor?.documents?.getCurrentId?.() ?? null;
482
+ }
642
483
 
643
484
  // src/errors.ts
644
485
  var import_utils = require("@elementor/utils");
@@ -684,11 +525,11 @@ function getElementLabel(elementId) {
684
525
  return label;
685
526
  }
686
527
 
687
- // src/sync/get-current-document-container.ts
688
- function getCurrentDocumentContainer() {
689
- const extendedWindow = window;
690
- return extendedWindow.elementor?.documents?.getCurrent?.()?.container ?? null;
691
- }
528
+ // src/sync/get-element-styles.ts
529
+ var getElementStyles = (elementID) => {
530
+ const container = getContainer(elementID);
531
+ return container?.model.get("styles") || null;
532
+ };
692
533
 
693
534
  // src/sync/get-elements.ts
694
535
  function getElements(root) {
@@ -702,31 +543,178 @@ function getElements(root) {
702
543
  return [container, ...children];
703
544
  }
704
545
 
705
- // src/sync/get-current-document-id.ts
706
- function getCurrentDocumentId() {
707
- const extendedWindow = window;
708
- return extendedWindow.elementor?.documents?.getCurrentId?.() ?? null;
546
+ // src/sync/move-element.ts
547
+ function moveElement({ elementId, targetContainerId, options = {} }) {
548
+ const container = getContainer(elementId);
549
+ const target = getContainer(targetContainerId);
550
+ if (!container) {
551
+ throw new Error(`Element with ID "${elementId}" not found`);
552
+ }
553
+ if (!target) {
554
+ throw new Error(`Target container with ID "${targetContainerId}" not found`);
555
+ }
556
+ const modelToRecreate = container.model.toJSON();
557
+ deleteElement({
558
+ elementId,
559
+ // prevent inner history from being created
560
+ options: { ...options, useHistory: false }
561
+ });
562
+ const newContainer = createElement({
563
+ containerId: targetContainerId,
564
+ model: modelToRecreate,
565
+ // prevent inner history from being created
566
+ options: { edit: false, ...options, useHistory: false }
567
+ });
568
+ return newContainer;
709
569
  }
710
570
 
711
- // src/sync/update-element-settings.ts
712
- var import_editor_v1_adapters14 = require("@elementor/editor-v1-adapters");
713
- var updateElementSettings = ({ id, props, withHistory = true }) => {
714
- const container = getContainer(id);
715
- const args = {
716
- container,
717
- settings: { ...props }
718
- };
719
- if (withHistory) {
720
- (0, import_editor_v1_adapters14.__privateRunCommandSync)("document/elements/settings", args);
721
- } else {
722
- (0, import_editor_v1_adapters14.__privateRunCommandSync)("document/elements/set-settings", args, { internal: true });
723
- }
571
+ // src/sync/move-elements.ts
572
+ var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
573
+ var import_i18n3 = require("@wordpress/i18n");
574
+ var moveElements = ({
575
+ moves: movesToMake,
576
+ title,
577
+ subtitle = (0, import_i18n3.__)("Elements moved", "elementor"),
578
+ onMoveElements,
579
+ onRestoreElements
580
+ }) => {
581
+ const undoableMove = (0, import_editor_v1_adapters12.undoable)(
582
+ {
583
+ do: ({ moves }) => {
584
+ const movedElements = [];
585
+ moves.forEach((move) => {
586
+ const { elementId } = move;
587
+ const sourceContainer = getContainer(elementId);
588
+ if (!sourceContainer) {
589
+ throw new Error(`Element with ID "${elementId}" not found`);
590
+ }
591
+ const originalContainerId = sourceContainer.parent?.id || "";
592
+ const originalIndex = sourceContainer.parent?.children?.indexOf(sourceContainer) ?? -1;
593
+ const originalPosition = {
594
+ elementId,
595
+ originalContainerId,
596
+ originalIndex
597
+ };
598
+ const element = moveElement({
599
+ ...move,
600
+ options: { ...move.options, useHistory: false }
601
+ });
602
+ onMoveElements?.();
603
+ movedElements.push({
604
+ elementId,
605
+ originalPosition,
606
+ move,
607
+ element
608
+ });
609
+ });
610
+ return { movedElements };
611
+ },
612
+ undo: (_, { movedElements }) => {
613
+ [...movedElements].reverse().forEach(({ originalPosition }) => {
614
+ const { elementId, originalContainerId, originalIndex } = originalPosition;
615
+ onRestoreElements?.();
616
+ moveElement({
617
+ elementId,
618
+ targetContainerId: originalContainerId,
619
+ options: {
620
+ useHistory: false,
621
+ at: originalIndex >= 0 ? originalIndex : void 0
622
+ }
623
+ });
624
+ });
625
+ },
626
+ redo: (_, { movedElements }) => {
627
+ const newMovedElements = [];
628
+ movedElements.forEach(({ move, originalPosition }) => {
629
+ const element = moveElement({
630
+ ...move,
631
+ options: { ...move.options, useHistory: false }
632
+ });
633
+ onMoveElements?.();
634
+ newMovedElements.push({
635
+ elementId: move.elementId,
636
+ originalPosition,
637
+ move,
638
+ element
639
+ });
640
+ });
641
+ return { movedElements: newMovedElements };
642
+ }
643
+ },
644
+ {
645
+ title,
646
+ subtitle
647
+ }
648
+ );
649
+ return undoableMove({ moves: movesToMake });
724
650
  };
725
651
 
726
- // src/sync/generate-element-id.ts
727
- var generateElementId = () => {
728
- const extendedWindow = window;
729
- return extendedWindow.elementorCommon?.helpers?.getUniqueId?.() ?? `el-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
652
+ // src/sync/remove-elements.ts
653
+ var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
654
+ var import_i18n4 = require("@wordpress/i18n");
655
+ var removeElements = ({
656
+ elementIds,
657
+ title,
658
+ subtitle = (0, import_i18n4.__)("Item removed", "elementor"),
659
+ onRemoveElements,
660
+ onRestoreElements
661
+ }) => {
662
+ const undoableRemove = (0, import_editor_v1_adapters13.undoable)(
663
+ {
664
+ do: ({ elementIds: elementIdsParam }) => {
665
+ const removedElements = [];
666
+ elementIdsParam.forEach((elementId) => {
667
+ const container = getContainer(elementId);
668
+ if (container) {
669
+ const model = container.model.toJSON();
670
+ const parent = container.parent;
671
+ const at = container.view?._index ?? 0;
672
+ removedElements.push({
673
+ elementId,
674
+ model,
675
+ parent: parent ?? null,
676
+ at
677
+ });
678
+ }
679
+ });
680
+ onRemoveElements?.();
681
+ elementIdsParam.forEach((elementId) => {
682
+ deleteElement({
683
+ elementId,
684
+ options: { useHistory: false }
685
+ });
686
+ });
687
+ return { elementIds: elementIdsParam, removedElements };
688
+ },
689
+ undo: (_, { removedElements }) => {
690
+ onRestoreElements?.();
691
+ [...removedElements].reverse().forEach(({ model, parent, at }) => {
692
+ if (parent && model) {
693
+ createElement({
694
+ containerId: parent.id,
695
+ model,
696
+ options: { useHistory: false, at }
697
+ });
698
+ }
699
+ });
700
+ },
701
+ redo: (_, { elementIds: originalElementIds, removedElements }) => {
702
+ onRemoveElements?.();
703
+ originalElementIds.forEach((elementId) => {
704
+ deleteElement({
705
+ elementId,
706
+ options: { useHistory: false }
707
+ });
708
+ });
709
+ return { elementIds: originalElementIds, removedElements };
710
+ }
711
+ },
712
+ {
713
+ title,
714
+ subtitle
715
+ }
716
+ );
717
+ return undoableRemove({ elementIds });
730
718
  };
731
719
 
732
720
  // src/sync/replace-element.ts
@@ -768,18 +756,121 @@ function createWrapperForWidget(parentId, elementIndex) {
768
756
  return { containerId: container.id, index: 0 };
769
757
  }
770
758
 
771
- // src/sync/drop-element.ts
772
- var import_editor_v1_adapters15 = require("@elementor/editor-v1-adapters");
773
- function dropElement({ containerId, model, options }) {
774
- const container = getContainer(containerId);
775
- if (!container) {
776
- throw new Error(`Container with ID "${containerId}" not found`);
759
+ // src/sync/update-element-editor-settings.ts
760
+ var import_editor_v1_adapters14 = require("@elementor/editor-v1-adapters");
761
+ var updateElementEditorSettings = ({
762
+ elementId,
763
+ settings
764
+ }) => {
765
+ const element = getContainer(elementId);
766
+ if (!element) {
767
+ throw new Error(`Element with id ${elementId} not found`);
777
768
  }
778
- return (0, import_editor_v1_adapters15.__privateRunCommandSync)("preview/drop", {
769
+ const editorSettings = element.model.get("editor_settings") ?? {};
770
+ element.model.set("editor_settings", { ...editorSettings, ...settings });
771
+ setDocumentModifiedStatus(true);
772
+ };
773
+ function setDocumentModifiedStatus(status) {
774
+ (0, import_editor_v1_adapters14.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
775
+ }
776
+
777
+ // src/sync/update-element-settings.ts
778
+ var import_editor_v1_adapters15 = require("@elementor/editor-v1-adapters");
779
+ var updateElementSettings = ({ id, props, withHistory = true }) => {
780
+ const container = getContainer(id);
781
+ const args = {
779
782
  container,
780
- model,
781
- options
782
- });
783
+ settings: { ...props }
784
+ };
785
+ if (withHistory) {
786
+ (0, import_editor_v1_adapters15.__privateRunCommandSync)("document/elements/settings", args);
787
+ } else {
788
+ (0, import_editor_v1_adapters15.__privateRunCommandSync)("document/elements/set-settings", args, { internal: true });
789
+ }
790
+ };
791
+
792
+ // src/link-restriction.ts
793
+ function getLinkInLinkRestriction(elementId) {
794
+ const anchoredDescendantId = getAnchoredDescendantId(elementId);
795
+ if (anchoredDescendantId) {
796
+ return {
797
+ shouldRestrict: true,
798
+ reason: "descendant",
799
+ elementId: anchoredDescendantId
800
+ };
801
+ }
802
+ const ancestor = getAnchoredAncestorId(elementId);
803
+ if (ancestor) {
804
+ return {
805
+ shouldRestrict: true,
806
+ reason: "ancestor",
807
+ elementId: ancestor
808
+ };
809
+ }
810
+ return {
811
+ shouldRestrict: false
812
+ };
813
+ }
814
+ function getAnchoredDescendantId(elementId) {
815
+ const element = getElementDOM(elementId);
816
+ if (!element) {
817
+ return null;
818
+ }
819
+ for (const childAnchorElement of Array.from(element.querySelectorAll("a"))) {
820
+ const childElementId = findElementIdOf(childAnchorElement);
821
+ if (childElementId !== elementId) {
822
+ return childElementId;
823
+ }
824
+ }
825
+ return null;
826
+ }
827
+ function getAnchoredAncestorId(elementId) {
828
+ const element = getElementDOM(elementId);
829
+ if (!element || element.parentElement === null) {
830
+ return null;
831
+ }
832
+ const parentAnchor = element.parentElement.closest("a");
833
+ return parentAnchor ? findElementIdOf(parentAnchor) : null;
834
+ }
835
+ function isElementAnchored(elementId) {
836
+ const element = getElementDOM(elementId);
837
+ if (!element) {
838
+ return false;
839
+ }
840
+ if (isAnchorTag(element.tagName)) {
841
+ return true;
842
+ }
843
+ return doesElementContainAnchor(element);
844
+ }
845
+ function doesElementContainAnchor(element) {
846
+ for (const child of element.children) {
847
+ if (isElementorElement(child)) {
848
+ continue;
849
+ }
850
+ if (isAnchorTag(child.tagName)) {
851
+ return true;
852
+ }
853
+ if (doesElementContainAnchor(child)) {
854
+ return true;
855
+ }
856
+ }
857
+ return false;
858
+ }
859
+ function findElementIdOf(element) {
860
+ return element.closest("[data-id]")?.dataset.id || null;
861
+ }
862
+ function getElementDOM(id) {
863
+ try {
864
+ return getContainer(id)?.view?.el || null;
865
+ } catch {
866
+ return null;
867
+ }
868
+ }
869
+ function isAnchorTag(tagName) {
870
+ return tagName.toLowerCase() === "a";
871
+ }
872
+ function isElementorElement(element) {
873
+ return element.hasAttribute("data-id");
783
874
  }
784
875
 
785
876
  // src/styles/consts.ts
@@ -907,6 +998,14 @@ function shouldCreateNewLocalStyle(payload) {
907
998
  return !payload?.styleId && !payload?.provider;
908
999
  }
909
1000
 
1001
+ // src/styles/delete-element-style.ts
1002
+ function deleteElementStyle(elementId, styleId) {
1003
+ mutateElementStyles(elementId, (styles) => {
1004
+ delete styles[styleId];
1005
+ return styles;
1006
+ });
1007
+ }
1008
+
910
1009
  // src/styles/update-element-style.ts
911
1010
  var import_editor_props3 = require("@elementor/editor-props");
912
1011
  var import_editor_styles2 = require("@elementor/editor-styles");
@@ -928,97 +1027,9 @@ function updateElementStyle(args) {
928
1027
  });
929
1028
  }
930
1029
 
931
- // src/styles/delete-element-style.ts
932
- function deleteElementStyle(elementId, styleId) {
933
- mutateElementStyles(elementId, (styles) => {
934
- delete styles[styleId];
935
- return styles;
936
- });
937
- }
938
-
939
- // src/link-restriction.ts
940
- function getLinkInLinkRestriction(elementId) {
941
- const anchoredDescendantId = getAnchoredDescendantId(elementId);
942
- if (anchoredDescendantId) {
943
- return {
944
- shouldRestrict: true,
945
- reason: "descendant",
946
- elementId: anchoredDescendantId
947
- };
948
- }
949
- const ancestor = getAnchoredAncestorId(elementId);
950
- if (ancestor) {
951
- return {
952
- shouldRestrict: true,
953
- reason: "ancestor",
954
- elementId: ancestor
955
- };
956
- }
957
- return {
958
- shouldRestrict: false
959
- };
960
- }
961
- function getAnchoredDescendantId(elementId) {
962
- const element = getElementDOM(elementId);
963
- if (!element) {
964
- return null;
965
- }
966
- for (const childAnchorElement of Array.from(element.querySelectorAll("a"))) {
967
- const childElementId = findElementIdOf(childAnchorElement);
968
- if (childElementId !== elementId) {
969
- return childElementId;
970
- }
971
- }
972
- return null;
973
- }
974
- function getAnchoredAncestorId(elementId) {
975
- const element = getElementDOM(elementId);
976
- if (!element || element.parentElement === null) {
977
- return null;
978
- }
979
- const parentAnchor = element.parentElement.closest("a");
980
- return parentAnchor ? findElementIdOf(parentAnchor) : null;
981
- }
982
- function isElementAnchored(elementId) {
983
- const element = getElementDOM(elementId);
984
- if (!element) {
985
- return false;
986
- }
987
- if (isAnchorTag(element.tagName)) {
988
- return true;
989
- }
990
- return doesElementContainAnchor(element);
991
- }
992
- function doesElementContainAnchor(element) {
993
- for (const child of element.children) {
994
- if (isElementorElement(child)) {
995
- continue;
996
- }
997
- if (isAnchorTag(child.tagName)) {
998
- return true;
999
- }
1000
- if (doesElementContainAnchor(child)) {
1001
- return true;
1002
- }
1003
- }
1004
- return false;
1005
- }
1006
- function findElementIdOf(element) {
1007
- return element.closest("[data-id]")?.dataset.id || null;
1008
- }
1009
- function getElementDOM(id) {
1010
- try {
1011
- return getContainer(id)?.view?.el || null;
1012
- } catch {
1013
- return null;
1014
- }
1015
- }
1016
- function isAnchorTag(tagName) {
1017
- return tagName.toLowerCase() === "a";
1018
- }
1019
- function isElementorElement(element) {
1020
- return element.hasAttribute("data-id");
1021
- }
1030
+ // src/hooks/use-element-interactions.ts
1031
+ var import_react = require("react");
1032
+ var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
1022
1033
 
1023
1034
  // src/sync/get-element-interactions.ts
1024
1035
  function getElementInteractions(elementId) {
@@ -1030,8 +1041,25 @@ function getElementInteractions(elementId) {
1030
1041
  return JSON.stringify(interactions);
1031
1042
  }
1032
1043
 
1044
+ // src/hooks/use-element-interactions.ts
1045
+ var useElementInteractions = (elementId) => {
1046
+ const [interactions, setInteractions] = (0, import_react.useState)(() => {
1047
+ const initial = getElementInteractions(elementId);
1048
+ return initial;
1049
+ });
1050
+ (0, import_editor_v1_adapters18.__privateUseListenTo)(
1051
+ (0, import_editor_v1_adapters18.windowEvent)("elementor/element/update_interactions"),
1052
+ () => {
1053
+ const newInteractions = getElementInteractions(elementId);
1054
+ setInteractions(newInteractions);
1055
+ },
1056
+ [elementId]
1057
+ );
1058
+ return interactions;
1059
+ };
1060
+
1033
1061
  // src/sync/update-element-interactions.ts
1034
- var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
1062
+ var import_editor_v1_adapters19 = require("@elementor/editor-v1-adapters");
1035
1063
  var updateElementInteractions = ({
1036
1064
  elementId,
1037
1065
  interactions
@@ -1048,28 +1076,9 @@ var playElementInteractions = (elementId) => {
1048
1076
  window.top?.dispatchEvent(new CustomEvent("atomic/play_interactions", { detail: { elementId } }));
1049
1077
  };
1050
1078
  function setDocumentModifiedStatus2(status) {
1051
- (0, import_editor_v1_adapters18.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
1079
+ (0, import_editor_v1_adapters19.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
1052
1080
  }
1053
1081
 
1054
- // src/hooks/use-element-interactions.ts
1055
- var import_react = require("react");
1056
- var import_editor_v1_adapters19 = require("@elementor/editor-v1-adapters");
1057
- var useElementInteractions = (elementId) => {
1058
- const [interactions, setInteractions] = (0, import_react.useState)(() => {
1059
- const initial = getElementInteractions(elementId);
1060
- return initial;
1061
- });
1062
- (0, import_editor_v1_adapters19.__privateUseListenTo)(
1063
- (0, import_editor_v1_adapters19.windowEvent)("elementor/element/update_interactions"),
1064
- () => {
1065
- const newInteractions = getElementInteractions(elementId);
1066
- setInteractions(newInteractions);
1067
- },
1068
- [elementId]
1069
- );
1070
- return interactions;
1071
- };
1072
-
1073
1082
  // src/mcp/index.ts
1074
1083
  var import_editor_mcp2 = require("@elementor/editor-mcp");
1075
1084