@elementor/editor-components 4.0.0-564 → 4.0.0-591

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/index.js +3801 -3744
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.mjs +3813 -3761
  4. package/dist/index.mjs.map +1 -1
  5. package/package.json +23 -22
  6. package/src/components/components-tab/components-item.tsx +5 -4
  7. package/src/components/components-tab/components-list.tsx +5 -13
  8. package/src/components/components-tab/loading-components.tsx +2 -3
  9. package/src/components/instance-editing-panel/instance-editing-panel.tsx +17 -5
  10. package/src/components/instance-editing-panel/override-prop-control.tsx +13 -7
  11. package/src/components/instance-editing-panel/use-resolved-origin-value.tsx +1 -1
  12. package/src/components/load-template-components.tsx +14 -0
  13. package/src/create-component-type.ts +8 -2
  14. package/src/{components → extended/components}/component-panel-header/component-panel-header.tsx +4 -4
  15. package/src/{components → extended/components}/component-properties-panel/component-properties-panel-content.tsx +2 -2
  16. package/src/{components → extended/components}/component-properties-panel/properties-empty-state.tsx +1 -1
  17. package/src/{components → extended/components}/component-properties-panel/properties-group.tsx +1 -1
  18. package/src/{components → extended/components}/component-properties-panel/property-item.tsx +1 -1
  19. package/src/{components → extended/components}/component-properties-panel/use-current-editable-item.ts +1 -1
  20. package/src/{components → extended/components}/component-properties-panel/utils/generate-unique-label.ts +1 -1
  21. package/src/{components → extended/components}/component-properties-panel/utils/validate-group-label.ts +1 -1
  22. package/src/{components → extended/components}/create-component-form/create-component-form.tsx +5 -5
  23. package/src/{components → extended/components}/edit-component/component-modal.tsx +2 -2
  24. package/src/{components → extended/components}/edit-component/edit-component.tsx +3 -3
  25. package/src/{components → extended/components}/overridable-props/overridable-prop-control.tsx +7 -7
  26. package/src/{components → extended/components}/overridable-props/overridable-prop-form.tsx +1 -1
  27. package/src/{components → extended/components}/overridable-props/overridable-prop-indicator.tsx +7 -7
  28. package/src/{components → extended}/consts.ts +2 -1
  29. package/src/{hooks → extended/hooks}/use-navigate-back.ts +2 -2
  30. package/src/extended/init.ts +77 -0
  31. package/src/{mcp → extended/mcp}/save-as-component-tool.ts +2 -2
  32. package/src/{prevent-non-atomic-nesting.ts → extended/prevent-non-atomic-nesting.ts} +1 -1
  33. package/src/{store → extended/store}/actions/add-overridable-group.ts +3 -3
  34. package/src/{store → extended/store}/actions/create-unpublished-component.ts +4 -4
  35. package/src/{store → extended/store}/actions/delete-overridable-group.ts +2 -2
  36. package/src/extended/store/actions/delete-overridable-prop.ts +70 -0
  37. package/src/{store → extended/store}/actions/rename-overridable-group.ts +2 -2
  38. package/src/{store → extended/store}/actions/reorder-group-props.ts +2 -2
  39. package/src/{store → extended/store}/actions/reorder-overridable-groups.ts +2 -2
  40. package/src/{store → extended/store}/actions/reset-sanitized-components.ts +1 -1
  41. package/src/{store → extended/store}/actions/set-overridable-prop.ts +3 -3
  42. package/src/{store → extended/store}/actions/update-component-sanitized-attribute.ts +2 -2
  43. package/src/{store → extended/store}/actions/update-current-component.ts +2 -14
  44. package/src/{store → extended/store}/actions/update-overridable-prop-params.ts +2 -2
  45. package/src/{store → extended/store}/utils/groups-transformers.ts +6 -4
  46. package/src/extended/sync/before-save.ts +52 -0
  47. package/src/{sync → extended/sync}/cleanup-overridable-props-on-delete.ts +24 -24
  48. package/src/{sync → extended/sync}/create-components-before-save.ts +4 -4
  49. package/src/{sync → extended/sync}/handle-component-edit-mode-container.ts +1 -1
  50. package/src/{sync → extended/sync}/revert-overridables-on-copy-or-duplicate.ts +1 -1
  51. package/src/{sync → extended/sync}/set-component-overridable-props-settings-before-save.ts +2 -2
  52. package/src/{sync → extended/sync}/update-archived-component-before-save.ts +3 -3
  53. package/src/{sync → extended/sync}/update-component-title-before-save.ts +3 -3
  54. package/src/{utils → extended/utils}/is-editing-component.ts +1 -1
  55. package/src/extended/utils/replace-element-with-component.ts +11 -0
  56. package/src/{utils → extended/utils}/revert-overridable-settings.ts +6 -6
  57. package/src/hooks/use-sanitize-overridable-props.ts +9 -4
  58. package/src/init.ts +8 -69
  59. package/src/sync/before-save.ts +1 -30
  60. package/src/types.ts +8 -1
  61. package/src/utils/component-name-validation.ts +1 -1
  62. package/src/{components/create-component-form/utils/replace-element-with-component.ts → utils/create-component-model.ts} +2 -10
  63. package/src/utils/filter-valid-overridable-props.ts +18 -8
  64. package/src/utils/format-component-elements-id.ts +20 -0
  65. package/src/utils/get-container-by-origin-id.ts +46 -0
  66. package/src/{components/overridable-props/utils → utils}/get-overridable-prop.ts +2 -2
  67. package/src/utils/switch-to-component.ts +5 -2
  68. package/src/hooks/use-component-instance-settings.ts +0 -15
  69. package/src/store/actions/delete-overridable-prop.ts +0 -56
  70. package/src/utils/expand-navigator.ts +0 -5
  71. /package/src/{components/components-tab → extended/components}/component-introduction.tsx +0 -0
  72. /package/src/{components → extended/components}/component-panel-header/component-badge.tsx +0 -0
  73. /package/src/{components → extended/components}/component-properties-panel/component-properties-panel.tsx +0 -0
  74. /package/src/{components → extended/components}/component-properties-panel/sortable.tsx +0 -0
  75. /package/src/{components → extended/components}/create-component-form/hooks/use-form.ts +0 -0
  76. /package/src/{components → extended/components}/create-component-form/utils/component-form-schema.ts +0 -0
  77. /package/src/{components → extended/components}/create-component-form/utils/get-component-event-data.ts +0 -0
  78. /package/src/{hooks → extended/components/edit-component}/use-canvas-document.ts +0 -0
  79. /package/src/{hooks → extended/components/edit-component}/use-element-rect.ts +0 -0
  80. /package/src/{components → extended/components}/overridable-props/indicator.tsx +0 -0
  81. /package/src/{components → extended/components}/overridable-props/utils/validate-prop-label.ts +0 -0
  82. /package/src/{mcp → extended/mcp}/index.ts +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-components",
