PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.2
Elementor Website Builder – more than just a page builder v4.3.2
4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 All 455 releases
elementor / assets / js / packages / editor-components / editor-components.js

editor-components.js in Elementor Website Builder – more than just a page builder 4.3.2, at assets/js/packages/editor-components/editor-components.js

2,934 lines 120.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function(_elementor_editor, _elementor_editor_canvas, _elementor_editor_documents, _elementor_editor_editing_panel, _elementor_editor_elements_panel, _elementor_editor_embedded_documents_manager, _elementor_editor_v1_adapters, _elementor_store, _wordpress_i18n, _elementor_http_client, react, _elementor_editor_ui, _elementor_ui, _elementor_utils, _elementor_icons, _elementor_editor_current_user, _elementor_editor_notifications, _elementor_editor_elements, _elementor_editor_props, _elementor_schema, _elementor_events, _elementor_editor_panels, _elementor_editor_controls, _elementor_editor_templates) {
2
3 //#region \0rolldown/runtime.js
4 var __create = Object.create;
5 var __defProp$1 = Object.defineProperty;
6 var __name = (target, value) => __defProp$1(target, "name", {
7 value,
8 configurable: true
9 });
10 var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11 var __getOwnPropNames = Object.getOwnPropertyNames;
12 var __getProtoOf = Object.getPrototypeOf;
13 var __hasOwnProp = Object.prototype.hasOwnProperty;
14 var __exportAll = (all, no_symbols) => {
15 let target = {};
16 for (var name in all) {
17 __defProp$1(target, name, {
18 get: all[name],
19 enumerable: true
20 });
21 }
22 if (!no_symbols) {
23 __defProp$1(target, Symbol.toStringTag, { value: "Module" });
24 }
25 return target;
26 };
27 var __copyProps = (to, from, except, desc) => {
28 if (from && typeof from === "object" || typeof from === "function") {
29 for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
30 key = keys[i];
31 if (!__hasOwnProp.call(to, key) && key !== except) {
32 __defProp$1(to, key, {
33 get: ((k) => from[k]).bind(null, key),
34 enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
35 });
36 }
37 }
38 }
39 return to;
40 };
41 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp$1(target, "default", {
42 value: mod,
43 enumerable: true
44 }) : target, mod));
45
46 //#endregion
47 react = __toESM(react);
48
49 //#region packages/packages/core/editor-components/src/store/store-types.ts
50 var initialState = {
51 data: [],
52 unpublishedData: [],
53 loadStatus: "idle",
54 createdThisSession: [],
55 archivedThisSession: [],
56 path: [],
57 currentComponentId: null,
58 updatedComponentNames: {},
59 sanitized: {}
60 };
61 var SLICE_NAME = "components";
62
63 //#endregion
64 //#region packages/packages/core/editor-components/src/api.ts
65 var BASE_URL = "elementor/v1/components";
66 var getParams = (id) => ({
67 action: "get_document_config",
68 unique_id: `document-config-${id}`,
69 data: { id }
70 });
71 var apiClient = {
72 get: () => (0, _elementor_http_client.httpService)().get(`${BASE_URL}`).then((res) => res.data.data),
73 create: (payload) => (0, _elementor_http_client.httpService)().post(`${BASE_URL}`, payload).then((res) => res.data.data),
74 updateStatuses: (ids, status) => (0, _elementor_http_client.httpService)().put(`${BASE_URL}/status`, {
75 ids,
76 status
77 }),
78 getComponentConfig: (id) => _elementor_editor_v1_adapters.ajax.load(getParams(id)),
79 invalidateComponentConfigCache: (id) => _elementor_editor_v1_adapters.ajax.invalidateCache(getParams(id)),
80 getComponentLockStatus: async (componentId) => await (0, _elementor_http_client.httpService)().get(`${BASE_URL}/lock-status`, { params: { componentId } }).then((res) => {
81 const { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;
82 return {
83 isAllowedToSwitchDocument,
84 lockedBy: lockedBy || ""
85 };
86 }),
87 lockComponent: async (componentId) => await (0, _elementor_http_client.httpService)().post(`${BASE_URL}/lock`, { componentId }).then((res) => res.data),
88 unlockComponent: async (componentId) => await (0, _elementor_http_client.httpService)().post(`${BASE_URL}/unlock`, { componentId }).then((res) => res.data),
89 getOverridableProps: async (componentIds) => await (0, _elementor_http_client.httpService)().get(`${BASE_URL}/overridable-props`, { params: { "componentIds[]": componentIds } }).then((res) => res.data),
90 updateArchivedComponents: async (componentIds, status) => await (0, _elementor_http_client.httpService)().post(`${BASE_URL}/archive`, {
91 componentIds,
92 status
93 }).then((res) => res.data.data),
94 updateComponentTitle: (updatedComponentNames, status) => (0, _elementor_http_client.httpService)().post(`${BASE_URL}/update-titles`, {
95 components: updatedComponentNames,
96 status
97 }).then((res) => res.data.data),
98 validate: async (payload) => await (0, _elementor_http_client.httpService)().post(`${BASE_URL}/create-validate`, payload).then((res) => res.data)
99 };
100
101 //#endregion
102 //#region packages/packages/core/editor-components/src/store/thunks.ts
103 var loadComponents = (0, _elementor_store.__createAsyncThunk)("components/load", async () => {
104 return await apiClient.get();
105 });
106
107 //#endregion
108 //#region packages/packages/core/editor-components/src/store/extensible-slice.ts
109 var extraReducersMap = /* @__PURE__ */ new Map();
110 function registerComponentsReducer(name, reducer) {
111 extraReducersMap.set(`${SLICE_NAME}/${name}`, reducer);
112 }
113 function createComponentsAction(name) {
114 const action = (0, _elementor_store.__createAction)(`${SLICE_NAME}/${name}`);
115 return {
116 action,
117 register(reducer) {
118 registerComponentsReducer(name, reducer);
119 },
120 dispatch(payload) {
121 (0, _elementor_store.__dispatch)(action(payload));
122 }
123 };
124 }
125 var baseSlice = (0, _elementor_store.__createSlice)({
126 name: SLICE_NAME,
127 initialState,
128 reducers: {
129 add: (state, { payload }) => {
130 if (Array.isArray(payload)) state.data = [...payload, ...state.data];
131 else state.data.unshift(payload);
132 },
133 load: (state, { payload }) => {
134 state.data = payload;
135 },
136 addUnpublished: (state, { payload }) => {
137 state.unpublishedData.unshift(payload);
138 },
139 removeUnpublished: (state, { payload }) => {
140 const uidsToRemove = Array.isArray(payload) ? payload : [payload];
141 state.unpublishedData = state.unpublishedData.filter((component) => !uidsToRemove.includes(component.uid));
142 },
143 resetUnpublished: (state) => {
144 state.unpublishedData = [];
145 },
146 addCreatedThisSession: (state, { payload }) => {
147 state.createdThisSession.push(payload);
148 },
149 removeCreatedThisSession: (state, { payload }) => {
150 state.createdThisSession = state.createdThisSession.filter((uid) => uid !== payload);
151 },
152 archive: (state, { payload }) => {
153 const component = state.data.find((comp) => comp.id === payload);
154 if (component) {
155 component.isArchived = true;
156 state.archivedThisSession.push(payload);
157 }
158 },
159 setCurrentComponentId: (state, { payload }) => {
160 state.currentComponentId = payload;
161 },
162 setPath: (state, { payload }) => {
163 state.path = payload;
164 },
165 setOverridableProps: (state, { payload }) => {
166 const component = state.data.find((comp) => comp.id === payload.componentId);
167 if (!component) return;
168 component.overridableProps = payload.overridableProps;
169 },
170 loadOverridableProps: (state, { payload }) => {
171 Object.keys(payload).forEach((id) => {
172 const componentId = Number(id);
173 const overridableProps = payload[componentId];
174 const component = state.data.find((comp) => comp.id === componentId);
175 if (!component || !overridableProps) return;
176 component.overridableProps = overridableProps;
177 });
178 },
179 rename: (state, { payload }) => {
180 const component = state.data.find((comp) => comp.uid === payload.componentUid);
181 if (!component) return;
182 if (component.id) state.updatedComponentNames[component.id] = payload.name;
183 component.name = payload.name;
184 },
185 cleanUpdatedComponentNames: (state) => {
186 state.updatedComponentNames = {};
187 },
188 updateComponentSanitizedAttribute: (state, { payload: { componentId, attribute } }) => {
189 if (!state.sanitized[componentId]) state.sanitized[componentId] = {};
190 state.sanitized[componentId][attribute] = true;
191 },
192 resetSanitizedComponents: (state) => {
193 state.sanitized = {};
194 }
195 },
196 extraReducers: (builder) => {
197 builder.addCase(loadComponents.fulfilled, (state, { payload }) => {
198 state.data = payload;
199 state.loadStatus = "idle";
200 });
201 builder.addCase(loadComponents.pending, (state) => {
202 state.loadStatus = "pending";
203 });
204 builder.addCase(loadComponents.rejected, (state) => {
205 state.loadStatus = "error";
206 });
207 }
208 });
209 var slice = {
210 ...baseSlice,
211 reducer(state, action) {
212 const nextState = baseSlice.reducer(state, action);
213 const extraReducer = extraReducersMap.get(action.type);
214 if (!extraReducer || !nextState) return nextState;
215 const clonedState = structuredClone(nextState);
216 extraReducer(clonedState, action);
217 return clonedState;
218 }
219 };
220
221 //#endregion
222 //#region packages/packages/core/editor-components/src/store/store.ts
223 var selectData = (state) => state[SLICE_NAME].data;
224 var selectArchivedThisSession = (state) => state[SLICE_NAME].archivedThisSession;
225 var selectLoadStatus = (state) => state[SLICE_NAME].loadStatus;
226 var selectUnpublishedData = (state) => state[SLICE_NAME].unpublishedData;
227 var getCreatedThisSession = (state) => state[SLICE_NAME].createdThisSession;
228 var getPath = (state) => state[SLICE_NAME].path;
229 var getCurrentComponentId = (state) => state[SLICE_NAME].currentComponentId;
230 var selectComponent = (state, componentId) => state[SLICE_NAME].data.find((component) => component.id === componentId);
231 var useComponent = (componentId) => {
232 return (0, _elementor_store.__useSelector)((state) => componentId ? selectComponent(state, componentId) : null);
233 };
234 var selectComponentByUid = (state, componentUid) => state["components"].data.find((component) => component.uid === componentUid) ?? state["components"].unpublishedData.find((component) => component.uid === componentUid);
235 var selectComponents = (0, _elementor_store.__createSelector)(selectData, selectUnpublishedData, (data, unpublishedData) => [...unpublishedData.map((item) => ({
236 uid: item.uid,
237 name: item.name,
238 overridableProps: item.overridableProps
239 })), ...data.filter((component) => !component.isArchived)]);
240 var selectUnpublishedComponents = (0, _elementor_store.__createSelector)(selectUnpublishedData, (unpublishedData) => unpublishedData);
241 var selectLoadIsPending = (0, _elementor_store.__createSelector)(selectLoadStatus, (status) => status === "pending");
242 var selectLoadIsError = (0, _elementor_store.__createSelector)(selectLoadStatus, (status) => status === "error");
243 var selectCreatedThisSession = (0, _elementor_store.__createSelector)(getCreatedThisSession, (createdThisSession) => createdThisSession);
244 var DEFAULT_OVERRIDABLE_PROPS = {
245 props: {},
246 groups: {
247 items: {},
248 order: []
249 }
250 };
251 var selectOverridableProps = (0, _elementor_store.__createSelector)(selectComponent, (component) => {
252 if (!component) return;
253 return component.overridableProps ?? DEFAULT_OVERRIDABLE_PROPS;
254 });
255 var useOverridableProps = (componentId) => {
256 return (0, _elementor_store.__useSelector)((state) => componentId ? selectOverridableProps(state, componentId) : null);
257 };
258 var selectIsOverridablePropsLoaded = (0, _elementor_store.__createSelector)(selectComponent, (component) => {
259 return !!component?.overridableProps;
260 });
261 var selectPath = (0, _elementor_store.__createSelector)(getPath, (path) => path);
262 var selectCurrentComponentId = (0, _elementor_store.__createSelector)(getCurrentComponentId, (currentComponentId) => currentComponentId);
263 var selectCurrentComponent = (0, _elementor_store.__createSelector)(selectData, getCurrentComponentId, (data, currentComponentId) => data.find((component) => component.id === currentComponentId));
264 var useCurrentComponentId = () => {
265 return (0, _elementor_store.__useSelector)(selectCurrentComponentId);
266 };
267 var useCurrentComponent = () => {
268 return (0, _elementor_store.__useSelector)(selectCurrentComponent);
269 };
270 var selectUpdatedComponentNames = (0, _elementor_store.__createSelector)((state) => state[SLICE_NAME].updatedComponentNames, (updatedComponentNames) => Object.entries(updatedComponentNames).map(([componentId, title]) => ({
271 componentId: Number(componentId),
272 title
273 })));
274 var useSanitizedComponents = () => {
275 return (0, _elementor_store.__useSelector)((state) => state[SLICE_NAME].sanitized);
276 };
277 var useIsSanitizedComponent = (componentId, key) => {
278 const sanitizedComponents = useSanitizedComponents();
279 if (!componentId) return false;
280 return !!sanitizedComponents[componentId]?.[key];
281 };
282
283 //#endregion
284 //#region packages/packages/core/editor-components/src/utils/component-document-data.ts
285 var getComponentDocumentParams = (id) => ({
286 action: "get_document_config",
287 unique_id: `document-${id}`,
288 data: { id }
289 });
290 var pendingRequests = /* @__PURE__ */ new Map();
291 var getComponentDocumentData = (id) => {
292 const pendingRequest = pendingRequests.get(id);
293 if (pendingRequest) return pendingRequest;
294 const request = _elementor_editor_v1_adapters.ajax.load(getComponentDocumentParams(id)).catch(() => null).finally(() => pendingRequests.delete(id));
295 pendingRequests.set(id, request);
296 return request;
297 };
298
299 //#endregion
300 //#region packages/packages/core/editor-components/src/component-instance-transformer.ts
301 var componentInstanceTransformer = (0, _elementor_editor_canvas.createTransformer)(async ({ component_id: id, overrides: overridesValue }) => {
302 const unpublishedComponent = selectUnpublishedComponents((0, _elementor_store.__getState)()).find(({ uid }) => uid === id);
303 const overrides = overridesValue?.reduce((acc, override) => ({
304 ...acc,
305 ...override
306 }), {});
307 if (unpublishedComponent) return {
308 elements: structuredClone(unpublishedComponent.elements),
309 overrides
310 };
311 if (typeof id !== "number") throw new Error(`Component ID "${id}" not valid.`);
312 return {
313 elements: (await getComponentDocumentData(id))?.elements ?? [],
314 overrides
315 };
316 });
317
318 //#endregion
319 //#region packages/packages/core/editor-components/src/component-overridable-transformer.ts
320 var componentOverridableTransformer = (0, _elementor_editor_canvas.createTransformer)((value, options) => {
321 const { overrides } = options.renderContext ?? {};
322 const overrideValue = overrides?.[value.override_key];
323 if (overrideValue) {
324 if (isOriginValueOverride(value.origin_value)) return transformOverride(value, options, overrideValue);
325 return overrideValue;
326 }
327 return value.origin_value;
328 });
329 function transformOverride(value, options, overrideValue) {
330 const transformer = _elementor_editor_canvas.settingsTransformersRegistry.get("override");
331 if (!transformer) return null;
332 const transformedValue = transformer(value.origin_value.value, options);
333 if (!transformedValue) return null;
334 const [key] = Object.keys(transformedValue);
335 return { [key]: overrideValue };
336 }
337 function isOriginValueOverride(originValue) {
338 return originValue.$$type === "override";
339 }
340
341 //#endregion
342 //#region packages/packages/core/editor-components/src/component-override-transformer.ts
343 var componentOverrideTransformer = (0, _elementor_editor_canvas.createTransformer)((override) => {
344 const { override_key: key, override_value: overrideValue } = override;
345 return { [key]: overrideValue };
346 });
347
348 //#endregion
349 //#region packages/packages/core/editor-components/src/hooks/use-components.ts
350 var useComponents = () => {
351 return {
352 components: (0, _elementor_store.__useSelector)(selectComponents),
353 isLoading: (0, _elementor_store.__useSelector)(selectLoadIsPending)
354 };
355 };
356
357 //#endregion
358 //#region packages/packages/core/editor-components/src/utils/is-pro-components-supported.ts
359 var MIN_PRO_VERSION_FOR_COMPONENTS = "4.0";
360 function isProComponentsSupported() {
361 return (0, _elementor_utils.hasProInstalled)() && (0, _elementor_utils.isProAtLeast)(MIN_PRO_VERSION_FOR_COMPONENTS);
362 }
363 function isProOutdatedForComponents() {
364 return (0, _elementor_utils.hasProInstalled)() && !(0, _elementor_utils.isProAtLeast)(MIN_PRO_VERSION_FOR_COMPONENTS);
365 }
366
367 //#endregion
368 //#region packages/packages/core/editor-components/src/components/components-tab/search-provider.tsx
369 var SearchContext = (0, react.createContext)(void 0);
370 var SearchProvider = ({ children, localStorageKey }) => {
371 const { debouncedValue, handleChange, inputValue } = (0, _elementor_utils.useSearchState)({ localStorageKey });
372 const clearSearch = () => {
373 handleChange("");
374 };
375 return /* @__PURE__ */ react.createElement(SearchContext.Provider, { value: {
376 handleChange,
377 clearSearch,
378 searchValue: debouncedValue,
379 inputValue
380 } }, children);
381 };
382 var useSearch = () => {
383 const context = (0, react.useContext)(SearchContext);
384 if (!context) throw new Error("useSearch must be used within a SearchProvider");
385 return context;
386 };
387
388 //#endregion
389 //#region packages/packages/core/editor-components/src/components/components-tab/component-search.tsx
390 var ComponentSearch = () => {
391 const { inputValue, handleChange } = useSearch();
392 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
393 direction: "row",
394 gap: .5,
395 sx: {
396 width: "100%",
397 px: 2,
398 py: 1.5
399 }
400 }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ react.createElement(_elementor_ui.TextField, {
401 role: "search",
402 fullWidth: true,
403 size: "tiny",
404 value: inputValue,
405 placeholder: (0, _wordpress_i18n.__)("Search", "elementor"),
406 onChange: (e) => handleChange(e.target.value),
407 InputProps: { startAdornment: /* @__PURE__ */ react.createElement(_elementor_ui.InputAdornment, { position: "start" }, /* @__PURE__ */ react.createElement(_elementor_icons.SearchIcon, { fontSize: "tiny" })) }
408 })));
409 };
410
411 //#endregion
412 //#region packages/packages/core/editor-components/src/hooks/use-components-permissions.ts
413 var useComponentsPermissions = () => {
414 const { isAdmin } = (0, _elementor_editor_current_user.useCurrentUserCapabilities)();
415 return {
416 canCreate: isAdmin,
417 canEdit: isAdmin,
418 canDelete: isAdmin,
419 canRename: isAdmin
420 };
421 };
422
423 //#endregion
424 //#region packages/packages/core/editor-components/src/components/components-tab/components-item.tsx
425 var ComponentItem = (0, react.forwardRef)(({ component, disabled = true, draggable, onDragStart, onDragEnd, onClick, isEditing = false, error = null, nameSlot, endSlot, ...props }, ref) => {
426 return /* @__PURE__ */ react.createElement(_elementor_ui.ListItemButton, {
427 disabled,
428 draggable,
429 onDragStart,
430 onDragEnd,
431 shape: "rounded",
432 ref,
433 sx: {
434 border: "solid 1px",
435 borderColor: "divider",
436 py: .5,
437 px: 1,
438 display: "flex",
439 width: "100%",
440 alignItems: "center",
441 gap: 1
442 },
443 ...props
444 }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, {
445 display: "flex",
446 alignItems: "center",
447 gap: 1,
448 minWidth: 0,
449 flexGrow: 1,
450 onClick
451 }, /* @__PURE__ */ react.createElement(_elementor_ui.ListItemIcon, { size: "tiny" }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, { fontSize: "tiny" })), /* @__PURE__ */ react.createElement(Indicator, {
452 isActive: isEditing,
453 isError: !!error
454 }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, {
455 display: "flex",
456 flex: 1,
457 minWidth: 0,
458 flexGrow: 1
459 }, nameSlot ?? /* @__PURE__ */ react.createElement(ComponentName, { name: component.name })))), endSlot);
460 });
461 var Indicator = (0, _elementor_ui.styled)(_elementor_ui.Box, { shouldForwardProp: (prop) => prop !== "isActive" && prop !== "isError" })(({ theme, isActive, isError }) => ({
462 display: "flex",
463 width: "100%",
464 flexGrow: 1,
465 borderRadius: theme.spacing(.5),
466 border: getIndicatorBorder({
467 isActive,
468 isError,
469 theme
470 }),
471 padding: `0 ${theme.spacing(1)}`,
472 marginLeft: isActive ? theme.spacing(1) : 0,
473 minWidth: 0
474 }));
475 var getIndicatorBorder = ({ isActive, isError, theme }) => {
476 if (isError) return `2px solid ${theme.palette.error.main}`;
477 if (isActive) return `2px solid ${theme.palette.secondary.main}`;
478 return "none";
479 };
480 function ComponentName({ name, editable }) {
481 if (editable?.isEditing) return /* @__PURE__ */ react.createElement(_elementor_editor_ui.EditableField, {
482 ref: editable.ref,
483 as: _elementor_ui.Typography,
484 variant: "caption",
485 ...editable.getProps()
486 });
487 return /* @__PURE__ */ react.createElement(_elementor_editor_ui.EllipsisWithTooltip, {
488 title: name,
489 as: _elementor_ui.Typography,
490 variant: "caption",
491 color: "text.primary"
492 });
493 }
494
495 //#endregion
496 //#region packages/packages/core/editor-components/src/components/components-tab/loading-components.tsx
497 var ROWS = Array.from({ length: 3 }, (_, index) => index);
498 var STAGGER_DELAY_MS = 80;
499 var LoadingComponents = () => {
500 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
501 "aria-label": "Loading components",
502 gap: 1.5,
503 sx: {
504 pointerEvents: "none",
505 position: "relative",
506 maxHeight: "300px",
507 overflow: "hidden",
508 px: 1,
509 "&:after": {
510 position: "absolute",
511 bottom: 0,
512 content: "\"\"",
513 left: 0,
514 width: "100%",
515 height: "40%",
516 pointerEvents: "none",
517 zIndex: 1
518 }
519 }
520 }, ROWS.map((row) => /* @__PURE__ */ react.createElement(_elementor_ui.Box, {
521 key: row,
522 display: "flex",
523 alignItems: "center",
524 gap: 1.5,
525 sx: {
526 py: .75,
527 px: 1.5,
528 opacity: 0,
529 animation: `e-loading-fade-in 0.4s ease-out ${row * STAGGER_DELAY_MS}ms forwards`,
530 "@keyframes e-loading-fade-in": {
531 from: {
532 opacity: 0,
533 transform: "translateY(4px)"
534 },
535 to: {
536 opacity: 1,
537 transform: "translateY(0)"
538 }
539 }
540 }
541 }, /* @__PURE__ */ react.createElement(_elementor_ui.Skeleton, {
542 animation: "wave",
543 variant: "rounded",
544 width: 24,
545 height: 24
546 }), /* @__PURE__ */ react.createElement(_elementor_ui.Skeleton, {
547 animation: "wave",
548 variant: "rounded",
549 width: "60%",
550 height: 14
551 }))));
552 };
553
554 //#endregion
555 //#region packages/packages/core/editor-components/src/components/components-tab/components-list.tsx
556 var LEARN_MORE_URL = "http://go.elementor.com/components-guide-article";
557 var UPGRADE_URL$1 = "https://go.elementor.com/go-pro-components/";
558 var UPDATE_PLUGINS_URL$2 = "/wp-admin/plugins.php";
559 var SUBTITLE_OVERRIDE_SX = {
560 fontSize: "0.875rem !important",
561 fontWeight: "500 !important"
562 };
563 function ComponentsList() {
564 const { components, isLoading, searchValue } = useFilteredComponents();
565 if (isLoading) return /* @__PURE__ */ react.createElement(LoadingComponents, null);
566 if (!components?.length) {
567 if (searchValue.length) return /* @__PURE__ */ react.createElement(EmptySearchResult, null);
568 if (isProOutdatedForComponents()) return /* @__PURE__ */ react.createElement(ProOutdatedEmptyState, null);
569 return isProComponentsSupported() ? /* @__PURE__ */ react.createElement(EmptyState$1, null) : /* @__PURE__ */ react.createElement(ProUpgradeEmptyState, null);
570 }
571 return /* @__PURE__ */ react.createElement(_elementor_ui.List, { sx: {
572 display: "flex",
573 flexDirection: "column",
574 gap: 1,
575 px: 2
576 } }, components.map((component) => /* @__PURE__ */ react.createElement(ComponentItem, {
577 key: component.uid,
578 component
579 })));
580 }
581 var ProUpgradeEmptyState = () => {
582 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
583 alignItems: "center",
584 justifyContent: "start",
585 height: "100%",
586 sx: {
587 px: 2,
588 py: 4
589 },
590 gap: 2,
591 overflow: "hidden"
592 }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
593 alignItems: "center",
594 gap: 1
595 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, {
596 fontSize: "large",
597 sx: { color: "text.secondary" }
598 }), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
599 align: "center",
600 variant: "subtitle2",
601 color: "text.secondary",
602 sx: SUBTITLE_OVERRIDE_SX
603 }, (0, _wordpress_i18n.__)("Create Reusable Components", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
604 align: "center",
605 variant: "caption",
606 color: "secondary",
607 sx: { maxWidth: 200 }
608 }, (0, _wordpress_i18n.__)("Create design elements that sync across your entire site.", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_ui.Button, {
609 variant: "contained",
610 color: "promotion",
611 size: "small",
612 startIcon: /* @__PURE__ */ react.createElement(_elementor_icons.CrownFilledIcon, null),
613 href: UPGRADE_URL$1,
614 target: "_blank",
615 rel: "noopener noreferrer"
616 }, (0, _wordpress_i18n.__)("Upgrade now", "elementor")));
617 };
618 var ProOutdatedEmptyState = () => {
619 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
620 alignItems: "center",
621 justifyContent: "start",
622 height: "100%",
623 sx: {
624 px: 2,
625 py: 4,
626 maxWidth: 268,
627 m: "auto"
628 },
629 gap: 2,
630 overflow: "hidden"
631 }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
632 alignItems: "center",
633 gap: 1
634 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, {
635 fontSize: "large",
636 sx: { color: "text.secondary" }
637 }), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
638 align: "center",
639 variant: "subtitle2",
640 color: "text.secondary",
641 sx: SUBTITLE_OVERRIDE_SX
642 }, (0, _wordpress_i18n.__)("Create Reusable Components", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
643 align: "center",
644 variant: "caption",
645 color: "secondary"
646 }, (0, _wordpress_i18n.__)("Create design elements that sync across your entire site.", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
647 align: "center",
648 variant: "caption",
649 color: "secondary",
650 sx: { mt: 1 }
651 }, (0, _wordpress_i18n.__)("To create components, update Elementor Pro to the latest version.", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_ui.Button, {
652 variant: "text",
653 color: "info",
654 size: "small",
655 href: UPDATE_PLUGINS_URL$2,
656 target: "_blank",
657 rel: "noopener noreferrer"
658 }, (0, _wordpress_i18n.__)("Update Elementor Pro", "elementor")));
659 };
660 var EmptyState$1 = /* @__PURE__ */ __name(() => {
661 const { canCreate } = useComponentsPermissions();
662 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
663 alignItems: "center",
664 justifyContent: "start",
665 height: "100%",
666 sx: {
667 px: 2,
668 py: 4
669 },
670 gap: 2,
671 overflow: "hidden"
672 }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
673 alignItems: "center",
674 gap: 1
675 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, {
676 fontSize: "large",
677 sx: { color: "text.secondary" }
678 }), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
679 align: "center",
680 variant: "subtitle2",
681 color: "text.secondary",
682 sx: SUBTITLE_OVERRIDE_SX
683 }, (0, _wordpress_i18n.__)("No components yet", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
684 align: "center",
685 variant: "caption",
686 color: "secondary",
687 sx: { maxWidth: 200 }
688 }, (0, _wordpress_i18n.__)("Components are reusable blocks that sync across your site.", "elementor"), /* @__PURE__ */ react.createElement("br", null), canCreate ? (0, _wordpress_i18n.__)("Create once, use everywhere.", "elementor") : (0, _wordpress_i18n.__)("With your current role, you cannot create components. Contact an administrator to create one.", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Link, {
689 href: LEARN_MORE_URL,
690 target: "_blank",
691 rel: "noopener noreferrer",
692 variant: "caption",
693 color: "info.main"
694 }, (0, _wordpress_i18n.__)("Learn more about components", "elementor"))), canCreate && /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement(_elementor_ui.Divider, { sx: { width: "100%" } }), /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
695 alignItems: "center",
696 gap: 1,
697 width: "100%"
698 }, /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
699 align: "center",
700 variant: "subtitle2",
701 color: "text.secondary",
702 sx: SUBTITLE_OVERRIDE_SX
703 }, (0, _wordpress_i18n.__)("Create your first one:", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
704 align: "center",
705 variant: "caption",
706 color: "secondary",
707 sx: { maxWidth: 228 }
708 }, (0, _wordpress_i18n.__)("Right-click any div-block or flexbox on your canvas or structure and select \"Create component\"", "elementor")))));
709 }, "EmptyState");
710 var EmptySearchResult = () => {
711 const { searchValue, clearSearch } = useSearch();
712 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
713 color: "text.secondary",
714 pt: 5,
715 alignItems: "center",
716 gap: 1,
717 overflow: "hidden",
718 justifySelf: "center"
719 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, null), /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { width: "100%" } }, /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
720 align: "center",
721 variant: "subtitle2",
722 color: "inherit",
723 sx: SUBTITLE_OVERRIDE_SX
724 }, (0, _wordpress_i18n.__)("Sorry, nothing matched", "elementor")), searchValue && /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
725 variant: "subtitle2",
726 color: "inherit",
727 sx: {
728 ...SUBTITLE_OVERRIDE_SX,
729 display: "flex",
730 width: "100%",
731 justifyContent: "center"
732 }
733 }, /* @__PURE__ */ react.createElement("span", null, "“"), /* @__PURE__ */ react.createElement("span", { style: {
734 maxWidth: "80%",
735 overflow: "hidden",
736 textOverflow: "ellipsis"
737 } }, searchValue), /* @__PURE__ */ react.createElement("span", null, "”."))), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
738 align: "center",
739 variant: "caption",
740 color: "inherit"
741 }, (0, _wordpress_i18n.__)("Try something else.", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
742 align: "center",
743 variant: "caption",
744 color: "inherit"
745 }, /* @__PURE__ */ react.createElement(_elementor_ui.Link, {
746 color: "secondary",
747 variant: "caption",
748 component: "button",
749 onClick: clearSearch
750 }, (0, _wordpress_i18n.__)("Clear & try again", "elementor"))));
751 };
752 var useFilteredComponents = () => {
753 const { components, isLoading } = useComponents();
754 const { searchValue } = useSearch();
755 return {
756 components: components.filter((component) => component.name.toLowerCase().includes(searchValue.toLowerCase())),
757 isLoading,
758 searchValue
759 };
760 };
761
762 //#endregion
763 //#region packages/packages/core/editor-components/src/components/components-upgrade-alert.tsx
764 function ComponentsUpgradeAlert({ title, description, upgradeUrl }) {
765 return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: {
766 mt: "auto",
767 position: "sticky",
768 bottom: 0
769 } }, /* @__PURE__ */ react.createElement(_elementor_ui.Alert, {
770 variant: "standard",
771 color: "promotion",
772 icon: /* @__PURE__ */ react.createElement(_elementor_icons.CrownFilledIcon, { fontSize: "tiny" }),
773 role: "status",
774 size: "small",
775 action: /* @__PURE__ */ react.createElement(_elementor_ui.AlertAction, {
776 variant: "contained",
777 color: "promotion",
778 href: upgradeUrl,
779 target: "_blank",
780 rel: "noopener noreferrer"
781 }, (0, _wordpress_i18n.__)("Upgrade now", "elementor")),
782 sx: {
783 m: 2,
784 mt: 1
785 }
786 }, /* @__PURE__ */ react.createElement(_elementor_ui.AlertTitle, null, title), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, { variant: "caption" }, description)));
787 }
788
789 //#endregion
790 //#region packages/packages/core/editor-components/src/components/components-tab/components-pro-notification.tsx
791 var UPGRADE_URL = "https://go.elementor.com/go-pro-components-exist-footer/";
792 function ComponentsProNotification() {
793 return /* @__PURE__ */ react.createElement(ComponentsUpgradeAlert, {
794 title: (0, _wordpress_i18n.__)("Create new components", "elementor"),
795 description: (0, _wordpress_i18n.__)("Creating new components requires an active Pro subscription.", "elementor"),
796 upgradeUrl: UPGRADE_URL
797 });
798 }
799
800 //#endregion
801 //#region packages/packages/core/editor-components/src/components/components-update-alert.tsx
802 var UPDATE_PLUGINS_URL$1 = "/wp-admin/plugins.php";
803 function ComponentsUpdateAlert({ title, description }) {
804 return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: {
805 mt: "auto",
806 position: "sticky",
807 bottom: 0
808 } }, /* @__PURE__ */ react.createElement(_elementor_ui.Alert, {
809 variant: "standard",
810 color: "info",
811 icon: /* @__PURE__ */ react.createElement(_elementor_icons.InfoCircleFilledIcon, { fontSize: "tiny" }),
812 role: "status",
813 size: "small",
814 action: /* @__PURE__ */ react.createElement(_elementor_ui.AlertAction, {
815 variant: "contained",
816 color: "info",
817 href: UPDATE_PLUGINS_URL$1,
818 target: "_blank",
819 rel: "noopener noreferrer"
820 }, (0, _wordpress_i18n.__)("Upgrade Now", "elementor")),
821 sx: {
822 m: 2,
823 mt: 1
824 }
825 }, /* @__PURE__ */ react.createElement(_elementor_ui.AlertTitle, null, title), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, { variant: "caption" }, description)));
826 }
827
828 //#endregion
829 //#region packages/packages/core/editor-components/src/components/components-tab/components-update-notification.tsx
830 function ComponentsUpdateNotification() {
831 return /* @__PURE__ */ react.createElement(ComponentsUpdateAlert, {
832 title: (0, _wordpress_i18n.__)("Create new Components", "elementor"),
833 description: (0, _wordpress_i18n.__)("To create new components, update Elementor Pro to the latest version.", "elementor")
834 });
835 }
836
837 //#endregion
838 //#region packages/packages/core/editor-components/src/components/components-tab/components.tsx
839 var FULL_HEIGHT_STYLE_ID = "components-full-height-panel";
840 var FULL_HEIGHT_CSS = `
841 #elementor-panel-page-elements {
842 display: flex;
843 flex-direction: column;
844 height: 100%;
845 }
846
847 #elementor-panel-elements {
848 display: flex;
849 flex-direction: column;
850 flex: 1;
851 min-height: 0;
852 }
853
854 #elementor-panel-elements-wrapper {
855 display: flex;
856 flex-direction: column;
857 flex: 1;
858 min-height: 0;
859 }
860 `;
861 var useFullHeightPanel = () => {
862 (0, react.useLayoutEffect)(() => {
863 let style = document.getElementById(FULL_HEIGHT_STYLE_ID);
864 if (!style) {
865 style = document.createElement("style");
866 style.id = FULL_HEIGHT_STYLE_ID;
867 style.textContent = FULL_HEIGHT_CSS;
868 document.head.appendChild(style);
869 }
870 return () => {
871 document.getElementById(FULL_HEIGHT_STYLE_ID)?.remove();
872 };
873 }, []);
874 };
875 var ComponentsContent = () => {
876 const { components, isLoading } = useComponents();
877 const hasComponents = !isLoading && components.length > 0;
878 const showProNotification = !isProComponentsSupported() && hasComponents;
879 const isOutdated = isProOutdatedForComponents();
880 useFullHeightPanel();
881 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
882 justifyContent: "space-between",
883 sx: {
884 flex: 1,
885 minHeight: 0
886 }
887 }, hasComponents && /* @__PURE__ */ react.createElement(ComponentSearch, null), /* @__PURE__ */ react.createElement(ComponentsList, null), showProNotification && (isOutdated ? /* @__PURE__ */ react.createElement(ComponentsUpdateNotification, null) : /* @__PURE__ */ react.createElement(ComponentsProNotification, null)));
888 };
889 var Components = () => {
890 return /* @__PURE__ */ react.createElement(_elementor_editor_ui.ThemeProvider, null, /* @__PURE__ */ react.createElement(SearchProvider, { localStorageKey: "elementor-components-search" }, /* @__PURE__ */ react.createElement(ComponentsContent, null)));
891 };
892
893 //#endregion
894 //#region packages/packages/core/editor-components/src/components/detach-instance-confirmation-dialog.tsx
895 function DetachInstanceConfirmationDialog({ open, onClose, onConfirm }) {
896 return /* @__PURE__ */ react.createElement(_elementor_editor_ui.ConfirmationDialog, {
897 open,
898 onClose
899 }, /* @__PURE__ */ react.createElement(_elementor_editor_ui.ConfirmationDialog.Title, {
900 icon: _elementor_icons.AlertTriangleFilledIcon,
901 iconColor: "secondary"
902 }, (0, _wordpress_i18n.__)("Detach from Component?", "elementor")), /* @__PURE__ */ react.createElement(_elementor_editor_ui.ConfirmationDialog.Content, null, /* @__PURE__ */ react.createElement(_elementor_editor_ui.ConfirmationDialog.ContentText, null, (0, _wordpress_i18n.__)("Detaching this instance will break its link to the Component. Changes to the Component will no longer apply. Continue?", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_editor_ui.ConfirmationDialog.Actions, {
903 onClose,
904 onConfirm,
905 confirmLabel: (0, _wordpress_i18n.__)("Detach", "elementor"),
906 color: "primary"
907 }));
908 }
909 function openDetachConfirmDialog(onConfirm) {
910 const handleConfirm = () => {
911 (0, _elementor_editor_ui.closeDialog)();
912 onConfirm();
913 };
914 (0, _elementor_editor_ui.openDialog)({ component: /* @__PURE__ */ react.createElement(DetachInstanceConfirmationDialog, {
915 open: true,
916 onClose: _elementor_editor_ui.closeDialog,
917 onConfirm: handleConfirm
918 }) });
919 }
920
921 //#endregion
922 //#region packages/packages/core/editor-components/src/components/in-edit-mode.tsx
923 var openEditModeDialog = (lockedBy) => {
924 (0, _elementor_editor_ui.openDialog)({ component: /* @__PURE__ */ react.createElement(EditModeDialog, { lockedBy }) });
925 };
926 var EditModeDialog = ({ lockedBy }) => {
927 const content = (0, _wordpress_i18n.__)("%s is currently editing this document", "elementor").replace("%s", lockedBy);
928 return /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement(_elementor_ui.DialogHeader, { logo: false }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, {
929 display: "flex",
930 alignItems: "center",
931 gap: 1
932 }, /* @__PURE__ */ react.createElement(_elementor_ui.Icon, { color: "secondary" }, /* @__PURE__ */ react.createElement(_elementor_icons.InfoCircleFilledIcon, { fontSize: "medium" })), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, { variant: "subtitle1" }, content))), /* @__PURE__ */ react.createElement(_elementor_ui.DialogContent, null, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
933 spacing: 2,
934 direction: "column"
935 }, /* @__PURE__ */ react.createElement(_elementor_ui.Typography, { variant: "body2" }, (0, _wordpress_i18n.__)("You can wait for them to finish or reach out to coordinate your changes together.", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.DialogActions, null, /* @__PURE__ */ react.createElement(_elementor_ui.Button, {
936 color: "secondary",
937 variant: "contained",
938 onClick: _elementor_editor_ui.closeDialog
939 }, (0, _wordpress_i18n.__)("Close", "elementor"))))));
940 };
941
942 //#endregion
943 //#region packages/packages/core/editor-components/src/provider/component-instance-context.tsx
944 var ComponentInstanceContext = (0, react.createContext)(null);
945 function ComponentInstanceProvider({ children, ...props }) {
946 return /* @__PURE__ */ react.createElement(ComponentInstanceContext.Provider, { value: props }, children);
947 }
948 function useComponentInstanceContext() {
949 const context = (0, react.useContext)(ComponentInstanceContext);
950 if (!context) throw new Error("useComponentInstanceContext must be used within a ComponentInstanceProvider");
951 return context;
952 }
953 var useComponentId = () => useComponentInstanceContext().componentId;
954 var useComponentInstanceOverrides = () => useComponentInstanceContext().overrides;
955 var useComponentOverridableProps = () => useComponentInstanceContext().overridableProps;
956
957 //#endregion
958 //#region packages/packages/core/editor-components/src/prop-types/component-instance-override-prop-type.ts
959 var componentInstanceOverridePropTypeUtil = (0, _elementor_editor_props.createPropUtils)("override", _elementor_schema.z.object({
960 override_key: _elementor_schema.z.string(),
961 override_value: _elementor_schema.z.unknown(),
962 schema_source: _elementor_schema.z.object({
963 type: _elementor_schema.z.literal("component"),
964 id: _elementor_schema.z.number()
965 })
966 }));
967
968 //#endregion
969 //#region packages/packages/core/editor-components/src/prop-types/component-overridable-prop-type.ts
970 var componentOverridablePropTypeUtil = (0, _elementor_editor_props.createPropUtils)("overridable", _elementor_schema.z.object({
971 override_key: _elementor_schema.z.string(),
972 origin_value: _elementor_schema.z.object({
973 $$type: _elementor_schema.z.string(),
974 value: _elementor_schema.z.unknown()
975 }).nullable()
976 }));
977
978 //#endregion
979 //#region packages/packages/core/editor-components/src/prop-types/component-instance-overrides-prop-type.ts
980 var componentInstanceOverridesPropTypeUtil = (0, _elementor_editor_props.createPropUtils)("overrides", _elementor_schema.z.array(_elementor_schema.z.union([componentInstanceOverridePropTypeUtil.schema, componentOverridablePropTypeUtil.schema])).optional().default([]));
981
982 //#endregion
983 //#region packages/packages/core/editor-components/src/prop-types/component-instance-prop-type.ts
984 var componentInstancePropTypeUtil = (0, _elementor_editor_props.createPropUtils)("component-instance", _elementor_schema.z.object({
985 component_id: _elementor_editor_props.numberPropTypeUtil.schema,
986 overrides: _elementor_schema.z.optional(componentInstanceOverridesPropTypeUtil.schema)
987 }));
988
989 //#endregion
990 //#region packages/packages/core/editor-components/src/utils/tracking.ts
991 var FEATURE_NAME = "Components";
992 var trackComponentEvent = ({ action, source, executedBy, ...data }) => {
993 if (source === "system" || executedBy === "system") return;
994 const { dispatchEvent, config } = (0, _elementor_events.getMixpanel)();
995 if (!config?.names?.components?.[action]) return;
996 const name = config.names.components[action];
997 dispatchEvent?.(name, {
998 ...data,
999 executed_by: executedBy ?? source,
1000 "Feature name": FEATURE_NAME
1001 });
1002 };
1003 var onElementDrop = (_args, element) => {
1004 if (!(element?.model?.get("widgetType") === "e-component")) return;
1005 const editorSettings = element.model.get("editor_settings");
1006 const componentName = editorSettings?.title;
1007 const componentUID = editorSettings?.component_uid;
1008 const instanceId = element.id;
1009 const createdThisSession = selectCreatedThisSession((0, _elementor_store.__getState)());
1010 const isSameSessionReuse = componentUID && createdThisSession.includes(componentUID);
1011 const { locations, secondaryLocations } = window.elementorCommon.eventsManager.config;
1012 trackComponentEvent({
1013 action: "instanceAdded",
1014 executedBy: "user",
1015 instance_id: instanceId,
1016 component_uid: componentUID,
1017 component_name: componentName,
1018 is_same_session_reuse: isSameSessionReuse,
1019 location: locations.widgetPanel,
1020 secondary_location: secondaryLocations.componentsTab
1021 });
1022 };
1023
1024 //#endregion
1025 //#region packages/packages/core/editor-components/src/utils/detach-component-instance/regenerate-local-style-ids.ts
1026 function regenerateLocalStyleIds(element) {
1027 const originalStyles = element.styles;
1028 if (!originalStyles || Object.keys(originalStyles).length === 0) return {
1029 styles: void 0,
1030 settings: void 0
1031 };
1032 const newStyles = {};
1033 const styleIdMapping = {};
1034 for (const [originalStyleId, style] of Object.entries(originalStyles)) {
1035 const newStyleId = generateLocalStyleId(element.id);
1036 newStyles[newStyleId] = {
1037 ...style,
1038 id: newStyleId
1039 };
1040 styleIdMapping[originalStyleId] = newStyleId;
1041 }
1042 const settings = element.settings;
1043 if (!settings || Object.keys(settings).length === 0) return {
1044 styles: newStyles,
1045 settings: void 0
1046 };
1047 const updatedSettings = { ...settings };
1048 for (const [propKey, propValue] of Object.entries(updatedSettings)) if (isClassesProp(propValue) && propValue.value.length > 0) {
1049 const updatedClasses = propValue.value.map((classId) => styleIdMapping[classId] ?? classId);
1050 updatedSettings[propKey] = _elementor_editor_props.classesPropTypeUtil.create(updatedClasses);
1051 }
1052 return {
1053 styles: newStyles,
1054 settings: updatedSettings
1055 };
1056 }
1057 function isClassesProp(prop) {
1058 return _elementor_editor_props.classesPropTypeUtil.isValid(prop);
1059 }
1060 function generateLocalStyleId(elementId) {
1061 return `e-${elementId}-${(0, _elementor_editor_elements.generateElementId)()}`;
1062 }
1063
1064 //#endregion
1065 //#region packages/packages/core/editor-components/src/consts.ts
1066 var COMPONENT_WIDGET_TYPE$1 = "e-component";
1067
1068 //#endregion
1069 //#region packages/packages/core/editor-components/src/utils/is-component-instance.ts
1070 function isComponentInstance(elementModel) {
1071 return [elementModel.widgetType, elementModel.elType].includes(COMPONENT_WIDGET_TYPE$1);
1072 }
1073
1074 //#endregion
1075 //#region packages/packages/core/editor-components/src/utils/detach-component-instance/resolve-overridable-settings.ts
1076 function resolveOverridableSettings(element, overrideMap) {
1077 if (isComponentInstance({
1078 widgetType: element.widgetType,
1079 elType: element.elType
1080 })) return resolveOverridableSettingsForComponentInstance(element, overrideMap);
1081 return resolveOverridableSettingsForElement(element, overrideMap);
1082 }
1083 function resolveOverridableSettingsForElement(element, overrideMap) {
1084 const updatedSettings = element.settings ? { ...element.settings } : {};
1085 for (const [settingKey, settingValue] of Object.entries(element.settings ?? {})) updatedSettings[settingKey] = resolvePropValue(settingValue, overrideMap);
1086 return updatedSettings;
1087 }
1088 function resolveOverridableSettingsForComponentInstance(element, overrideMap) {
1089 const componentInstance = element.settings?.component_instance;
1090 if (!componentInstancePropTypeUtil.isValid(componentInstance)) return element.settings ?? {};
1091 const instanceOverrides = componentInstance.value.overrides?.value;
1092 if (!instanceOverrides?.length) return element.settings ?? {};
1093 const updatedOverrides = instanceOverrides.map((item) => resolvePropValue(item, overrideMap, { isOverridableOverride: true }));
1094 return {
1095 ...element.settings,
1096 component_instance: {
1097 ...componentInstance,
1098 value: {
1099 ...componentInstance.value,
1100 overrides: {
1101 ...componentInstance.value.overrides,
1102 value: updatedOverrides
1103 }
1104 }
1105 }
1106 };
1107 }
1108 function resolvePropValue(propValue, overrideMap, options) {
1109 const { isOverridableOverride = false } = options ?? {};
1110 if (!componentOverridablePropTypeUtil.isValid(propValue)) return propValue;
1111 const overridableKey = propValue.value.override_key;
1112 const matchingOverride = overrideMap.get(overridableKey);
1113 const originValue = componentOverridablePropTypeUtil.extract(propValue)?.origin_value;
1114 if (!matchingOverride) return originValue;
1115 if (isOverridableOverride) return resolveOverridableOverride(matchingOverride, originValue);
1116 return componentInstanceOverridePropTypeUtil.extract(matchingOverride)?.override_value ?? originValue;
1117 }
1118 function resolveOverridableOverride(matchingOverride, originValue) {
1119 if (!originValue || !componentInstanceOverridePropTypeUtil.isValid(originValue)) return null;
1120 return componentInstanceOverridePropTypeUtil.create({
1121 override_value: matchingOverride.value.override_value,
1122 override_key: originValue.value.override_key,
1123 schema_source: originValue.value.schema_source
1124 });
1125 }
1126
1127 //#endregion
1128 //#region packages/packages/core/editor-components/src/utils/detach-component-instance/resolve-detached-instance.ts
1129 function resolveDetachedInstance(element, overrides) {
1130 const overrideMap = createOverrideMap(overrides);
1131 return resolveElementRecursive(structuredClone(element), overrideMap);
1132 }
1133 function resolveElementRecursive(element, overrideMap) {
1134 element.id = (0, _elementor_editor_elements.generateElementId)();
1135 if (element.styles) {
1136 const { styles, settings } = regenerateLocalStyleIds(element);
1137 element.styles = styles;
1138 if (settings) element.settings = {
1139 ...element.settings,
1140 ...settings
1141 };
1142 }
1143 if (element.settings) element.settings = resolveOverridableSettings(element, overrideMap);
1144 if (element.elements?.length) element.elements = element.elements.map((child) => resolveElementRecursive(child, overrideMap));
1145 return element;
1146 }
1147 function createOverrideMap(overrides) {
1148 const map = /* @__PURE__ */ new Map();
1149 overrides.forEach((item) => {
1150 let override = null;
1151 if (componentInstanceOverridePropTypeUtil.isValid(item)) override = item;
1152 else if (componentOverridablePropTypeUtil.isValid(item)) override = getOverridableOverride(item);
1153 if (override) {
1154 const overrideKey = override.value.override_key;
1155 map.set(overrideKey, override);
1156 }
1157 });
1158 return map;
1159 }
1160 function getOverridableOverride(propValue) {
1161 if (!componentOverridablePropTypeUtil.isValid(propValue)) return null;
1162 const originValue = componentOverridablePropTypeUtil.extract(propValue)?.origin_value;
1163 if (!componentInstanceOverridePropTypeUtil.isValid(originValue)) return null;
1164 return originValue;
1165 }
1166
1167 //#endregion
1168 //#region packages/packages/core/editor-components/src/utils/detach-component-instance/detach-component-instance.ts
1169 var DETACH_EVENT = "elementor/components/detach-instance";
1170 var DETACH_UNDO_EVENT = "elementor/components/undo-detach-instance";
1171 var DETACH_REDO_EVENT = "elementor/components/redo-detach-instance";
1172 async function detachComponentInstance({ instanceId, componentId, trackingInfo }) {
1173 const instanceContainer = (0, _elementor_editor_elements.getContainer)(instanceId);
1174 if (!instanceContainer) throw new Error(`Instance container with ID "${instanceId}" not found.`);
1175 const componentData = await getComponentDocumentData(componentId);
1176 if (!componentData) throw new Error(`Component with ID "${componentId}" not found.`);
1177 const rootElement = componentData.elements?.[0];
1178 if (!rootElement) throw new Error(`Component with ID "${componentId}" has no root element.`);
1179 return (0, _elementor_editor_v1_adapters.undoable)({
1180 do: () => {
1181 const overrides = extractInstanceOverrides(instanceContainer);
1182 const detachedInstanceElementData = resolveDetachedInstance(rootElement, overrides);
1183 const originalInstanceModel = instanceContainer.model.toJSON();
1184 const actionId = (/* @__PURE__ */ new Date()).getTime();
1185 window.dispatchEvent(new CustomEvent(DETACH_EVENT, { detail: {
1186 detachedInstanceId: instanceId,
1187 detachActionId: actionId
1188 } }));
1189 const detachedElement = (0, _elementor_editor_elements.replaceElement)({
1190 currentElementId: instanceId,
1191 newElement: detachedInstanceElementData,
1192 withHistory: false
1193 });
1194 (0, _elementor_editor_elements.selectElement)(detachedElement.id);
1195 const componentUid = selectComponent((0, _elementor_store.__getState)(), componentId)?.uid;
1196 trackComponentEvent({
1197 action: "detached",
1198 executedBy: "user",
1199 component_uid: componentUid,
1200 instance_id: instanceId,
1201 location: trackingInfo.location,
1202 secondary_location: trackingInfo.secondaryLocation,
1203 trigger: trackingInfo.trigger
1204 });
1205 return {
1206 detachedElement,
1207 detachedInstanceElementData,
1208 originalInstanceModel,
1209 actionId
1210 };
1211 },
1212 undo: (_, { detachedElement, originalInstanceModel, actionId }) => {
1213 const restoredInstance = (0, _elementor_editor_elements.replaceElement)({
1214 currentElementId: detachedElement.id,
1215 newElement: originalInstanceModel,
1216 withHistory: false
1217 });
1218 window.dispatchEvent(new CustomEvent(DETACH_UNDO_EVENT, { detail: {
1219 restoredInstanceId: restoredInstance.id,
1220 detachActionId: actionId
1221 } }));
1222 (0, _elementor_editor_canvas.doAfterRender)([restoredInstance.id], () => {
1223 (0, _elementor_editor_elements.selectElement)(restoredInstance.id);
1224 });
1225 return restoredInstance;
1226 },
1227 redo: (_, doReturn, restoredInstance) => {
1228 const { detachedInstanceElementData, actionId } = doReturn;
1229 const detachedElement = (0, _elementor_editor_elements.replaceElement)({
1230 currentElementId: restoredInstance.id,
1231 newElement: detachedInstanceElementData,
1232 withHistory: false
1233 });
1234 window.dispatchEvent(new CustomEvent(DETACH_REDO_EVENT, { detail: {
1235 detachedInstanceId: detachedElement.id,
1236 detachActionId: actionId
1237 } }));
1238 (0, _elementor_editor_elements.selectElement)(detachedElement.id);
1239 return {
1240 ...doReturn,
1241 detachedElement
1242 };
1243 }
1244 }, {
1245 title: (0, _wordpress_i18n.__)("Detach from Component", "elementor"),
1246 subtitle: (0, _wordpress_i18n.__)("Instance detached", "elementor")
1247 })();
1248 }
1249 function extractInstanceOverrides(instanceContainer) {
1250 const settings = instanceContainer.model.toJSON().settings;
1251 const componentInstance = componentInstancePropTypeUtil.extract(settings?.component_instance);
1252 return componentInstanceOverridesPropTypeUtil.extract(componentInstance?.overrides) ?? [];
1253 }
1254
1255 //#endregion
1256 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/instance-panel-header.tsx
1257 function InstancePanelHeader({ componentName, actions }) {
1258 return /* @__PURE__ */ react.createElement(_elementor_editor_panels.PanelHeader, { sx: {
1259 justifyContent: "start",
1260 px: 2
1261 } }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
1262 direction: "row",
1263 alignItems: "center",
1264 flexGrow: 1,
1265 gap: 1,
1266 maxWidth: "100%"
1267 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentsIcon, {
1268 fontSize: "small",
1269 sx: { color: "text.tertiary" }
1270 }), /* @__PURE__ */ react.createElement(_elementor_editor_ui.EllipsisWithTooltip, {
1271 title: componentName,
1272 as: _elementor_editor_panels.PanelHeaderTitle,
1273 sx: { flexGrow: 1 }
1274 }), actions));
1275 }
1276 function EditComponentAction({ label, onClick, disabled = false, icon: Icon }) {
1277 return /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: label }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, {
1278 size: "tiny",
1279 onClick,
1280 "aria-label": label,
1281 disabled
1282 }, /* @__PURE__ */ react.createElement(Icon, { fontSize: "tiny" })));
1283 }
1284
1285 //#endregion
1286 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/detach-action.tsx
1287 var DetachAction = ({ componentInstanceId, componentId }) => {
1288 const [isDetachDialogOpen, setIsDetachDialogOpen] = (0, react.useState)(false);
1289 const handleDetachConfirm = async () => {
1290 setIsDetachDialogOpen(false);
1291 try {
1292 await detachComponentInstance({
1293 instanceId: componentInstanceId,
1294 componentId,
1295 trackingInfo: getDetachTrackingInfo()
1296 });
1297 } catch {
1298 (0, _elementor_editor_notifications.notify)({
1299 type: "error",
1300 message: (0, _wordpress_i18n.__)("Failed to detach component instance.", "elementor"),
1301 id: "detach-component-instance-failed"
1302 });
1303 }
1304 };
1305 const handleDetachCancel = () => {
1306 setIsDetachDialogOpen(false);
1307 };
1308 const handleDetachClick = () => {
1309 setIsDetachDialogOpen(true);
1310 };
1311 const detachLabel = (0, _wordpress_i18n.__)("Detach from Component", "elementor");
1312 return /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement(EditComponentAction, {
1313 label: detachLabel,
1314 icon: _elementor_icons.DetachIcon,
1315 onClick: handleDetachClick
1316 }), /* @__PURE__ */ react.createElement(DetachInstanceConfirmationDialog, {
1317 open: isDetachDialogOpen,
1318 onClose: handleDetachCancel,
1319 onConfirm: handleDetachConfirm
1320 }));
1321 };
1322 function getDetachTrackingInfo() {
1323 const config = window?.elementorCommon?.eventsManager?.config;
1324 if (!config) return {
1325 location: "",
1326 trigger: ""
1327 };
1328 return {
1329 location: config.locations.components.instanceEditingPanel,
1330 trigger: config.triggers.click
1331 };
1332 }
1333
1334 //#endregion
1335 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/empty-state.tsx
1336 var EmptyState = ({ onEditComponent }) => {
1337 const { canEdit } = useComponentsPermissions();
1338 const message = canEdit ? (0, _wordpress_i18n.__)("Edit the component to add properties, manage them or update the design across all instances.", "elementor") : (0, _wordpress_i18n.__)("With your current role, you cannot edit this component. Contact an administrator to add properties.", "elementor");
1339 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
1340 alignItems: "center",
1341 justifyContent: "start",
1342 height: "100%",
1343 color: "text.secondary",
1344 sx: {
1345 p: 2.5,
1346 pt: 8,
1347 pb: 5.5,
1348 mt: 1
1349 },
1350 gap: 1.5
1351 }, /* @__PURE__ */ react.createElement(_elementor_icons.ComponentPropListIcon, { fontSize: "large" }), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
1352 align: "center",
1353 variant: "subtitle2"
1354 }, (0, _wordpress_i18n.__)("No properties yet", "elementor")), /* @__PURE__ */ react.createElement(_elementor_ui.Typography, {
1355 align: "center",
1356 variant: "caption",
1357 maxWidth: "170px"
1358 }, message), canEdit && /* @__PURE__ */ react.createElement(_elementor_ui.Button, {
1359 variant: "outlined",
1360 color: "secondary",
1361 size: "small",
1362 sx: { mt: 1 },
1363 disabled: !onEditComponent,
1364 onClick: onEditComponent
1365 }, /* @__PURE__ */ react.createElement(_elementor_icons.PencilIcon, { fontSize: "small" }), (0, _wordpress_i18n.__)("Edit component", "elementor")));
1366 };
1367
1368 //#endregion
1369 //#region packages/packages/core/editor-components/src/hooks/use-controls-by-widget-type.ts
1370 function useControlsByWidgetType(type) {
1371 const elementType = (0, _elementor_editor_elements.getElementType)(type);
1372 if (!elementType) return {};
1373 return getControlsByBind(iterateControls(elementType.controls));
1374 }
1375 function iterateControls(controls) {
1376 return controls.map((control) => {
1377 if (control.type === "control" && "bind" in control.value) return control;
1378 if (control.type === "section") return iterateControls(control.value.items);
1379 return null;
1380 }).filter(Boolean).flat();
1381 }
1382 function getControlsByBind(controls) {
1383 return controls.reduce((controlsByBind, control) => ({
1384 ...controlsByBind,
1385 [control.value.bind]: control
1386 }), {});
1387 }
1388
1389 //#endregion
1390 //#region packages/packages/core/editor-components/src/provider/overridable-prop-context.tsx
1391 var OverridablePropContext = (0, react.createContext)(null);
1392 function OverridablePropProvider({ children, ...props }) {
1393 return /* @__PURE__ */ react.createElement(OverridablePropContext.Provider, { value: props }, children);
1394 }
1395 var useOverridablePropValue = () => (0, react.useContext)(OverridablePropContext)?.value;
1396 var useComponentInstanceElement = () => (0, react.useContext)(OverridablePropContext)?.componentInstanceElement;
1397
1398 //#endregion
1399 //#region packages/packages/core/editor-components/src/utils/resolve-override-prop-value.ts
1400 var resolveOverridePropValue = (originalPropValue) => {
1401 if (componentOverridablePropTypeUtil.isValid(originalPropValue)) return getOverridableValue(originalPropValue);
1402 if (componentInstanceOverridePropTypeUtil.isValid(originalPropValue)) return getOverrideValue(originalPropValue);
1403 return originalPropValue;
1404 };
1405 function getOverridableValue(overridableProp) {
1406 const overridableValue = componentOverridablePropTypeUtil.extract(overridableProp);
1407 if (!overridableValue) return null;
1408 if (componentInstanceOverridePropTypeUtil.isValid(overridableValue.origin_value)) return getOverrideValue(overridableValue.origin_value);
1409 return overridableValue.origin_value;
1410 }
1411 function getOverrideValue(overrideProp) {
1412 const overrideValue = componentInstanceOverridePropTypeUtil.extract(overrideProp);
1413 if (!overrideValue) return null;
1414 return overrideValue.override_value;
1415 }
1416
1417 //#endregion
1418 //#region packages/packages/core/editor-components/src/store/dispatchers.ts
1419 function safeDispatch() {
1420 return (0, _elementor_store.__getStore)()?.dispatch;
1421 }
1422 var componentsActions = {
1423 add(components) {
1424 (0, _elementor_store.__dispatch)(slice.actions.add(components));
1425 },
1426 load(components) {
1427 (0, _elementor_store.__dispatch)(slice.actions.load(components));
1428 },
1429 addUnpublished(component) {
1430 (0, _elementor_store.__dispatch)(slice.actions.addUnpublished(component));
1431 },
1432 removeUnpublished(uids) {
1433 (0, _elementor_store.__dispatch)(slice.actions.removeUnpublished(uids));
1434 },
1435 resetUnpublished() {
1436 (0, _elementor_store.__dispatch)(slice.actions.resetUnpublished());
1437 },
1438 addCreatedThisSession(uid) {
1439 (0, _elementor_store.__dispatch)(slice.actions.addCreatedThisSession(uid));
1440 },
1441 removeCreatedThisSession(uid) {
1442 (0, _elementor_store.__dispatch)(slice.actions.removeCreatedThisSession(uid));
1443 },
1444 archive(componentId) {
1445 (0, _elementor_store.__dispatch)(slice.actions.archive(componentId));
1446 },
1447 setCurrentComponentId(id) {
1448 safeDispatch()?.(slice.actions.setCurrentComponentId(id));
1449 },
1450 setPath(path) {
1451 safeDispatch()?.(slice.actions.setPath(path));
1452 },
1453 setOverridableProps(componentId, overridableProps) {
1454 (0, _elementor_store.__dispatch)(slice.actions.setOverridableProps({
1455 componentId,
1456 overridableProps
1457 }));
1458 },
1459 rename(componentUid, name) {
1460 (0, _elementor_store.__dispatch)(slice.actions.rename({
1461 componentUid,
1462 name
1463 }));
1464 },
1465 cleanUpdatedComponentNames() {
1466 (0, _elementor_store.__dispatch)(slice.actions.cleanUpdatedComponentNames());
1467 },
1468 updateComponentSanitizedAttribute(componentId, attribute) {
1469 (0, _elementor_store.__dispatch)(slice.actions.updateComponentSanitizedAttribute({
1470 componentId,
1471 attribute
1472 }));
1473 },
1474 resetSanitizedComponents() {
1475 (0, _elementor_store.__dispatch)(slice.actions.resetSanitizedComponents());
1476 }
1477 };
1478
1479 //#endregion
1480 //#region packages/packages/core/editor-components/src/store/selectors.ts
1481 function safeGetState() {
1482 return (0, _elementor_store.__getStore)()?.getState();
1483 }
1484 var componentsSelectors = {
1485 getOverridableProps(componentId) {
1486 return selectOverridableProps((0, _elementor_store.__getState)(), componentId);
1487 },
1488 getCurrentComponent() {
1489 return selectCurrentComponent((0, _elementor_store.__getState)());
1490 },
1491 getCurrentComponentId() {
1492 const state = safeGetState();
1493 if (!state) return null;
1494 return selectCurrentComponentId(state);
1495 },
1496 getUnpublishedComponents() {
1497 return selectUnpublishedComponents((0, _elementor_store.__getState)());
1498 },
1499 getUpdatedComponentNames() {
1500 return selectUpdatedComponentNames((0, _elementor_store.__getState)());
1501 },
1502 getArchivedThisSession() {
1503 return selectArchivedThisSession((0, _elementor_store.__getState)());
1504 },
1505 getCreatedThisSession() {
1506 return selectCreatedThisSession((0, _elementor_store.__getState)());
1507 },
1508 getComponents() {
1509 return selectComponents((0, _elementor_store.__getState)());
1510 },
1511 getComponentByUid(componentUid) {
1512 return selectComponentByUid((0, _elementor_store.__getState)(), componentUid);
1513 }
1514 };
1515
1516 //#endregion
1517 //#region packages/packages/core/editor-components/src/store/actions/update-overridable-prop.ts
1518 function updateOverridableProp(componentId, propValue, originPropFields) {
1519 const overridableProps = componentsSelectors.getOverridableProps(componentId);
1520 if (!overridableProps) return;
1521 const existingOverridableProp = overridableProps.props[propValue.override_key];
1522 if (!existingOverridableProp) return;
1523 const originValue = resolveOverridePropValue(propValue.origin_value);
1524 const newOverridableProp = originPropFields ? {
1525 originValue,
1526 originPropFields
1527 } : { originValue };
1528 const newOverridableProps = {
1529 ...overridableProps,
1530 props: {
1531 ...overridableProps.props,
1532 [existingOverridableProp.overrideKey]: {
1533 ...existingOverridableProp,
1534 ...newOverridableProp
1535 }
1536 }
1537 };
1538 componentsActions.setOverridableProps(componentId, newOverridableProps);
1539 }
1540
1541 //#endregion
1542 //#region packages/packages/core/editor-components/src/utils/get-prop-type-for-component-override.ts
1543 var getPropTypeForComponentOverride = (overridableProp) => {
1544 if (overridableProp.originPropFields) return getPropType(overridableProp.originPropFields);
1545 const { widgetType, propKey } = overridableProp;
1546 return getPropType({
1547 widgetType,
1548 propKey
1549 });
1550 };
1551 function getPropType({ widgetType, propKey }) {
1552 return ((0, _elementor_editor_elements.getWidgetsCache)()?.[widgetType]?.atomic_props_schema)?.[propKey];
1553 }
1554
1555 //#endregion
1556 //#region packages/packages/core/editor-components/src/utils/overridable-props-utils.ts
1557 function getMatchingOverride(overrides, overrideKey) {
1558 return overrides?.find((override) => {
1559 const overridableValue = componentOverridablePropTypeUtil.extract(override);
1560 if (overridableValue) return componentInstanceOverridePropTypeUtil.extract(overridableValue.origin_value)?.override_key === overrideKey;
1561 return override.value.override_key === overrideKey;
1562 }) ?? null;
1563 }
1564
1565 //#endregion
1566 //#region packages/packages/core/editor-components/src/components/control-label.tsx
1567 var ControlLabel = ({ children, ...props }) => {
1568 return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
1569 direction: "row",
1570 alignItems: "center",
1571 justifyItems: "start",
1572 gap: .25
1573 }, /* @__PURE__ */ react.createElement(_elementor_editor_controls.ControlFormLabel, { ...props }, children), /* @__PURE__ */ react.createElement(_elementor_editor_controls.ControlAdornments, null));
1574 };
1575
1576 //#endregion
1577 //#region packages/packages/core/editor-components/src/components/errors.ts
1578 var OverrideControlInnerElementNotFoundError = (0, _elementor_utils.createError)({
1579 code: "override_control_inner_element_not_found",
1580 message: `Component inner element not found for override control. The element may have been deleted without updating the overridable props, or the component has not finished rendering yet.`
1581 });
1582 var OverrideControlPropTypeNotFoundError = (0, _elementor_utils.createError)({
1583 code: "override_control_prop_type_not_found",
1584 message: "Prop type not found for override control."
1585 });
1586
1587 //#endregion
1588 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/utils/correct-exposed-empty-override.ts
1589 function correctExposedEmptyOverride(newPropValue, matchingOverride) {
1590 const newOverridableValue = componentOverridablePropTypeUtil.extract(newPropValue);
1591 if (!(newOverridableValue && matchingOverride === null)) return newPropValue;
1592 return componentOverridablePropTypeUtil.create({
1593 override_key: newOverridableValue.override_key,
1594 origin_value: null
1595 });
1596 }
1597
1598 //#endregion
1599 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/utils/resolve-element-settings.ts
1600 function applyOverridesToSettings(elementSettings, overrides) {
1601 const result = {};
1602 for (const [propKey, propValue] of Object.entries(elementSettings)) {
1603 const overridable = componentOverridablePropTypeUtil.extract(propValue);
1604 if (!overridable) {
1605 result[propKey] = propValue;
1606 continue;
1607 }
1608 const override = overrides[overridable.override_key];
1609 if (!override) {
1610 result[propKey] = propValue;
1611 continue;
1612 }
1613 if (override.outermostKey && override.outermostKey !== overridable.override_key) {
1614 const originValue = overridable.origin_value;
1615 result[propKey] = componentOverridablePropTypeUtil.create({
1616 override_key: override.outermostKey,
1617 origin_value: override.value ?? originValue
1618 });
1619 } else result[propKey] = override.value ?? propValue;
1620 }
1621 return result;
1622 }
1623 function unwrapOverridableSettings(elementSettings) {
1624 const result = {};
1625 for (const [propKey, propValue] of Object.entries(elementSettings)) {
1626 const overridable = componentOverridablePropTypeUtil.extract(propValue);
1627 if (!overridable) {
1628 result[propKey] = propValue;
1629 continue;
1630 }
1631 result[propKey] = overridable.origin_value;
1632 }
1633 return result;
1634 }
1635
1636 //#endregion
1637 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/utils/use-override-dependencies.ts
1638 function useOverrideControlDependencies({ existingOverride, resolvedElementSettings, elementId, elementType, propKey }) {
1639 return (0, react.useMemo)(() => {
1640 const { isDisabled, isHidden } = (0, _elementor_editor_editing_panel.extractDependencyEffect)(propKey, elementType.propsSchema, resolvedElementSettings);
1641 const existingOverrideValue = existingOverride ? resolveOverridePropValue(existingOverride) : null;
1642 const settingsForDepsNewValuesCalculation = {
1643 ...resolvedElementSettings,
1644 [propKey]: existingOverrideValue
1645 };
1646 const resolvedSettingsWithDefaults = (0, _elementor_editor_editing_panel.getElementSettingsWithDefaults)(elementType.propsSchema, settingsForDepsNewValuesCalculation);
1647 const dependents = (0, _elementor_editor_editing_panel.extractOrderedDependencies)(elementType.dependenciesPerTargetMapping ?? {});
1648 return {
1649 overrideValue: (0, _elementor_editor_editing_panel.getUpdatedValues)({ [propKey]: existingOverrideValue }, dependents, elementType.propsSchema, resolvedSettingsWithDefaults, elementId)[propKey],
1650 isDisabled,
1651 isHidden
1652 };
1653 }, [
1654 existingOverride,
1655 resolvedElementSettings,
1656 propKey,
1657 elementType.propsSchema,
1658 elementType.dependenciesPerTargetMapping,
1659 elementId
1660 ]);
1661 }
1662
1663 //#endregion
1664 //#region packages/packages/core/editor-components/src/utils/get-container-by-origin-id.ts
1665 function getContainerByOriginId(originElementId, instanceElementId) {
1666 if (!instanceElementId) return (0, _elementor_editor_elements.getContainer)(originElementId);
1667 const instanceContainer = (0, _elementor_editor_elements.getContainer)(instanceElementId);
1668 if (!instanceContainer) return null;
1669 return window.elementor?.getContainerByKeyValue?.({
1670 key: "originId",
1671 value: originElementId,
1672 parent: instanceContainer.view
1673 }) ?? null;
1674 }
1675
1676 //#endregion
1677 //#region packages/packages/core/editor-components/src/utils/get-overridable-prop.ts
1678 function getOverridableProp({ componentId, overrideKey }) {
1679 const overridableProps = selectOverridableProps((0, _elementor_store.__getState)(), componentId);
1680 if (!overridableProps) return;
1681 return overridableProps.props[overrideKey];
1682 }
1683
1684 //#endregion
1685 //#region packages/packages/core/editor-components/src/utils/resolve-overrides-chain.ts
1686 function resolveOverridesChain({ outerOverridableProp, outerInstanceId, overridesMapping = {} }) {
1687 if (!outerOverridableProp.originPropFields) {
1688 const innerElement = getContainerByOriginId(outerOverridableProp.elementId, outerInstanceId);
1689 if (!innerElement) throw new Error(`Inner element not found inside instance. elementId: ${outerOverridableProp.elementId}, instanceId: ${outerInstanceId}`);
1690 return {
1691 isChainBroken: false,
1692 innerElement,
1693 overridesMapping
1694 };
1695 }
1696 const currentInstance = getContainerByOriginId(outerOverridableProp.elementId, outerInstanceId);
1697 if (!currentInstance) return { isChainBroken: true };
1698 const { componentId, overrides } = extractComponentInstanceSettings(currentInstance);
1699 if (!componentId) throw new Error(`Component ID not found for current instance. currentInstanceId: ${currentInstance.id}. outerInstanceId: ${outerInstanceId}`);
1700 const mergedOverrides = buildOverridesMap(overridesMapping, overrides ?? []);
1701 const override = findOverrideByOuterKey(overrides, outerOverridableProp.overrideKey);
1702 const overrideKey = componentInstanceOverridePropTypeUtil.extract(override)?.override_key;
1703 if (!override || !overrideKey) return { isChainBroken: true };
1704 const overridableProp = getOverridableProp({
1705 componentId,
1706 overrideKey
1707 });
1708 if (!overridableProp) throw new Error(`Overridable prop not found. componentId: ${componentId}, overrideKey: ${overrideKey}`);
1709 return resolveOverridesChain({
1710 outerOverridableProp: overridableProp,
1711 outerInstanceId: currentInstance.id,
1712 overridesMapping: mergedOverrides
1713 });
1714 }
1715 function buildOverridesMap(existing, levelOverrides) {
1716 const result = { ...existing };
1717 for (const item of levelOverrides) {
1718 const overridableValue = componentOverridablePropTypeUtil.extract(item);
1719 if (overridableValue) {
1720 const override = componentInstanceOverridePropTypeUtil.extract(overridableValue.origin_value);
1721 if (!override) continue;
1722 const outerKey = overridableValue.override_key;
1723 const innerKey = override.override_key;
1724 const innerValue = override.override_value;
1725 const higherLevelOverride = existing[outerKey];
1726 if (higherLevelOverride) {
1727 result[innerKey] = {
1728 value: higherLevelOverride.value ?? innerValue,
1729 outermostKey: higherLevelOverride.outermostKey ?? outerKey
1730 };
1731 continue;
1732 }
1733 result[innerKey] = {
1734 value: innerValue,
1735 outermostKey: outerKey
1736 };
1737 } else {
1738 const override = componentInstanceOverridePropTypeUtil.extract(item);
1739 if (!override) continue;
1740 const key = override.override_key;
1741 result[key] = { value: override.override_value };
1742 }
1743 }
1744 return result;
1745 }
1746 function extractComponentInstanceSettings(element) {
1747 const instanceSetting = element.settings?.get("component_instance");
1748 const instanceValue = componentInstancePropTypeUtil.extract(instanceSetting);
1749 return {
1750 componentId: instanceValue?.component_id?.value,
1751 overrides: componentInstanceOverridesPropTypeUtil.extract(instanceValue?.overrides)
1752 };
1753 }
1754 function findOverrideByOuterKey(overrides, outerKey) {
1755 if (!overrides) return null;
1756 const overridableOverride = overrides.find((item) => {
1757 const overridableValue = componentOverridablePropTypeUtil.extract(item);
1758 if (!overridableValue) return false;
1759 return overridableValue.override_key === outerKey;
1760 });
1761 const override = componentOverridablePropTypeUtil.extract(overridableOverride)?.origin_value;
1762 if (!override || !componentInstanceOverridePropTypeUtil.isValid(override)) return null;
1763 return override;
1764 }
1765
1766 //#endregion
1767 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/utils/use-resolved-inner-element.ts
1768 function useResolvedInnerElement(overridableProp) {
1769 const componentInstanceElement = (0, _elementor_editor_editing_panel.useElement)();
1770 const componentId = useComponentId();
1771 const overrides = useComponentInstanceOverrides();
1772 const { elementId: originElementId, widgetType, elType } = overridableProp.originPropFields ?? overridableProp;
1773 const type = elType === "widget" ? widgetType : elType;
1774 const elementType = (0, _elementor_editor_elements.getElementType)(type);
1775 if (!elementType) throw new Error(`Element type not found for ${type}`);
1776 const { elementId, overridesMapping } = (0, react.useMemo)(() => {
1777 const overridesChainResult = resolveOverridesChain({
1778 outerOverridableProp: overridableProp,
1779 outerInstanceId: componentInstanceElement.element.id
1780 });
1781 if (overridesChainResult.isChainBroken) throw new OverrideControlInnerElementNotFoundError({ context: {
1782 componentId,
1783 elementId: originElementId
1784 } });
1785 return {
1786 elementId: overridesChainResult.innerElement.id,
1787 overridesMapping: overridesChainResult.overridesMapping
1788 };
1789 }, [
1790 overridableProp,
1791 componentInstanceElement.element.id,
1792 componentId,
1793 originElementId
1794 ]);
1795 const settingsWithInnerOverrides = (0, react.useMemo)(() => {
1796 return applyOverridesToSettings((0, _elementor_editor_elements.getElementSettings)(elementId, Object.keys(elementType?.propsSchema ?? {})), overridesMapping);
1797 }, [
1798 elementId,
1799 elementType?.propsSchema,
1800 overridesMapping
1801 ]);
1802 return {
1803 elementId,
1804 elementType,
1805 resolvedOriginValues: settingsWithInnerOverrides,
1806 resolvedElementSettings: (0, react.useMemo)(() => {
1807 return unwrapOverridableSettings(applyOverridesToSettings(settingsWithInnerOverrides, formatOverridesToApply(overrides)));
1808 }, [settingsWithInnerOverrides, overrides])
1809 };
1810 }
1811 function formatOverridesToApply(overrides) {
1812 if (!overrides) return {};
1813 const result = {};
1814 for (const item of overrides) {
1815 const overridable = componentOverridablePropTypeUtil.extract(item);
1816 let override = item;
1817 if (overridable) override = overridable.origin_value;
1818 const extractedOverride = componentInstanceOverridePropTypeUtil.extract(override);
1819 if (!extractedOverride) continue;
1820 result[extractedOverride.override_key] = { value: extractedOverride.override_value };
1821 }
1822 return result;
1823 }
1824
1825 //#endregion
1826 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/override-prop-control.tsx
1827 function OverridePropControl({ overrideKey }) {
1828 const overridableProp = useComponentOverridableProps().props[overrideKey];
1829 if (!overridableProp) return null;
1830 return /* @__PURE__ */ react.createElement(_elementor_editor_editing_panel.SettingsField, {
1831 bind: "component_instance",
1832 propDisplayName: overridableProp.label
1833 }, /* @__PURE__ */ react.createElement(OverrideControl, { overridableProp }));
1834 }
1835 function OverrideControl({ overridableProp }) {
1836 const componentInstanceElement = (0, _elementor_editor_editing_panel.useElement)();
1837 const { value: instanceValue, setValue: setInstanceValue } = (0, _elementor_editor_controls.useBoundProp)(componentInstancePropTypeUtil);
1838 const wrappingComponentId = useCurrentComponentId();
1839 const componentId = useComponentId();
1840 const overridableProps = useComponentOverridableProps();
1841 const overrides = useComponentInstanceOverrides();
1842 const controls = useControlsByWidgetType(overridableProp.originPropFields?.widgetType ?? overridableProp.widgetType);
1843 const controlReplacements = (0, _elementor_editor_controls.getControlReplacements)();
1844 const matchingOverride = getMatchingOverride(overrides, overridableProp.overrideKey);
1845 const { propKey } = overridableProp.originPropFields ?? overridableProp;
1846 const propType = getPropTypeForComponentOverride(overridableProp);
1847 if (!propType) throw new OverrideControlPropTypeNotFoundError({ context: { overridableProp } });
1848 const { elementId, elementType, resolvedElementSettings, resolvedOriginValues } = useResolvedInnerElement(overridableProp);
1849 const { overrideValue, isDisabled, isHidden } = useOverrideControlDependencies({
1850 existingOverride: matchingOverride,
1851 resolvedElementSettings,
1852 elementType,
1853 elementId,
1854 propKey
1855 });
1856 if (isHidden) return null;
1857 const { propValue, baseValue: resolvedBaseValue } = resolveOverrideValues(overrideValue, resolvedOriginValues, propKey);
1858 const value = { [overridableProp.overrideKey]: propValue };
1859 const baseValue = { [overridableProp.overrideKey]: resolvedBaseValue };
1860 const { control, controlProps, layout } = getControlParams(controls, overridableProp.originPropFields ?? overridableProp, overridableProp.label);
1861 const propTypeSchema = (0, _elementor_editor_editing_panel.createTopLevelObjectType)({ schema: { [overridableProp.overrideKey]: propType } });
1862 const setValue = (newValue, options, meta) => {
1863 let newPropValue = getTempNewValueForDynamicProp(propType, propValue, newValue[overridableProp.overrideKey]);
1864 newPropValue = correctExposedEmptyOverride(newPropValue, matchingOverride);
1865 const newOverrideValue = createOverrideValue({
1866 matchingOverride,
1867 overrideKey: overridableProp.overrideKey,
1868 overrideValue: newPropValue,
1869 componentId
1870 });
1871 let newOverrides = (overrides ?? []).filter((override) => isValidOverride(overridableProps, override)).map((override) => override === matchingOverride ? newOverrideValue : override);
1872 if (!matchingOverride) newOverrides = [...newOverrides, newOverrideValue];
1873 setInstanceValue({
1874 ...instanceValue,
1875 overrides: componentInstanceOverridesPropTypeUtil.create(newOverrides)
1876 }, options, meta);
1877 const overridableValue = componentOverridablePropTypeUtil.extract(newOverrideValue);
1878 if (overridableValue && wrappingComponentId) {
1879 if (overridableProp.originPropFields) {
1880 updateOverridableProp(wrappingComponentId, overridableValue, overridableProp.originPropFields);
1881 return;
1882 }
1883 const originPropFields = {
1884 elType: overridableProp.elType,
1885 widgetType: overridableProp.widgetType,
1886 propKey: overridableProp.propKey,
1887 elementId: overridableProp.elementId
1888 };
1889 updateOverridableProp(wrappingComponentId, overridableValue, originPropFields);
1890 }
1891 };
1892 return /* @__PURE__ */ react.createElement(OverridablePropProvider, {
1893 value: componentOverridablePropTypeUtil.extract(matchingOverride) ?? void 0,
1894 componentInstanceElement
1895 }, /* @__PURE__ */ react.createElement(_elementor_editor_editing_panel.ElementProvider, {
1896 element: {
1897 id: elementId,
1898 type: elementType.key
1899 },
1900 elementType,
1901 settings: resolvedElementSettings
1902 }, /* @__PURE__ */ react.createElement(_elementor_editor_controls.PropProvider, {
1903 propType: propTypeSchema,
1904 value,
1905 setValue,
1906 baseValue,
1907 isDisabled
1908 }, /* @__PURE__ */ react.createElement(_elementor_editor_controls.PropKeyProvider, { bind: overridableProp.overrideKey }, /* @__PURE__ */ react.createElement(_elementor_editor_controls.ControlReplacementsProvider, { replacements: controlReplacements }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { mb: 1.5 }, /* @__PURE__ */ react.createElement(_elementor_editor_editing_panel.ControlTypeContainer, { layout }, layout !== "custom" && /* @__PURE__ */ react.createElement(ControlLabel, null, overridableProp.label), /* @__PURE__ */ react.createElement(OriginalControl, {
1909 control,
1910 controlProps
1911 }))))))));
1912 }
1913 function resolveOverrideValues(overrideValue, resolvedOriginValues, propKey) {
1914 const inheritedValue = unwrapOverridableSettings(resolvedOriginValues)[propKey] ?? null;
1915 const isInheritedDynamic = (0, _elementor_editor_editing_panel.isDynamicPropValue)(inheritedValue);
1916 return {
1917 propValue: isInheritedDynamic && !overrideValue ? inheritedValue : overrideValue,
1918 baseValue: overrideValue || isInheritedDynamic ? null : inheritedValue
1919 };
1920 }
1921 function getTempNewValueForDynamicProp(propType, propValue, newPropValue) {
1922 if (newPropValue === null && (0, _elementor_editor_editing_panel.isDynamicPropValue)(propValue)) return propType.default ?? null;
1923 return newPropValue;
1924 }
1925 function createOverrideValue({ matchingOverride, overrideKey, overrideValue, componentId }) {
1926 const overridableValue = componentOverridablePropTypeUtil.extract(matchingOverride);
1927 const anyOverridable = componentOverridablePropTypeUtil.extract(overrideValue) ?? overridableValue;
1928 if (anyOverridable) {
1929 const innerOverride = componentInstanceOverridePropTypeUtil.create({
1930 override_key: overrideKey,
1931 override_value: resolveOverridePropValue(overrideValue),
1932 schema_source: {
1933 type: "component",
1934 id: componentId
1935 }
1936 });
1937 return componentOverridablePropTypeUtil.create({
1938 override_key: anyOverridable.override_key,
1939 origin_value: innerOverride
1940 });
1941 }
1942 return componentInstanceOverridePropTypeUtil.create({
1943 override_key: overrideKey,
1944 override_value: overrideValue,
1945 schema_source: {
1946 type: "component",
1947 id: componentId
1948 }
1949 });
1950 }
1951 function getControlParams(controls, originPropFields, label) {
1952 const control = controls[originPropFields.propKey];
1953 const { value } = control;
1954 const layout = getControlLayout(control);
1955 const controlProps = populateChildControlProps(value.props);
1956 if (layout === "custom") controlProps.label = label ?? value.label;
1957 return {
1958 control,
1959 controlProps,
1960 layout
1961 };
1962 }
1963 function OriginalControl({ control, controlProps }) {
1964 const { value } = control;
1965 return /* @__PURE__ */ react.createElement(_elementor_editor_editing_panel.BaseControl, {
1966 type: value.type,
1967 props: controlProps
1968 });
1969 }
1970 function getControlLayout(control) {
1971 return control.value.meta?.layout || _elementor_editor_editing_panel.controlsRegistry.getLayout(control.value.type);
1972 }
1973 function populateChildControlProps(props) {
1974 if (props.childControlType) {
1975 const childComponent = _elementor_editor_editing_panel.controlsRegistry.get(props.childControlType);
1976 const childPropType = _elementor_editor_editing_panel.controlsRegistry.getPropTypeUtil(props.childControlType);
1977 props = {
1978 ...props,
1979 childControlConfig: {
1980 component: childComponent,
1981 props: props.childControlProps || {},
1982 propTypeUtil: childPropType
1983 }
1984 };
1985 }
1986 return props;
1987 }
1988 function isValidOverride(overridableProps, override) {
1989 const overridableKey = componentOverridablePropTypeUtil.isValid(override) ? override.value.origin_value?.value.override_key : override.value.override_key;
1990 return !!overridableProps.props[overridableKey];
1991 }
1992
1993 //#endregion
1994 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/override-props-group.tsx
1995 function OverridePropsGroup({ group }) {
1996 const [isOpen, setIsOpen] = (0, _elementor_editor_editing_panel.useStateByElement)(group.id, true);
1997 const handleClick = () => {
1998 setIsOpen(!isOpen);
1999 };
2000 const id = (0, react.useId)();
2001 const labelId = `label-${id}`;
2002 const contentId = `content-${id}`;
2003 const title = group.label;
2004 return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { "aria-label": `${title} section` }, /* @__PURE__ */ react.createElement(_elementor_ui.ListItemButton, {
2005 id: labelId,
2006 "aria-controls": contentId,
2007 "aria-label": `${title} section`,
2008 onClick: handleClick,
2009 p: 0,
2010 sx: { "&:hover": { backgroundColor: "transparent" } }
2011 }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
2012 direction: "row",
2013 alignItems: "center",
2014 justifyItems: "start",
2015 flexGrow: 1,
2016 gap: .5
2017 }, /* @__PURE__ */ react.createElement(_elementor_ui.ListItemText, {
2018 secondary: title,
2019 secondaryTypographyProps: {
2020 color: "text.primary",
2021 variant: "caption",
2022 fontWeight: "bold"
2023 },
2024 sx: {
2025 flexGrow: 0,
2026 flexShrink: 1,
2027 marginInlineEnd: 1
2028 }
2029 })), /* @__PURE__ */ react.createElement(_elementor_editor_ui.CollapseIcon, {
2030 open: isOpen,
2031 color: "secondary",
2032 fontSize: "tiny"
2033 })), /* @__PURE__ */ react.createElement(_elementor_ui.Collapse, {
2034 id: contentId,
2035 "aria-labelledby": labelId,
2036 in: isOpen,
2037 timeout: "auto"
2038 }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
2039 direction: "column",
2040 gap: 1,
2041 p: 2
2042 }, group.props.map((overrideKey) => /* @__PURE__ */ react.createElement(OverridePropControl, {
2043 key: overrideKey,
2044 overrideKey
2045 })))));
2046 }
2047
2048 //#endregion
2049 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/instance-panel-body.tsx
2050 function InstancePanelBody({ groups, isEmpty, emptyState, componentInstanceId }) {
2051 return /* @__PURE__ */ react.createElement(_elementor_editor_panels.PanelBody, null, /* @__PURE__ */ react.createElement(_elementor_editor_controls.ControlAdornmentsProvider, { items: (0, _elementor_editor_editing_panel.getFieldIndicators)("settings") }, isEmpty ? emptyState : /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
2052 direction: "column",
2053 alignItems: "stretch"
2054 }, groups.map((group) => /* @__PURE__ */ react.createElement(react.Fragment, { key: group.id + componentInstanceId }, /* @__PURE__ */ react.createElement(OverridePropsGroup, { group }), /* @__PURE__ */ react.createElement(_elementor_ui.Divider, null))))));
2055 }
2056
2057 //#endregion
2058 //#region packages/packages/core/editor-components/src/utils/filter-valid-overridable-props.ts
2059 function filterValidOverridableProps(overridableProps, instanceElementId) {
2060 const validProps = {};
2061 for (const [key, prop] of Object.entries(overridableProps.props)) if (isExposedPropValid(prop, instanceElementId)) validProps[key] = prop;
2062 const validPropKeys = new Set(Object.keys(validProps));
2063 return {
2064 props: validProps,
2065 groups: {
2066 items: Object.fromEntries(Object.entries(overridableProps.groups.items).map(([groupId, group]) => [groupId, {
2067 ...group,
2068 props: group.props.filter((propKey) => validPropKeys.has(propKey))
2069 }])),
2070 order: overridableProps.groups.order
2071 }
2072 };
2073 }
2074 function isExposedPropValid(prop, instanceElementId) {
2075 const { isChainBroken } = resolveOverridesChain({
2076 outerOverridableProp: prop,
2077 outerInstanceId: instanceElementId
2078 });
2079 return !isChainBroken;
2080 }
2081
2082 //#endregion
2083 //#region packages/packages/core/editor-components/src/hooks/use-sanitize-overridable-props.ts
2084 function useSanitizeOverridableProps(componentId, instanceElementId) {
2085 const overridableProps = useOverridableProps(componentId);
2086 const isSanitized = useIsSanitizedComponent(componentId, "overridableProps");
2087 if (!overridableProps || !componentId) return;
2088 if (isSanitized) return overridableProps;
2089 return filterValidOverridableProps(overridableProps, instanceElementId);
2090 }
2091
2092 //#endregion
2093 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/use-instance-panel-data.ts
2094 function useInstancePanelData() {
2095 const { element, settings } = useComponentInstanceSettings();
2096 const componentId = settings?.component_id?.value;
2097 const overrides = settings?.overrides?.value;
2098 const component = useComponent(componentId ?? null);
2099 const componentInstanceId = element?.id;
2100 const overridableProps = useSanitizeOverridableProps(componentId ?? null, componentInstanceId);
2101 if (!componentId || !overridableProps || !component || !componentInstanceId) return null;
2102 const isNonEmptyGroup = (group) => group !== null && group.props.length > 0;
2103 const groups = overridableProps.groups.order.map((groupId) => overridableProps.groups.items[groupId] ?? null).filter(isNonEmptyGroup);
2104 return {
2105 componentId,
2106 component,
2107 overrides,
2108 overridableProps,
2109 groups,
2110 isEmpty: groups.length === 0 || Object.keys(overridableProps.props).length === 0,
2111 componentInstanceId
2112 };
2113 }
2114 function useComponentInstanceSettings() {
2115 const { element, settings } = (0, _elementor_editor_editing_panel.useElement)();
2116 return {
2117 element,
2118 settings: componentInstancePropTypeUtil.extract(settings.component_instance)
2119 };
2120 }
2121
2122 //#endregion
2123 //#region packages/packages/core/editor-components/src/components/instance-editing-panel/instance-editing-panel.tsx
2124 var EDIT_UPGRADE_URL = "https://go.elementor.com/go-pro-components-Instance-edit-footer/";
2125 function InstanceEditingPanel() {
2126 const { canEdit } = useComponentsPermissions();
2127 const data = useInstancePanelData();
2128 if (!data) return null;
2129 const { componentId, component, overrides, overridableProps, groups, isEmpty, componentInstanceId } = data;
2130 const panelTitle = (0, _wordpress_i18n.__)("Edit %s", "elementor").replace("%s", component.name);
2131 const actions = /* @__PURE__ */ react.createElement(_elementor_ui.Stack, {
2132 direction: "row",
2133 gap: .5
2134 }, /* @__PURE__ */ react.createElement(DetachAction, {
2135 componentInstanceId,
2136 componentId
2137 }), canEdit && /* @__PURE__ */ react.createElement(EditComponentAction, {
2138 disabled: true,
2139 label: panelTitle,
2140 icon: _elementor_icons.PencilIcon
2141 }));
2142 return /* @__PURE__ */ react.createElement(_elementor_ui.Box, {
2143 "data-testid": "instance-editing-panel",
2144 sx: {
2145 display: "flex",
2146 flexDirection: "column",
2147 height: "100%"
2148 }
2149 }, /* @__PURE__ */ react.createElement(ComponentInstanceProvider, {
2150 componentId,
2151 overrides,
2152 overridableProps
2153 }, /* @__PURE__ */ react.createElement(InstancePanelHeader, {
2154 componentName: component.name,
2155 actions
2156 }), /* @__PURE__ */ react.createElement(InstancePanelBody, {
2157 groups,
2158 isEmpty,
2159 emptyState: /* @__PURE__ */ react.createElement(EmptyState, null),
2160 componentInstanceId
2161 })), !isProComponentsSupported() && (isProOutdatedForComponents() ? /* @__PURE__ */ react.createElement(ComponentsUpdateAlert, {
2162 title: (0, _wordpress_i18n.__)("Edit Component", "elementor"),
2163 description: (0, _wordpress_i18n.__)("To edit components, update Elementor Pro to the latest version.", "elementor")
2164 }) : /* @__PURE__ */ react.createElement(ComponentsUpgradeAlert, {
2165 title: (0, _wordpress_i18n.__)("Edit components", "elementor"),
2166 description: (0, _wordpress_i18n.__)("Editing components requires an active Pro subscription.", "elementor"),
2167 upgradeUrl: EDIT_UPGRADE_URL
2168 })));
2169 }
2170
2171 //#endregion
2172 //#region packages/packages/core/editor-components/src/utils/get-component-documents.ts
2173 async function getComponentDocuments({ elements, cache = /* @__PURE__ */ new Map(), isRecursive = true }) {
2174 return getDocumentsMap(await getComponentIds(elements, cache, isRecursive), cache);
2175 }
2176 async function getComponentIds(elements, cache, isRecursive) {
2177 const results = await Promise.all(elements.filter(Boolean).map(async ({ widgetType, elType, elements: childElements, settings }) => {
2178 const ids = [];
2179 if (isComponentInstance({
2180 widgetType,
2181 elType
2182 })) {
2183 const componentId = settings?.component_instance?.value?.component_id.value;
2184 if (!componentId) return ids;
2185 ids.push(componentId);
2186 if (!cache.has(componentId)) cache.set(componentId, getComponentDocumentData(componentId));
2187 if (isRecursive) childElements = (await cache.get(componentId))?.elements;
2188 }
2189 if (childElements?.length) {
2190 const childIds = await getComponentIds(childElements, cache, isRecursive);
2191 ids.push(...childIds);
2192 }
2193 return ids;
2194 }));
2195 return [...new Set(results.flat())];
2196 }
2197 async function getDocumentsMap(ids, cache) {
2198 const documents = await Promise.all(ids.map(async (id) => {
2199 const document = await cache.get(id);
2200 if (!document) return null;
2201 return [id, document];
2202 }));
2203 return new Map(documents.filter((document) => document !== null));
2204 }
2205
2206 //#endregion
2207 //#region packages/packages/core/editor-components/src/store/actions/load-components-overridable-props.ts
2208 async function loadComponentsOverridableProps(componentIds, { force = false } = {}) {
2209 const idsToLoad = force ? componentIds : componentIds.filter((id) => !selectIsOverridablePropsLoaded((0, _elementor_store.__getState)(), id));
2210 if (!idsToLoad.length) return;
2211 const { data } = await apiClient.getOverridableProps(idsToLoad);
2212 (0, _elementor_store.__dispatch)(slice.actions.loadOverridableProps(data));
2213 }
2214
2215 //#endregion
2216 //#region packages/packages/core/editor-components/src/store/actions/load-components-assets.ts
2217 async function loadComponentsAssets(elements) {
2218 if (!elements.length) return;
2219 const documents = await getComponentDocuments({
2220 elements,
2221 isRecursive: false
2222 });
2223 updateDocumentState(documents);
2224 documents.forEach((document, id) => {
2225 _elementor_editor_embedded_documents_manager.embeddedDocumentsManager.setDocument(id, document);
2226 });
2227 await loadComponentsOverridableProps([...documents.keys()]);
2228 }
2229 function updateDocumentState(documents) {
2230 if ([...documents.values()].some(_elementor_editor_documents.isDocumentDirty)) (0, _elementor_editor_documents.setDocumentModifiedStatus)(true);
2231 }
2232
2233 //#endregion
2234 //#region packages/packages/core/editor-components/src/components/load-template-components.tsx
2235 var LoadTemplateComponents = () => {
2236 if ((0, _elementor_editor_templates.isHandlingTemplateStyles)()) return /* @__PURE__ */ react.createElement(LoadTemplateComponentsInternal, null);
2237 return null;
2238 };
2239 function LoadTemplateComponentsInternal() {
2240 const templates = (0, _elementor_editor_templates.useLoadedTemplates)();
2241 (0, react.useEffect)(() => {
2242 loadComponentsAssets(templates.flatMap((elements) => elements ?? []));
2243 }, [templates]);
2244 return null;
2245 }
2246
2247 //#endregion
2248 //#region packages/packages/core/editor-components/src/utils/format-component-elements-id.ts
2249 var ELEMENT_ID_LENGTH$1 = 7;
2250 function formatComponentElementsId(elements, path) {
2251 return elements.map((element) => {
2252 const nestingPath = [...path, element.id];
2253 const id = (0, _elementor_utils.hashString)(nestingPath.join("_"), ELEMENT_ID_LENGTH$1);
2254 return {
2255 ...element,
2256 id,
2257 originId: element.id,
2258 elements: element.elements ? formatComponentElementsId(element.elements, nestingPath) : void 0
2259 };
2260 });
2261 }
2262
2263 //#endregion
2264 //#region packages/packages/core/editor-components/src/utils/reconcile-component-instance-elements.ts
2265 var ELEMENT_ID_LENGTH = 7;
2266 function overridesRecordToMapping(overrides) {
2267 const mapping = {};
2268 for (const [key, value] of Object.entries(overrides)) mapping[key] = { value };
2269 return mapping;
2270 }
2271 function getElementConfig(element) {
2272 const type = element.elType === "widget" ? element.widgetType : element.elType;
2273 if (!type) return;
2274 return (0, _elementor_editor_elements.getWidgetsCache)()?.[type];
2275 }
2276 function deriveIds(element, seed) {
2277 const id = (0, _elementor_utils.hashString)(seed, ELEMENT_ID_LENGTH);
2278 return {
2279 ...element,
2280 id,
2281 elements: (element.elements ?? []).map((child, index) => deriveIds(child, `${id}_${index}`))
2282 };
2283 }
2284 function reconcileElementTree(element, overridesMapping) {
2285 const elementConfig = getElementConfig(element);
2286 const effectiveSettings = unwrapOverridableSettings(applyOverridesToSettings(element.settings ?? {}, overridesMapping));
2287 const originalChildren = element.elements ?? [];
2288 const originalChildIds = new Set(originalChildren.map((child) => child.id));
2289 const attributes = {
2290 elements: [...originalChildren],
2291 settings: effectiveSettings
2292 };
2293 if (elementConfig?.children_dependencies?.length) (0, _elementor_editor_elements.reconcileInitialChildren)({
2294 elementId: element.id,
2295 elementConfig,
2296 attributes
2297 });
2298 const reconciledChildren = (attributes.elements ?? []).map((child) => originalChildIds.has(child.id) ? child : deriveIds(child, `${element.id}_${child.elType}`)).map((child) => reconcileElementTree(child, overridesMapping));
2299 return {
2300 ...element,
2301 elements: reconciledChildren
2302 };
2303 }
2304 function reconcileComponentInstanceElements(elements, overrides = {}) {
2305 const overridesMapping = overridesRecordToMapping(overrides);
2306 return elements.map((element) => reconcileElementTree(element, overridesMapping));
2307 }
2308
2309 //#endregion
2310 //#region packages/packages/core/editor-components/src/utils/switch-to-component.ts
2311 async function switchToComponent(componentId, componentInstanceId, element) {
2312 const selector = getSelector(element, componentInstanceId);
2313 (0, _elementor_editor_documents.invalidateDocumentData)(componentId);
2314 await (0, _elementor_editor_documents.switchToDocument)(componentId, {
2315 selector,
2316 mode: "autosave",
2317 setAsInitial: false,
2318 shouldScroll: false
2319 });
2320 await loadComponentsOverridableProps([componentId], { force: true });
2321 const topLevelElement = (0, _elementor_editor_elements.getCurrentDocumentContainer)()?.children?.[0];
2322 if (topLevelElement) {
2323 (0, _elementor_editor_elements.selectElement)(topLevelElement.id);
2324 expandNavigator();
2325 }
2326 }
2327 async function expandNavigator() {
2328 await (0, _elementor_editor_v1_adapters.__privateRunCommand)("navigator/expand-all");
2329 }
2330 function getSelector(element, componentInstanceId) {
2331 if (element) return buildUniqueSelector(element);
2332 if (componentInstanceId) return `[data-id="${componentInstanceId}"]`;
2333 }
2334 function buildUniqueSelector(element) {
2335 const selectors = [];
2336 let current = element.closest("[data-id]");
2337 while (current) {
2338 const dataId = current.dataset.id;
2339 if (current.hasAttribute("data-elementor-id")) selectors.unshift(`[data-id="${dataId}"]`);
2340 current = current.parentElement?.closest("[data-id]") ?? null;
2341 }
2342 if (selectors.length === 0) {
2343 const closestElement = element.closest("[data-id]");
2344 if (closestElement?.dataset?.id) return `[data-id="${closestElement.dataset.id}"]`;
2345 }
2346 return selectors.join(" ");
2347 }
2348
2349 //#endregion
2350 //#region packages/packages/core/editor-components/src/create-component-type.ts
2351 var __defProp = Object.defineProperty;
2352 var __typeError = (msg) => {
2353 throw TypeError(msg);
2354 };
2355 var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
2356 enumerable: true,
2357 configurable: true,
2358 writable: true,
2359 value
2360 }) : obj[key] = value;
2361 var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
2362 var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
2363 var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
2364 var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
2365 var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
2366 var COMPONENT_WIDGET_TYPE = "e-component";
2367 var EDIT_COMPONENT_DB_CLICK_UPGRADE_URL = "https://go.elementor.com/go-pro-components-Instance-edit-canvas-double-click/";
2368 var EDIT_COMPONENT_CONTEXT_MENU_UPGRADE_URL = "https://go.elementor.com/go-pro-components-Instance-edit-context-menu/";
2369 var UPDATE_PLUGINS_URL = "/wp-admin/plugins.php";
2370 var COMPONENT_EDIT_UPGRADE_NOTIFICATION_ID = "component-edit-upgrade";
2371 var COMPONENT_EDIT_UPDATE_NOTIFICATION_ID = "component-edit-update";
2372 var COMPONENT_EDIT_UPGRADE_AUTO_HIDE_DURATION = 2e3;
2373 function notifyComponentEditUpgrade() {
2374 (0, _elementor_editor_notifications.notify)({
2375 type: "promotion",
2376 id: COMPONENT_EDIT_UPGRADE_NOTIFICATION_ID,
2377 message: (0, _wordpress_i18n.__)("Editing components requires an active Pro subscription.", "elementor"),
2378 autoHideDuration: COMPONENT_EDIT_UPGRADE_AUTO_HIDE_DURATION,
2379 additionalActionProps: [{
2380 size: "small",
2381 variant: "contained",
2382 color: "promotion",
2383 href: EDIT_COMPONENT_DB_CLICK_UPGRADE_URL,
2384 target: "_blank",
2385 children: (0, _wordpress_i18n.__)("Upgrade Now", "elementor")
2386 }]
2387 });
2388 }
2389 function notifyComponentEditUpdate() {
2390 (0, _elementor_editor_notifications.notify)({
2391 type: "info",
2392 id: COMPONENT_EDIT_UPDATE_NOTIFICATION_ID,
2393 message: (0, _wordpress_i18n.__)("To edit components, update Elementor Pro to the latest version.", "elementor"),
2394 additionalActionProps: [{
2395 size: "small",
2396 variant: "contained",
2397 color: "info",
2398 href: UPDATE_PLUGINS_URL,
2399 target: "_blank",
2400 children: (0, _wordpress_i18n.__)("Update Now", "elementor")
2401 }]
2402 });
2403 }
2404 var updateGroups = (groups, config) => {
2405 const disableMap = new Map(Object.entries(config.disable ?? {}));
2406 const addMap = new Map(Object.entries(config.add ?? {}));
2407 return groups.map((group) => {
2408 const disabledActions = disableMap.get(group.name) ?? [];
2409 const addConfig = addMap.get(group.name);
2410 const updatedActions = group.actions.map((action) => disabledActions.includes(action.name) ? {
2411 ...action,
2412 isEnabled: () => false
2413 } : action);
2414 if (addConfig) updatedActions.splice(addConfig.index, 0, ...addConfig.actions);
2415 return {
2416 ...group,
2417 actions: updatedActions
2418 };
2419 });
2420 };
2421 function createComponentType(options) {
2422 const WidgetType = window.elementor.modules.elements.types.Widget;
2423 const view = createComponentView({ ...options });
2424 return class extends WidgetType {
2425 getType() {
2426 return options.type;
2427 }
2428 getView() {
2429 return view;
2430 }
2431 getModel() {
2432 return createComponentModel();
2433 }
2434 };
2435 }
2436 function createComponentView(options) {
2437 var _componentRenderContext;
2438 var _a;
2439 const legacyWindow = window;
2440 return _a = class extends (0, _elementor_editor_canvas.createTemplatedElementView)(options) {
2441 constructor() {
2442 super(...arguments);
2443 __publicField(this, "eventsManagerConfig", legacyWindow.elementorCommon.eventsManager.config);
2444 __privateAdd(this, _componentRenderContext);
2445 }
2446 isComponentCurrentlyEdited() {
2447 return (0, _elementor_editor_documents.getCurrentDocument)()?.id === this.getComponentId();
2448 }
2449 getRenderContext() {
2450 const namespaceKey = this.getNamespaceKey();
2451 const parentContext = this._parent?.getRenderContext?.();
2452 const parentComponentContext = parentContext?.[namespaceKey];
2453 if (!__privateGet(this, _componentRenderContext)) return parentContext;
2454 const ownOverrides = __privateGet(this, _componentRenderContext).overrides ?? {};
2455 const parentOverrides = parentComponentContext?.overrides ?? {};
2456 return {
2457 ...parentContext,
2458 [namespaceKey]: { overrides: {
2459 ...parentOverrides,
2460 ...ownOverrides
2461 } }
2462 };
2463 }
2464 getResolverRenderContext() {
2465 const namespaceKey = this.getNamespaceKey();
2466 const ownContext = this.getRenderContext()?.[namespaceKey];
2467 if (!ownContext) return this._parent?.getResolverRenderContext?.();
2468 return {
2469 ...this._parent?.getResolverRenderContext?.(),
2470 ...ownContext
2471 };
2472 }
2473 afterSettingsResolve(settings) {
2474 const componentInstance = settings.component_instance;
2475 if (componentInstance) {
2476 __privateSet(this, _componentRenderContext, { overrides: componentInstance.overrides ?? {} });
2477 const instanceId = this.model.get("id");
2478 const formattedElements = formatComponentElementsId(reconcileComponentInstanceElements(componentInstance.elements ?? [], componentInstance.overrides ?? {}), [instanceId]);
2479 this.collection = legacyWindow.elementor.createBackboneElementsCollection(formattedElements);
2480 this.collection.models.forEach(setInactiveRecursively);
2481 settings.component_instance = "<template data-children-placeholder></template>";
2482 }
2483 return settings;
2484 }
2485 getDomElement() {
2486 return this.children.findByIndex(0)?.getDomElement() ?? this.$el;
2487 }
2488 attachBuffer(collectionView, buffer) {
2489 const childrenPlaceholder = collectionView.$el.find("[data-children-placeholder]").get(0);
2490 if (!childrenPlaceholder) {
2491 super.attachBuffer(collectionView, buffer);
2492 return;
2493 }
2494 childrenPlaceholder.replaceWith(buffer);
2495 }
2496 getComponentId() {
2497 return (this.options?.model?.get("settings")?.get("component_instance")?.value).component_id.value;
2498 }
2499 getContextMenuGroups() {
2500 const filteredGroups = super.getContextMenuGroups().filter((group) => group.name !== "save");
2501 if (!this.getComponentId()) return filteredGroups;
2502 return updateGroups(filteredGroups, this._getContextMenuConfig());
2503 }
2504 _getContextMenuConfig() {
2505 const isAdministrator = isUserAdministrator();
2506 const hasPro = (0, _elementor_utils.hasProInstalled)();
2507 const isOutdated = isProOutdatedForComponents();
2508 const editComponentAction = {
2509 name: "edit component",
2510 icon: "eicon-edit",
2511 title: () => (0, _wordpress_i18n.__)("Edit Component", "elementor"),
2512 ...!hasPro && !isOutdated && {
2513 shortcut: `<a href="${EDIT_COMPONENT_CONTEXT_MENU_UPGRADE_URL}" target="_blank" onclick="event.stopPropagation()" class="elementor-context-menu-list__item__shortcut__promotion-badge"><i class="eicon-upgrade-crown"></i></a>`,
2514 hasShortcutAction: true
2515 },
2516 isEnabled: () => isProComponentsSupported() || isOutdated,
2517 callback: (_, eventData) => this.editComponent(eventData)
2518 };
2519 const detachInstanceAction = {
2520 name: "detach instance",
2521 icon: "eicon-chain-broken",
2522 title: () => (0, _wordpress_i18n.__)("Detach from Component", "elementor"),
2523 isEnabled: () => true,
2524 callback: (_, eventData) => this.detachInstance(eventData)
2525 };
2526 return {
2527 add: { general: {
2528 index: 1,
2529 actions: isAdministrator ? [editComponentAction, detachInstanceAction] : [detachInstanceAction]
2530 } },
2531 disable: { clipboard: ["pasteStyle", "resetStyle"] }
2532 };
2533 }
2534 async switchDocument() {
2535 const { isAllowedToSwitchDocument, lockedBy } = await apiClient.getComponentLockStatus(this.getComponentId());
2536 if (!isAllowedToSwitchDocument) options.showLockedByModal?.(lockedBy || "");
2537 else switchToComponent(this.getComponentId(), this.model.get("id"), this.el);
2538 }
2539 editComponent({ trigger, location, secondaryLocation }) {
2540 if (isProOutdatedForComponents()) {
2541 notifyComponentEditUpdate();
2542 return;
2543 }
2544 if (!isProComponentsSupported() || this.isComponentCurrentlyEdited()) return;
2545 this.switchDocument();
2546 const editorSettings = this.model.get("editor_settings");
2547 trackComponentEvent({
2548 action: "edited",
2549 executedBy: "user",
2550 component_uid: editorSettings?.component_uid,
2551 component_name: editorSettings?.title,
2552 location,
2553 secondary_location: secondaryLocation,
2554 trigger
2555 });
2556 }
2557 detachInstance({ trigger, location, secondaryLocation }) {
2558 const componentId = this.getComponentId();
2559 const instanceId = this.model.get("id");
2560 if (!componentId || !instanceId) return;
2561 const handleConfirm = async () => {
2562 try {
2563 await detachComponentInstance({
2564 instanceId,
2565 componentId,
2566 trackingInfo: {
2567 location,
2568 secondaryLocation,
2569 trigger
2570 }
2571 });
2572 } catch {
2573 (0, _elementor_editor_notifications.notify)({
2574 type: "error",
2575 message: (0, _wordpress_i18n.__)("Failed to detach component instance.", "elementor"),
2576 id: "detach-component-instance-failed"
2577 });
2578 }
2579 };
2580 options.showDetachConfirmDialog?.(handleConfirm);
2581 }
2582 handleDblClick(e) {
2583 e.stopPropagation();
2584 if (!isUserAdministrator()) return;
2585 if (isProOutdatedForComponents()) {
2586 notifyComponentEditUpdate();
2587 return;
2588 }
2589 if (!(0, _elementor_utils.hasProInstalled)()) {
2590 notifyComponentEditUpgrade();
2591 return;
2592 }
2593 const { triggers, locations, secondaryLocations } = this.eventsManagerConfig;
2594 this.editComponent({
2595 trigger: triggers.doubleClick,
2596 location: locations.canvas,
2597 secondaryLocation: secondaryLocations.canvasElement
2598 });
2599 }
2600 events() {
2601 return {
2602 ...super.events(),
2603 dblclick: this.handleDblClick
2604 };
2605 }
2606 attributes() {
2607 return {
2608 ...super.attributes(),
2609 "data-elementor-id": this.getComponentId()
2610 };
2611 }
2612 }, _componentRenderContext = /* @__PURE__ */ new WeakMap(), _a;
2613 }
2614 function setInactiveRecursively(model) {
2615 const editSettings = model.get("editSettings");
2616 if (editSettings) editSettings.set("inactive", true);
2617 const elements = model.get("elements");
2618 if (elements) elements.forEach((childModel) => {
2619 setInactiveRecursively(childModel);
2620 });
2621 }
2622 function isUserAdministrator() {
2623 return window.elementor.config?.user?.is_administrator ?? false;
2624 }
2625 function createComponentModel() {
2626 const WidgetType = window.elementor.modules.elements.types.Widget;
2627 const BaseWidgetModel = new WidgetType().getModel();
2628 return BaseWidgetModel.extend({
2629 initialize(attributes, options) {
2630 BaseWidgetModel.prototype.initialize.call(this, attributes, options);
2631 const componentInstance = this.get("settings")?.get("component_instance");
2632 if (componentInstance?.value) {
2633 const componentId = componentInstance.value.component_id?.value;
2634 if (componentId && typeof componentId === "number") this.set("componentId", componentId);
2635 }
2636 this.set("isGlobal", true);
2637 },
2638 getTitle() {
2639 const editorSettings = this.get("editor_settings");
2640 const instanceTitle = editorSettings?.title;
2641 if (instanceTitle) return instanceTitle;
2642 const componentUid = editorSettings?.component_uid;
2643 if (componentUid) {
2644 const component = selectComponentByUid((0, _elementor_store.__getState)(), componentUid);
2645 if (component?.name) return component.name;
2646 }
2647 return window.elementor.getElementData(this).title;
2648 },
2649 getComponentId() {
2650 return this.get("componentId") || null;
2651 },
2652 getComponentName() {
2653 return this.getTitle();
2654 },
2655 getComponentUid() {
2656 return this.get("editor_settings")?.component_uid || null;
2657 }
2658 });
2659 }
2660
2661 //#endregion
2662 //#region packages/packages/core/editor-components/src/populate-store.ts
2663 function PopulateStore() {
2664 (0, react.useEffect)(() => {
2665 (0, _elementor_store.__dispatch)(loadComponents());
2666 }, []);
2667 return null;
2668 }
2669
2670 //#endregion
2671 //#region packages/packages/core/editor-components/src/prevent-circular-nesting.ts
2672 var COMPONENT_TYPE = "e-component";
2673 var COMPONENT_CIRCULAR_NESTING_ALERT = {
2674 type: "default",
2675 message: (0, _wordpress_i18n.__)("Can't add this component - components that contain each other can't be nested.", "elementor"),
2676 id: "circular-component-nesting-blocked"
2677 };
2678 function initCircularNestingPrevention() {
2679 (0, _elementor_editor_v1_adapters.blockCommand)({
2680 command: "document/elements/create",
2681 condition: blockCircularCreate
2682 });
2683 (0, _elementor_editor_v1_adapters.blockCommand)({
2684 command: "document/elements/move",
2685 condition: blockCircularMove
2686 });
2687 (0, _elementor_editor_v1_adapters.blockCommand)({
2688 command: "document/elements/paste",
2689 condition: blockCircularPaste
2690 });
2691 }
2692 function wouldCreateCircularNesting(componentIdToAdd) {
2693 if (componentIdToAdd === void 0) return false;
2694 const state = (0, _elementor_store.__getState)();
2695 const currentComponentId = selectCurrentComponentId(state);
2696 const path = selectPath(state);
2697 if (currentComponentId === null) return false;
2698 if (componentIdToAdd === currentComponentId) return true;
2699 return path.some((item) => item.componentId === componentIdToAdd);
2700 }
2701 function extractComponentIdFromModel(model) {
2702 if (!model) return null;
2703 if (!(model.widgetType === COMPONENT_TYPE)) return null;
2704 return model.settings?.component_instance?.value?.component_id?.value ?? null;
2705 }
2706 function extractComponentIdFromElement(element) {
2707 if (element.widgetType !== COMPONENT_TYPE) return null;
2708 return element.settings?.component_instance?.value?.component_id?.value ?? null;
2709 }
2710 function extractComponentIdsFromElements(elements) {
2711 const ids = [];
2712 for (const element of elements) {
2713 const componentId = extractComponentIdFromElement(element);
2714 if (componentId !== null) ids.push(componentId);
2715 if (element.elements?.length) ids.push(...extractComponentIdsFromElements(element.elements));
2716 }
2717 return ids;
2718 }
2719 function extractComponentIdFromContainer(container) {
2720 if (container.model?.get?.("widgetType") !== COMPONENT_TYPE) return null;
2721 return ((container.model?.get?.("settings"))?.get?.("component_instance"))?.value?.component_id?.value ?? null;
2722 }
2723 function blockCircularCreate(args) {
2724 const componentId = extractComponentIdFromModel(args.model);
2725 if (componentId === null) return false;
2726 const isBlocked = wouldCreateCircularNesting(componentId);
2727 if (isBlocked) (0, _elementor_editor_notifications.notify)(COMPONENT_CIRCULAR_NESTING_ALERT);
2728 return isBlocked;
2729 }
2730 function blockCircularMove(args) {
2731 const { containers = [args.container] } = args;
2732 const hasCircularComponent = containers.some((container) => {
2733 if (!container) return false;
2734 return (0, _elementor_editor_elements.getAllDescendants)(container).some((element) => {
2735 const componentId = extractComponentIdFromContainer(element);
2736 if (componentId === null) return false;
2737 return wouldCreateCircularNesting(componentId);
2738 });
2739 });
2740 if (hasCircularComponent) (0, _elementor_editor_notifications.notify)(COMPONENT_CIRCULAR_NESTING_ALERT);
2741 return hasCircularComponent;
2742 }
2743 function blockCircularPaste(args) {
2744 const { storageType } = args;
2745 if (storageType !== "localstorage") return false;
2746 const data = window?.elementorCommon?.storage?.get();
2747 if (!data?.clipboard?.elements) return false;
2748 const hasCircularComponent = extractComponentIdsFromElements(data.clipboard.elements).some(wouldCreateCircularNesting);
2749 if (hasCircularComponent) (0, _elementor_editor_notifications.notify)(COMPONENT_CIRCULAR_NESTING_ALERT);
2750 return hasCircularComponent;
2751 }
2752
2753 //#endregion
2754 //#region packages/packages/core/editor-components/src/store/actions/remove-component-styles.ts
2755 function removeComponentStyles(id) {
2756 apiClient.invalidateComponentConfigCache(id);
2757 }
2758
2759 //#endregion
2760 //#region packages/packages/core/editor-components/src/sync/publish-draft-components-in-page-before-save.ts
2761 var INSUFFICIENT_PERMISSIONS_ERROR_CODE = "insufficient_permissions";
2762 var PUBLISH_UPGRADE_URL = "https://go.elementor.com/go-pro-components-Instance-draft-failure/";
2763 var PUBLISH_UPGRADE_NOTIFICATION_ID = "component-publish-upgrade";
2764 async function publishDraftComponentsInPageBeforeSave({ status, elements }) {
2765 if (status !== "publish") return;
2766 const draftIds = [...(await getComponentDocuments({ elements })).values()].filter(_elementor_editor_documents.isDocumentDirty).map((document) => document.id);
2767 if (draftIds.length === 0) return;
2768 try {
2769 await apiClient.updateStatuses(draftIds, "publish");
2770 } catch (error) {
2771 if (isInsufficientPermissionsError(error)) {
2772 notifyPublishUpgrade();
2773 return;
2774 }
2775 throw error;
2776 }
2777 draftIds.forEach((id) => (0, _elementor_editor_documents.invalidateDocumentData)(id));
2778 }
2779 function isInsufficientPermissionsError(error) {
2780 return error instanceof _elementor_http_client.AxiosError && error.response?.data?.code === INSUFFICIENT_PERMISSIONS_ERROR_CODE;
2781 }
2782 function notifyPublishUpgrade() {
2783 (0, _elementor_editor_notifications.notify)({
2784 type: "promotion",
2785 id: PUBLISH_UPGRADE_NOTIFICATION_ID,
2786 message: (0, _wordpress_i18n.__)("You have unpublished component on this page. You need a pro version to publish it.", "elementor"),
2787 additionalActionProps: [{
2788 size: "small",
2789 variant: "contained",
2790 color: "promotion",
2791 href: PUBLISH_UPGRADE_URL,
2792 target: "_blank",
2793 children: (0, _wordpress_i18n.__)("Upgrade Now", "elementor")
2794 }]
2795 });
2796 }
2797
2798 //#endregion
2799 //#region packages/packages/core/editor-components/src/sync/before-save.ts
2800 var beforeSave = ({ container, status }) => {
2801 return publishDraftComponentsInPageBeforeSave({
2802 elements: container?.model.get("elements").toJSON?.() ?? [],
2803 status
2804 });
2805 };
2806
2807 //#endregion
2808 //#region packages/packages/core/editor-components/src/sync/load-component-data-after-instance-added.ts
2809 function initLoadComponentDataAfterInstanceAdded() {
2810 (0, _elementor_editor_v1_adapters.registerDataHook)("after", "document/elements/paste", (_args, result) => {
2811 load(result);
2812 });
2813 (0, _elementor_editor_v1_adapters.registerDataHook)("after", "document/elements/import", (_args, result) => {
2814 load(result);
2815 });
2816 }
2817 function load(result) {
2818 if (!result) return;
2819 loadComponentsAssets((Array.isArray(result) ? result : [result]).map((container) => container.model?.toJSON()).filter((element) => !!element));
2820 }
2821
2822 //#endregion
2823 //#region packages/packages/core/editor-components/src/init.ts
2824 function init() {
2825 (0, _elementor_store.__registerSlice)(slice);
2826 (0, _elementor_editor_canvas.registerElementType)(COMPONENT_WIDGET_TYPE, (options) => createComponentType({
2827 ...options,
2828 showLockedByModal: openEditModeDialog,
2829 showDetachConfirmDialog: openDetachConfirmDialog
2830 }));
2831 window.elementorCommon.__beforeSave = beforeSave;
2832 (0, _elementor_editor_elements_panel.injectTab)({
2833 id: "components",
2834 label: (0, _wordpress_i18n.__)("Components", "elementor"),
2835 component: Components,
2836 position: 1
2837 });
2838 (0, _elementor_editor.injectIntoLogic)({
2839 id: "components-populate-store",
2840 component: PopulateStore
2841 });
2842 (0, _elementor_editor_v1_adapters.registerDataHook)("after", "editor/documents/attach-preview", () => {
2843 const { id, config } = (0, _elementor_editor_documents.getV1CurrentDocument)() ?? {};
2844 if (!id) return;
2845 removeComponentStyles(id);
2846 loadComponentsAssets(config?.elements ?? []);
2847 });
2848 _elementor_editor_embedded_documents_manager.embeddedDocumentsManager.onDocumentLoad((_documentId, data) => {
2849 loadComponentsAssets(data.elements ?? []);
2850 });
2851 (0, _elementor_editor.injectIntoLogic)({
2852 id: "templates",
2853 component: LoadTemplateComponents
2854 });
2855 (0, _elementor_editor_editing_panel.registerEditingPanelReplacement)({
2856 id: "component-instance-edit-panel",
2857 condition: (_, elementType) => elementType.key === "e-component",
2858 component: InstanceEditingPanel
2859 });
2860 _elementor_editor_canvas.settingsTransformersRegistry.register("component-instance", componentInstanceTransformer);
2861 _elementor_editor_canvas.settingsTransformersRegistry.register("overridable", componentOverridableTransformer);
2862 _elementor_editor_canvas.settingsTransformersRegistry.register("override", componentOverrideTransformer);
2863 initCircularNestingPrevention();
2864 initLoadComponentDataAfterInstanceAdded();
2865 }
2866
2867 //#endregion
2868 //#region packages/packages/core/editor-components/src/index.ts
2869 var src_exports = /* @__PURE__ */ __exportAll({
2870 COMPONENT_WIDGET_TYPE: () => COMPONENT_WIDGET_TYPE,
2871 ComponentInstanceProvider: () => ComponentInstanceProvider,
2872 ComponentItem: () => ComponentItem,
2873 ComponentName: () => ComponentName,
2874 ComponentSearch: () => ComponentSearch,
2875 ComponentsList: () => ComponentsList,
2876 DetachAction: () => DetachAction,
2877 EditComponentAction: () => EditComponentAction,
2878 EmptySearchResult: () => EmptySearchResult,
2879 InstanceEmptyState: () => EmptyState,
2880 InstancePanelBody: () => InstancePanelBody,
2881 InstancePanelHeader: () => InstancePanelHeader,
2882 LoadingComponents: () => LoadingComponents,
2883 OverridablePropProvider: () => OverridablePropProvider,
2884 SLICE_NAME: () => SLICE_NAME,
2885 SearchProvider: () => SearchProvider,
2886 apiClient: () => apiClient,
2887 componentInstanceOverridePropTypeUtil: () => componentInstanceOverridePropTypeUtil,
2888 componentInstanceOverridesPropTypeUtil: () => componentInstanceOverridesPropTypeUtil,
2889 componentInstancePropTypeUtil: () => componentInstancePropTypeUtil,
2890 componentOverridablePropTypeUtil: () => componentOverridablePropTypeUtil,
2891 componentsActions: () => componentsActions,
2892 componentsSelectors: () => componentsSelectors,
2893 createComponentsAction: () => createComponentsAction,
2894 filterValidOverridableProps: () => filterValidOverridableProps,
2895 getComponentDocumentData: () => getComponentDocumentData,
2896 getContainerByOriginId: () => getContainerByOriginId,
2897 getOverridableProp: () => getOverridableProp,
2898 getPropTypeForComponentOverride: () => getPropTypeForComponentOverride,
2899 init: () => init,
2900 isComponentInstance: () => isComponentInstance,
2901 loadComponentsAssets: () => loadComponentsAssets,
2902 onElementDrop: () => onElementDrop,
2903 publishDraftComponentsInPageBeforeSave: () => publishDraftComponentsInPageBeforeSave,
2904 registerComponentsReducer: () => registerComponentsReducer,
2905 resolveOverridePropValue: () => resolveOverridePropValue,
2906 selectComponentByUid: () => selectComponentByUid,
2907 selectCreatedThisSession: () => selectCreatedThisSession,
2908 selectOverridableProps: () => selectOverridableProps,
2909 selectPath: () => selectPath,
2910 slice: () => slice,
2911 switchToComponent: () => switchToComponent,
2912 trackComponentEvent: () => trackComponentEvent,
2913 updateOverridableProp: () => updateOverridableProp,
2914 useComponentInstanceElement: () => useComponentInstanceElement,
2915 useComponents: () => useComponents,
2916 useComponentsPermissions: () => useComponentsPermissions,
2917 useCurrentComponent: () => useCurrentComponent,
2918 useCurrentComponentId: () => useCurrentComponentId,
2919 useFilteredComponents: () => useFilteredComponents,
2920 useInstancePanelData: () => useInstancePanelData,
2921 useIsSanitizedComponent: () => useIsSanitizedComponent,
2922 useOverridablePropValue: () => useOverridablePropValue,
2923 useOverridableProps: () => useOverridableProps,
2924 useSanitizeOverridableProps: () => useSanitizeOverridableProps
2925 });
2926
2927 //#endregion
2928 //#region \0elementor-package-library-entry
2929 (window.elementorV2 = window.elementorV2 || {}).editorComponents = src_exports;
2930
2931 //#endregion
2932 })(elementorV2.editor, elementorV2.editorCanvas, elementorV2.editorDocuments, elementorV2.editorEditingPanel, elementorV2.editorElementsPanel, elementorV2.editorEmbeddedDocumentsManager, elementorV2.editorV1Adapters, elementorV2.store, wp.i18n, elementorV2.httpClient, React, elementorV2.editorUi, elementorV2.ui, elementorV2.utils, elementorV2.icons, elementorV2.editorCurrentUser, elementorV2.editorNotifications, elementorV2.editorElements, elementorV2.editorProps, elementorV2.schema, elementorV2.events, elementorV2.editorPanels, elementorV2.editorControls, elementorV2.editorTemplates);
2933 window.elementorV2.editorComponents?.init?.();
2934 //# sourceMappingURL=editor-components.js.map