@elementor/editor-components 4.0.0-672 → 4.0.0-673

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -10,7 +10,7 @@ import { injectTab } from "@elementor/editor-elements-panel";
10
10
  import { stylesRepository } from "@elementor/editor-styles-repository";
11
11
  import { registerDataHook as registerDataHook2 } from "@elementor/editor-v1-adapters";
12
12
  import { __registerSlice as registerSlice } from "@elementor/store";
13
- import { __ as __13 } from "@wordpress/i18n";
13
+ import { __ as __14 } from "@wordpress/i18n";
14
14
 
15
15
  // src/component-instance-transformer.ts
16
16
  import { createTransformer } from "@elementor/editor-canvas";
@@ -374,8 +374,10 @@ var componentOverrideTransformer = createTransformer3((override) => {
374
374
  });
375
375
 
376
376
  // src/components/components-tab/components.tsx
377
- import * as React7 from "react";
377
+ import * as React8 from "react";
378
378
  import { ThemeProvider } from "@elementor/editor-ui";
379
+ import { Stack as Stack4 } from "@elementor/ui";
380
+ import { hasProInstalled as hasProInstalled2 } from "@elementor/utils";
379
381
 
380
382
  // src/hooks/use-components.ts
381
383
  import { __useSelector as useSelector2 } from "@elementor/store";
