@elementor/editor-components 3.33.0-201 → 3.33.0-202

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
@@ -41,80 +41,11 @@ var import_editor_documents = require("@elementor/editor-documents");
41
41
  var import_editor_elements_panel = require("@elementor/editor-elements-panel");
42
42
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
43
43
  var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
44
- var import_store14 = require("@elementor/store");
44
+ var import_store18 = require("@elementor/store");
45
45
  var import_i18n6 = require("@wordpress/i18n");
46
46
 
47
47
  // src/component-id-transformer.ts
48
48
  var import_editor_canvas = require("@elementor/editor-canvas");
49
- var componentIdTransformer = (0, import_editor_canvas.createTransformer)(async (id) => {
50
- const extendedWindow = window;
51
- const documentManager = extendedWindow.elementor?.documents;
52
- if (!documentManager) {
53
- throw new Error("Elementor documents manager not found");
54
- }
55
- const data = await documentManager.request(id);
56
- return data.elements ?? [];
57
- });
58
-
59
- // src/components/components-tab/components.tsx
60
- var React6 = __toESM(require("react"));
61
- var import_editor_ui = require("@elementor/editor-ui");
62
-
63
- // src/components/components-tab/component-search.tsx
64
- var React2 = __toESM(require("react"));
65
- var import_icons = require("@elementor/icons");
66
- var import_ui = require("@elementor/ui");
67
- var import_i18n = require("@wordpress/i18n");
68
-
69
- // src/components/components-tab/search-provider.tsx
70
- var React = __toESM(require("react"));
71
- var import_react = require("react");
72
- var import_utils = require("@elementor/utils");
73
- var SearchContext = (0, import_react.createContext)(void 0);
74
- var SearchProvider = ({
75
- children,
76
- localStorageKey
77
- }) => {
78
- const { debouncedValue, handleChange, inputValue } = (0, import_utils.useSearchState)({ localStorageKey });
79
- const clearSearch = () => {
80
- handleChange("");
81
- };
82
- return /* @__PURE__ */ React.createElement(SearchContext.Provider, { value: { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }, children);
83
- };
84
- var useSearch = () => {
85
- const context = (0, import_react.useContext)(SearchContext);
86
- if (!context) {
87
- throw new Error("useSearch must be used within a SearchProvider");
88
- }
89
- return context;
90
- };
91
-
92
- // src/components/components-tab/component-search.tsx
93
- var ComponentSearch = () => {
94
- const { inputValue, handleChange } = useSearch();
95
- return /* @__PURE__ */ React2.createElement(import_ui.Stack, { direction: "row", gap: 0.5, sx: { width: "100%", px: 2, py: 1.5 } }, /* @__PURE__ */ React2.createElement(import_ui.Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React2.createElement(
96
- import_ui.TextField,
97
- {
98
- role: "search",
99
- fullWidth: true,
100
- size: "tiny",
101
- value: inputValue,
102
- placeholder: (0, import_i18n.__)("Search", "elementor"),
103
- onChange: (e) => handleChange(e.target.value),
104
- InputProps: {
105
- startAdornment: /* @__PURE__ */ React2.createElement(import_ui.InputAdornment, { position: "start" }, /* @__PURE__ */ React2.createElement(import_icons.SearchIcon, { fontSize: "tiny" }))
106
- }
107
- }
108
- )));
109
- };
110
-
111
- // src/components/components-tab/components-list.tsx
112
- var React5 = __toESM(require("react"));
113
- var import_icons3 = require("@elementor/icons");
114
- var import_ui4 = require("@elementor/ui");
115
- var import_i18n2 = require("@wordpress/i18n");
116
-
117
- // src/hooks/use-components.ts
118
49
  var import_store3 = require("@elementor/store");
119
50
 
120
51
  // src/store/store.ts
@@ -155,6 +86,7 @@ var loadComponents = (0, import_store.__createAsyncThunk)("components/load", asy
155
86
  // src/store/store.ts
156
87
  var initialState = {
157
88
  data: [],
89
+ unpublishedData: [],
158
90
  loadStatus: "idle",
159
91
  createStatus: "idle",
160
92
  styles: {}
@@ -165,11 +97,21 @@ var slice = (0, import_store2.__createSlice)({
165
97
  initialState,
166
98
  reducers: {
167
99
  add: (state, { payload }) => {
168
- state.data = { ...payload };
100
+ if (Array.isArray(payload)) {
101
+ state.data = [...state.data, ...payload];
102
+ } else {
103
+ state.data.unshift(payload);
104
+ }
169
105
  },
170
106
  load: (state, { payload }) => {
171
107
  state.data = payload;
172
108
  },
109
+ addUnpublished: (state, { payload }) => {
110
+ state.unpublishedData.unshift(payload);
111
+ },
112
+ resetUnpublished: (state) => {
113
+ state.unpublishedData = [];
114
+ },
173
115
  removeStyles(state, { payload }) {
174
116
  const { [payload.id]: _, ...rest } = state.styles;
175
117
  state.styles = rest;
@@ -208,7 +150,19 @@ var selectData = (state) => state[SLICE_NAME].data;
208
150
  var selectLoadStatus = (state) => state[SLICE_NAME].loadStatus;
209
151
  var selectCreateStatus = (state) => state[SLICE_NAME].createStatus;
210
152
  var selectStylesDefinitions = (state) => state[SLICE_NAME].styles ?? {};
211
- var selectComponents = (0, import_store2.__createSelector)(selectData, (data) => data);
153
+ var selectUnpublishedData = (state) => state[SLICE_NAME].unpublishedData;
154
+ var selectComponents = (0, import_store2.__createSelector)(
155
+ selectData,
156
+ selectUnpublishedData,
157
+ (data, unpublishedData) => [
158
+ ...unpublishedData.map((item) => ({ id: item.id, name: item.name })),
159
+ ...data
160
+ ]
161
+ );
162
+ var selectUnpublishedComponents = (0, import_store2.__createSelector)(
163
+ selectUnpublishedData,
164
+ (unpublishedData) => unpublishedData
165
+ );
212
166
  var selectLoadIsPending = (0, import_store2.__createSelector)(selectLoadStatus, (status) => status === "pending");
213
167
  var selectLoadIsError = (0, import_store2.__createSelector)(selectLoadStatus, (status) => status === "error");
214
168
  var selectCreateIsPending = (0, import_store2.__createSelector)(selectCreateStatus, (status) => status === "pending");
@@ -216,10 +170,85 @@ var selectCreateIsError = (0, import_store2.__createSelector)(selectCreateStatus
216
170
  var selectStyles = (state) => state[SLICE_NAME].styles ?? {};
217
171
  var selectFlatStyles = (0, import_store2.__createSelector)(selectStylesDefinitions, (data) => Object.values(data).flat());
218
172
 
173
+ // src/component-id-transformer.ts
174
+ var componentIdTransformer = (0, import_editor_canvas.createTransformer)(async (id) => {
175
+ const unpublishedComponents = selectUnpublishedComponents((0, import_store3.__getState)());
176
+ const unpublishedComponent = unpublishedComponents.find((component) => component.id === id);
177
+ if (unpublishedComponent) {
178
+ return structuredClone(unpublishedComponent.content);
179
+ }
180
+ const extendedWindow = window;
181
+ const documentManager = extendedWindow.elementor?.documents;
182
+ if (!documentManager) {
183
+ throw new Error("Elementor documents manager not found");
184
+ }
185
+ const data = await documentManager.request(id);
186
+ return data.elements ?? [];
187
+ });
188
+
189
+ // src/components/components-tab/components.tsx
190
+ var React6 = __toESM(require("react"));
191
+ var import_editor_ui = require("@elementor/editor-ui");
192
+
193
+ // src/components/components-tab/component-search.tsx
194
+ var React2 = __toESM(require("react"));
195
+ var import_icons = require("@elementor/icons");
196
+ var import_ui = require("@elementor/ui");
197
+ var import_i18n = require("@wordpress/i18n");
198
+
199
+ // src/components/components-tab/search-provider.tsx
200
+ var React = __toESM(require("react"));
201
+ var import_react = require("react");
202
+ var import_utils = require("@elementor/utils");
203
+ var SearchContext = (0, import_react.createContext)(void 0);
204
+ var SearchProvider = ({
205
+ children,
206
+ localStorageKey
207
+ }) => {
208
+ const { debouncedValue, handleChange, inputValue } = (0, import_utils.useSearchState)({ localStorageKey });
209
+ const clearSearch = () => {
210
+ handleChange("");
211
+ };
212
+ return /* @__PURE__ */ React.createElement(SearchContext.Provider, { value: { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }, children);
213
+ };
214
+ var useSearch = () => {
215
+ const context = (0, import_react.useContext)(SearchContext);
216
+ if (!context) {
217
+ throw new Error("useSearch must be used within a SearchProvider");
218
+ }
219
+ return context;
220
+ };
221
+
222
+ // src/components/components-tab/component-search.tsx
223
+ var ComponentSearch = () => {
224
+ const { inputValue, handleChange } = useSearch();
225
+ return /* @__PURE__ */ React2.createElement(import_ui.Stack, { direction: "row", gap: 0.5, sx: { width: "100%", px: 2, py: 1.5 } }, /* @__PURE__ */ React2.createElement(import_ui.Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React2.createElement(
226
+ import_ui.TextField,
227
+ {
228
+ role: "search",
229
+ fullWidth: true,
230
+ size: "tiny",
231
+ value: inputValue,
232
+ placeholder: (0, import_i18n.__)("Search", "elementor"),
233
+ onChange: (e) => handleChange(e.target.value),
234
+ InputProps: {
235
+ startAdornment: /* @__PURE__ */ React2.createElement(import_ui.InputAdornment, { position: "start" }, /* @__PURE__ */ React2.createElement(import_icons.SearchIcon, { fontSize: "tiny" }))
236
+ }
237
+ }
238
+ )));
239
+ };
240
+
241
+ // src/components/components-tab/components-list.tsx
242
+ var React5 = __toESM(require("react"));
243
+ var import_icons3 = require("@elementor/icons");
244
+ var import_ui4 = require("@elementor/ui");
245
+ var import_i18n2 = require("@wordpress/i18n");
246
+
219
247
  // src/hooks/use-components.ts
248
+ var import_store5 = require("@elementor/store");
220
249
  var useComponents = () => {
221
- const components = (0, import_store3.__useSelector)(selectComponents);
222
- const isLoading = (0, import_store3.__useSelector)(selectLoadIsPending);
250
+ const components = (0, import_store5.__useSelector)(selectComponents);
251
+ const isLoading = (0, import_store5.__useSelector)(selectLoadIsPending);
223
252
  return { components, isLoading };
224
253
  };
225
254
 
@@ -268,7 +297,7 @@ function getSelectedElementContainer() {
268
297
 
269
298
  // src/components/create-component-form/utils/replace-element-with-component.ts
270
299
  var import_editor_elements2 = require("@elementor/editor-elements");
271
- var replaceElementWithComponent = async (element, component) => {
300
+ var replaceElementWithComponent = (element, component) => {
272
301
  (0, import_editor_elements2.replaceElement)({
273
302
  currentElement: element,
274
303
  newElement: createComponentModel(component),
@@ -488,26 +517,10 @@ var import_react3 = require("react");
488
517
  var import_editor_elements4 = require("@elementor/editor-elements");
489
518
  var import_editor_ui2 = require("@elementor/editor-ui");
490
519
  var import_icons4 = require("@elementor/icons");
520
+ var import_store7 = require("@elementor/store");
491
521
  var import_ui5 = require("@elementor/ui");
492
522
  var import_i18n4 = require("@wordpress/i18n");
493
523
 
494
- // src/hooks/use-create-component.ts
495
- var import_store5 = require("@elementor/store");
496
- var useCreateComponent = () => {
497
- const dispatch4 = (0, import_store5.__useDispatch)();
498
- const isPending = (0, import_store5.__useSelector)(selectCreateIsPending);
499
- const isError = (0, import_store5.__useSelector)(selectCreateIsError);
500
- const createComponentAction = async (payload) => {
501
- const result = await dispatch4(createComponent(payload));
502
- return result.payload;
503
- };
504
- return {
505
- createComponent: createComponentAction,
506
- isPending,
507
- isError
508
- };
509
- };
510
-
511
524
  // src/components/create-component-form/hooks/use-form.ts
512
525
  var import_react2 = require("react");
513
526
  var useForm = (initialValues) => {
@@ -588,7 +601,7 @@ function CreateComponentForm() {
588
601
  const [element, setElement] = (0, import_react3.useState)(null);
589
602
  const [anchorPosition, setAnchorPosition] = (0, import_react3.useState)();
590
603
  const [resultNotification, setResultNotification] = (0, import_react3.useState)(null);
591
- const { createComponent: createComponent2, isPending } = useCreateComponent();
604
+ const dispatch5 = (0, import_store7.__useDispatch)();
592
605
  (0, import_react3.useEffect)(() => {
593
606
  const OPEN_SAVE_AS_COMPONENT_FORM_EVENT = "elementor/editor/open-save-as-component-form";
594
607
  const openPopup = (event) => {
@@ -601,25 +614,26 @@ function CreateComponentForm() {
601
614
  };
602
615
  }, []);
603
616
  const handleSave = async (values) => {
604
- if (!element) {
605
- throw new Error(`Can't save element as component: element not found`);
606
- }
607
617
  try {
608
- const result = await createComponent2({
609
- name: values.componentName,
610
- content: [element.element.model.toJSON({ remove: ["default"] })]
611
- });
612
618
  if (!element) {
613
- throw new Error(`Can't replace element with component: element not found`);
619
+ throw new Error(`Can't save element as component: element not found`);
614
620
  }
621
+ const tempId = generateTempId();
622
+ dispatch5(
623
+ slice.actions.addUnpublished({
624
+ id: tempId,
625
+ name: values.componentName,
626
+ content: [element.element.model.toJSON({ remove: ["default"] })]
627
+ })
628
+ );
615
629
  replaceElementWithComponent(element.element, {
616
- id: result.component_id,
630
+ id: tempId,
617
631
  name: values.componentName
618
632
  });
619
633
  setResultNotification({
620
634
  show: true,
621
- // Translators: %1$s: Component name, %2$s: Component ID
622
- message: (0, import_i18n4.__)("Component saved successfully as: %1$s (ID: %2$s)", "elementor").replace("%1$s", values.componentName).replace("%2$s", result.component_id.toString()),
635
+ // Translators: %1$s: Component name, %2$s: Component temp ID
636
+ message: (0, import_i18n4.__)("Component saved successfully as: %1$s (temp ID: %2$s)", "elementor").replace("%1$s", values.componentName).replace("%2$s", tempId.toString()),
623
637
  type: "success"
624
638
  });
625
639
  resetAndClosePopup();
@@ -649,7 +663,6 @@ function CreateComponentForm() {
649
663
  {
650
664
  initialValues: { componentName: element.elementLabel },
651
665
  handleSave,
652
- isSubmitting: isPending,
653
666
  closePopup: resetAndClosePopup
654
667
  }
655
668
  )
@@ -667,7 +680,6 @@ var FONT_SIZE = "tiny";
667
680
  var Form = ({
668
681
  initialValues,
669
682
  handleSave,
670
- isSubmitting,
671
683
  closePopup
672
684
  }) => {
673
685
  const { values, errors, isValid, handleChange, validateForm: validateForm2 } = useForm(initialValues);
@@ -712,18 +724,21 @@ var Form = ({
712
724
  error: Boolean(errors.componentName),
713
725
  helperText: errors.componentName
714
726
  }
715
- ))), /* @__PURE__ */ React7.createElement(import_ui5.Stack, { direction: "row", justifyContent: "flex-end", alignSelf: "end", py: 1, px: 1.5 }, /* @__PURE__ */ React7.createElement(import_ui5.Button, { onClick: closePopup, disabled: isSubmitting, color: "secondary", variant: "text", size: "small" }, (0, import_i18n4.__)("Cancel", "elementor")), /* @__PURE__ */ React7.createElement(
727
+ ))), /* @__PURE__ */ React7.createElement(import_ui5.Stack, { direction: "row", justifyContent: "flex-end", alignSelf: "end", py: 1, px: 1.5 }, /* @__PURE__ */ React7.createElement(import_ui5.Button, { onClick: closePopup, color: "secondary", variant: "text", size: "small" }, (0, import_i18n4.__)("Cancel", "elementor")), /* @__PURE__ */ React7.createElement(
716
728
  import_ui5.Button,
717
729
  {
718
730
  onClick: handleSubmit,
719
- disabled: isSubmitting || !isValid,
731
+ disabled: !isValid,
720
732
  variant: "contained",
721
733
  color: "primary",
722
734
  size: "small"
723
735
  },
724
- isSubmitting ? (0, import_i18n4.__)("Creating\u2026", "elementor") : (0, import_i18n4.__)("Create", "elementor")
736
+ (0, import_i18n4.__)("Create", "elementor")
725
737
  )));
726
738
  };
739
+ var generateTempId = () => {
740
+ return Date.now() + Math.floor(Math.random() * 1e6);
741
+ };
727
742
 
728
743
  // src/create-component-type.ts
729
744
  var import_editor_canvas3 = require("@elementor/editor-canvas");
@@ -806,21 +821,21 @@ function createComponentView(options) {
806
821
 
807
822
  // src/populate-store.ts
808
823
  var import_react4 = require("react");
809
- var import_store7 = require("@elementor/store");
824
+ var import_store9 = require("@elementor/store");
810
825
  function PopulateStore() {
811
826
  (0, import_react4.useEffect)(() => {
812
- (0, import_store7.__dispatch)(loadComponents());
827
+ (0, import_store9.__dispatch)(loadComponents());
813
828
  }, []);
814
829
  return null;
815
830
  }
816
831
 
817
832
  // src/store/components-styles-provider.ts
818
833
  var import_editor_styles_repository = require("@elementor/editor-styles-repository");
819
- var import_store8 = require("@elementor/store");
834
+ var import_store10 = require("@elementor/store");
820
835
  var componentsStylesProvider = (0, import_editor_styles_repository.createStylesProvider)({
821
836
  key: "components-styles",
822
837
  priority: 100,
823
- subscribe: (cb) => (0, import_store8.__subscribeWithSelector)(
838
+ subscribe: (cb) => (0, import_store10.__subscribeWithSelector)(
824
839
  (state) => state[SLICE_NAME],
825
840
  () => {
826
841
  cb();
@@ -828,16 +843,16 @@ var componentsStylesProvider = (0, import_editor_styles_repository.createStylesP
828
843
  ),
829
844
  actions: {
830
845
  all: () => {
831
- return selectFlatStyles((0, import_store8.__getState)());
846
+ return selectFlatStyles((0, import_store10.__getState)());
832
847
  },
833
848
  get: (id) => {
834
- return selectFlatStyles((0, import_store8.__getState)()).find((style) => style.id === id) ?? null;
849
+ return selectFlatStyles((0, import_store10.__getState)()).find((style) => style.id === id) ?? null;
835
850
  }
836
851
  }
837
852
  });
838
853
 
839
854
  // src/store/load-components-styles.ts
840
- var import_store10 = require("@elementor/store");
855
+ var import_store12 = require("@elementor/store");
841
856
 
842
857
  // src/utils/get-component-ids.ts
843
858
  var import_editor_props = require("@elementor/editor-props");
@@ -861,7 +876,7 @@ async function loadComponentsStyles(elements) {
861
876
  if (!componentIds.length) {
862
877
  return;
863
878
  }
864
- const knownComponents = selectStyles((0, import_store10.__getState)());
879
+ const knownComponents = selectStyles((0, import_store12.__getState)());
865
880
  const unknownComponentIds = componentIds.filter((id) => !knownComponents[id]);
866
881
  if (!unknownComponentIds.length) {
867
882
  return;
@@ -882,24 +897,92 @@ function addStyles(data) {
882
897
  const styles = Object.fromEntries(
883
898
  data.map(([componentId, componentData]) => [componentId, extractStyles(componentData)])
884
899
  );
885
- (0, import_store10.__dispatch)(slice.actions.addStyles(styles));
900
+ (0, import_store12.__dispatch)(slice.actions.addStyles(styles));
886
901
  }
887
902
  function extractStyles(element) {
888
903
  return [...Object.values(element.styles ?? {}), ...(element.elements ?? []).flatMap(extractStyles)];
889
904
  }
890
905
 
891
906
  // src/store/remove-component-styles.ts
892
- var import_store12 = require("@elementor/store");
907
+ var import_store14 = require("@elementor/store");
893
908
  function removeComponentStyles(id) {
894
909
  apiClient.invalidateComponentConfigCache(id);
895
- (0, import_store12.__dispatch)(slice.actions.removeStyles({ id }));
910
+ (0, import_store14.__dispatch)(slice.actions.removeStyles({ id }));
911
+ }
912
+
913
+ // src/utils/before-save.ts
914
+ var import_editor_elements5 = require("@elementor/editor-elements");
915
+ var import_store16 = require("@elementor/store");
916
+ var beforeSave = async ({ container, status }) => {
917
+ const unpublishedComponents = selectUnpublishedComponents((0, import_store16.__getState)());
918
+ if (!unpublishedComponents.length) {
919
+ return;
920
+ }
921
+ try {
922
+ const tempIdToComponentId = await createComponents(unpublishedComponents, status);
923
+ const elements = container.model.get("elements").toJSON();
924
+ updateComponentInstances(elements, tempIdToComponentId);
925
+ (0, import_store16.__dispatch)(
926
+ slice.actions.add(
927
+ unpublishedComponents.map((component) => ({
928
+ id: tempIdToComponentId.get(component.id),
929
+ name: component.name
930
+ }))
931
+ )
932
+ );
933
+ (0, import_store16.__dispatch)(slice.actions.resetUnpublished());
934
+ } catch (error) {
935
+ throw new Error(`Failed to publish components and update component instances: ${error}`);
936
+ }
937
+ };
938
+ async function createComponents(components, status) {
939
+ const tempIdToComponentId = /* @__PURE__ */ new Map();
940
+ const promises = components.map((component) => {
941
+ return apiClient.create({ name: component.name, content: component.content, status }).then((response) => {
942
+ tempIdToComponentId.set(component.id, response.component_id);
943
+ });
944
+ });
945
+ await Promise.all(promises);
946
+ return tempIdToComponentId;
947
+ }
948
+ function updateComponentInstances(elements, tempIdToComponentId) {
949
+ elements.forEach((element) => {
950
+ const { shouldUpdate, newComponentId } = shouldUpdateElement(element, tempIdToComponentId);
951
+ if (shouldUpdate) {
952
+ updateElementComponentId(element.id, newComponentId);
953
+ }
954
+ if (element.elements) {
955
+ updateComponentInstances(element.elements, tempIdToComponentId);
956
+ }
957
+ });
958
+ }
959
+ function shouldUpdateElement(element, tempIdToComponentId) {
960
+ if (element.widgetType === "e-component") {
961
+ const currentComponentId = element.settings?.component?.value;
962
+ if (currentComponentId && tempIdToComponentId.has(currentComponentId)) {
963
+ return { shouldUpdate: true, newComponentId: tempIdToComponentId.get(currentComponentId) };
964
+ }
965
+ }
966
+ return { shouldUpdate: false, newComponentId: null };
967
+ }
968
+ function updateElementComponentId(elementId, componentId) {
969
+ (0, import_editor_elements5.updateElementSettings)({
970
+ id: elementId,
971
+ props: {
972
+ component: {
973
+ $$type: "component-id",
974
+ value: componentId
975
+ }
976
+ },
977
+ withHistory: false
978
+ });
896
979
  }
897
980
 
898
981
  // src/init.ts
899
982
  var COMPONENT_DOCUMENT_TYPE = "elementor_component";
900
983
  function init() {
901
984
  import_editor_styles_repository2.stylesRepository.register(componentsStylesProvider);
902
- (0, import_store14.__registerSlice)(slice);
985
+ (0, import_store18.__registerSlice)(slice);
903
986
  (0, import_editor_canvas4.registerElementType)(TYPE, createComponentType);
904
987
  (0, import_editor_v1_adapters3.registerDataHook)("dependency", "editor/documents/close", (args) => {
905
988
  const document = (0, import_editor_documents.getV1CurrentDocument)();
@@ -908,6 +991,7 @@ function init() {
908
991
  }
909
992
  return true;
910
993
  });
994
+ window.elementorCommon.__beforeSave = beforeSave;
911
995
  (0, import_editor_elements_panel.injectTab)({
912
996
  id: "components",
913
997
  label: (0, import_i18n6.__)("Components", "elementor"),