@elementor/editor-canvas 3.35.0-351 → 3.35.0-352

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
@@ -243,8 +243,8 @@ var subscribeToStylesRepository = () => {
243
243
  });
244
244
  };
245
245
  var renameClass = (oldClassName, newClassName) => {
246
- Object.values((0, import_editor_documents.getV1DocumentsManager)().documents).forEach((document) => {
247
- const container = document.container;
246
+ Object.values((0, import_editor_documents.getV1DocumentsManager)().documents).forEach((document2) => {
247
+ const container = document2.container;
248
248
  container.view?.el?.querySelectorAll(`.elementor .${oldClassName}`).forEach((element) => {
249
249
  element.classList.replace(oldClassName, newClassName);
250
250
  });
@@ -252,92 +252,9 @@ var renameClass = (oldClassName, newClassName) => {
252
252
  };
253
253
 
254
254
  // src/components/elements-overlays.tsx
255
- var React3 = __toESM(require("react"));
256
- var import_editor_elements4 = require("@elementor/editor-elements");
257
- var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
258
-
259
- // src/utils/inline-editing-utils.ts
260
- var import_editor_elements2 = require("@elementor/editor-elements");
261
- var WIDGET_PROPERTY_MAP = {
262
- "e-heading": "title",
263
- "e-paragraph": "paragraph"
264
- };
265
- var getHtmlPropertyName = (container) => {
266
- const widgetType = container?.model?.get("widgetType") ?? container?.model?.get("elType");
267
- if (!widgetType) {
268
- return "";
269
- }
270
- if (WIDGET_PROPERTY_MAP[widgetType]) {
271
- return WIDGET_PROPERTY_MAP[widgetType];
272
- }
273
- const propsSchema = (0, import_editor_elements2.getElementType)(widgetType)?.propsSchema;
274
- if (!propsSchema) {
275
- return "";
276
- }
277
- const entry = Object.entries(propsSchema).find(([, propType]) => propType.key === "html");
278
- return entry?.[0] ?? "";
279
- };
280
- var hasInlineEditableProperty = (containerId) => {
281
- const container = (0, import_editor_elements2.getContainer)(containerId);
282
- const widgetType = container?.model?.get("widgetType") ?? container?.model?.get("elType");
283
- if (!widgetType) {
284
- return false;
285
- }
286
- return widgetType in WIDGET_PROPERTY_MAP;
287
- };
288
- var getInlineEditablePropertyName = (container) => {
289
- return getHtmlPropertyName(container);
290
- };
291
-
292
- // src/components/inline-editor-overlay.tsx
293
255
  var React2 = __toESM(require("react"));
294
- var import_editor_controls = require("@elementor/editor-controls");
295
- var import_editor_elements3 = require("@elementor/editor-elements");
296
- var import_editor_props2 = require("@elementor/editor-props");
297
- var import_ui2 = require("@elementor/ui");
298
- var import_utils2 = require("@elementor/utils");
299
- var import_react6 = require("@floating-ui/react");
300
-
301
- // src/hooks/use-floating-on-element.ts
302
- var import_react2 = require("react");
303
- var import_react3 = require("@floating-ui/react");
304
- function useFloatingOnElement({ element, isSelected }) {
305
- const [isOpen, setIsOpen] = (0, import_react2.useState)(false);
306
- const sizeModifier = 2;
307
- const { refs, floatingStyles, context } = (0, import_react3.useFloating)({
308
- // Must be controlled for interactions (like hover) to work.
309
- open: isOpen || isSelected,
310
- onOpenChange: setIsOpen,
311
- whileElementsMounted: import_react3.autoUpdate,
312
- middleware: [
313
- // Match the floating element's size to the reference element.
314
- (0, import_react3.size)(() => {
315
- return {
316
- apply({ elements, rects }) {
317
- Object.assign(elements.floating.style, {
318
- width: `${rects.reference.width + sizeModifier}px`,
319
- height: `${rects.reference.height + sizeModifier}px`
320
- });
321
- }
322
- };
323
- }),
324
- // Center the floating element on the reference element.
325
- (0, import_react3.offset)(({ rects }) => -rects.reference.height / 2 - rects.floating.height / 2)
326
- ]
327
- });
328
- (0, import_react2.useEffect)(() => {
329
- refs.setReference(element);
330
- }, [element, refs]);
331
- return {
332
- isVisible: isOpen || isSelected,
333
- context,
334
- floating: {
335
- setRef: refs.setFloating,
336
- ref: refs.floating,
337
- styles: floatingStyles
338
- }
339
- };
340
- }
256
+ var import_editor_elements2 = require("@elementor/editor-elements");
257
+ var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
341
258
 
342
259
  // src/components/outline-overlay.tsx
343
260
  var React = __toESM(require("react"));
@@ -345,9 +262,9 @@ var import_ui = require("@elementor/ui");
345
262
  var import_react5 = require("@floating-ui/react");
346
263
 
347
264
  // src/hooks/use-bind-react-props-to-element.ts
348
- var import_react4 = require("react");
265
+ var import_react2 = require("react");
349
266
  function useBindReactPropsToElement(element, getProps) {
350
- (0, import_react4.useEffect)(() => {
267
+ (0, import_react2.useEffect)(() => {
351
268
  const el = element;
352
269
  const { events, attrs } = groupProps(getProps());
353
270
  events.forEach(([eventName, listener]) => el.addEventListener(eventName, listener));
@@ -378,6 +295,47 @@ function groupProps(props) {
378
295
  );
379
296
  }
380
297
 
298
+ // src/hooks/use-floating-on-element.ts
299
+ var import_react3 = require("react");
300
+ var import_react4 = require("@floating-ui/react");
301
+ function useFloatingOnElement({ element, isSelected }) {
302
+ const [isOpen, setIsOpen] = (0, import_react3.useState)(false);
303
+ const sizeModifier = 2;
304
+ const { refs, floatingStyles, context } = (0, import_react4.useFloating)({
305
+ // Must be controlled for interactions (like hover) to work.
306
+ open: isOpen || isSelected,
307
+ onOpenChange: setIsOpen,
308
+ whileElementsMounted: import_react4.autoUpdate,
309
+ middleware: [
310
+ // Match the floating element's size to the reference element.
311
+ (0, import_react4.size)(() => {
312
+ return {
313
+ apply({ elements, rects }) {
314
+ Object.assign(elements.floating.style, {
315
+ width: `${rects.reference.width + sizeModifier}px`,
316
+ height: `${rects.reference.height + sizeModifier}px`
317
+ });
318
+ }
319
+ };
320
+ }),
321
+ // Center the floating element on the reference element.
322
+ (0, import_react4.offset)(({ rects }) => -rects.reference.height / 2 - rects.floating.height / 2)
323
+ ]
324
+ });
325
+ (0, import_react3.useEffect)(() => {
326
+ refs.setReference(element);
327
+ }, [element, refs]);
328
+ return {
329
+ isVisible: isOpen || isSelected,
330
+ context,
331
+ floating: {
332
+ setRef: refs.setFloating,
333
+ ref: refs.floating,
334
+ styles: floatingStyles
335
+ }
336
+ };
337
+ }
338
+
381
339
  // src/hooks/use-has-overlapping.ts
382
340
  var possibleOverlappingSelectors = [".e-off-canvas"];
383
341
  var useHasOverlapping = () => {
@@ -424,75 +382,16 @@ var OutlineOverlay = ({ element, isSelected, id }) => {
424
382
  ));
425
383
  };
426
384
 
427
- // src/components/inline-editor-overlay.tsx
428
- var OVERLAY_Z_INDEX = 1e3;
429
- var DEBOUNCE_DELAY = 100;
430
- var InlineEditorOverlay = ({ element, isSelected, id }) => {
431
- const { floating, isVisible } = useFloatingOnElement({ element, isSelected });
432
- const propertyName = React2.useMemo(() => {
433
- const container = (0, import_editor_elements3.getContainer)(id);
434
- return getInlineEditablePropertyName(container);
435
- }, [id]);
436
- const contentProp = (0, import_editor_elements3.useElementSetting)(id, propertyName);
437
- const value = React2.useMemo(() => import_editor_props2.htmlPropTypeUtil.extract(contentProp) || "", [contentProp]);
438
- const debouncedUpdateRef = React2.useRef(null);
439
- const lastValueRef = React2.useRef("");
440
- React2.useEffect(() => {
441
- debouncedUpdateRef.current = (0, import_utils2.debounce)((newValue) => {
442
- const textContent = newValue.replace(/<[^>]*>/g, "").trim();
443
- const valueToSave = textContent === "" ? "&nbsp;" : newValue;
444
- (0, import_editor_elements3.updateElementSettings)({
445
- id,
446
- props: {
447
- [propertyName]: import_editor_props2.htmlPropTypeUtil.create(valueToSave)
448
- },
449
- withHistory: true
450
- });
451
- }, DEBOUNCE_DELAY);
452
- return () => {
453
- debouncedUpdateRef.current?.cancel?.();
454
- };
455
- }, [id, propertyName]);
456
- const handleValueChange = React2.useCallback((newValue) => {
457
- lastValueRef.current = newValue;
458
- debouncedUpdateRef.current?.(newValue);
459
- }, []);
460
- React2.useEffect(() => {
461
- if (!isVisible && debouncedUpdateRef.current?.pending?.()) {
462
- debouncedUpdateRef.current.flush(lastValueRef.current);
463
- }
464
- }, [isVisible]);
465
- if (!isVisible) {
466
- return null;
467
- }
468
- return /* @__PURE__ */ React2.createElement(import_react6.FloatingPortal, { id: CANVAS_WRAPPER_ID }, /* @__PURE__ */ React2.createElement(
469
- import_ui2.Box,
470
- {
471
- ref: floating.setRef,
472
- style: {
473
- ...floating.styles,
474
- zIndex: OVERLAY_Z_INDEX,
475
- pointerEvents: "auto"
476
- }
477
- },
478
- /* @__PURE__ */ React2.createElement(import_editor_controls.InlineEditor, { value, setValue: handleValueChange, showToolbar: isSelected })
479
- ));
480
- };
481
-
482
385
  // src/components/elements-overlays.tsx
483
386
  var ELEMENTS_DATA_ATTR = "atomic";
484
387
  var overlayRegistry = [
485
388
  {
486
389
  component: OutlineOverlay,
487
390
  shouldRender: () => true
488
- },
489
- {
490
- component: InlineEditorOverlay,
491
- shouldRender: ({ id, isSelected }) => isSelected && hasInlineEditableProperty(id) && (0, import_editor_v1_adapters2.isExperimentActive)("v4-inline-text-editing")
492
391
  }
493
392
  ];
494
393
  function ElementsOverlays() {
495
- const selected = (0, import_editor_elements4.useSelectedElement)();
394
+ const selected = (0, import_editor_elements2.useSelectedElement)();
496
395
  const elements = useElementsDom();
497
396
  const currentEditMode = (0, import_editor_v1_adapters2.useEditMode)();
498
397
  const isEditMode = currentEditMode === "edit";
@@ -504,7 +403,7 @@ function ElementsOverlays() {
504
403
  return elements.map(([id, element]) => {
505
404
  const isSelected = selected.element?.id === id;
506
405
  return overlayRegistry.map(
507
- ({ shouldRender, component: Overlay }, index) => shouldRender({ id, element, isSelected }) && /* @__PURE__ */ React3.createElement(Overlay, { key: `${id}-${index}`, id, element, isSelected })
406
+ ({ shouldRender, component: Overlay }, index) => shouldRender({ id, element, isSelected }) && /* @__PURE__ */ React2.createElement(Overlay, { key: `${id}-${index}`, id, element, isSelected })
508
407
  );
509
408
  });
510
409
  }
@@ -512,26 +411,26 @@ function useElementsDom() {
512
411
  return (0, import_editor_v1_adapters2.__privateUseListenTo)(
513
412
  [(0, import_editor_v1_adapters2.windowEvent)("elementor/editor/element-rendered"), (0, import_editor_v1_adapters2.windowEvent)("elementor/editor/element-destroyed")],
514
413
  () => {
515
- return (0, import_editor_elements4.getElements)().filter((el) => ELEMENTS_DATA_ATTR in (el.view?.el?.dataset ?? {})).map((element) => [element.id, element.view?.getDomElement?.()?.get?.(0)]).filter((item) => !!item[1]);
414
+ return (0, import_editor_elements2.getElements)().filter((el) => ELEMENTS_DATA_ATTR in (el.view?.el?.dataset ?? {})).map((element) => [element.id, element.view?.getDomElement?.()?.get?.(0)]).filter((item) => !!item[1]);
516
415
  }
517
416
  );
518
417
  }
519
418
 
520
419
  // src/components/interactions-renderer.tsx
521
- var React4 = __toESM(require("react"));
420
+ var React3 = __toESM(require("react"));
522
421
  var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
523
- var import_ui3 = require("@elementor/ui");
422
+ var import_ui2 = require("@elementor/ui");
524
423
 
525
424
  // src/hooks/use-interactions-items.ts
526
- var import_react8 = require("react");
425
+ var import_react7 = require("react");
527
426
  var import_editor_interactions = require("@elementor/editor-interactions");
528
427
  var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
529
428
 
530
429
  // src/hooks/use-on-mount.ts
531
- var import_react7 = require("react");
430
+ var import_react6 = require("react");
532
431
  function useOnMount(cb) {
533
- const mounted = (0, import_react7.useRef)(false);
534
- (0, import_react7.useEffect)(() => {
432
+ const mounted = (0, import_react6.useRef)(false);
433
+ (0, import_react6.useEffect)(() => {
535
434
  if (!mounted.current) {
536
435
  mounted.current = true;
537
436
  cb();
@@ -541,8 +440,8 @@ function useOnMount(cb) {
541
440
 
542
441
  // src/hooks/use-interactions-items.ts
543
442
  function useInteractionsItems() {
544
- const [interactionItems, setInteractionItems] = (0, import_react8.useState)({});
545
- const providerAndSubscribers = (0, import_react8.useMemo)(() => {
443
+ const [interactionItems, setInteractionItems] = (0, import_react7.useState)({});
444
+ const providerAndSubscribers = (0, import_react7.useMemo)(() => {
546
445
  try {
547
446
  const providers = import_editor_interactions.interactionsRepository.getProviders();
548
447
  const mapped = providers.map((provider) => {
@@ -559,7 +458,7 @@ function useInteractionsItems() {
559
458
  return [];
560
459
  }
561
460
  }, []);
562
- (0, import_react8.useEffect)(() => {
461
+ (0, import_react7.useEffect)(() => {
563
462
  if (providerAndSubscribers.length === 0) {
564
463
  return;
565
464
  }
@@ -590,7 +489,7 @@ function useInteractionsItems() {
590
489
  });
591
490
  });
592
491
  });
593
- return (0, import_react8.useMemo)(() => {
492
+ return (0, import_react7.useMemo)(() => {
594
493
  const result = Object.values(interactionItems).sort(sortByProviderPriority).flatMap(({ items }) => items);
595
494
  return result;
596
495
  }, [interactionItems]);
@@ -626,7 +525,7 @@ function InteractionsRenderer() {
626
525
  return null;
627
526
  }
628
527
  const interactionsData = JSON.stringify(Array.isArray(interactionItems) ? interactionItems : []);
629
- return /* @__PURE__ */ React4.createElement(import_ui3.Portal, { container }, /* @__PURE__ */ React4.createElement(
528
+ return /* @__PURE__ */ React3.createElement(import_ui2.Portal, { container }, /* @__PURE__ */ React3.createElement(
630
529
  "script",
631
530
  {
632
531
  type: "application/json",
@@ -642,9 +541,9 @@ function usePortalContainer() {
642
541
  }
643
542
 
644
543
  // src/components/style-renderer.tsx
645
- var React5 = __toESM(require("react"));
544
+ var React4 = __toESM(require("react"));
646
545
  var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
647
- var import_ui4 = require("@elementor/ui");
546
+ var import_ui3 = require("@elementor/ui");
648
547
 
649
548
  // src/hooks/use-documents-css-links.ts
650
549
  var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
@@ -676,14 +575,14 @@ function useDocumentsCssLinks() {
676
575
  }));
677
576
  });
678
577
  }
679
- function getDocumentsIdsInCanvas(document) {
680
- return [...document.body.querySelectorAll(`[${DOCUMENT_WRAPPER_ATTR}]`) ?? []].map(
578
+ function getDocumentsIdsInCanvas(document2) {
579
+ return [...document2.body.querySelectorAll(`[${DOCUMENT_WRAPPER_ATTR}]`) ?? []].map(
681
580
  (el) => el.getAttribute(DOCUMENT_WRAPPER_ATTR) || ""
682
581
  );
683
582
  }
684
- function getDocumentsCssLinks(document) {
583
+ function getDocumentsCssLinks(document2) {
685
584
  return [
686
- ...document.head.querySelectorAll(
585
+ ...document2.head.querySelectorAll(
687
586
  `link[rel="stylesheet"][id^=${CSS_LINK_ID_PREFIX}][id$=${CSS_LINK_ID_SUFFIX}]`
688
587
  ) ?? []
689
588
  ];
@@ -694,7 +593,7 @@ function getLinkAttrs(el) {
694
593
  }
695
594
 
696
595
  // src/hooks/use-style-items.ts
697
- var import_react11 = require("react");
596
+ var import_react10 = require("react");
698
597
  var import_editor_responsive2 = require("@elementor/editor-responsive");
699
598
  var import_editor_styles4 = require("@elementor/editor-styles");
700
599
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
@@ -732,11 +631,11 @@ function signalizedProcess(signal, steps = []) {
732
631
  }
733
632
 
734
633
  // src/hooks/use-style-prop-resolver.ts
735
- var import_react9 = require("react");
634
+ var import_react8 = require("react");
736
635
  var import_editor_styles2 = require("@elementor/editor-styles");
737
636
 
738
637
  // src/renderers/create-props-resolver.ts
739
- var import_editor_props3 = require("@elementor/editor-props");
638
+ var import_editor_props2 = require("@elementor/editor-props");
740
639
 
741
640
  // src/renderers/multi-props.ts
742
641
  var isMultiProps = (propValue) => {
@@ -774,7 +673,7 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
774
673
  if (value === null || value === void 0) {
775
674
  return null;
776
675
  }
777
- if (!(0, import_editor_props3.isTransformable)(value)) {
676
+ if (!(0, import_editor_props2.isTransformable)(value)) {
778
677
  return value;
779
678
  }
780
679
  if (depth > TRANSFORM_DEPTH_LIMIT) {
@@ -783,8 +682,8 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
783
682
  if (value.disabled === true) {
784
683
  return null;
785
684
  }
786
- value = (0, import_editor_props3.migratePropValue)(value, type);
787
- if (!(0, import_editor_props3.isTransformable)(value)) {
685
+ value = (0, import_editor_props2.migratePropValue)(value, type);
686
+ if (!(0, import_editor_props2.isTransformable)(value)) {
788
687
  return value;
789
688
  }
790
689
  let transformablePropType = type;
@@ -860,7 +759,7 @@ var enqueueFont = (fontFamily, context = "preview") => {
860
759
 
861
760
  // src/hooks/use-style-prop-resolver.ts
862
761
  function useStylePropResolver() {
863
- return (0, import_react9.useMemo)(() => {
762
+ return (0, import_react8.useMemo)(() => {
864
763
  return createPropsResolver({
865
764
  transformers: styleTransformersRegistry,
866
765
  schema: (0, import_editor_styles2.getStylesSchema)(),
@@ -875,20 +774,20 @@ function useStylePropResolver() {
875
774
  }
876
775
 
877
776
  // src/hooks/use-style-renderer.ts
878
- var import_react10 = require("react");
777
+ var import_react9 = require("react");
879
778
  var import_editor_responsive = require("@elementor/editor-responsive");
880
779
 
881
780
  // src/renderers/create-styles-renderer.ts
882
781
  var import_editor_styles3 = require("@elementor/editor-styles");
883
- var import_utils4 = require("@elementor/utils");
782
+ var import_utils3 = require("@elementor/utils");
884
783
 
885
784
  // src/renderers/errors.ts
886
- var import_utils3 = require("@elementor/utils");
887
- var UnknownStyleTypeError = (0, import_utils3.createError)({
785
+ var import_utils2 = require("@elementor/utils");
786
+ var UnknownStyleTypeError = (0, import_utils2.createError)({
888
787
  code: "unknown_style_type",
889
788
  message: "Unknown style type"
890
789
  });
891
- var UnknownStyleStateError = (0, import_utils3.createError)({
790
+ var UnknownStyleStateError = (0, import_utils2.createError)({
892
791
  code: "unknown_style_state",
893
792
  message: "Unknown style state"
894
793
  });
@@ -965,7 +864,7 @@ async function propsToCss({ props, resolve, signal }) {
965
864
  }, []).join("");
966
865
  }
967
866
  function customCssToString(customCss) {
968
- const decoded = (0, import_utils4.decodeString)(customCss?.raw || "");
867
+ const decoded = (0, import_utils3.decodeString)(customCss?.raw || "");
969
868
  if (!decoded.trim()) {
970
869
  return "";
971
870
  }
@@ -976,7 +875,7 @@ function customCssToString(customCss) {
976
875
  var SELECTOR_PREFIX = ".elementor";
977
876
  function useStyleRenderer(resolve) {
978
877
  const breakpoints = (0, import_editor_responsive.useBreakpointsMap)();
979
- return (0, import_react10.useMemo)(() => {
878
+ return (0, import_react9.useMemo)(() => {
980
879
  return createStylesRenderer({
981
880
  selectorPrefix: SELECTOR_PREFIX,
982
881
  breakpoints,
@@ -989,8 +888,8 @@ function useStyleRenderer(resolve) {
989
888
  function useStyleItems() {
990
889
  const resolve = useStylePropResolver();
991
890
  const renderStyles = useStyleRenderer(resolve);
992
- const [styleItems, setStyleItems] = (0, import_react11.useState)({});
993
- const providerAndSubscribers = (0, import_react11.useMemo)(() => {
891
+ const [styleItems, setStyleItems] = (0, import_react10.useState)({});
892
+ const providerAndSubscribers = (0, import_react10.useMemo)(() => {
994
893
  return import_editor_styles_repository2.stylesRepository.getProviders().map((provider) => {
995
894
  return {
996
895
  provider,
@@ -1002,7 +901,7 @@ function useStyleItems() {
1002
901
  };
1003
902
  });
1004
903
  }, [renderStyles]);
1005
- (0, import_react11.useEffect)(() => {
904
+ (0, import_react10.useEffect)(() => {
1006
905
  const unsubscribes = providerAndSubscribers.map(
1007
906
  ({ provider, subscriber }) => provider.subscribe(subscriber)
1008
907
  );
@@ -1017,7 +916,7 @@ function useStyleItems() {
1017
916
  });
1018
917
  });
1019
918
  const breakpointsOrder = (0, import_editor_responsive2.getBreakpoints)().map((breakpoint) => breakpoint.id);
1020
- return (0, import_react11.useMemo)(
919
+ return (0, import_react10.useMemo)(
1021
920
  () => Object.values(styleItems).sort(sortByProviderPriority2).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
1022
921
  // eslint-disable-next-line react-hooks/exhaustive-deps
1023
922
  [styleItems, breakpointsOrder.join("-")]
@@ -1090,7 +989,7 @@ function StyleRenderer() {
1090
989
  if (!container) {
1091
990
  return null;
1092
991
  }
1093
- return /* @__PURE__ */ React5.createElement(import_ui4.Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React5.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React5.createElement("link", { ...attrs, key: attrs.id })));
992
+ return /* @__PURE__ */ React4.createElement(import_ui3.Portal, { container }, styleItems.map((item, i) => /* @__PURE__ */ React4.createElement("style", { key: `${item.id}-${i}-${item.breakpoint}` }, item.value)), linksAttrs.map((attrs) => /* @__PURE__ */ React4.createElement("link", { ...attrs, key: attrs.id })));
1094
993
  }
1095
994
  function usePortalContainer2() {
1096
995
  return (0, import_editor_v1_adapters7.__privateUseListenTo)((0, import_editor_v1_adapters7.commandEndEvent)("editor/documents/attach-preview"), () => getCanvasIframeDocument()?.head);
@@ -1461,10 +1360,10 @@ var transformSkewTransformer = createTransformer((value) => {
1461
1360
  });
1462
1361
 
1463
1362
  // src/transformers/styles/transition-transformer.ts
1464
- var import_editor_controls2 = require("@elementor/editor-controls");
1363
+ var import_editor_controls = require("@elementor/editor-controls");
1465
1364
  var getAllowedProperties = () => {
1466
1365
  const allowedProperties = /* @__PURE__ */ new Set();
1467
- import_editor_controls2.transitionProperties.forEach((category) => {
1366
+ import_editor_controls.transitionProperties.forEach((category) => {
1468
1367
  category.properties.forEach((property) => {
1469
1368
  allowedProperties.add(property.value);
1470
1369
  });
@@ -1527,7 +1426,7 @@ function initStyleTransformers() {
1527
1426
 
1528
1427
  // src/legacy/init-legacy-views.ts
1529
1428
  var import_editor_elements5 = require("@elementor/editor-elements");
1530
- var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
1429
+ var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
1531
1430
 
1532
1431
  // src/renderers/create-dom-renderer.ts
1533
1432
  var import_twing = require("@elementor/twing");
@@ -1574,10 +1473,102 @@ function escapeURL(value) {
1574
1473
  }
1575
1474
  }
1576
1475
 
1476
+ // src/utils/inline-editing-utils.ts
1477
+ var import_editor_elements3 = require("@elementor/editor-elements");
1478
+ var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
1479
+ var WIDGET_PROPERTY_MAP = {
1480
+ "e-heading": "title",
1481
+ "e-paragraph": "paragraph"
1482
+ };
1483
+ var EXPERIMENT_KEY = "v4-inline-text-editing";
1484
+ var legacyWindow = window;
1485
+ var shouldRenderInlineEditingView = (elementType) => {
1486
+ return elementType in WIDGET_PROPERTY_MAP && (0, import_editor_v1_adapters8.isExperimentActive)(EXPERIMENT_KEY);
1487
+ };
1488
+ var getWidgetType = (container) => {
1489
+ return container?.model?.get("widgetType") ?? container?.model?.get("elType") ?? null;
1490
+ };
1491
+ var getHtmlPropertyName = (container) => {
1492
+ const widgetType = getWidgetType(container);
1493
+ if (!widgetType) {
1494
+ return "";
1495
+ }
1496
+ const propsSchema = (0, import_editor_elements3.getElementType)(widgetType)?.propsSchema;
1497
+ if (WIDGET_PROPERTY_MAP[widgetType]) {
1498
+ return WIDGET_PROPERTY_MAP[widgetType];
1499
+ }
1500
+ if (!propsSchema) {
1501
+ return "";
1502
+ }
1503
+ const entry = Object.entries(propsSchema).find(([, propType]) => {
1504
+ switch (propType.kind) {
1505
+ case "union":
1506
+ return propType.prop_types.html;
1507
+ case "object":
1508
+ return propType.shape.html;
1509
+ case "array":
1510
+ return "key" in propType.item_prop_type && propType.item_prop_type.key === "html";
1511
+ }
1512
+ return propType.key === "html";
1513
+ });
1514
+ return entry?.[0] ?? "";
1515
+ };
1516
+ var getHtmlPropType = (container) => {
1517
+ const widgetType = getWidgetType(container);
1518
+ if (!widgetType) {
1519
+ return null;
1520
+ }
1521
+ const propsSchema = (0, import_editor_elements3.getElementType)(widgetType)?.propsSchema;
1522
+ const propertyName = getHtmlPropertyName(container) ?? null;
1523
+ return propsSchema?.[propertyName] ?? null;
1524
+ };
1525
+ var getInlineEditablePropertyName = (container) => {
1526
+ return getHtmlPropertyName(container) ?? "";
1527
+ };
1528
+ var getBlockedValue = (value, tag) => {
1529
+ if (!value) {
1530
+ return "";
1531
+ }
1532
+ if (!tag) {
1533
+ return value;
1534
+ }
1535
+ const pseudoElement = document.createElement("div");
1536
+ pseudoElement.innerHTML = value;
1537
+ if (!pseudoElement?.children.length) {
1538
+ return `<${tag}>${value}</${tag}>`;
1539
+ }
1540
+ const firstChild = pseudoElement.children[0];
1541
+ const lastChild = Array.from(pseudoElement.children).slice(-1)[0];
1542
+ if (firstChild === lastChild && pseudoElement.textContent === firstChild.textContent) {
1543
+ return compareTag(firstChild, tag) ? value : `<${tag}>${firstChild.innerHTML}</${tag}>`;
1544
+ }
1545
+ if (!value.startsWith(`<${tag}`) || !value.endsWith(`</${tag}>`)) {
1546
+ return `<${tag}>${value}</${tag}>`;
1547
+ }
1548
+ if (firstChild !== lastChild || !compareTag(firstChild, tag)) {
1549
+ return `<${tag}>${value}</${tag}>`;
1550
+ }
1551
+ return value;
1552
+ };
1553
+ var compareTag = (el, tag) => {
1554
+ return el.tagName.toUpperCase() === tag.toUpperCase();
1555
+ };
1556
+ var getInitialPopoverPosition = () => {
1557
+ const positionFallback = { left: 0, top: 0 };
1558
+ const iFrameElement = legacyWindow?.elementor?.$preview?.get(0);
1559
+ const iFramePosition = iFrameElement?.getBoundingClientRect() ?? positionFallback;
1560
+ const previewElement = legacyWindow?.elementor?.$previewWrapper?.get(0);
1561
+ const previewPosition = previewElement ? { left: previewElement.scrollLeft, top: previewElement.scrollTop } : positionFallback;
1562
+ return {
1563
+ left: iFramePosition.left + previewPosition.left,
1564
+ top: iFramePosition.top + previewPosition.top
1565
+ };
1566
+ };
1567
+
1577
1568
  // src/legacy/create-element-type.ts
1578
1569
  function createElementType(type) {
1579
- const legacyWindow = window;
1580
- return class extends legacyWindow.elementor.modules.elements.types.Widget {
1570
+ const legacyWindow2 = window;
1571
+ return class extends legacyWindow2.elementor.modules.elements.types.Widget {
1581
1572
  getType() {
1582
1573
  return type;
1583
1574
  }
@@ -1587,8 +1578,8 @@ function createElementType(type) {
1587
1578
  };
1588
1579
  }
1589
1580
  function createElementViewClassDeclaration() {
1590
- const legacyWindow = window;
1591
- return class extends legacyWindow.elementor.modules.elements.views.Widget {
1581
+ const legacyWindow2 = window;
1582
+ return class extends legacyWindow2.elementor.modules.elements.views.Widget {
1592
1583
  // Dispatch `render` event so the overlay layer will be updated
1593
1584
  onRender(...args) {
1594
1585
  super.onRender(...args);
@@ -1634,7 +1625,7 @@ function createElementViewClassDeclaration() {
1634
1625
  );
1635
1626
  }
1636
1627
  #dispatchPreviewEvent(eventType) {
1637
- legacyWindow.elementor?.$preview?.[0]?.contentWindow.dispatchEvent(
1628
+ legacyWindow2.elementor?.$preview?.[0]?.contentWindow.dispatchEvent(
1638
1629
  new CustomEvent(eventType, {
1639
1630
  detail: {
1640
1631
  id: this.model.get("id"),
@@ -1650,14 +1641,22 @@ function createElementViewClassDeclaration() {
1650
1641
  };
1651
1642
  }
1652
1643
 
1644
+ // src/legacy/create-inline-editing-element-type.tsx
1645
+ var React5 = __toESM(require("react"));
1646
+ var import_client = require("react-dom/client");
1647
+ var import_editor_controls2 = require("@elementor/editor-controls");
1648
+ var import_editor_elements4 = require("@elementor/editor-elements");
1649
+ var import_editor_props3 = require("@elementor/editor-props");
1650
+ var import_editor_ui = require("@elementor/editor-ui");
1651
+
1653
1652
  // src/legacy/create-templated-element-type.ts
1654
1653
  function createTemplatedElementType({
1655
1654
  type,
1656
1655
  renderer,
1657
1656
  element
1658
1657
  }) {
1659
- const legacyWindow = window;
1660
- return class extends legacyWindow.elementor.modules.elements.types.Widget {
1658
+ const legacyWindow2 = window;
1659
+ return class extends legacyWindow2.elementor.modules.elements.types.Widget {
1661
1660
  getType() {
1662
1661
  return type;
1663
1662
  }
@@ -1748,15 +1747,151 @@ function createTemplatedElementView({
1748
1747
  };
1749
1748
  }
1750
1749
 
1750
+ // src/legacy/create-inline-editing-element-type.tsx
1751
+ function createInlineEditingElementType({
1752
+ type,
1753
+ renderer,
1754
+ element
1755
+ }) {
1756
+ return class extends legacyWindow.elementor.modules.elements.types.Widget {
1757
+ getType() {
1758
+ return type;
1759
+ }
1760
+ getView() {
1761
+ return createInlineEditingElementView({
1762
+ type,
1763
+ renderer,
1764
+ element
1765
+ });
1766
+ }
1767
+ };
1768
+ }
1769
+ function createInlineEditingElementView({
1770
+ type,
1771
+ renderer,
1772
+ element
1773
+ }) {
1774
+ const TemplatedView = createTemplatedElementView({ type, renderer, element });
1775
+ Object.entries(element.twig_templates).forEach(([key, template]) => {
1776
+ renderer.register(key, template);
1777
+ });
1778
+ return class extends TemplatedView {
1779
+ inlineEditorRoot = null;
1780
+ handlerAttached = false;
1781
+ render() {
1782
+ if (this.inlineEditorRoot) {
1783
+ this.resetInlineEditorRoot();
1784
+ }
1785
+ if (!this.isValueDynamic() && !this.handlerAttached) {
1786
+ this.$el.on("dblclick", "*", this.handleRenderInlineEditor.bind(this));
1787
+ this.handlerAttached = true;
1788
+ }
1789
+ TemplatedView.prototype.render.apply(this);
1790
+ }
1791
+ handleRenderInlineEditor(event) {
1792
+ event.stopPropagation();
1793
+ this.$el.off("dblclick", "*");
1794
+ this.handlerAttached = false;
1795
+ if (!this.isValueDynamic()) {
1796
+ this.renderInlineEditor();
1797
+ }
1798
+ }
1799
+ handleUnmountInlineEditor(event) {
1800
+ event.stopPropagation();
1801
+ this.unmountInlineEditor();
1802
+ }
1803
+ onDestroy(...args) {
1804
+ this.resetInlineEditorRoot();
1805
+ TemplatedView.prototype.onDestroy.apply(this, args);
1806
+ }
1807
+ resetInlineEditorRoot() {
1808
+ this.$el.off("dblclick", "*");
1809
+ this.handlerAttached = false;
1810
+ this.inlineEditorRoot?.unmount?.();
1811
+ this.inlineEditorRoot = null;
1812
+ }
1813
+ unmountInlineEditor() {
1814
+ this.resetInlineEditorRoot();
1815
+ this.render();
1816
+ }
1817
+ isValueDynamic() {
1818
+ const settingKey = getInlineEditablePropertyName(this.container);
1819
+ const propValue = this.model.get("settings")?.get(settingKey);
1820
+ return propValue?.$$type === "dynamic";
1821
+ }
1822
+ getContentValue() {
1823
+ const prop = getHtmlPropType(this.container);
1824
+ const defaultValue = prop?.default?.value ?? "";
1825
+ const settingKey = getInlineEditablePropertyName(this.container);
1826
+ return import_editor_props3.htmlPropTypeUtil.extract(this.model.get("settings")?.get(settingKey) ?? null) ?? import_editor_props3.htmlPropTypeUtil.extract(prop?.default ?? null) ?? defaultValue ?? "";
1827
+ }
1828
+ setContentValue(value) {
1829
+ const settingKey = getInlineEditablePropertyName(this.container);
1830
+ const valueToSave = value ? import_editor_props3.htmlPropTypeUtil.create(value) : null;
1831
+ this.model.get("settings")?.set(settingKey, valueToSave);
1832
+ }
1833
+ getExpectedTag() {
1834
+ const widgetType = getWidgetType(this.container);
1835
+ if (!widgetType) {
1836
+ return null;
1837
+ }
1838
+ const propsSchema = (0, import_editor_elements4.getElementType)(widgetType)?.propsSchema;
1839
+ if (!propsSchema?.tag) {
1840
+ return null;
1841
+ }
1842
+ return import_editor_props3.stringPropTypeUtil.extract(this.model.get("settings").get("tag") ?? null) ?? import_editor_props3.stringPropTypeUtil.extract(propsSchema.tag.default ?? null) ?? null;
1843
+ }
1844
+ ensureProperValue() {
1845
+ const actualValue = this.getContentValue();
1846
+ const tagSettings = this.getExpectedTag();
1847
+ const wrappedValue = getBlockedValue(actualValue, tagSettings);
1848
+ if (actualValue !== wrappedValue) {
1849
+ this.setContentValue(wrappedValue);
1850
+ }
1851
+ }
1852
+ renderInlineEditor() {
1853
+ this.ensureProperValue();
1854
+ const propValue = this.getContentValue();
1855
+ const settingKey = getInlineEditablePropertyName(this.container);
1856
+ const classes = (this.el?.children?.[0]?.classList.toString() ?? "") + " strip-styles";
1857
+ const expectedTag = this.getExpectedTag();
1858
+ const setValue = (value) => {
1859
+ const valueToSave = value ? import_editor_props3.htmlPropTypeUtil.create(value) : null;
1860
+ this.model.get("settings")?.set(settingKey, valueToSave);
1861
+ };
1862
+ this.$el.html("");
1863
+ if (this.inlineEditorRoot) {
1864
+ this.resetInlineEditorRoot();
1865
+ }
1866
+ this.inlineEditorRoot = (0, import_client.createRoot)(this.el);
1867
+ this.inlineEditorRoot.render(
1868
+ /* @__PURE__ */ React5.createElement(import_editor_ui.ThemeProvider, null, /* @__PURE__ */ React5.createElement(
1869
+ import_editor_controls2.InlineEditor,
1870
+ {
1871
+ attributes: { class: classes },
1872
+ value: propValue,
1873
+ setValue,
1874
+ onBlur: this.handleUnmountInlineEditor.bind(this),
1875
+ autofocus: true,
1876
+ showToolbar: true,
1877
+ getInitialPopoverPosition,
1878
+ expectedTag
1879
+ }
1880
+ ))
1881
+ );
1882
+ }
1883
+ };
1884
+ }
1885
+
1751
1886
  // src/legacy/init-legacy-views.ts
1752
1887
  var elementsLegacyTypes = {};
1753
1888
  function registerElementType(type, elementTypeGenerator) {
1754
1889
  elementsLegacyTypes[type] = elementTypeGenerator;
1755
1890
  }
1756
1891
  function initLegacyViews() {
1757
- (0, import_editor_v1_adapters8.__privateListenTo)((0, import_editor_v1_adapters8.v1ReadyEvent)(), () => {
1892
+ (0, import_editor_v1_adapters9.__privateListenTo)((0, import_editor_v1_adapters9.v1ReadyEvent)(), () => {
1758
1893
  const config = (0, import_editor_elements5.getWidgetsCache)() ?? {};
1759
- const legacyWindow = window;
1894
+ const legacyWindow2 = window;
1760
1895
  const renderer = createDomRenderer();
1761
1896
  Object.entries(config).forEach(([type, element]) => {
1762
1897
  if (!element.atomic) {
@@ -1766,11 +1901,11 @@ function initLegacyViews() {
1766
1901
  if (!!elementsLegacyTypes[type] && canBeTemplated(element)) {
1767
1902
  ElementType = elementsLegacyTypes[type]({ type, renderer, element });
1768
1903
  } else if (canBeTemplated(element)) {
1769
- ElementType = createTemplatedElementType({ type, renderer, element });
1904
+ ElementType = shouldRenderInlineEditingView(type) ? createInlineEditingElementType({ type, renderer, element }) : createTemplatedElementType({ type, renderer, element });
1770
1905
  } else {
1771
1906
  ElementType = createElementType(type);
1772
1907
  }
1773
- legacyWindow.elementor.elementsManager.registerElementType(new ElementType());
1908
+ legacyWindow2.elementor.elementsManager.registerElementType(new ElementType());
1774
1909
  });
1775
1910
  });
1776
1911
  }
@@ -2828,14 +2963,14 @@ An Example scenario of creating fully styled composition:
2828
2963
  // src/prevent-link-in-link-commands.ts
2829
2964
  var import_editor_elements10 = require("@elementor/editor-elements");
2830
2965
  var import_editor_notifications = require("@elementor/editor-notifications");
2831
- var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
2966
+ var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
2832
2967
  var import_i18n = require("@wordpress/i18n");
2833
2968
  function initLinkInLinkPrevention() {
2834
- (0, import_editor_v1_adapters9.blockCommand)({
2969
+ (0, import_editor_v1_adapters10.blockCommand)({
2835
2970
  command: "document/elements/paste",
2836
2971
  condition: blockLinkInLinkPaste
2837
2972
  });
2838
- (0, import_editor_v1_adapters9.blockCommand)({
2973
+ (0, import_editor_v1_adapters10.blockCommand)({
2839
2974
  command: "document/elements/move",
2840
2975
  condition: blockLinkInLinkMove
2841
2976
  });
@@ -2909,12 +3044,12 @@ function shouldBlock(sourceElements, targetElements) {
2909
3044
  }
2910
3045
 
2911
3046
  // src/style-commands/paste-style.ts
2912
- var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
3047
+ var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
2913
3048
 
2914
3049
  // src/style-commands/undoable-actions/paste-element-style.ts
2915
3050
  var import_editor_elements12 = require("@elementor/editor-elements");
2916
3051
  var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
2917
- var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
3052
+ var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
2918
3053
  var import_i18n3 = require("@wordpress/i18n");
2919
3054
 
2920
3055
  // src/style-commands/utils.ts
@@ -2960,7 +3095,7 @@ function getTitleForContainers(containers) {
2960
3095
  }
2961
3096
 
2962
3097
  // src/style-commands/undoable-actions/paste-element-style.ts
2963
- var undoablePasteElementStyle = () => (0, import_editor_v1_adapters10.undoable)(
3098
+ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters11.undoable)(
2964
3099
  {
2965
3100
  do: ({ containers, newStyle }) => {
2966
3101
  return containers.map((container) => {
@@ -3036,12 +3171,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters10.undoable)(
3036
3171
  // src/style-commands/paste-style.ts
3037
3172
  function initPasteStyleCommand() {
3038
3173
  const pasteElementStyleCommand = undoablePasteElementStyle();
3039
- (0, import_editor_v1_adapters11.blockCommand)({
3174
+ (0, import_editor_v1_adapters12.blockCommand)({
3040
3175
  command: "document/elements/paste-style",
3041
3176
  condition: hasAtomicWidgets
3042
3177
  });
3043
- (0, import_editor_v1_adapters11.__privateListenTo)(
3044
- (0, import_editor_v1_adapters11.commandStartEvent)("document/elements/paste-style"),
3178
+ (0, import_editor_v1_adapters12.__privateListenTo)(
3179
+ (0, import_editor_v1_adapters12.commandStartEvent)("document/elements/paste-style"),
3045
3180
  (e) => pasteStyles(e.args, pasteElementStyleCommand)
3046
3181
  );
3047
3182
  }
@@ -3065,14 +3200,14 @@ function pasteStyles(args, pasteCallback) {
3065
3200
  }
3066
3201
 
3067
3202
  // src/style-commands/reset-style.ts
3068
- var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
3203
+ var import_editor_v1_adapters14 = require("@elementor/editor-v1-adapters");
3069
3204
 
3070
3205
  // src/style-commands/undoable-actions/reset-element-style.ts
3071
3206
  var import_editor_elements13 = require("@elementor/editor-elements");
3072
3207
  var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
3073
- var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
3208
+ var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
3074
3209
  var import_i18n4 = require("@wordpress/i18n");
3075
- var undoableResetElementStyle = () => (0, import_editor_v1_adapters12.undoable)(
3210
+ var undoableResetElementStyle = () => (0, import_editor_v1_adapters13.undoable)(
3076
3211
  {
3077
3212
  do: ({ containers }) => {
3078
3213
  return containers.map((container) => {
@@ -3116,12 +3251,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters12.undoable)(
3116
3251
  // src/style-commands/reset-style.ts
3117
3252
  function initResetStyleCommand() {
3118
3253
  const resetElementStyles = undoableResetElementStyle();
3119
- (0, import_editor_v1_adapters13.blockCommand)({
3254
+ (0, import_editor_v1_adapters14.blockCommand)({
3120
3255
  command: "document/elements/reset-style",
3121
3256
  condition: hasAtomicWidgets
3122
3257
  });
3123
- (0, import_editor_v1_adapters13.__privateListenTo)(
3124
- (0, import_editor_v1_adapters13.commandStartEvent)("document/elements/reset-style"),
3258
+ (0, import_editor_v1_adapters14.__privateListenTo)(
3259
+ (0, import_editor_v1_adapters14.commandStartEvent)("document/elements/reset-style"),
3125
3260
  (e) => resetStyles(e.args, resetElementStyles)
3126
3261
  );
3127
3262
  }