3
3
  "description": "Elementor editor components",
4
- "version": "4.0.0-564",
4
+ "version": "4.0.0-591",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -40,30 +40,31 @@
40
40
  "dev": "tsup --config=../../tsup.dev.ts"
41
41
  },
42
42
  "dependencies": {
43
- "@elementor/editor": "4.0.0-564",
44
- "@elementor/editor-canvas": "4.0.0-564",
45
- "@elementor/editor-controls": "4.0.0-564",
46
- "@elementor/editor-documents": "4.0.0-564",
47
- "@elementor/editor-editing-panel": "4.0.0-564",
48
- "@elementor/editor-elements": "4.0.0-564",
49
- "@elementor/editor-elements-panel": "4.0.0-564",
50
- "@elementor/editor-mcp": "4.0.0-564",
51
- "@elementor/editor-panels": "4.0.0-564",
52
- "@elementor/editor-props": "4.0.0-564",
53
- "@elementor/editor-styles-repository": "4.0.0-564",
54
- "@elementor/editor-ui": "4.0.0-564",
55
- "@elementor/editor-v1-adapters": "4.0.0-564",
56
- "@elementor/http-client": "4.0.0-564",
43
+ "@elementor/editor": "4.0.0-591",
44
+ "@elementor/editor-canvas": "4.0.0-591",
45
+ "@elementor/editor-controls": "4.0.0-591",
46
+ "@elementor/editor-documents": "4.0.0-591",
47
+ "@elementor/editor-editing-panel": "4.0.0-591",
48
+ "@elementor/editor-elements": "4.0.0-591",
49
+ "@elementor/editor-elements-panel": "4.0.0-591",
50
+ "@elementor/editor-mcp": "4.0.0-591",
51
+ "@elementor/editor-templates": "4.0.0-591",
52
+ "@elementor/editor-panels": "4.0.0-591",
53
+ "@elementor/editor-props": "4.0.0-591",
54
+ "@elementor/editor-styles-repository": "4.0.0-591",
55
+ "@elementor/editor-ui": "4.0.0-591",
56
+ "@elementor/editor-v1-adapters": "4.0.0-591",
57
+ "@elementor/http-client": "4.0.0-591",
57
58
  "@elementor/icons": "^1.63.0",
58
- "@elementor/events": "4.0.0-564",
59
- "@elementor/query": "4.0.0-564",
60
- "@elementor/schema": "4.0.0-564",
61
- "@elementor/store": "4.0.0-564",
59
+ "@elementor/events": "4.0.0-591",
60
+ "@elementor/query": "4.0.0-591",
61
+ "@elementor/schema": "4.0.0-591",
62
+ "@elementor/store": "4.0.0-591",
62
63
  "@elementor/ui": "1.36.17",
63
- "@elementor/utils": "4.0.0-564",
64
+ "@elementor/utils": "4.0.0-591",
64
65
  "@wordpress/i18n": "^5.13.0",
65
- "@elementor/editor-notifications": "4.0.0-564",
66
- "@elementor/editor-current-user": "4.0.0-564"
66
+ "@elementor/editor-notifications": "4.0.0-591",
67
+ "@elementor/editor-current-user": "4.0.0-591"
67
68
  },
