@elementor/editor-elements 3.33.0-270 → 3.33.0-272

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,12 +283,266 @@ 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", {
287
+ container,
288
+ options
289
+ });
290
+ }
291
+
292
+ // src/sync/create-elements.ts
293
+ var createElements = ({
294
+ elements,
295
+ title,
296
+ subtitle = (0, import_i18n.__)("Item added", "elementor")
297
+ }) => {
298
+ const undoableCreate = (0, import_editor_v1_adapters9.undoable)(
299
+ {
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 }
307
+ });
308
+ const elementId = element.id;
309
+ createdElements.push({
310
+ elementId,
311
+ model: element.model?.toJSON() || {},
312
+ createParams: {
313
+ ...createParams
314
+ }
315
+ });
316
+ });
317
+ return { createdElements };
318
+ },
319
+ undo: (_, { createdElements }) => {
320
+ [...createdElements].reverse().forEach(({ elementId }) => {
321
+ deleteElement({
322
+ elementId,
323
+ options: { useHistory: false }
324
+ });
325
+ });
326
+ },
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 }
334
+ });
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
+ {
349
+ title,
350
+ subtitle
351
+ }
352
+ );
353
+ return undoableCreate({ elements });
354
+ };
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", {
299
364
  container,
365
+ model,
300
366
  options
301
367
  });
302
368
  }
303
369
 