@@ -435,8 +437,9 @@ var ComponentSearch = () => {
435
437
 
436
438
  // src/components/components-tab/components-list.tsx
437
439
  import * as React5 from "react";
438
- import { ComponentsIcon as ComponentsIcon2 } from "@elementor/icons";
439
- import { Box as Box4, Divider, Link, List, Stack as Stack3, Typography as Typography2 } from "@elementor/ui";
440
+ import { ComponentsIcon as ComponentsIcon2, CrownFilledIcon } from "@elementor/icons";
441
+ import { Box as Box4, Button, Divider, Link, List, Stack as Stack3, Typography as Typography2 } from "@elementor/ui";
442
+ import { hasProInstalled } from "@elementor/utils";
440
443
  import { __ as __2 } from "@wordpress/i18n";
441
444
 
442
445
  // src/hooks/use-components-permissions.ts
@@ -527,45 +530,60 @@ function ComponentName({ name, editable }) {
527
530
 
528
531
  // src/components/components-tab/loading-components.tsx
529
532
  import * as React4 from "react";
530
- import { Box as Box3, ListItemButton as ListItemButton2, Skeleton, Stack as Stack2 } from "@elementor/ui";
531
- var ROWS = Array.from({ length: 6 }, (_, index) => index);
533
+ import { Box as Box3, Skeleton, Stack as Stack2 } from "@elementor/ui";
534
+ var ROWS = Array.from({ length: 3 }, (_, index) => index);
535
+ var STAGGER_DELAY_MS = 80;
532
536
  var LoadingComponents = () => {
533
537
  return /* @__PURE__ */ React4.createElement(
534
538
  Stack2,
535
539
  {
536
540
  "aria-label": "Loading components",
537
- gap: 1,
541
+ gap: 1.5,
538
542
  sx: {
539
543
  pointerEvents: "none",
540
544
  position: "relative",
541
545
  maxHeight: "300px",
542
546
  overflow: "hidden",
547
+ px: 1,
543
548
  "&:after": {
544
549
  position: "absolute",
545
- top: 0,
550
+ bottom: 0,
546
551
  content: '""',
547
552
  left: 0,
548
553
  width: "100%",
549
- height: "300px",
550
- background: "linear-gradient(to top, white, transparent)",
551
- pointerEvents: "none"
554
+ height: "40%",
555
+ pointerEvents: "none",
556
+ zIndex: 1
552
557
  }
553
558
  }
554
559
  },
555
560
  ROWS.map((row) => /* @__PURE__ */ React4.createElement(
556
- ListItemButton2,
561
+ Box3,
557
562
  {
558
563
  key: row,
559
- sx: { border: "solid 1px", borderColor: "divider", py: 0.5, px: 1 },
560
- shape: "rounded"
564
+ display: "flex",
565
+ alignItems: "center",
566
+ gap: 1.5,
567
+ sx: {
568
+ py: 0.75,
569
+ px: 1.5,
570
+ opacity: 0,
571
+ animation: `e-loading-fade-in 0.4s ease-out ${row * STAGGER_DELAY_MS}ms forwards`,
572
+ "@keyframes e-loading-fade-in": {
573
+ from: { opacity: 0, transform: "translateY(4px)" },
574
+ to: { opacity: 1, transform: "translateY(0)" }
575
+ }
576
+ }
561
577
  },
562
- /* @__PURE__ */ React4.createElement(Box3, { display: "flex", gap: 1, width: "100%" }, /* @__PURE__ */ React4.createElement(Skeleton, { variant: "text", width: "24px", height: "36px" }), /* @__PURE__ */ React4.createElement(Skeleton, { variant: "text", width: "100%", height: "36px" }))
578
+ /* @__PURE__ */ React4.createElement(Skeleton, { animation: "wave", variant: "rounded", width: 24, height: 24 }),
579
+ /* @__PURE__ */ React4.createElement(Skeleton, { animation: "wave", variant: "rounded", width: "60%", height: 14 })
563
580
  ))
564
581
  );
565
582
  };
566
583
 
567
584
  // src/components/components-tab/components-list.tsx
568
585
  var LEARN_MORE_URL = "http://go.elementor.com/components-guide-article";
586
+ var UPGRADE_URL = "https://go.elementor.com/go-pro-components/";
569
587
  var SUBTITLE_OVERRIDE_SX = {
570
588
  fontSize: "0.875rem !important",
571
589
  fontWeight: "500 !important"
@@ -577,10 +595,40 @@ function ComponentsList() {
577
595
  }
578
596
  const isEmpty = !components?.length;
579
597
  if (isEmpty) {
580
- return searchValue.length ? /* @__PURE__ */ React5.createElement(EmptySearchResult, null) : /* @__PURE__ */ React5.createElement(EmptyState, null);
598
+ if (searchValue.length) {
599
+ return /* @__PURE__ */ React5.createElement(EmptySearchResult, null);
600
+ }
601
+ return hasProInstalled() ? /* @__PURE__ */ React5.createElement(EmptyState, null) : /* @__PURE__ */ React5.createElement(ProUpgradeEmptyState, null);
581
602
  }
582
603
  return /* @__PURE__ */ React5.createElement(List, { sx: { display: "flex", flexDirection: "column", gap: 1, px: 2 } }, components.map((component) => /* @__PURE__ */ React5.createElement(ComponentItem, { key: component.uid, component })));
583
604
  }
605
+ var ProUpgradeEmptyState = () => {
606
+ return /* @__PURE__ */ React5.createElement(
607
+ Stack3,
608
+ {
609
+ alignItems: "center",
610
+ justifyContent: "start",
611
+ height: "100%",
612
+ sx: { px: 2, py: 4 },
613
+ gap: 2,
614
+ overflow: "hidden"
615
+ },
616
+ /* @__PURE__ */ React5.createElement(Stack3, { alignItems: "center", gap: 1 }, /* @__PURE__ */ React5.createElement(ComponentsIcon2, { fontSize: "large", sx: { color: "text.secondary" } }), /* @__PURE__ */ React5.createElement(Typography2, { align: "center", variant: "subtitle2", color: "text.secondary", sx: SUBTITLE_OVERRIDE_SX }, __2("Create Reusable Components", "elementor")), /* @__PURE__ */ React5.createElement(Typography2, { align: "center", variant: "caption", color: "secondary", sx: { maxWidth: 200 } }, __2("Create design elements that sync across your entire site.", "elementor"))),
617
+ /* @__PURE__ */ React5.createElement(
618
+ Button,
619
+ {
620
+ variant: "contained",
621
+ color: "promotion",
622
+ size: "small",
623
+ startIcon: /* @__PURE__ */ React5.createElement(CrownFilledIcon, null),
624
+ href: UPGRADE_URL,
625
+ target: "_blank",
626
+ rel: "noopener noreferrer"
627
+ },
628
+ __2("Upgrade now", "elementor")
629
+ )
630
+ );
631
+ };
584
632
  var EmptyState = () => {
585
633
  const { canCreate } = useComponentsPermissions();
586
634
  return /* @__PURE__ */ React5.createElement(
@@ -687,46 +735,85 @@ var useFilteredComponents = () => {
687
735
  };
688
736
 
689
737
  // src/components/components-tab/components-pro-notification.tsx
738
+ import * as React7 from "react";
739
+ import { __ as __4 } from "@wordpress/i18n";
740
+
741
+ // src/components/components-upgrade-alert.tsx
690
742
  import * as React6 from "react";
691
- import { InfoAlert } from "@elementor/editor-ui";
692
- import { Box as Box5, Typography as Typography3 } from "@elementor/ui";
743
+ import { CrownFilledIcon as CrownFilledIcon2 } from "@elementor/icons";
744
+ import { Alert, AlertAction, AlertTitle, Box as Box5, Typography as Typography3 } from "@elementor/ui";
693
745
  import { __ as __3 } from "@wordpress/i18n";
746
+ function ComponentsUpgradeAlert({ title, description, upgradeUrl }) {
747
+ return /* @__PURE__ */ React6.createElement(Box5, { sx: { mt: "auto" } }, /* @__PURE__ */ React6.createElement(
748
+ Alert,
749
+ {
750
+ variant: "standard",
751
+ color: "promotion",
752
+ icon: /* @__PURE__ */ React6.createElement(CrownFilledIcon2, { fontSize: "tiny" }),
753
+ role: "status",
754
+ size: "small",
755
+ action: /* @__PURE__ */ React6.createElement(
756
+ AlertAction,
757
+ {
758
+ variant: "contained",
759
+ color: "promotion",
760
+ href: upgradeUrl,
761
+ target: "_blank",
762
+ rel: "noopener noreferrer"
763
+ },
764
+ __3("Upgrade now", "elementor")
765
+ ),
766
+ sx: { m: 2, mt: 1 }
767
+ },
768
+ /* @__PURE__ */ React6.createElement(AlertTitle, null, title),
769
+ /* @__PURE__ */ React6.createElement(Typography3, { variant: "caption" }, description)
770
+ ));
771
+ }
772
+
773
+ // src/components/components-tab/components-pro-notification.tsx
774
+ var UPGRADE_URL2 = "https://go.elementor.com/go-pro-components-create/";
694
775
  function ComponentsProNotification() {
695
- return /* @__PURE__ */ React6.createElement(Box5, { sx: { px: 2 } }, /* @__PURE__ */ React6.createElement(InfoAlert, null, /* @__PURE__ */ React6.createElement(Typography3, { variant: "caption", component: "span" }, /* @__PURE__ */ React6.createElement(Typography3, { variant: "caption", component: "span", fontWeight: "bold" }, __3("Try Components for free:", "elementor")), " ", __3(
696
- "Soon Components will be part of the Pro subscription, but what you create now will remain on your site.",
697
- "elementor"
698
- ))));
776
+ return /* @__PURE__ */ React7.createElement(
777
+ ComponentsUpgradeAlert,
778
+ {
779
+ title: __4("Create new components", "elementor"),
780
+ description: __4("Creating new components requires an active Pro subscription.", "elementor"),
781
+ upgradeUrl: UPGRADE_URL2
782
+ }
783
+ );
699
784
  }
700
785
 
701
786
  // src/components/components-tab/components.tsx
702
787
  var ComponentsContent = () => {
703
788
  const { components, isLoading } = useComponents();
704
789
  const hasComponents = !isLoading && components.length > 0;
705
- return /* @__PURE__ */ React7.createElement(React7.Fragment, null, hasComponents && /* @__PURE__ */ React7.createElement(ComponentSearch, null), hasComponents && /* @__PURE__ */ React7.createElement(ComponentsProNotification, null), /* @__PURE__ */ React7.createElement(ComponentsList, null));
790
+ const hasPro = hasProInstalled2();
791
+ const showProNotification = !hasPro && hasComponents;
792
+ return /* @__PURE__ */ React8.createElement(Stack4, { sx: { height: "100%" } }, hasComponents && /* @__PURE__ */ React8.createElement(ComponentSearch, null), /* @__PURE__ */ React8.createElement(ComponentsList, null), showProNotification && /* @__PURE__ */ React8.createElement(ComponentsProNotification, null));
706
793
  };
707
794
  var Components = () => {
708
- return /* @__PURE__ */ React7.createElement(ThemeProvider, null, /* @__PURE__ */ React7.createElement(SearchProvider, { localStorageKey: "elementor-components-search" }, /* @__PURE__ */ React7.createElement(ComponentsContent, null)));
795
+ return /* @__PURE__ */ React8.createElement(ThemeProvider, null, /* @__PURE__ */ React8.createElement(SearchProvider, { localStorageKey: "elementor-components-search" }, /* @__PURE__ */ React8.createElement(ComponentsContent, null)));
709
796
  };
710
797
 
711
798
  // src/components/detach-instance-confirmation-dialog.tsx
712
- import * as React8 from "react";
799
+ import * as React9 from "react";
713
800
  import { closeDialog, ConfirmationDialog, openDialog } from "@elementor/editor-ui";
714
801
  import { AlertTriangleFilledIcon } from "@elementor/icons";
715
- import { __ as __4 } from "@wordpress/i18n";
802
+ import { __ as __5 } from "@wordpress/i18n";
716
803
  function DetachInstanceConfirmationDialog({
717
804
  open,
718
805
  onClose,
719
806
  onConfirm
720
807
  }) {
721
- return /* @__PURE__ */ React8.createElement(ConfirmationDialog, { open, onClose }, /* @__PURE__ */ React8.createElement(ConfirmationDialog.Title, { icon: AlertTriangleFilledIcon, iconColor: "secondary" }, __4("Detach from Component?", "elementor")), /* @__PURE__ */ React8.createElement(ConfirmationDialog.Content, null, /* @__PURE__ */ React8.createElement(ConfirmationDialog.ContentText, null, __4(
808
+ return /* @__PURE__ */ React9.createElement(ConfirmationDialog, { open, onClose }, /* @__PURE__ */ React9.createElement(ConfirmationDialog.Title, { icon: AlertTriangleFilledIcon, iconColor: "secondary" }, __5("Detach from Component?", "elementor")), /* @__PURE__ */ React9.createElement(ConfirmationDialog.Content, null, /* @__PURE__ */ React9.createElement(ConfirmationDialog.ContentText, null, __5(
722
809
  "Detaching this instance will break its link to the Component. Changes to the Component will no longer apply. Continue?",
723
810
  "elementor"
724
- ))), /* @__PURE__ */ React8.createElement(
811
+ ))), /* @__PURE__ */ React9.createElement(
725
812
  ConfirmationDialog.Actions,
726
813
  {
727
814
  onClose,
728
815
  onConfirm,
729
- confirmLabel: __4("Detach", "elementor"),
816
+ confirmLabel: __5("Detach", "elementor"),
730
817
  color: "primary"
731
818
  }
732
819
  ));
@@ -737,58 +824,59 @@ function openDetachConfirmDialog(onConfirm) {
737
824
  onConfirm();
738
825
  };
739
826
  openDialog({
740
- component: /* @__PURE__ */ React8.createElement(DetachInstanceConfirmationDialog, { open: true, onClose: closeDialog, onConfirm: handleConfirm })
827
+ component: /* @__PURE__ */ React9.createElement(DetachInstanceConfirmationDialog, { open: true, onClose: closeDialog, onConfirm: handleConfirm })
741
828
  });
742
829
  }
743
830
 
744
831
  // src/components/in-edit-mode.tsx
745
- import * as React9 from "react";
832
+ import * as React10 from "react";
746
833
  import { closeDialog as closeDialog2, openDialog as openDialog2 } from "@elementor/editor-ui";
747
834
  import { InfoCircleFilledIcon } from "@elementor/icons";
748
- import { Box as Box6, Button, DialogActions, DialogContent, DialogHeader, Icon, Stack as Stack4, Typography as Typography4 } from "@elementor/ui";
749
- import { __ as __5 } from "@wordpress/i18n";
835
+ import { Box as Box6, Button as Button2, DialogActions, DialogContent, DialogHeader, Icon, Stack as Stack5, Typography as Typography4 } from "@elementor/ui";
836
+ import { __ as __6 } from "@wordpress/i18n";
750
837
  var openEditModeDialog = (lockedBy) => {
751
838
  openDialog2({
752
- component: /* @__PURE__ */ React9.createElement(EditModeDialog, { lockedBy })
839
+ component: /* @__PURE__ */ React10.createElement(EditModeDialog, { lockedBy })
753
840
  });
754
841
  };
755
842
  var EditModeDialog = ({ lockedBy }) => {
756
- const content = __5("%s is currently editing this document", "elementor").replace("%s", lockedBy);
757
- return /* @__PURE__ */ React9.createElement(React9.Fragment, null, /* @__PURE__ */ React9.createElement(DialogHeader, { logo: false }, /* @__PURE__ */ React9.createElement(Box6, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ React9.createElement(Icon, { color: "secondary" }, /* @__PURE__ */ React9.createElement(InfoCircleFilledIcon, { fontSize: "medium" })), /* @__PURE__ */ React9.createElement(Typography4, { variant: "subtitle1" }, content))), /* @__PURE__ */ React9.createElement(DialogContent, null, /* @__PURE__ */ React9.createElement(Stack4, { spacing: 2, direction: "column" }, /* @__PURE__ */ React9.createElement(Typography4, { variant: "body2" }, __5(
843
+ const content = __6("%s is currently editing this document", "elementor").replace("%s", lockedBy);
844
+ return /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(DialogHeader, { logo: false }, /* @__PURE__ */ React10.createElement(Box6, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ React10.createElement(Icon, { color: "secondary" }, /* @__PURE__ */ React10.createElement(InfoCircleFilledIcon, { fontSize: "medium" })), /* @__PURE__ */ React10.createElement(Typography4, { variant: "subtitle1" }, content))), /* @__PURE__ */ React10.createElement(DialogContent, null, /* @__PURE__ */ React10.createElement(Stack5, { spacing: 2, direction: "column" }, /* @__PURE__ */ React10.createElement(Typography4, { variant: "body2" }, __6(
758
845
  "You can wait for them to finish or reach out to coordinate your changes together.",
759
846
  "elementor"
760
- )), /* @__PURE__ */ React9.createElement(DialogActions, null, /* @__PURE__ */ React9.createElement(Button, { color: "secondary", variant: "contained", onClick: closeDialog2 }, __5("Close", "elementor"))))));
847
+ )), /* @__PURE__ */ React10.createElement(DialogActions, null, /* @__PURE__ */ React10.createElement(Button2, { color: "secondary", variant: "contained", onClick: closeDialog2 }, __6("Close", "elementor"))))));
761
848
  };
762
849
 
763
850
  // src/components/instance-editing-panel/instance-editing-panel.tsx
764
- import * as React19 from "react";
851
+ import * as React20 from "react";
765
852
  import { PencilIcon as PencilIcon2 } from "@elementor/icons";
766
- import { Box as Box8, Stack as Stack11 } from "@elementor/ui";
767
- import { __ as __9 } from "@wordpress/i18n";
853
+ import { Box as Box8, Stack as Stack12 } from "@elementor/ui";
854
+ import { hasProInstalled as hasProInstalled3 } from "@elementor/utils";
855
+ import { __ as __10 } from "@wordpress/i18n";
768
856
 
769
857
  // src/provider/component-instance-context.tsx
770
- import * as React10 from "react";
858
+ import * as React11 from "react";
771
859
  import { createContext as createContext2, useContext as useContext2 } from "react";
772
860
  var ComponentInstanceContext = createContext2(null);
773
861
  function ComponentInstanceProvider({ children, ...props }) {
774
- return /* @__PURE__ */ React10.createElement(ComponentInstanceContext.Provider, { value: props }, children);
862
+ return /* @__PURE__ */ React11.createElement(ComponentInstanceContext.Provider, { value: props }, children);
775
863
  }
776
864
  var useComponentId = () => useContext2(ComponentInstanceContext)?.componentId;
777
865
  var useComponentInstanceOverrides = () => useContext2(ComponentInstanceContext)?.overrides;
778
866
  var useComponentOverridableProps = () => useContext2(ComponentInstanceContext)?.overridableProps;
779
867
 
780
868
  // src/components/instance-editing-panel/detach-action.tsx
781
- import * as React12 from "react";
869
+ import * as React13 from "react";
782
870
  import { useState } from "react";
783
871
  import { notify } from "@elementor/editor-notifications";
784
872
  import { DetachIcon } from "@elementor/icons";
785
- import { __ as __7 } from "@wordpress/i18n";
873
+ import { __ as __8 } from "@wordpress/i18n";
786
874
 
787
875
  // src/utils/detach-component-instance/detach-component-instance.ts
788
876
  import { getContainer, replaceElement } from "@elementor/editor-elements";
789
877
  import { undoable } from "@elementor/editor-v1-adapters";
790
878
  import { __dispatch as dispatch, __getState as getState3 } from "@elementor/store";
791
- import { __ as __6 } from "@wordpress/i18n";
879
+ import { __ as __7 } from "@wordpress/i18n";
792
880
 
793
881
  // src/prop-types/component-instance-overrides-prop-type.ts
794
882
  import { createPropUtils as createPropUtils3 } from "@elementor/editor-props";
@@ -1137,8 +1225,8 @@ async function detachComponentInstance({
1137
1225
  }
1138
1226
  },
1139
1227
  {
1140
- title: __6("Detach from Component", "elementor"),
1141
- subtitle: __6("Instance detached", "elementor")
1228
+ title: __7("Detach from Component", "elementor"),
1229
+ subtitle: __7("Instance detached", "elementor")
1142
1230
  }
1143
1231
  );
1144
1232
  return undoableDetach();
@@ -1153,16 +1241,16 @@ function extractInstanceOverrides(instanceContainer) {
1153
1241
  }
1154
1242
 
1155
1243
  // src/components/instance-editing-panel/instance-panel-header.tsx
1156
- import * as React11 from "react";
1244
+ import * as React12 from "react";
1157
1245
  import { PanelHeader, PanelHeaderTitle } from "@elementor/editor-panels";
1158
1246
  import { EllipsisWithTooltip as EllipsisWithTooltip2 } from "@elementor/editor-ui";
1159
1247
  import { ComponentsIcon as ComponentsIcon3 } from "@elementor/icons";
1160
- import { IconButton, Stack as Stack5, Tooltip } from "@elementor/ui";
1248
+ import { IconButton, Stack as Stack6, Tooltip } from "@elementor/ui";
1161
1249
  function InstancePanelHeader({ componentName, actions }) {
1162
- return /* @__PURE__ */ React11.createElement(PanelHeader, { sx: { justifyContent: "start", px: 2 } }, /* @__PURE__ */ React11.createElement(Stack5, { direction: "row", alignItems: "center", flexGrow: 1, gap: 1, maxWidth: "100%" }, /* @__PURE__ */ React11.createElement(ComponentsIcon3, { fontSize: "small", sx: { color: "text.tertiary" } }), /* @__PURE__ */ React11.createElement(EllipsisWithTooltip2, { title: componentName, as: PanelHeaderTitle, sx: { flexGrow: 1 } }), actions));
1250
+ return /* @__PURE__ */ React12.createElement(PanelHeader, { sx: { justifyContent: "start", px: 2 } }, /* @__PURE__ */ React12.createElement(Stack6, { direction: "row", alignItems: "center", flexGrow: 1, gap: 1, maxWidth: "100%" }, /* @__PURE__ */ React12.createElement(ComponentsIcon3, { fontSize: "small", sx: { color: "text.tertiary" } }), /* @__PURE__ */ React12.createElement(EllipsisWithTooltip2, { title: componentName, as: PanelHeaderTitle, sx: { flexGrow: 1 } }), actions));
1163
1251
  }
1164
1252
  function EditComponentAction({ label, onClick, disabled = false, icon: Icon2 }) {
1165
- return /* @__PURE__ */ React11.createElement(Tooltip, { title: label }, /* @__PURE__ */ React11.createElement(IconButton, { size: "tiny", onClick, "aria-label": label, disabled }, /* @__PURE__ */ React11.createElement(Icon2, { fontSize: "tiny" })));
1253
+ return /* @__PURE__ */ React12.createElement(Tooltip, { title: label }, /* @__PURE__ */ React12.createElement(IconButton, { size: "tiny", onClick, "aria-label": label, disabled }, /* @__PURE__ */ React12.createElement(Icon2, { fontSize: "tiny" })));
1166
1254
  }
1167
1255
 
1168
1256
  // src/components/instance-editing-panel/detach-action.tsx
@@ -1182,7 +1270,7 @@ var DetachAction = ({
1182
1270
  } catch {
1183
1271
  notify({
1184
1272
  type: "error",
1185
- message: __7("Failed to detach component instance.", "elementor"),
1273
+ message: __8("Failed to detach component instance.", "elementor"),
1186
1274
  id: "detach-component-instance-failed"
1187
1275
  });
1188
1276
  }
@@ -1193,8 +1281,8 @@ var DetachAction = ({
1193
1281
  const handleDetachClick = () => {
1194
1282
  setIsDetachDialogOpen(true);
1195
1283
  };
1196
- const detachLabel = __7("Detach from Component", "elementor");
1197
- return /* @__PURE__ */ React12.createElement(React12.Fragment, null, /* @__PURE__ */ React12.createElement(EditComponentAction, { label: detachLabel, icon: DetachIcon, onClick: handleDetachClick }), /* @__PURE__ */ React12.createElement(
1284
+ const detachLabel = __8("Detach from Component", "elementor");
1285
+ return /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement(EditComponentAction, { label: detachLabel, icon: DetachIcon, onClick: handleDetachClick }), /* @__PURE__ */ React13.createElement(
1198
1286
  DetachInstanceConfirmationDialog,
1199
1287
  {
1200
1288
  open: isDetachDialogOpen,
@@ -1219,21 +1307,21 @@ function getDetachTrackingInfo() {
1219
1307
  }
1220
1308
 
1221
1309
  // src/components/instance-editing-panel/empty-state.tsx
1222
- import * as React13 from "react";
1310
+ import * as React14 from "react";
1223
1311
  import { ComponentPropListIcon, PencilIcon } from "@elementor/icons";
1224
- import { Button as Button2, Stack as Stack6, Typography as Typography5 } from "@elementor/ui";
1225
- import { __ as __8 } from "@wordpress/i18n";
1312
+ import { Button as Button3, Stack as Stack7, Typography as Typography5 } from "@elementor/ui";
1313
+ import { __ as __9 } from "@wordpress/i18n";
1226
1314
  var EmptyState2 = ({ onEditComponent }) => {
1227
1315
  const { canEdit } = useComponentsPermissions();
1228
- const message = canEdit ? __8(
1316
+ const message = canEdit ? __9(
1229
1317
  "Edit the component to add properties, manage them or update the design across all instances.",
1230
1318
  "elementor"
1231
- ) : __8(
1319
+ ) : __9(
1232
1320
  "With your current role, you cannot edit this component. Contact an administrator to add properties.",
1233
1321
  "elementor"
1234
1322
  );
1235
- return /* @__PURE__ */ React13.createElement(
1236
- Stack6,
1323
+ return /* @__PURE__ */ React14.createElement(
1324
+ Stack7,
1237
1325
  {
1238
1326
  alignItems: "center",
1239
1327
  justifyContent: "start",
@@ -1242,29 +1330,29 @@ var EmptyState2 = ({ onEditComponent }) => {
1242
1330
  sx: { p: 2.5, pt: 8, pb: 5.5, mt: 1 },
1243
1331
  gap: 1.5
1244
1332
  },
1245
- /* @__PURE__ */ React13.createElement(ComponentPropListIcon, { fontSize: "large" }),
1246
- /* @__PURE__ */ React13.createElement(Typography5, { align: "center", variant: "subtitle2" }, __8("No properties yet", "elementor")),
1247
- /* @__PURE__ */ React13.createElement(Typography5, { align: "center", variant: "caption", maxWidth: "170px" }, message),
1248
- canEdit && !!onEditComponent && /* @__PURE__ */ React13.createElement(Button2, { variant: "outlined", color: "secondary", size: "small", sx: { mt: 1 }, onClick: onEditComponent }, /* @__PURE__ */ React13.createElement(PencilIcon, { fontSize: "small" }), __8("Edit component", "elementor"))
1333
+ /* @__PURE__ */ React14.createElement(ComponentPropListIcon, { fontSize: "large" }),
1334
+ /* @__PURE__ */ React14.createElement(Typography5, { align: "center", variant: "subtitle2" }, __9("No properties yet", "elementor")),
1335
+ /* @__PURE__ */ React14.createElement(Typography5, { align: "center", variant: "caption", maxWidth: "170px" }, message),
1336
+ canEdit && !!onEditComponent && /* @__PURE__ */ React14.createElement(Button3, { variant: "outlined", color: "secondary", size: "small", sx: { mt: 1 }, onClick: onEditComponent }, /* @__PURE__ */ React14.createElement(PencilIcon, { fontSize: "small" }), __9("Edit component", "elementor"))
1249
1337
  );
1250
1338
  };
1251
1339
 
1252
1340
  // src/components/instance-editing-panel/instance-panel-body.tsx
1253
- import * as React18 from "react";
1341
+ import * as React19 from "react";
1254
1342
  import { ControlAdornmentsProvider } from "@elementor/editor-controls";
1255
1343
  import { getFieldIndicators } from "@elementor/editor-editing-panel";
1256
1344
  import { PanelBody } from "@elementor/editor-panels";
1257
- import { Divider as Divider2, Stack as Stack10 } from "@elementor/ui";
1345
+ import { Divider as Divider2, Stack as Stack11 } from "@elementor/ui";
1258
1346
 
1259
1347
  // src/components/instance-editing-panel/override-props-group.tsx
1260
- import * as React17 from "react";
1348
+ import * as React18 from "react";
1261
1349
  import { useId } from "react";
1262
1350
  import { useStateByElement } from "@elementor/editor-editing-panel";
1263
1351
  import { CollapseIcon } from "@elementor/editor-ui";
1264
- import { Box as Box7, Collapse, ListItemButton as ListItemButton3, ListItemText, Stack as Stack9 } from "@elementor/ui";
1352
+ import { Box as Box7, Collapse, ListItemButton as ListItemButton2, ListItemText, Stack as Stack10 } from "@elementor/ui";
1265
1353
 
1266
1354
  // src/components/instance-editing-panel/override-prop-control.tsx
1267
- import * as React16 from "react";
1355
+ import * as React17 from "react";
1268
1356
  import {
1269
1357
  ControlReplacementsProvider,
1270
1358
  getControlReplacements,
@@ -1282,7 +1370,7 @@ import {
1282
1370
  useElement
1283
1371
  } from "@elementor/editor-editing-panel";
1284
1372
  import { getElementSettings, getElementType as getElementType2 } from "@elementor/editor-elements";
1285
- import { Stack as Stack8 } from "@elementor/ui";
1373
+ import { Stack as Stack9 } from "@elementor/ui";
1286
1374
 
1287
1375
  // src/hooks/use-controls-by-widget-type.ts
1288
1376
  import { getElementType } from "@elementor/editor-elements";
@@ -1316,11 +1404,11 @@ function getControlsByBind(controls) {
1316
1404
  }
1317
1405
 
1318
1406
  // src/provider/overridable-prop-context.tsx
1319
- import * as React14 from "react";
1407
+ import * as React15 from "react";
1320
1408
  import { createContext as createContext3, useContext as useContext3 } from "react";
1321
1409
  var OverridablePropContext = createContext3(null);
1322
1410
  function OverridablePropProvider({ children, ...props }) {
1323
- return /* @__PURE__ */ React14.createElement(OverridablePropContext.Provider, { value: props }, children);
1411
+ return /* @__PURE__ */ React15.createElement(OverridablePropContext.Provider, { value: props }, children);
1324
1412
  }
1325
1413
  var useOverridablePropValue = () => useContext3(OverridablePropContext)?.value;
1326
1414
  var useComponentInstanceElement = () => useContext3(OverridablePropContext)?.componentInstanceElement;
@@ -1549,11 +1637,11 @@ function extractInnerOverrideInfo(override) {
1549
1637
  }
1550
1638
 
1551
1639
  // src/components/control-label.tsx
1552
- import * as React15 from "react";
1640
+ import * as React16 from "react";
1553
1641
  import { ControlAdornments, ControlFormLabel } from "@elementor/editor-controls";
1554
- import { Stack as Stack7 } from "@elementor/ui";
1642
+ import { Stack as Stack8 } from "@elementor/ui";
1555
1643
  var ControlLabel = ({ children, ...props }) => {
1556
- return /* @__PURE__ */ React15.createElement(Stack7, { direction: "row", alignItems: "center", justifyItems: "start", gap: 0.25 }, /* @__PURE__ */ React15.createElement(ControlFormLabel, { ...props }, children), /* @__PURE__ */ React15.createElement(ControlAdornments, null));
1644
+ return /* @__PURE__ */ React16.createElement(Stack8, { direction: "row", alignItems: "center", justifyItems: "start", gap: 0.25 }, /* @__PURE__ */ React16.createElement(ControlFormLabel, { ...props }, children), /* @__PURE__ */ React16.createElement(ControlAdornments, null));
1557
1645
  };
1558
1646
 
1559
1647
  // src/components/errors.ts
@@ -1662,7 +1750,7 @@ function OverridePropControl({ overrideKey }) {
1662
1750
  if (!overridableProp) {
1663
1751
  return null;
1664
1752
  }
1665
- return /* @__PURE__ */ React16.createElement(SettingsField, { bind: "component_instance", propDisplayName: overridableProp.label }, /* @__PURE__ */ React16.createElement(OverrideControl, { overridableProp }));
1753
+ return /* @__PURE__ */ React17.createElement(SettingsField, { bind: "component_instance", propDisplayName: overridableProp.label }, /* @__PURE__ */ React17.createElement(OverrideControl, { overridableProp }));
1666
1754
  }
1667
1755
  function OverrideControl({ overridableProp }) {
1668
1756
  const componentInstanceElement = useElement();
@@ -1756,13 +1844,13 @@ function OverrideControl({ overridableProp }) {
1756
1844
  [overridableProp.overrideKey]: propType
1757
1845
  }
1758
1846
  });
1759
- return /* @__PURE__ */ React16.createElement(
1847
+ return /* @__PURE__ */ React17.createElement(
1760
1848
  OverridablePropProvider,
1761
1849
  {
1762
1850
  value: componentOverridablePropTypeUtil.extract(matchingOverride) ?? void 0,
1763
1851
  componentInstanceElement
1764
1852
  },
1765
- /* @__PURE__ */ React16.createElement(ElementProvider, { element: { id: elementId, type }, elementType, settings }, /* @__PURE__ */ React16.createElement(SettingsField, { bind: propKey, propDisplayName: overridableProp.label }, /* @__PURE__ */ React16.createElement(
1853
+ /* @__PURE__ */ React17.createElement(ElementProvider, { element: { id: elementId, type }, elementType, settings }, /* @__PURE__ */ React17.createElement(SettingsField, { bind: propKey, propDisplayName: overridableProp.label }, /* @__PURE__ */ React17.createElement(
1766
1854
  PropProvider,
1767
1855
  {
1768
1856
  propType: propTypeSchema,
@@ -1772,7 +1860,7 @@ function OverrideControl({ overridableProp }) {
1772
1860
  return false;
1773
1861
  }
1774
1862
  },
1775
- /* @__PURE__ */ React16.createElement(PropKeyProvider, { bind: overridableProp.overrideKey }, /* @__PURE__ */ React16.createElement(ControlReplacementsProvider, { replacements: controlReplacements }, /* @__PURE__ */ React16.createElement(Stack8, { direction: "column", gap: 1, mb: 1.5 }, layout !== "custom" && /* @__PURE__ */ React16.createElement(ControlLabel, null, overridableProp.label), /* @__PURE__ */ React16.createElement(OriginalControl, { control, controlProps }))))
1863
+ /* @__PURE__ */ React17.createElement(PropKeyProvider, { bind: overridableProp.overrideKey }, /* @__PURE__ */ React17.createElement(ControlReplacementsProvider, { replacements: controlReplacements }, /* @__PURE__ */ React17.createElement(Stack9, { direction: "column", gap: 1, mb: 1.5 }, layout !== "custom" && /* @__PURE__ */ React17.createElement(ControlLabel, null, overridableProp.label), /* @__PURE__ */ React17.createElement(OriginalControl, { control, controlProps }))))
1776
1864
  )))
1777
1865
  );
1778
1866
  }
@@ -1831,7 +1919,7 @@ function getControlParams(controls, originPropFields, label) {
1831
1919
  }
1832
1920
  function OriginalControl({ control, controlProps }) {
1833
1921
  const { value } = control;
1834
- return /* @__PURE__ */ React16.createElement(BaseControl, { type: value.type, props: controlProps });
1922
+ return /* @__PURE__ */ React17.createElement(BaseControl, { type: value.type, props: controlProps });
1835
1923
  }
1836
1924
  function getControlLayout(control) {
1837
1925
  return control.value.meta?.layout || controlsRegistry.getLayout(control.value.type);
@@ -1866,8 +1954,8 @@ function OverridePropsGroup({ group }) {
1866
1954
  const labelId = `label-${id}`;
1867
1955
  const contentId = `content-${id}`;
1868
1956
  const title = group.label;
1869
- return /* @__PURE__ */ React17.createElement(Box7, { "aria-label": `${title} section` }, /* @__PURE__ */ React17.createElement(
1870
- ListItemButton3,
1957
+ return /* @__PURE__ */ React18.createElement(Box7, { "aria-label": `${title} section` }, /* @__PURE__ */ React18.createElement(
1958
+ ListItemButton2,
1871
1959
  {
1872
1960
  id: labelId,
1873
1961
  "aria-controls": contentId,
@@ -1876,7 +1964,7 @@ function OverridePropsGroup({ group }) {
1876
1964
  p: 0,
1877
1965
  sx: { "&:hover": { backgroundColor: "transparent" } }
1878
1966
  },
1879
- /* @__PURE__ */ React17.createElement(Stack9, { direction: "row", alignItems: "center", justifyItems: "start", flexGrow: 1, gap: 0.5 }, /* @__PURE__ */ React17.createElement(
1967
+ /* @__PURE__ */ React18.createElement(Stack10, { direction: "row", alignItems: "center", justifyItems: "start", flexGrow: 1, gap: 0.5 }, /* @__PURE__ */ React18.createElement(
1880
1968
  ListItemText,
1881
1969
  {
1882
1970
  secondary: title,
@@ -1884,13 +1972,13 @@ function OverridePropsGroup({ group }) {
1884
1972
  sx: { flexGrow: 0, flexShrink: 1, marginInlineEnd: 1 }
1885
1973
  }
1886
1974
  )),
1887
- /* @__PURE__ */ React17.createElement(CollapseIcon, { open: isOpen, color: "secondary", fontSize: "tiny" })
1888
- ), /* @__PURE__ */ React17.createElement(Collapse, { id: contentId, "aria-labelledby": labelId, in: isOpen, timeout: "auto" }, /* @__PURE__ */ React17.createElement(Stack9, { direction: "column", gap: 1, p: 2 }, group.props.map((overrideKey) => /* @__PURE__ */ React17.createElement(OverridePropControl, { key: overrideKey, overrideKey })))));
1975
+ /* @__PURE__ */ React18.createElement(CollapseIcon, { open: isOpen, color: "secondary", fontSize: "tiny" })
1976
+ ), /* @__PURE__ */ React18.createElement(Collapse, { id: contentId, "aria-labelledby": labelId, in: isOpen, timeout: "auto" }, /* @__PURE__ */ React18.createElement(Stack10, { direction: "column", gap: 1, p: 2 }, group.props.map((overrideKey) => /* @__PURE__ */ React18.createElement(OverridePropControl, { key: overrideKey, overrideKey })))));
1889
1977
  }
1890
1978
 
1891
1979
  // src/components/instance-editing-panel/instance-panel-body.tsx
1892
1980
  function InstancePanelBody({ groups, isEmpty, emptyState, componentInstanceId }) {
1893
- return /* @__PURE__ */ React18.createElement(PanelBody, null, /* @__PURE__ */ React18.createElement(ControlAdornmentsProvider, { items: getFieldIndicators("settings") }, isEmpty ? emptyState : /* @__PURE__ */ React18.createElement(Stack10, { direction: "column", alignItems: "stretch" }, groups.map((group) => /* @__PURE__ */ React18.createElement(React18.Fragment, { key: group.id + componentInstanceId }, /* @__PURE__ */ React18.createElement(OverridePropsGroup, { group }), /* @__PURE__ */ React18.createElement(Divider2, null))))));
1981
+ return /* @__PURE__ */ React19.createElement(PanelBody, null, /* @__PURE__ */ React19.createElement(ControlAdornmentsProvider, { items: getFieldIndicators("settings") }, isEmpty ? emptyState : /* @__PURE__ */ React19.createElement(Stack11, { direction: "column", alignItems: "stretch" }, groups.map((group) => /* @__PURE__ */ React19.createElement(React19.Fragment, { key: group.id + componentInstanceId }, /* @__PURE__ */ React19.createElement(OverridePropsGroup, { group }), /* @__PURE__ */ React19.createElement(Divider2, null))))));
1894
1982
  }
1895
1983
 
1896
1984
  // src/components/instance-editing-panel/use-instance-panel-data.ts
@@ -1990,32 +2078,41 @@ function useComponentInstanceSettings() {
1990
2078
  }
1991
2079
 
1992
2080
  // src/components/instance-editing-panel/instance-editing-panel.tsx
2081
+ var EDIT_UPGRADE_URL = "https://go.elementor.com/go-pro-components-edit/";
1993
2082
  function InstanceEditingPanel() {
1994
2083
  const { canEdit } = useComponentsPermissions();
1995
2084
  const data = useInstancePanelData();
2085
+ const hasPro = hasProInstalled3();
1996
2086
  if (!data) {
1997
2087
  return null;
1998
2088
  }
1999
2089
  const { componentId, component, overrides, overridableProps, groups, isEmpty, componentInstanceId } = data;
2000
- const panelTitle = __9("Edit %s", "elementor").replace("%s", component.name);
2001
- const actions = /* @__PURE__ */ React19.createElement(Stack11, { direction: "row", gap: 0.5 }, /* @__PURE__ */ React19.createElement(DetachAction, { componentInstanceId, componentId }), canEdit && /* @__PURE__ */ React19.createElement(EditComponentAction, { disabled: true, label: panelTitle, icon: PencilIcon2 }));
2002
- return /* @__PURE__ */ React19.createElement(Box8, { "data-testid": "instance-editing-panel" }, /* @__PURE__ */ React19.createElement(
2090
+ const panelTitle = __10("Edit %s", "elementor").replace("%s", component.name);
2091
+ const actions = /* @__PURE__ */ React20.createElement(Stack12, { direction: "row", gap: 0.5 }, /* @__PURE__ */ React20.createElement(DetachAction, { componentInstanceId, componentId }), canEdit && /* @__PURE__ */ React20.createElement(EditComponentAction, { disabled: true, label: panelTitle, icon: PencilIcon2 }));
2092
+ return /* @__PURE__ */ React20.createElement(Box8, { "data-testid": "instance-editing-panel", sx: { display: "flex", flexDirection: "column", height: "100%" } }, /* @__PURE__ */ React20.createElement(
2003
2093
  ComponentInstanceProvider,
2004
2094
  {
2005
2095
  componentId,
2006
2096
  overrides,
2007
2097
  overridableProps
2008
2098
  },
2009
- /* @__PURE__ */ React19.createElement(InstancePanelHeader, { componentName: component.name, actions }),
2010
- /* @__PURE__ */ React19.createElement(
2099
+ /* @__PURE__ */ React20.createElement(InstancePanelHeader, { componentName: component.name, actions }),
2100
+ /* @__PURE__ */ React20.createElement(
2011
2101
  InstancePanelBody,
2012
2102
  {
2013
2103
  groups,
2014
2104
  isEmpty,
2015
- emptyState: /* @__PURE__ */ React19.createElement(EmptyState2, null),
2105
+ emptyState: /* @__PURE__ */ React20.createElement(EmptyState2, null),
2016
2106
  componentInstanceId
2017
2107
  }
2018
2108
  )
2109
+ ), !hasPro && /* @__PURE__ */ React20.createElement(
2110
+ ComponentsUpgradeAlert,
2111
+ {
2112
+ title: __10("Edit components", "elementor"),
2113
+ description: __10("Editing components requires an active Pro subscription.", "elementor"),
2114
+ upgradeUrl: EDIT_UPGRADE_URL
2115
+ }
2019
2116
  ));
2020
2117
  }
2021
2118
 
@@ -2156,8 +2253,8 @@ import {
2156
2253
  import { getCurrentDocument } from "@elementor/editor-documents";
2157
2254
  import { notify as notify2 } from "@elementor/editor-notifications";
2158
2255
  import { __getState as getState8 } from "@elementor/store";
2159
- import { hasProInstalled } from "@elementor/utils";
2160
- import { __ as __10 } from "@wordpress/i18n";
2256
+ import { hasProInstalled as hasProInstalled4 } from "@elementor/utils";
2257
+ import { __ as __11 } from "@wordpress/i18n";
2161
2258
 
2162
2259
  // src/utils/format-component-elements-id.ts
2163
2260
  import { hashString } from "@elementor/utils";
@@ -2235,7 +2332,7 @@ function notifyComponentEditUpgrade() {
2235
2332
  notify2({
2236
2333
  type: "promotion",
2237
2334
  id: COMPONENT_EDIT_UPGRADE_NOTIFICATION_ID,
2238
- message: __10("Your Pro subscription has expired. Renew to edit components.", "elementor"),
2335
+ message: __11("Editing components requires an active Pro subscription.", "elementor"),
2239
2336
  additionalActionProps: [
2240
2337
  {
2241
2338
  size: "small",
@@ -2243,7 +2340,7 @@ function notifyComponentEditUpgrade() {
2243
2340
  color: "promotion",
2244
2341
  href: EDIT_COMPONENT_UPGRADE_URL,
2245
2342
  target: "_blank",
2246
- children: __10("Upgrade Now", "elementor")
2343
+ children: __11("Upgrade Now", "elementor")
2247
2344
  }
2248
2345
  ]
2249
2346
  });
@@ -2356,14 +2453,13 @@ function createComponentView(options) {
2356
2453
  }
2357
2454
  _getContextMenuConfig() {
2358
2455
  const isAdministrator = isUserAdministrator();
2359
- const hasPro = hasProInstalled();
2360
- const proLabel = __10("PRO", "elementor");
2361
- const badgeClass = "elementor-context-menu-list__item__shortcut__new-badge";
2362
- const proBadge = `<a href="${EDIT_COMPONENT_UPGRADE_URL}" target="_blank" onclick="event.stopPropagation()" class="${badgeClass}">${proLabel}</a>`;
2456
+ const hasPro = hasProInstalled4();
2457
+ const badgeClass = "elementor-context-menu-list__item__shortcut__promotion-badge";
2458
+ const proBadge = `<a href="${EDIT_COMPONENT_UPGRADE_URL}" target="_blank" onclick="event.stopPropagation()" class="${badgeClass}"><i class="eicon-upgrade-crown"></i></a>`;
2363
2459
  const editComponentAction = {
2364
2460
  name: "edit component",
2365
2461
  icon: "eicon-edit",
2366
- title: () => __10("Edit Component", "elementor"),
2462
+ title: () => __11("Edit Component", "elementor"),
2367
2463
  ...!hasPro && { shortcut: proBadge, hasShortcutAction: true },
2368
2464
  isEnabled: () => hasPro,
2369
2465
  callback: (_, eventData) => this.editComponent(eventData)
@@ -2371,7 +2467,7 @@ function createComponentView(options) {
2371
2467
  const detachInstanceAction = {
2372
2468
  name: "detach instance",
2373
2469
  icon: "eicon-chain-broken",
2374
- title: () => __10("Detach from Component", "elementor"),
2470
+ title: () => __11("Detach from Component", "elementor"),
2375
2471
  isEnabled: () => true,
2376
2472
  callback: (_, eventData) => this.detachInstance(eventData)
2377
2473
  };
@@ -2398,7 +2494,7 @@ function createComponentView(options) {
2398
2494
  }
2399
2495
  }
2400
2496
  editComponent({ trigger, location, secondaryLocation }) {
2401
- const hasPro = hasProInstalled();
2497
+ const hasPro = hasProInstalled4();
2402
2498
  if (!hasPro || this.isComponentCurrentlyEdited()) {
2403
2499
  return;
2404
2500
  }
@@ -2430,7 +2526,7 @@ function createComponentView(options) {
2430
2526
  } catch {
2431
2527
  notify2({
2432
2528
  type: "error",
2433
- message: __10("Failed to detach component instance.", "elementor"),
2529
+ message: __11("Failed to detach component instance.", "elementor"),
2434
2530
  id: "detach-component-instance-failed"
2435
2531
  });
2436
2532
  }
@@ -2442,7 +2538,7 @@ function createComponentView(options) {
2442
2538
  if (!isUserAdministrator()) {
2443
2539
  return;
2444
2540
  }
2445
- if (!hasProInstalled()) {
2541
+ if (!hasProInstalled4()) {
2446
2542
  notifyComponentEditUpgrade();
2447
2543
  return;
2448
2544
  }
@@ -2543,11 +2639,11 @@ import { getAllDescendants } from "@elementor/editor-elements";
2543
2639
  import { notify as notify3 } from "@elementor/editor-notifications";
2544
2640
  import { blockCommand } from "@elementor/editor-v1-adapters";
2545
2641
  import { __getState as getState9 } from "@elementor/store";
2546
- import { __ as __11 } from "@wordpress/i18n";
2642
+ import { __ as __12 } from "@wordpress/i18n";
2547
2643
  var COMPONENT_TYPE = "e-component";
2548
2644
  var COMPONENT_CIRCULAR_NESTING_ALERT = {
2549
2645
  type: "default",
2550
- message: __11("Can't add this component - components that contain each other can't be nested.", "elementor"),
2646
+ message: __12("Can't add this component - components that contain each other can't be nested.", "elementor"),
2551
2647
  id: "circular-component-nesting-blocked"
2552
2648
  };
2553
2649
  function initCircularNestingPrevention() {
@@ -2698,7 +2794,7 @@ var componentsStylesProvider = createStylesProvider({
2698
2794
  import { invalidateDocumentData as invalidateDocumentData2, isDocumentDirty as isDocumentDirty2 } from "@elementor/editor-documents";
2699
2795
  import { notify as notify4 } from "@elementor/editor-notifications";
2700
2796
  import { AxiosError } from "@elementor/http-client";
2701
- import { __ as __12 } from "@wordpress/i18n";
2797
+ import { __ as __13 } from "@wordpress/i18n";
2702
2798
  var INSUFFICIENT_PERMISSIONS_ERROR_CODE = "insufficient_permissions";
2703
2799
  var PUBLISH_UPGRADE_URL = "https://go.elementor.com/go-pro-components-edit/";
2704
2800
  var PUBLISH_UPGRADE_NOTIFICATION_ID = "component-publish-upgrade";
@@ -2729,7 +2825,7 @@ function notifyPublishUpgrade() {
2729
2825
  notify4({
2730
2826
  type: "promotion",
2731
2827
  id: PUBLISH_UPGRADE_NOTIFICATION_ID,
2732
- message: __12(
2828
+ message: __13(
2733
2829
  "You have unpublished component on this page. You need a pro version to publish it.",
2734
2830
  "elementor"
2735
2831
  ),
@@ -2740,7 +2836,7 @@ function notifyPublishUpgrade() {
2740
2836
  color: "promotion",
2741
2837
  href: PUBLISH_UPGRADE_URL,
2742
2838
  target: "_blank",
2743
- children: __12("Upgrade Now", "elementor")
2839
+ children: __13("Upgrade Now", "elementor")
2744
2840
  }
2745
2841
  ]
2746
2842
  });
@@ -2782,7 +2878,7 @@ function init() {
2782
2878
  window.elementorCommon.__beforeSave = beforeSave;
2783
2879
  injectTab({
2784
2880
  id: "components",
2785
- label: __13("Components", "elementor"),
2881
+ label: __14("Components", "elementor"),
2786
2882
  component: Components,
2787
2883
  position: 1
2788
2884
  });
@@ -2818,7 +2914,6 @@ export {
2818
2914
  ComponentItem,
2819
2915
  ComponentName,
2820
2916
  ComponentSearch,
2821
- EmptyState as ComponentsEmptyState,
2822
2917
  ComponentsList,
2823
2918
  DetachAction,
2824
2919
  EditComponentAction,