68
69
  "peerDependencies": {
69
70
  "react": "^18.3.1",
@@ -23,18 +23,18 @@ import { __ } from '@wordpress/i18n';
23
23
  import { useComponentsPermissions } from '../../hooks/use-components-permissions';
24
24
  import { archiveComponent } from '../../store/actions/archive-component';
25
25
  import { loadComponentsAssets } from '../../store/actions/load-components-assets';
26
+ import { renameComponent } from '../../store/actions/rename-component';
26
27
  import { type Component } from '../../types';
27
28
  import { validateComponentName } from '../../utils/component-name-validation';
29
+ import { createComponentModel } from '../../utils/create-component-model';
28
30
  import { getContainerForNewElement } from '../../utils/get-container-for-new-element';
29
- import { createComponentModel } from '../create-component-form/utils/replace-element-with-component';
30
31
  import { DeleteConfirmationDialog } from './delete-confirmation-dialog';
31
32
 
32
33
  type ComponentItemProps = {
33
34
  component: Omit< Component, 'id' > & { id?: number };
34
- renameComponent: ( newName: string ) => void;
35
35
  };
36
36
 
37
- export const ComponentItem = ( { component, renameComponent }: ComponentItemProps ) => {
37
+ export const ComponentItem = ( { component }: ComponentItemProps ) => {
38
38
  const itemRef = useRef< HTMLElement >( null );
39
39
  const [ isDeleteDialogOpen, setIsDeleteDialogOpen ] = useState( false );
40
40
  const { canRename, canDelete } = useComponentsPermissions();
@@ -49,9 +49,10 @@ export const ComponentItem = ( { component, renameComponent }: ComponentItemProp
49
49
  getProps: getEditableProps,
50
50
  } = useEditable( {
51
51
  value: component.name,
52
- onSubmit: renameComponent,
52
+ onSubmit: ( newName: string ) => renameComponent( component.uid, newName ),
53
53
  validation: validateComponentTitle,
54
54
  } );
55
+
55
56
  const componentModel = createComponentModel( component );
56
57
 
57
58
  const popupState = usePopupState( {
@@ -5,7 +5,6 @@ import { __ } from '@wordpress/i18n';
5
5
 
6
6
  import { useComponents } from '../../hooks/use-components';
7
7
  import { useComponentsPermissions } from '../../hooks/use-components-permissions';
8
- import { renameComponent } from '../../store/actions/rename-component';
9
8
  import { ComponentItem } from './components-item';
10
9
  import { LoadingComponents } from './loading-components';
11
10
  import { useSearch } from './search-provider';
@@ -25,24 +24,17 @@ export function ComponentsList() {
25
24
  if ( isLoading ) {
26
25
  return <LoadingComponents />;
27
26
  }
28
- const isEmpty = ! components || components.length === 0;
27
+
28
+ const isEmpty = ! components?.length;
29
+
29
30
  if ( isEmpty ) {
30
- if ( searchValue.length > 0 ) {
31
- return <EmptySearchResult />;
32
- }
33
- return <EmptyState />;
31
+ return searchValue.length ? <EmptySearchResult /> : <EmptyState />;
34
32
  }
35
33
 
36
34
  return (
37
35
  <List sx={ { display: 'flex', flexDirection: 'column', gap: 1, px: 2 } }>
38
36
  { components.map( ( component ) => (
39
- <ComponentItem
40
- key={ component.uid }
41
- component={ component }
42
- renameComponent={ ( newName ) => {
43
- renameComponent( component.uid, newName );
44
- } }
45
- />
37
+ <ComponentItem key={ component.uid } component={ component } />
46
38
  ) ) }
47
39
  </List>
48
40
  );
@@ -1,8 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { Box, ListItemButton, Skeleton, Stack } from '@elementor/ui';
3
- const ROWS_COUNT = 6;
4
3
 
5
- const rows = Array.from( { length: ROWS_COUNT }, ( _, index ) => index );
4
+ const ROWS = Array.from( { length: 6 }, ( _, index ) => index );
6
5
 
7
6
  export const LoadingComponents = () => {
8
7
  return (
@@ -26,7 +25,7 @@ export const LoadingComponents = () => {
26
25
  },
27
26
  } }
28
27
  >
29
- { rows.map( ( row ) => (
28
+ { ROWS.map( ( row ) => (
30
29
  <ListItemButton
31
30
  key={ row }
32
31
  sx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }
@@ -1,16 +1,19 @@
1
1
  import * as React from 'react';
2
2
  import { ControlAdornmentsProvider } from '@elementor/editor-controls';
3
- import { getFieldIndicators } from '@elementor/editor-editing-panel';
4
- import { useSelectedElement } from '@elementor/editor-elements';
3
+ import { getFieldIndicators, useElement } from '@elementor/editor-editing-panel';
4
+ import { useElementSetting, useSelectedElement } from '@elementor/editor-elements';
5
5
  import { PanelBody, PanelHeader, PanelHeaderTitle } from '@elementor/editor-panels';
6
6
  import { EllipsisWithTooltip } from '@elementor/editor-ui';
7
7
  import { ComponentsIcon, PencilIcon } from '@elementor/icons';
8
8
  import { Box, Divider, IconButton, Stack, Tooltip } from '@elementor/ui';
9
9
  import { __ } from '@wordpress/i18n';
10
10
 
11
- import { useComponentInstanceSettings } from '../../hooks/use-component-instance-settings';
12
11
  import { useComponentsPermissions } from '../../hooks/use-components-permissions';
13
12
  import { useSanitizeOverridableProps } from '../../hooks/use-sanitize-overridable-props';
13
+ import {
14
+ componentInstancePropTypeUtil,
15
+ type ComponentInstancePropValue,
16
+ } from '../../prop-types/component-instance-prop-type';
14
17
  import { ComponentInstanceProvider } from '../../provider/component-instance-context';
15
18
  import { useComponent } from '../../store/store';
16
19
  import { type OverridablePropsGroup } from '../../types';
@@ -28,9 +31,10 @@ export function InstanceEditingPanel() {
28
31
  const overrides = settings?.overrides?.value;
29
32
 
30
33
  const component = useComponent( componentId ?? null );
31
- const overridableProps = useSanitizeOverridableProps( componentId ?? null );
32
34
 
33
- const componentInstanceId = useSelectedElement()?.element?.id ?? null;
35
+ const componentInstanceId = useSelectedElement()?.element?.id;
36
+
37
+ const overridableProps = useSanitizeOverridableProps( componentId ?? null, componentInstanceId );
34
38
 
35
39
  if ( ! componentId || ! overridableProps || ! component ) {
36
40
  return null;
@@ -89,3 +93,11 @@ export function InstanceEditingPanel() {
89
93
  </Box>
90
94
  );
91
95
  }
96
+
97
+ function useComponentInstanceSettings() {
98
+ const { element } = useElement();
99
+
100
+ const settings = useElementSetting< ComponentInstancePropValue >( element.id, 'component_instance' );
101
+
102
+ return componentInstancePropTypeUtil.extract( settings );
103
+ }
@@ -16,7 +16,7 @@ import {
16
16
  SettingsField,
17
17
  useElement,
18
18
  } from '@elementor/editor-editing-panel';
19
- import { type Control, getContainer, getElementType } from '@elementor/editor-elements';
19
+ import { type Control, getElementType } from '@elementor/editor-elements';
20
20
  import { type PropType, type PropValue } from '@elementor/editor-props';
21
21
  import { Stack } from '@elementor/ui';
22
22
 
@@ -43,6 +43,7 @@ import { OverridablePropProvider } from '../../provider/overridable-prop-context
43
43
  import { updateOverridableProp } from '../../store/actions/update-overridable-prop';
44
44
  import { useCurrentComponentId } from '../../store/store';
45
45
  import { type OriginPropFields, type OverridableProp, type OverridableProps } from '../../types';
46
+ import { getContainerByOriginId } from '../../utils/get-container-by-origin-id';
46
47
  import { getPropTypeForComponentOverride } from '../../utils/get-prop-type-for-component-override';
47
48
  import { getMatchingOverride } from '../../utils/overridable-props-utils';
48
49
  import { resolveOverridePropValue } from '../../utils/resolve-override-prop-value';
@@ -167,14 +168,19 @@ function OverrideControl( { overridableProp }: InternalProps ) {
167
168
  overridableProp.label
168
169
  );
169
170
 
170
- const { elementId, widgetType, elType, propKey } = overridableProp.originPropFields ?? overridableProp;
171
+ const {
172
+ elementId: originElementId,
173
+ widgetType,
174
+ elType,
175
+ propKey,
176
+ } = overridableProp.originPropFields ?? overridableProp;
171
177
 
172
- const elementContainer = getContainer( elementId );
173
- if ( ! elementContainer ) {
174
- throw new OverrideControlInnerElementNotFoundError( {
175
- context: { componentId, elementId },
176
- } );
178
+ const element = getContainerByOriginId( originElementId, componentInstanceElement.element.id );
179
+
180
+ if ( ! element ) {
181
+ throw new OverrideControlInnerElementNotFoundError( { context: { componentId, elementId: originElementId } } );
177
182
  }
183
+ const elementId = element.id;
178
184
 
179
185
  const type = elType === 'widget' ? widgetType : elType;
180
186
  const elementType = getElementType( type );
@@ -5,8 +5,8 @@ import { type ComponentInstanceOverride } from '../../prop-types/component-insta
5
5
  import { componentOverridablePropTypeUtil } from '../../prop-types/component-overridable-prop-type';
6
6
  import { selectData } from '../../store/store';
7
7
  import { type OverridableProp, type PublishedComponent } from '../../types';
8
+ import { getOverridableProp } from '../../utils/get-overridable-prop';
8
9
  import { extractInnerOverrideInfo } from '../../utils/overridable-props-utils';
9
- import { getOverridableProp } from '../overridable-props/utils/get-overridable-prop';
10
10
 
11
11
  export function useResolvedOriginValue( override: ComponentInstanceOverride | null, overridableProp: OverridableProp ) {
12
12
  const components = useSelector( selectData );
@@ -0,0 +1,14 @@
1
+ import { useEffect } from 'react';
2
+ import { useLoadedTemplates } from '@elementor/editor-templates';
3
+
4
+ import { loadComponentsAssets } from '../store/actions/load-components-assets';
5
+
6
+ export const LoadTemplateComponents = () => {
7
+ const templates = useLoadedTemplates();
8
+
9
+ useEffect( () => {
10
+ loadComponentsAssets( templates.flatMap( ( elements ) => elements ?? [] ) );
11
+ }, [ templates ] );
12
+
13
+ return null;
14
+ };
@@ -11,6 +11,7 @@ import {
11
11
  type RenderContext,
12
12
  } from '@elementor/editor-canvas';
13
13
  import { getCurrentDocument } from '@elementor/editor-documents';
14
+ import { type V1ElementData } from '@elementor/editor-elements';
14
15
  import { __getState as getState } from '@elementor/store';
15
16
  import { __ } from '@wordpress/i18n';
16
17
 
@@ -18,6 +19,7 @@ import { apiClient } from './api';
18
19
  import { type ComponentInstanceProp } from './prop-types/component-instance-prop-type';
19
20
  import { type ComponentsSlice, selectComponentByUid } from './store/store';
20
21
  import { type ComponentRenderContext, type ExtendedWindow } from './types';
22
+ import { formatComponentElementsId } from './utils/format-component-elements-id';
21
23
  import { switchToComponent } from './utils/switch-to-component';
22
24
  import { trackComponentEvent } from './utils/tracking';
23
25
 
@@ -152,7 +154,7 @@ function createComponentView(
152
154
  const componentInstance = settings.component_instance as
153
155
  | {
154
156
  overrides?: Record< string, unknown >;
155
- elements?: unknown[];
157
+ elements?: V1ElementData[];
156
158
  }
157
159
  | undefined;
158
160
 
@@ -161,7 +163,11 @@ function createComponentView(
161
163
  overrides: componentInstance.overrides ?? {},
162
164
  };
163
165
 
164
- this.collection = legacyWindow.elementor.createBackboneElementsCollection( componentInstance.elements );
166
+ const instanceId = this.model.get( 'id' );
167
+ const elements = componentInstance.elements ?? [];
168
+ const formattedElements = formatComponentElementsId( elements, [ instanceId ] );
169
+
170
+ this.collection = legacyWindow.elementor.createBackboneElementsCollection( formattedElements );
165
171
 
166
172
  this.collection.models.forEach( setInactiveRecursively );
167
173
 
@@ -8,12 +8,12 @@ import { __getState as getState } from '@elementor/store';
8
8
  import { Box, Divider, IconButton, Tooltip, Typography } from '@elementor/ui';
9
9
  import { __ } from '@wordpress/i18n';
10
10
 
11
+ import { useSanitizeOverridableProps } from '../../../hooks/use-sanitize-overridable-props';
12
+ import { type ComponentsSlice, SLICE_NAME, useCurrentComponent } from '../../../store/store';
13
+ import { trackComponentEvent } from '../../../utils/tracking';
11
14
  import { useNavigateBack } from '../../hooks/use-navigate-back';
12
- import { useSanitizeOverridableProps } from '../../hooks/use-sanitize-overridable-props';
13
- import { type ComponentsSlice, SLICE_NAME, useCurrentComponent } from '../../store/store';
14
- import { trackComponentEvent } from '../../utils/tracking';
15
+ import { ComponentIntroduction } from '../component-introduction';
15
16
  import { usePanelActions } from '../component-properties-panel/component-properties-panel';
16
- import { ComponentIntroduction } from '../components-tab/component-introduction';
17
17
  import { ComponentsBadge } from './component-badge';
18
18
 
19
19
  const MESSAGE_KEY = 'components-properties-introduction';
@@ -7,14 +7,14 @@ import { Divider, IconButton, List, Stack, Tooltip } from '@elementor/ui';
7
7
  import { generateUniqueId } from '@elementor/utils';
8
8
  import { __ } from '@wordpress/i18n';
9
9
 
10
- import { useSanitizeOverridableProps } from '../../hooks/use-sanitize-overridable-props';
10
+ import { useSanitizeOverridableProps } from '../../../hooks/use-sanitize-overridable-props';
11
+ import { useCurrentComponentId } from '../../../store/store';
11
12
  import { addOverridableGroup } from '../../store/actions/add-overridable-group';
12
13
  import { deleteOverridableGroup } from '../../store/actions/delete-overridable-group';
13
14
  import { deleteOverridableProp } from '../../store/actions/delete-overridable-prop';
14
15
  import { reorderGroupProps } from '../../store/actions/reorder-group-props';
15
16
  import { reorderOverridableGroups } from '../../store/actions/reorder-overridable-groups';
16
17
  import { updateOverridablePropParams } from '../../store/actions/update-overridable-prop-params';
17
- import { useCurrentComponentId } from '../../store/store';
18
18
  import { PropertiesEmptyState } from './properties-empty-state';
19
19
  import { PropertiesGroup } from './properties-group';
20
20
  import { SortableItem, SortableProvider } from './sortable';
@@ -4,7 +4,7 @@ import { ComponentPropListIcon } from '@elementor/icons';
4
4
  import { Link, Stack, Typography } from '@elementor/ui';
5
5
  import { __ } from '@wordpress/i18n';
6
6
 
7
- import { ComponentIntroduction } from '../components-tab/component-introduction';
7
+ import { ComponentIntroduction } from '../component-introduction';
8
8
 
9
9
  export function PropertiesEmptyState( { introductionRef }: { introductionRef: React.RefObject< HTMLButtonElement > } ) {
10
10
  const [ isOpen, setIsOpen ] = useState( false );
@@ -15,7 +15,7 @@ import {
15
15
  } from '@elementor/ui';
16
16
  import { __ } from '@wordpress/i18n';
17
17
 
18
- import { type OverridableProp, type OverridablePropsGroup } from '../../types';
18
+ import { type OverridableProp, type OverridablePropsGroup } from '../../../types';
19
19
  import { PropertyItem } from './property-item';
20
20
  import { SortableItem, SortableProvider, SortableTrigger, type SortableTriggerProps } from './sortable';
21
21
  import { type GroupLabelEditableState } from './use-current-editable-item';
@@ -3,7 +3,7 @@ import { getWidgetsCache } from '@elementor/editor-elements';
3
3
  import { XIcon } from '@elementor/icons';
4
4
  import { bindPopover, bindTrigger, Box, IconButton, Popover, Typography, usePopupState } from '@elementor/ui';
5
5
 
6
- import { type OverridableProp } from '../../types';
6
+ import { type OverridableProp } from '../../../types';
7
7
  import { OverridablePropForm } from '../overridable-props/overridable-prop-form';
8
8
  import { SortableTrigger, type SortableTriggerProps } from './sortable';
9
9
 
@@ -4,8 +4,8 @@ import { setDocumentModifiedStatus } from '@elementor/editor-documents';
4
4
  import { useEditable } from '@elementor/editor-ui';
5
5
  import { __ } from '@wordpress/i18n';
6
6
 
7
+ import { useCurrentComponentId, useOverridableProps } from '../../../store/store';
7
8
  import { renameOverridableGroup } from '../../store/actions/rename-overridable-group';
8
- import { useCurrentComponentId, useOverridableProps } from '../../store/store';
9
9
  import { validateGroupLabel } from './utils/validate-group-label';
10
10
 
11
11
  export type GroupLabelEditableState = {
@@ -1,4 +1,4 @@
1
- import { type OverridablePropsGroup } from '../../../types';
1
+ import { type OverridablePropsGroup } from '../../../../types';
2
2
 
3
3
  const DEFAULT_NEW_GROUP_LABEL = 'New group';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { __ } from '@wordpress/i18n';
2
2
 
3
- import { type OverridablePropsGroup } from '../../../types';
3
+ import { type OverridablePropsGroup } from '../../../../types';
4
4
 
5
5
  export const ERROR_MESSAGES = {
6
6
  EMPTY_NAME: __( 'Group name is required', 'elementor' ),
@@ -8,13 +8,13 @@ import { __getState as getState } from '@elementor/store';
8
8
  import { Button, FormLabel, Grid, Popover, Stack, TextField, Typography } from '@elementor/ui';
9
9
  import { __ } from '@wordpress/i18n';
10
10
 
11
- import { useComponents } from '../../hooks/use-components';
11
+ import { useComponents } from '../../../hooks/use-components';
12
+ import { selectComponentByUid } from '../../../store/store';
13
+ import { type ComponentFormValues, type PublishedComponent } from '../../../types';
14
+ import { switchToComponent } from '../../../utils/switch-to-component';
15
+ import { trackComponentEvent } from '../../../utils/tracking';
12
16
  import { findNonAtomicElementsInElement } from '../../prevent-non-atomic-nesting';
13
17
  import { createUnpublishedComponent } from '../../store/actions/create-unpublished-component';
14
- import { selectComponentByUid } from '../../store/store';
15
- import { type ComponentFormValues, type PublishedComponent } from '../../types';
16
- import { switchToComponent } from '../../utils/switch-to-component';
17
- import { trackComponentEvent } from '../../utils/tracking';
18
18
  import { useForm } from './hooks/use-form';
19
19
  import { createBaseComponentSchema, createSubmitComponentSchema } from './utils/component-form-schema';
20
20
  import {
@@ -3,8 +3,8 @@ import { type CSSProperties, useEffect } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
  import { __ } from '@wordpress/i18n';
5
5
 
6
- import { useCanvasDocument } from '../../hooks/use-canvas-document';
7
- import { useElementRect } from '../../hooks/use-element-rect';
6
+ import { useCanvasDocument } from './use-canvas-document';
7
+ import { useElementRect } from './use-element-rect';
8
8
 
9
9
  type ModalProps = {
10
10
  topLevelElementDom: HTMLElement | null;
@@ -6,12 +6,12 @@ import { __privateListenTo as listenTo, commandEndEvent } from '@elementor/edito
6
6
  import { __useSelector as useSelector } from '@elementor/store';
7
7
  import { throttle } from '@elementor/utils';
8
8
 
9
- import { apiClient } from '../../api';
9
+ import { apiClient } from '../../../api';
10
+ import { type ComponentsPathItem, selectPath, useCurrentComponentId } from '../../../store/store';
11
+ import { COMPONENT_DOCUMENT_TYPE } from '../../consts';
10
12
  import { useNavigateBack } from '../../hooks/use-navigate-back';
11
13
  import { resetSanitizedComponents } from '../../store/actions/reset-sanitized-components';
12
14
  import { updateCurrentComponent } from '../../store/actions/update-current-component';
13
- import { type ComponentsPathItem, selectPath, useCurrentComponentId } from '../../store/store';
14
- import { COMPONENT_DOCUMENT_TYPE } from '../consts';
15
15
  import { ComponentModal } from './component-modal';
16
16
 
17
17
  export function EditComponent() {
@@ -11,16 +11,16 @@ import {
11
11
  import { createTopLevelObjectType, useElement } from '@elementor/editor-editing-panel';
12
12
  import { type PropValue } from '@elementor/editor-props';
13
13
 
14
- import { type ComponentInstanceOverridePropValue } from '../../prop-types/component-instance-override-prop-type';
14
+ import { type ComponentInstanceOverridePropValue } from '../../../prop-types/component-instance-override-prop-type';
15
15
  import {
16
16
  componentOverridablePropTypeUtil,
17
17
  type ComponentOverridablePropValue,
18
- } from '../../prop-types/component-overridable-prop-type';
19
- import { OverridablePropProvider } from '../../provider/overridable-prop-context';
20
- import { updateOverridableProp } from '../../store/actions/update-overridable-prop';
21
- import { useCurrentComponentId, useOverridableProps } from '../../store/store';
22
- import { getPropTypeForComponentOverride } from '../../utils/get-prop-type-for-component-override';
23
- import { OVERRIDABLE_PROP_REPLACEMENT_ID } from '../consts';
18
+ } from '../../../prop-types/component-overridable-prop-type';
19
+ import { OverridablePropProvider } from '../../../provider/overridable-prop-context';
20
+ import { updateOverridableProp } from '../../../store/actions/update-overridable-prop';
21
+ import { useCurrentComponentId, useOverridableProps } from '../../../store/store';
22
+ import { getPropTypeForComponentOverride } from '../../../utils/get-prop-type-for-component-override';
23
+ import { OVERRIDABLE_PROP_REPLACEMENT_ID } from '../../consts';
24
24
 
25
25
  export function OverridablePropControl< T extends object >( {
26
26
  OriginalControl,
@@ -4,7 +4,7 @@ import { Form, MenuListItem } from '@elementor/editor-ui';
4
4
  import { Button, FormLabel, Grid, Select, Stack, type SxProps, TextField, Typography } from '@elementor/ui';
5
5
  import { __ } from '@wordpress/i18n';
6
6
 
7
- import { type OverridableProp } from '../../types';
7
+ import { type OverridableProp } from '../../../types';
8
8
  import { validatePropLabel } from './utils/validate-prop-label';
9
9
 
10
10
  const SIZE = 'tiny';
@@ -6,16 +6,16 @@ import { type PropType, type TransformablePropValue } from '@elementor/editor-pr
6
6
  import { bindPopover, bindTrigger, Popover, Tooltip, usePopupState } from '@elementor/ui';
7
7
  import { __ } from '@wordpress/i18n';
8
8
 
9
- import { useSanitizeOverridableProps } from '../../hooks/use-sanitize-overridable-props';
10
- import { componentOverridablePropTypeUtil } from '../../prop-types/component-overridable-prop-type';
11
- import { useComponentInstanceElement, useOverridablePropValue } from '../../provider/overridable-prop-context';
9
+ import { useSanitizeOverridableProps } from '../../../hooks/use-sanitize-overridable-props';
10
+ import { componentOverridablePropTypeUtil } from '../../../prop-types/component-overridable-prop-type';
11
+ import { useComponentInstanceElement, useOverridablePropValue } from '../../../provider/overridable-prop-context';
12
+ import { useCurrentComponentId } from '../../../store/store';
13
+ import { type OverridableProps } from '../../../types';
14
+ import { getOverridableProp } from '../../../utils/get-overridable-prop';
15
+ import { resolveOverridePropValue } from '../../../utils/resolve-override-prop-value';
12
16
  import { setOverridableProp } from '../../store/actions/set-overridable-prop';
13
- import { useCurrentComponentId } from '../../store/store';
14
- import { type OverridableProps } from '../../types';
15
- import { resolveOverridePropValue } from '../../utils/resolve-override-prop-value';
16
17
  import { Indicator } from './indicator';
17
18
  import { OverridablePropForm } from './overridable-prop-form';
18
- import { getOverridableProp } from './utils/get-overridable-prop';
19
19
 
20
20
  export function OverridablePropIndicator() {
21
21
  const { propType } = useBoundProp();
@@ -1,2 +1,3 @@
1
- export const COMPONENT_DOCUMENT_TYPE = 'elementor_component';
2
1
  export const OVERRIDABLE_PROP_REPLACEMENT_ID = 'overridable-prop';
2
+
3
+ export const COMPONENT_DOCUMENT_TYPE = 'elementor_component';
@@ -2,8 +2,8 @@ import { useCallback } from 'react';
2
2
  import { getV1DocumentsManager } from '@elementor/editor-documents';
3
3
  import { __useSelector as useSelector } from '@elementor/store';
4
4
 
5
- import { selectPath } from '../store/store';
6
- import { switchToComponent } from '../utils/switch-to-component';
5
+ import { selectPath } from '../../store/store';
6
+ import { switchToComponent } from '../../utils/switch-to-component';
7
7
 
8
8
  export function useNavigateBack() {
9
9
  const path = useSelector( selectPath );
@@ -0,0 +1,77 @@
1
+ import { injectIntoTop } from '@elementor/editor';
2
+ import { registerControlReplacement } from '@elementor/editor-controls';
3
+ import { getV1CurrentDocument } from '@elementor/editor-documents';
4
+ import { FIELD_TYPE, injectIntoPanelHeaderTop, registerFieldIndicator } from '@elementor/editor-editing-panel';
5
+ import { __registerPanel as registerPanel } from '@elementor/editor-panels';
6
+ import { registerDataHook } from '@elementor/editor-v1-adapters';
7
+
8
+ import { componentOverridablePropTypeUtil } from '../prop-types/component-overridable-prop-type';
9
+ import { type ExtendedWindow } from '../types';
10
+ import { onElementDrop } from '../utils/tracking';
11
+ import { ComponentPanelHeader } from './components/component-panel-header/component-panel-header';
12
+ import { panel as componentPropertiesPanel } from './components/component-properties-panel/component-properties-panel';
13
+ import { CreateComponentForm } from './components/create-component-form/create-component-form';
14
+ import { EditComponent } from './components/edit-component/edit-component';
15
+ import { OverridablePropControl } from './components/overridable-props/overridable-prop-control';
16
+ import { OverridablePropIndicator } from './components/overridable-props/overridable-prop-indicator';
17
+ import { COMPONENT_DOCUMENT_TYPE, OVERRIDABLE_PROP_REPLACEMENT_ID } from './consts';
18
+ import { initMcp } from './mcp';
19
+ import { initNonAtomicNestingPrevention } from './prevent-non-atomic-nesting';
20
+ import { beforeSave } from './sync/before-save';
21
+ import { initCleanupOverridablePropsOnDelete } from './sync/cleanup-overridable-props-on-delete';
22
+ import { initHandleComponentEditModeContainer } from './sync/handle-component-edit-mode-container';
23
+ import { initRevertOverridablesOnCopyOrDuplicate } from './sync/revert-overridables-on-copy-or-duplicate';
24
+
25
+ export function initExtended() {
26
+ registerPanel( componentPropertiesPanel );
27
+
28
+ registerDataHook( 'dependency', 'editor/documents/close', ( args ) => {
29
+ const document = getV1CurrentDocument();
30
+ if ( document.config.type === COMPONENT_DOCUMENT_TYPE ) {
31
+ args.mode = 'autosave';
32
+ }
33
+ return true;
34
+ } );
35
+
36
+ registerDataHook( 'after', 'preview/drop', onElementDrop );
37
+
38
+ ( window as unknown as ExtendedWindow ).elementorCommon.__beforeSave = beforeSave;
39
+
40
+ injectIntoTop( {
41
+ id: 'create-component-popup',
42
+ component: CreateComponentForm,
43
+ } );
44
+
45
+ injectIntoTop( {
46
+ id: 'edit-component',
47
+ component: EditComponent,
48
+ } );
49
+
50
+ injectIntoPanelHeaderTop( {
51
+ id: 'component-panel-header',
52
+ component: ComponentPanelHeader,
53
+ } );
54
+
55
+ registerFieldIndicator( {
56
+ fieldType: FIELD_TYPE.SETTINGS,
57
+ id: 'component-overridable-prop',
58
+ priority: 1,
59
+ indicator: OverridablePropIndicator,
60
+ } );
61
+
62
+ registerControlReplacement( {
63
+ id: OVERRIDABLE_PROP_REPLACEMENT_ID,
64
+ component: OverridablePropControl,
65
+ condition: ( { value } ) => componentOverridablePropTypeUtil.isValid( value ),
66
+ } );
67
+
68
+ initCleanupOverridablePropsOnDelete();
69
+
70
+ initMcp();
71
+
72
+ initNonAtomicNestingPrevention();
73
+
74
+ initHandleComponentEditModeContainer();
75
+
76
+ initRevertOverridablesOnCopyOrDuplicate();
77
+ }
@@ -6,9 +6,9 @@ import { AxiosError } from '@elementor/http-client';
6
6
  import { z } from '@elementor/schema';
7
7
  import { generateUniqueId } from '@elementor/utils';
8
8
 
9
- import { apiClient } from '../api';
9
+ import { apiClient } from '../../api';
10
+ import { type OverridableProps } from '../../types';
10
11
  import { createUnpublishedComponent } from '../store/actions/create-unpublished-component';
11
- import { type OverridableProps } from '../types';
12
12
 
13
13
  const InputSchema = {
14
14
  element_id: z