370
+ // src/sync/duplicate-element.ts
371
+ function duplicateElement({ elementId, options = {} }) {
372
+ const elementToDuplicate = getContainer(elementId);
373
+ if (!elementToDuplicate) {
374
+ throw new Error(`Element with ID "${elementId}" not found`);
375
+ }
376
+ if (!elementToDuplicate.parent) {
377
+ throw new Error(`Element with ID "${elementId}" has no parent container`);
378
+ }
379
+ const parentContainer = elementToDuplicate.parent;
380
+ const elementModel = elementToDuplicate.model.toJSON();
381
+ const currentIndex = elementToDuplicate.view?._index ?? 0;
382
+ const insertPosition = options.clone !== false ? currentIndex + 1 : void 0;
383
+ return createElement({
384
+ containerId: parentContainer.id,
385
+ model: elementModel,
386
+ options: {
387
+ at: insertPosition,
388
+ ...options
389
+ }
390
+ });
391
+ }
392
+
393
+ // src/sync/duplicate-elements.ts
394
+ var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
395
+ var import_i18n2 = require("@wordpress/i18n");
396
+ var duplicateElements = ({
397
+ elementIds,
398
+ title,
399
+ subtitle = (0, import_i18n2.__)("Item duplicated", "elementor")
400
+ }) => {
401
+ const undoableDuplicate = (0, import_editor_v1_adapters11.undoable)(
402
+ {
403
+ do: ({ elementIds: elementIdsToDuplicate }) => {
404
+ const duplicatedElements = elementIdsToDuplicate.reduce((acc, elementId) => {
405
+ const originalContainer = getContainer(elementId);
406
+ if (originalContainer?.parent) {
407
+ const duplicatedElement = duplicateElement({
408
+ elementId,
409
+ options: { useHistory: false, clone: true }
410
+ });
411
+ acc.push({
412
+ id: duplicatedElement.id,
413
+ model: duplicatedElement.model.toJSON(),
414
+ originalElementId: elementId,
415
+ modelToRestore: duplicatedElement.model.toJSON(),
416
+ parentContainerId: duplicatedElement.parent?.id,
417
+ at: duplicatedElement.view?._index
418
+ });
419
+ }
420
+ return acc;
421
+ }, []);
422
+ return { duplicatedElements };
423
+ },
424
+ undo: (_, { duplicatedElements }) => {
425
+ [...duplicatedElements].reverse().forEach(({ id }) => {
426
+ deleteElement({
427
+ elementId: id,
428
+ options: { useHistory: false }
429
+ });
430
+ });
431
+ },
432
+ redo: (_, { duplicatedElements: previousElements }) => {
433
+ const duplicatedElements = previousElements.reduce((acc, previousElement) => {
434
+ if (previousElement.modelToRestore && previousElement.parentContainerId) {
435
+ const createdElement = createElement({
436
+ containerId: previousElement.parentContainerId,
437
+ model: previousElement.modelToRestore,
438
+ options: {
439
+ useHistory: false,
440
+ clone: false,
441
+ at: previousElement.at
442
+ }
443
+ });
444
+ acc.push({
445
+ id: createdElement.id,
446
+ model: createdElement.model.toJSON(),
447
+ originalElementId: previousElement.originalElementId,
448
+ modelToRestore: previousElement.modelToRestore,
449
+ parentContainerId: previousElement.parentContainerId,
450
+ at: previousElement.at
451
+ });
452
+ }
453
+ return acc;
454
+ }, []);
455
+ return { duplicatedElements };
456
+ }
457
+ },
458
+ {
459
+ title,
460
+ subtitle
461
+ }
462
+ );
463
+ return undoableDuplicate({ elementIds });
464
+ };
465
+
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)}`;
470
+ };
471
+
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
+ }
483
+
484
+ // src/errors.ts
485
+ var import_utils = require("@elementor/utils");
486
+ var ElementNotFoundError = (0, import_utils.createError)({
487
+ code: "element_not_found",
488
+ message: "Element not found."
489
+ });
490
+ var StyleNotFoundError = (0, import_utils.createError)({
491
+ code: "style_not_found",
492
+ message: "Style not found."
493
+ });
494
+ var ElementTypeNotExistsError = (0, import_utils.createError)({
495
+ code: "element_type_not_exists",
496
+ message: "Element type does not exist."
497
+ });
498
+ var ElementLabelNotExistsError = (0, import_utils.createError)({
499
+ code: "element_label_not_exists",
500
+ message: "Element label does not exist."
501
+ });
502
+ var ElementParentNotFoundError = (0, import_utils.createError)({
503
+ code: "element_parent_not_found",
504
+ message: "Element parent not found."
505
+ });
506
+ var ElementIndexNotFoundError = (0, import_utils.createError)({
507
+ code: "element_index_not_found",
508
+ message: "Element index not found."
509
+ });
510
+
511
+ // src/sync/get-element-label.ts
512
+ function getElementLabel(elementId) {
513
+ if (!elementId) {
514
+ elementId = getSelectedElements()?.[0]?.id;
515
+ }
516
+ const container = getContainer(elementId);
517
+ const type = container?.model.get("widgetType") || container?.model.get("elType");
518
+ if (!type) {
519
+ throw new ElementTypeNotExistsError({ context: { elementId } });
520
+ }
521
+ const label = getWidgetsCache()?.[type]?.title;
522
+ if (!label) {
523
+ throw new ElementLabelNotExistsError({ context: { elementType: type } });
524
+ }
525
+ return label;
526
+ }
527
+
528
+ // src/sync/get-element-styles.ts
529
+ var getElementStyles = (elementID) => {
530
+ const container = getContainer(elementID);
531
+ return container?.model.get("styles") || null;
532
+ };
533
+
534
+ // src/sync/get-elements.ts
535
+ function getElements(root) {
536
+ const container = root ? getContainer(root) : getCurrentDocumentContainer();
537
+ if (!container) {
538
+ return [];
539
+ }
540
+ const children = [...container.model.get("elements") ?? []].flatMap(
541
+ (childModel) => getElements(childModel.get("id"))
542
+ );
543
+ return [container, ...children];
544
+ }
545
+
304
546
  // src/sync/move-element.ts
305
547
  function moveElement({ elementId, targetContainerId, options = {} }) {
306
548
  const container = getContainer(elementId);
@@ -327,14 +569,14 @@ function moveElement({ elementId, targetContainerId, options = {} }) {
327
569
  }
328
570
 
329
571
  // src/sync/move-elements.ts
330
- var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
331
- var import_i18n = require("@wordpress/i18n");
572
+ var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
573
+ var import_i18n3 = require("@wordpress/i18n");
332
574
  var moveElements = ({
333
575
  moves: movesToMake,
334
576
  title,
335
- subtitle = (0, import_i18n.__)("Elements moved", "elementor")
577
+ subtitle = (0, import_i18n3.__)("Elements moved", "elementor")
336
578
  }) => {
337
- const undoableMove = (0, import_editor_v1_adapters10.undoable)(
579
+ const undoableMove = (0, import_editor_v1_adapters12.undoable)(
338
580
  {
339
581
  do: ({ moves }) => {
340
582
  const movedElements = [];
@@ -402,168 +644,6 @@ var moveElements = ({
402
644
  return undoableMove({ moves: movesToMake });
403
645
  };
404
646
 
405
- // src/sync/duplicate-element.ts
406
- function duplicateElement({ elementId, options = {} }) {
407
- const elementToDuplicate = getContainer(elementId);
408
- if (!elementToDuplicate) {
409
- throw new Error(`Element with ID "${elementId}" not found`);
410
- }
411
- if (!elementToDuplicate.parent) {
412
- throw new Error(`Element with ID "${elementId}" has no parent container`);
413
- }
414
- const parentContainer = elementToDuplicate.parent;
415
- const elementModel = elementToDuplicate.model.toJSON();
416
- const currentIndex = elementToDuplicate.view?._index ?? 0;
417
- const insertPosition = options.clone !== false ? currentIndex + 1 : void 0;
418
- return createElement({
419
- containerId: parentContainer.id,
420
- model: elementModel,
421
- options: {
422
- at: insertPosition,
423
- ...options
424
- }
425
- });
426
- }
427
-
428
- // src/sync/create-elements.ts
429
- var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
430
- 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
- var duplicateElements = ({
498
- elementIds,
499
- title,
500
- subtitle = (0, import_i18n3.__)("Item duplicated", "elementor")
501
- }) => {
502
- const undoableDuplicate = (0, import_editor_v1_adapters12.undoable)(
503
- {
504
- do: ({ elementIds: elementIdsToDuplicate }) => {
505
- const duplicatedElements = elementIdsToDuplicate.reduce((acc, elementId) => {
506
- const originalContainer = getContainer(elementId);
507
- if (originalContainer?.parent) {
508
- const duplicatedElement = duplicateElement({
509
- elementId,
510
- options: { useHistory: false, clone: true }
511
- });
512
- acc.push({
513
- id: duplicatedElement.id,
514
- model: duplicatedElement.model.toJSON(),
515
- originalElementId: elementId,
516
- modelToRestore: duplicatedElement.model.toJSON(),
517
- parentContainerId: duplicatedElement.parent?.id,
518
- at: duplicatedElement.view?._index
519
- });
520
- }
521
- return acc;
522
- }, []);
523
- return { duplicatedElements };
524
- },
525
- undo: (_, { duplicatedElements }) => {
526
- [...duplicatedElements].reverse().forEach(({ id }) => {
527
- deleteElement({
528
- elementId: id,
529
- options: { useHistory: false }
530
- });
531
- });
532
- },
533
- redo: (_, { duplicatedElements: previousElements }) => {
534
- const duplicatedElements = previousElements.reduce((acc, previousElement) => {
535
- if (previousElement.modelToRestore && previousElement.parentContainerId) {
536
- const createdElement = createElement({
537
- containerId: previousElement.parentContainerId,
538
- model: previousElement.modelToRestore,
539
- options: {
540
- useHistory: false,
541
- clone: false,
542
- at: previousElement.at
543
- }
544
- });
545
- acc.push({
546
- id: createdElement.id,
547
- model: createdElement.model.toJSON(),
548
- originalElementId: previousElement.originalElementId,
549
- modelToRestore: previousElement.modelToRestore,
550
- parentContainerId: previousElement.parentContainerId,
551
- at: previousElement.at
552
- });
553
- }
554
- return acc;
555
- }, []);
556
- return { duplicatedElements };
557
- }
558
- },
559
- {
560
- title,
561
- subtitle
562
- }
563
- );
564
- return undoableDuplicate({ elementIds });
565
- };
566
-
567
647
  // src/sync/remove-elements.ts
568
648
  var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
569
649
  var import_i18n4 = require("@wordpress/i18n");
@@ -631,102 +711,7 @@ var removeElements = ({
631
711
  subtitle
632
712
  }
633
713
  );
634
- return undoableRemove({ elementIds });
635
- };
636
-
637
- // src/sync/get-element-styles.ts
638
- var getElementStyles = (elementID) => {
639
- const container = getContainer(elementID);
640
- return container?.model.get("styles") || null;
641
- };
642
-
643
- // src/errors.ts
644
- var import_utils = require("@elementor/utils");
645
- var ElementNotFoundError = (0, import_utils.createError)({
646
- code: "element_not_found",
647
- message: "Element not found."
648
- });
649
- var StyleNotFoundError = (0, import_utils.createError)({
650
- code: "style_not_found",
651
- message: "Style not found."
652
- });
653
- var ElementTypeNotExistsError = (0, import_utils.createError)({
654
- code: "element_type_not_exists",
655
- message: "Element type does not exist."
656
- });
657
- var ElementLabelNotExistsError = (0, import_utils.createError)({
658
- code: "element_label_not_exists",
659
- message: "Element label does not exist."
660
- });
661
- var ElementParentNotFoundError = (0, import_utils.createError)({
662
- code: "element_parent_not_found",
663
- message: "Element parent not found."
664
- });
665
- var ElementIndexNotFoundError = (0, import_utils.createError)({
666
- code: "element_index_not_found",
667
- message: "Element index not found."
668
- });
669
-
670
- // src/sync/get-element-label.ts
671
- function getElementLabel(elementId) {
672
- if (!elementId) {
673
- elementId = getSelectedElements()?.[0]?.id;
674
- }
675
- const container = getContainer(elementId);
676
- const type = container?.model.get("widgetType") || container?.model.get("elType");
677
- if (!type) {
678
- throw new ElementTypeNotExistsError({ context: { elementId } });
679
- }
680
- const label = getWidgetsCache()?.[type]?.title;
681
- if (!label) {
682
- throw new ElementLabelNotExistsError({ context: { elementType: type } });
683
- }
684
- return label;
685
- }
686
-
687
- // src/sync/get-current-document-container.ts
688
- function getCurrentDocumentContainer() {
689
- const extendedWindow = window;
690
- return extendedWindow.elementor?.documents?.getCurrent?.()?.container ?? null;
691
- }
692
-
693
- // src/sync/get-elements.ts
694
- function getElements(root) {
695
- const container = root ? getContainer(root) : getCurrentDocumentContainer();
696
- if (!container) {
697
- return [];
698
- }
699
- const children = [...container.model.get("elements") ?? []].flatMap(
700
- (childModel) => getElements(childModel.get("id"))
701
- );
702
- return [container, ...children];
703
- }
704
-
705
- // src/sync/get-current-document-id.ts
706
- function getCurrentDocumentId() {
707
- const extendedWindow = window;
708
- return extendedWindow.elementor?.documents?.getCurrentId?.() ?? null;
709
- }
710
-
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
- }
724
- };
725
-
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)}`;
714
+ return undoableRemove({ elementIds });
730
715
  };
731
716
 
732
717
  // src/sync/replace-element.ts
@@ -768,18 +753,121 @@ function createWrapperForWidget(parentId, elementIndex) {
768
753
  return { containerId: container.id, index: 0 };
769
754
  }
770
755
 
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`);
756
+ // src/sync/update-element-editor-settings.ts
757
+ var import_editor_v1_adapters14 = require("@elementor/editor-v1-adapters");
758
+ var updateElementEditorSettings = ({
759
+ elementId,
760
+ settings
761
+ }) => {
762
+ const element = getContainer(elementId);
763
+ if (!element) {
764
+ throw new Error(`Element with id ${elementId} not found`);
777
765
  }
778
- return (0, import_editor_v1_adapters15.__privateRunCommandSync)("preview/drop", {
766
+ const editorSettings = element.model.get("editor_settings") ?? {};
767
+ element.model.set("editor_settings", { ...editorSettings, ...settings });
768
+ setDocumentModifiedStatus(true);
769
+ };
770
+ function setDocumentModifiedStatus(status) {
771
+ (0, import_editor_v1_adapters14.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
772
+ }
773
+
774
+ // src/sync/update-element-settings.ts
775
+ var import_editor_v1_adapters15 = require("@elementor/editor-v1-adapters");
776
+ var updateElementSettings = ({ id, props, withHistory = true }) => {
777
+ const container = getContainer(id);
778
+ const args = {
779
779
  container,
780
- model,
781
- options
782
- });
780
+ settings: { ...props }
781
+ };
782
+ if (withHistory) {
783
+ (0, import_editor_v1_adapters15.__privateRunCommandSync)("document/elements/settings", args);
784
+ } else {
785
+ (0, import_editor_v1_adapters15.__privateRunCommandSync)("document/elements/set-settings", args, { internal: true });
786
+ }
787
+ };
788
+
789
+ // src/link-restriction.ts
790
+ function getLinkInLinkRestriction(elementId) {
791
+ const anchoredDescendantId = getAnchoredDescendantId(elementId);
792
+ if (anchoredDescendantId) {
793
+ return {
794
+ shouldRestrict: true,
795
+ reason: "descendant",
796
+ elementId: anchoredDescendantId
797
+ };
798
+ }
799
+ const ancestor = getAnchoredAncestorId(elementId);
800
+ if (ancestor) {
801
+ return {
802
+ shouldRestrict: true,
803
+ reason: "ancestor",
804
+ elementId: ancestor
805
+ };
806
+ }
807
+ return {
808
+ shouldRestrict: false
809
+ };
810
+ }
811
+ function getAnchoredDescendantId(elementId) {
812
+ const element = getElementDOM(elementId);
813
+ if (!element) {
814
+ return null;
815
+ }
816
+ for (const childAnchorElement of Array.from(element.querySelectorAll("a"))) {
817
+ const childElementId = findElementIdOf(childAnchorElement);
818
+ if (childElementId !== elementId) {
819
+ return childElementId;
820
+ }
821
+ }
822
+ return null;
823
+ }
824
+ function getAnchoredAncestorId(elementId) {
825
+ const element = getElementDOM(elementId);
826
+ if (!element || element.parentElement === null) {
827
+ return null;
828
+ }
829
+ const parentAnchor = element.parentElement.closest("a");
830
+ return parentAnchor ? findElementIdOf(parentAnchor) : null;
831
+ }
832
+ function isElementAnchored(elementId) {
833
+ const element = getElementDOM(elementId);
834
+ if (!element) {
835
+ return false;
836
+ }
837
+ if (isAnchorTag(element.tagName)) {
838
+ return true;
839
+ }
840
+ return doesElementContainAnchor(element);
841
+ }
842
+ function doesElementContainAnchor(element) {
843
+ for (const child of element.children) {
844
+ if (isElementorElement(child)) {
845
+ continue;
846
+ }
847
+ if (isAnchorTag(child.tagName)) {
848
+ return true;
849
+ }
850
+ if (doesElementContainAnchor(child)) {
851
+ return true;
852
+ }
853
+ }
854
+ return false;
855
+ }
856
+ function findElementIdOf(element) {
857
+ return element.closest("[data-id]")?.dataset.id || null;
858
+ }
859
+ function getElementDOM(id) {
860
+ try {
861
+ return getContainer(id)?.view?.el || null;
862
+ } catch {
863
+ return null;
864
+ }
865
+ }
866
+ function isAnchorTag(tagName) {
867
+ return tagName.toLowerCase() === "a";
868
+ }
869
+ function isElementorElement(element) {
870
+ return element.hasAttribute("data-id");
783
871
  }
784
872
 
785
873
  // src/styles/consts.ts
@@ -907,6 +995,14 @@ function shouldCreateNewLocalStyle(payload) {
907
995
  return !payload?.styleId && !payload?.provider;
908
996
  }
909
997
 
998
+ // src/styles/delete-element-style.ts
999
+ function deleteElementStyle(elementId, styleId) {
1000
+ mutateElementStyles(elementId, (styles) => {
1001
+ delete styles[styleId];
1002
+ return styles;
1003
+ });
1004
+ }
1005
+
910
1006
  // src/styles/update-element-style.ts
911
1007
  var import_editor_props3 = require("@elementor/editor-props");
912
1008
  var import_editor_styles2 = require("@elementor/editor-styles");
@@ -928,97 +1024,9 @@ function updateElementStyle(args) {
928
1024
  });
929
1025
  }
930
1026
 
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
- }
1027
+ // src/hooks/use-element-interactions.ts
1028
+ var import_react = require("react");
1029
+ var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
1022
1030
 
1023
1031
  // src/sync/get-element-interactions.ts
1024
1032
  function getElementInteractions(elementId) {
@@ -1030,8 +1038,25 @@ function getElementInteractions(elementId) {
1030
1038
  return JSON.stringify(interactions);
1031
1039
  }
1032
1040
 
1041
+ // src/hooks/use-element-interactions.ts
1042
+ var useElementInteractions = (elementId) => {
1043
+ const [interactions, setInteractions] = (0, import_react.useState)(() => {
1044
+ const initial = getElementInteractions(elementId);
1045
+ return initial;
1046
+ });
1047
+ (0, import_editor_v1_adapters18.__privateUseListenTo)(
1048
+ (0, import_editor_v1_adapters18.windowEvent)("elementor/element/update_interactions"),
1049
+ () => {
1050
+ const newInteractions = getElementInteractions(elementId);
1051
+ setInteractions(newInteractions);
1052
+ },
1053
+ [elementId]
1054
+ );
1055
+ return interactions;
1056
+ };
1057
+
1033
1058
  // src/sync/update-element-interactions.ts
1034
- var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
1059
+ var import_editor_v1_adapters19 = require("@elementor/editor-v1-adapters");
1035
1060
  var updateElementInteractions = ({
1036
1061
  elementId,
1037
1062
  interactions
@@ -1048,28 +1073,9 @@ var playElementInteractions = (elementId) => {
1048
1073
  window.top?.dispatchEvent(new CustomEvent("atomic/play_interactions", { detail: { elementId } }));
1049
1074
  };
1050
1075
  function setDocumentModifiedStatus2(status) {
1051
- (0, import_editor_v1_adapters18.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
1076
+ (0, import_editor_v1_adapters19.__privateRunCommandSync)("document/save/set-is-modified", { status }, { internal: true });
1052
1077
  }
1053
1078
 
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
1079
  // src/mcp/index.ts
1074
1080
  var import_editor_mcp2 = require("@elementor/editor-mcp");
1075
1081