@elementor/editor-components 4.1.0-748 → 4.1.0-749

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-components",
3
3
  "description": "Elementor editor components",
4
- "version": "4.1.0-748",
4
+ "version": "4.1.0-749",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -40,31 +40,31 @@
40
40
  "dev": "tsup --config=../../tsup.dev.ts"
41
41
  },
42
42
  "dependencies": {
43
- "@elementor/editor": "4.1.0-748",
44
- "@elementor/editor-canvas": "4.1.0-748",
45
- "@elementor/editor-controls": "4.1.0-748",
46
- "@elementor/editor-documents": "4.1.0-748",
47
- "@elementor/editor-editing-panel": "4.1.0-748",
48
- "@elementor/editor-elements": "4.1.0-748",
49
- "@elementor/editor-elements-panel": "4.1.0-748",
50
- "@elementor/editor-mcp": "4.1.0-748",
51
- "@elementor/editor-templates": "4.1.0-748",
52
- "@elementor/editor-panels": "4.1.0-748",
53
- "@elementor/editor-props": "4.1.0-748",
54
- "@elementor/editor-styles-repository": "4.1.0-748",
55
- "@elementor/editor-ui": "4.1.0-748",
56
- "@elementor/editor-v1-adapters": "4.1.0-748",
57
- "@elementor/http-client": "4.1.0-748",
43
+ "@elementor/editor": "4.1.0-749",
44
+ "@elementor/editor-canvas": "4.1.0-749",
45
+ "@elementor/editor-controls": "4.1.0-749",
46
+ "@elementor/editor-documents": "4.1.0-749",
47
+ "@elementor/editor-editing-panel": "4.1.0-749",
48
+ "@elementor/editor-elements": "4.1.0-749",
49
+ "@elementor/editor-elements-panel": "4.1.0-749",
50
+ "@elementor/editor-mcp": "4.1.0-749",
51
+ "@elementor/editor-templates": "4.1.0-749",
52
+ "@elementor/editor-panels": "4.1.0-749",
53
+ "@elementor/editor-props": "4.1.0-749",
54
+ "@elementor/editor-styles-repository": "4.1.0-749",
55
+ "@elementor/editor-ui": "4.1.0-749",
56
+ "@elementor/editor-v1-adapters": "4.1.0-749",
57
+ "@elementor/http-client": "4.1.0-749",
58
58
  "@elementor/icons": "^1.68.0",
59
- "@elementor/events": "4.1.0-748",
60
- "@elementor/query": "4.1.0-748",
61
- "@elementor/schema": "4.1.0-748",
62
- "@elementor/store": "4.1.0-748",
59
+ "@elementor/events": "4.1.0-749",
60
+ "@elementor/query": "4.1.0-749",
61
+ "@elementor/schema": "4.1.0-749",
62
+ "@elementor/store": "4.1.0-749",
63
63
  "@elementor/ui": "1.36.17",
64
- "@elementor/utils": "4.1.0-748",
64
+ "@elementor/utils": "4.1.0-749",
65
65
  "@wordpress/i18n": "^5.13.0",
66
- "@elementor/editor-notifications": "4.1.0-748",
67
- "@elementor/editor-current-user": "4.1.0-748"
66
+ "@elementor/editor-notifications": "4.1.0-749",
67
+ "@elementor/editor-current-user": "4.1.0-749"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "react": "^18.3.1",
@@ -1,6 +1,13 @@
1
1
  import { createError } from '@elementor/utils';
2
2
 
3
+ import { type OverridableProp } from '../types';
4
+
3
5
  export const OverrideControlInnerElementNotFoundError = createError< { componentId: number; elementId: string } >( {
4
6
  code: 'override_control_inner_element_not_found',
5
7
  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.`,
6
8
  } );
9
+
10
+ export const OverrideControlPropTypeNotFoundError = createError< { overridableProp: OverridableProp } >( {
11
+ code: 'override_control_prop_type_not_found',
12
+ message: 'Prop type not found for override control.',
13
+ } );
@@ -1,5 +1,4 @@
1
1
  import * as React from 'react';
2
- import { useMemo } from 'react';
3
2
  import {
4
3
  ControlReplacementsProvider,
5
4
  getControlReplacements,
@@ -18,7 +17,7 @@ import {
18
17
  SettingsField,
19
18
  useElement,
20
19
  } from '@elementor/editor-editing-panel';
21
- import { type Control, getElementSettings, getElementType } from '@elementor/editor-elements';
20
+ import { type Control } from '@elementor/editor-elements';
22
21
  import { type AnyTransformable, type PropType, type PropValue } from '@elementor/editor-props';
23
22
  import { Box } from '@elementor/ui';
24
23
 
@@ -30,7 +29,6 @@ import {
30
29
  import {
31
30
  type ComponentInstanceOverride,
32
31
  componentInstanceOverridesPropTypeUtil,
33
- type ComponentInstanceOverridesPropValue,
34
32
  } from '../../prop-types/component-instance-overrides-prop-type';
35
33
  import { componentInstancePropTypeUtil } from '../../prop-types/component-instance-prop-type';
36
34
  import {
@@ -49,15 +47,12 @@ import { type OriginPropFields, type OverridableProp, type OverridableProps } fr
49
47
  import { getPropTypeForComponentOverride } from '../../utils/get-prop-type-for-component-override';
50
48
  import { getMatchingOverride } from '../../utils/overridable-props-utils';
51
49
  import { resolveOverridePropValue } from '../../utils/resolve-override-prop-value';
52
- import { resolveOverridesChain } from '../../utils/resolve-overrides-chain';
53
50
  import { ControlLabel } from '../control-label';
54
- import { OverrideControlInnerElementNotFoundError } from '../errors';
51
+ import { OverrideControlPropTypeNotFoundError } from '../errors';
55
52
  import { correctExposedEmptyOverride } from './utils/correct-exposed-empty-override';
56
- import {
57
- applyOverridesToSettings,
58
- type OverridesMapping,
59
- unwrapOverridableSettings,
60
- } from './utils/resolve-element-settings';
53
+ import { unwrapOverridableSettings } from './utils/resolve-element-settings';
54
+ import { useOverrideControlDependencies } from './utils/use-override-dependencies';
55
+ import { useResolvedInnerElement } from './utils/use-resolved-inner-element';
61
56
 
62
57
  type Props = {
63
58
  overrideKey: string;
@@ -65,7 +60,7 @@ type Props = {
65
60
 
66
61
  export function OverridePropControl( { overrideKey }: Props ) {
67
62
  const overridableProps = useComponentOverridableProps();
68
- const overridableProp = overridableProps?.props[ overrideKey ];
63
+ const overridableProp = overridableProps.props[ overrideKey ];
69
64
 
70
65
  if ( ! overridableProp ) {
71
66
  return null;
@@ -92,75 +87,38 @@ function OverrideControl( { overridableProp }: InternalProps ) {
92
87
  const overrides = useComponentInstanceOverrides();
93
88
 
94
89
  const controls = useControlsByWidgetType(
95
- overridableProp?.originPropFields?.widgetType ?? overridableProp.widgetType
90
+ overridableProp.originPropFields?.widgetType ?? overridableProp.widgetType
96
91
  );
97
92
  const controlReplacements = getControlReplacements();
98
93
 
99
94
  const matchingOverride = getMatchingOverride( overrides, overridableProp.overrideKey );
100
95
 
101
- if ( ! componentId ) {
102
- throw new Error( 'Component ID is required' );
103
- }
96
+ const { propKey } = overridableProp.originPropFields ?? overridableProp;
97
+ const propType = getPropTypeForComponentOverride( overridableProp );
104
98
 
105
- if ( ! overridableProps ) {
106
- throw new Error( 'Component has no overridable props' );
99
+ if ( ! propType ) {
100
+ throw new OverrideControlPropTypeNotFoundError( { context: { overridableProp } } );
107
101
  }
108
102
 
109
- const {
110
- elementId: originElementId,
111
- widgetType,
112
- elType,
113
- propKey,
114
- } = overridableProp.originPropFields ?? overridableProp;
115
- const type = elType === 'widget' ? widgetType : elType;
116
- const elementType = getElementType( type );
117
-
118
- const { elementId, overridesMapping } = useMemo( () => {
119
- const overridesChainResult = resolveOverridesChain( {
120
- outerOverridableProp: overridableProp,
121
- outerInstanceId: componentInstanceElement.element.id,
122
- } );
123
-
124
- if ( overridesChainResult.isChainBroken ) {
125
- throw new OverrideControlInnerElementNotFoundError( {
126
- context: { componentId, elementId: originElementId },
127
- } );
128
- }
129
-
130
- return {
131
- elementId: overridesChainResult.innerElement.id,
132
- overridesMapping: overridesChainResult.overridesMapping,
133
- };
134
- }, [ overridableProp, componentInstanceElement.element.id, componentId, originElementId ] );
135
-
136
- // Not reactive to inner element store changes — intentional.
137
- // Inner element settings can only change in component edit mode, which unmounts this component.
138
- const settingsWithInnerOverrides = useMemo( () => {
139
- const settings = getElementSettings< AnyTransformable >(
140
- elementId,
141
- Object.keys( elementType?.propsSchema ?? {} )
142
- );
143
-
144
- return applyOverridesToSettings( settings, overridesMapping );
145
- }, [ elementId, elementType?.propsSchema, overridesMapping ] );
146
-
147
- const resolvedElementSettings = useMemo( () => {
148
- const withAllOverrides = applyOverridesToSettings(
149
- settingsWithInnerOverrides,
150
- formatOverridesToApply( overrides )
151
- );
152
- return unwrapOverridableSettings( withAllOverrides );
153
- }, [ settingsWithInnerOverrides, overrides ] );
103
+ const { elementId, elementType, resolvedElementSettings, resolvedOriginValues } =
104
+ useResolvedInnerElement( overridableProp );
154
105
 
155
- const propType = getPropTypeForComponentOverride( overridableProp );
106
+ const { overrideValue, isDisabled, isHidden } = useOverrideControlDependencies( {
107
+ existingOverride: matchingOverride,
108
+ resolvedElementSettings,
109
+ elementType,
110
+ elementId,
111
+ propKey,
112
+ } );
156
113
 
157
- if ( ! propType || ! elementType ) {
114
+ if ( isHidden ) {
158
115
  return null;
159
116
  }
160
117
 
161
118
  const { propValue, placeholderValue } = resolveValueAndPlaceholder(
162
119
  matchingOverride,
163
- settingsWithInnerOverrides,
120
+ overrideValue,
121
+ resolvedOriginValues,
164
122
  propKey
165
123
  );
166
124
 
@@ -172,16 +130,17 @@ function OverrideControl( { overridableProp }: InternalProps ) {
172
130
  [ overridableProp.overrideKey ]: placeholderValue,
173
131
  } as OverridesSchema;
174
132
 
175
- const setValue = ( newValue: OverridesSchema ) => {
176
- if ( ! overridableProps ) {
177
- setInstanceValue( {
178
- ...instanceValue,
179
- overrides: undefined,
180
- } );
133
+ const { control, controlProps, layout } = getControlParams(
134
+ controls,
135
+ overridableProp.originPropFields ?? overridableProp,
136
+ overridableProp.label
137
+ );
181
138
 
182
- return;
183
- }
139
+ const propTypeSchema = createTopLevelObjectType( {
140
+ schema: { [ overridableProp.overrideKey ]: propType },
141
+ } );
184
142
 
143
+ const setValue = ( newValue: OverridesSchema ) => {
185
144
  let newPropValue = getTempNewValueForDynamicProp(
186
145
  propType,
187
146
  propValue,
@@ -228,52 +187,34 @@ function OverrideControl( { overridableProp }: InternalProps ) {
228
187
  }
229
188
  };
230
189
 
231
- const { control, controlProps, layout } = getControlParams(
232
- controls,
233
- overridableProp?.originPropFields ?? overridableProp,
234
- overridableProp.label
235
- );
236
-
237
- const propTypeSchema = createTopLevelObjectType( {
238
- schema: {
239
- [ overridableProp.overrideKey ]: propType,
240
- },
241
- } );
242
-
243
190
  return (
244
191
  <OverridablePropProvider
245
192
  value={ componentOverridablePropTypeUtil.extract( matchingOverride ) ?? undefined }
246
193
  componentInstanceElement={ componentInstanceElement }
247
194
  >
248
195
  <ElementProvider
249
- element={ { id: elementId, type } }
196
+ element={ { id: elementId, type: elementType.key } }
250
197
  elementType={ elementType }
251
198
  settings={ resolvedElementSettings }
252
199
  >
253
- <SettingsField bind={ propKey } propDisplayName={ overridableProp.label }>
254
- <PropProvider
255
- propType={ propTypeSchema }
256
- value={ value }
257
- setValue={ setValue }
258
- placeholder={ placeholder }
259
- isDisabled={ () => {
260
- return false;
261
- } }
262
- >
263
- <PropKeyProvider bind={ overridableProp.overrideKey }>
264
- <ControlReplacementsProvider replacements={ controlReplacements }>
265
- <Box mb={ 1.5 }>
266
- <ControlTypeContainer layout={ layout }>
267
- { layout !== 'custom' && (
268
- <ControlLabel>{ overridableProp.label }</ControlLabel>
269
- ) }
270
- <OriginalControl control={ control } controlProps={ controlProps } />
271
- </ControlTypeContainer>
272
- </Box>
273
- </ControlReplacementsProvider>
274
- </PropKeyProvider>
275
- </PropProvider>
276
- </SettingsField>
200
+ <PropProvider
201
+ propType={ propTypeSchema }
202
+ value={ value }
203
+ setValue={ setValue }
204
+ placeholder={ placeholder }
205
+ isDisabled={ isDisabled }
206
+ >
207
+ <PropKeyProvider bind={ overridableProp.overrideKey }>
208
+ <ControlReplacementsProvider replacements={ controlReplacements }>
209
+ <Box mb={ 1.5 }>
210
+ <ControlTypeContainer layout={ layout }>
211
+ { layout !== 'custom' && <ControlLabel>{ overridableProp.label }</ControlLabel> }
212
+ <OriginalControl control={ control } controlProps={ controlProps } />
213
+ </ControlTypeContainer>
214
+ </Box>
215
+ </ControlReplacementsProvider>
216
+ </PropKeyProvider>
217
+ </PropProvider>
277
218
  </ElementProvider>
278
219
  </OverridablePropProvider>
279
220
  );
@@ -283,16 +224,17 @@ type ElementSettings = Record< string, AnyTransformable | null >;
283
224
 
284
225
  function resolveValueAndPlaceholder(
285
226
  matchingOverride: ComponentInstanceOverride | null,
286
- settingsWithInnerOverrides: ElementSettings,
227
+ overrideValue: AnyTransformable | null,
228
+ resolvedOriginValues: ElementSettings,
287
229
  propKey: string
288
230
  ) {
289
- const overrideValue = matchingOverride ? resolveOverridePropValue( matchingOverride ) : null;
290
-
291
- const placeholderSettings = unwrapOverridableSettings( settingsWithInnerOverrides );
231
+ const placeholderSettings = unwrapOverridableSettings( resolvedOriginValues );
292
232
  const inheritedValue = placeholderSettings[ propKey ] ?? null;
293
233
  const isInheritedDynamic = isDynamicPropValue( inheritedValue );
294
234
 
295
- const propValue = isInheritedDynamic && ! matchingOverride ? inheritedValue : overrideValue;
235
+ const shouldUseInheritedAsValue = isInheritedDynamic && ! matchingOverride;
236
+
237
+ const propValue = shouldUseInheritedAsValue ? inheritedValue : overrideValue;
296
238
  const placeholderValue = matchingOverride || isInheritedDynamic ? null : inheritedValue;
297
239
 
298
240
  return { propValue, placeholderValue };
@@ -408,31 +350,3 @@ function isValidOverride( overridableProps: OverridableProps, override: Componen
408
350
 
409
351
  return !! overridableProps.props[ overridableKey ];
410
352
  }
411
-
412
- function formatOverridesToApply( overrides: ComponentInstanceOverridesPropValue ): OverridesMapping {
413
- if ( ! overrides ) {
414
- return {};
415
- }
416
-
417
- const result: OverridesMapping = {};
418
-
419
- for ( const item of overrides ) {
420
- const overridable = componentOverridablePropTypeUtil.extract( item );
421
- let override: PropValue = item;
422
-
423
- if ( overridable ) {
424
- override = overridable.origin_value;
425
- }
426
-
427
- const extractedOverride = componentInstanceOverridePropTypeUtil.extract( override );
428
- if ( ! extractedOverride ) {
429
- continue;
430
- }
431
-
432
- result[ extractedOverride.override_key ] = {
433
- value: extractedOverride.override_value as AnyTransformable | null,
434
- };
435
- }
436
-
437
- return result;
438
- }
@@ -2,7 +2,7 @@ import { type AnyTransformable } from '@elementor/editor-props';
2
2
 
3
3
  import { componentOverridablePropTypeUtil } from '../../../prop-types/component-overridable-prop-type';
4
4
 
5
- type ElementSettings = Record< string, AnyTransformable | null >;
5
+ export type ElementSettings = Record< string, AnyTransformable | null >;
6
6
 
7
7
  export type OverridesMapping = {
8
8
  [ key: string ]: {
@@ -0,0 +1,73 @@
1
+ import { useMemo } from 'react';
2
+ import {
3
+ type DependencyEffect,
4
+ extractDependencyEffect,
5
+ extractOrderedDependencies,
6
+ getElementSettingsWithDefaults,
7
+ getUpdatedValues,
8
+ } from '@elementor/editor-editing-panel';
9
+ import { type ElementType } from '@elementor/editor-elements';
10
+ import { type AnyTransformable } from '@elementor/editor-props';
11
+
12
+ import { type ComponentInstanceOverride } from '../../../prop-types/component-instance-overrides-prop-type';
13
+ import { resolveOverridePropValue } from '../../../utils/resolve-override-prop-value';
14
+ import { type ElementSettings } from './resolve-element-settings';
15
+
16
+ type OverrideDependenciesResult = DependencyEffect & {
17
+ overrideValue: AnyTransformable | null;
18
+ };
19
+
20
+ export function useOverrideControlDependencies( {
21
+ existingOverride,
22
+ resolvedElementSettings,
23
+ elementId,
24
+ elementType,
25
+ propKey,
26
+ }: {
27
+ existingOverride: ComponentInstanceOverride | null;
28
+ resolvedElementSettings: ElementSettings;
29
+ elementType: ElementType;
30
+ elementId: string;
31
+ propKey: string;
32
+ } ): OverrideDependenciesResult {
33
+ return useMemo( () => {
34
+ const { isDisabled, isHidden } = extractDependencyEffect(
35
+ propKey,
36
+ elementType.propsSchema,
37
+ resolvedElementSettings
38
+ );
39
+
40
+ const existingOverrideValue = existingOverride ? resolveOverridePropValue( existingOverride ) : null;
41
+ const settingsForDepsNewValuesCalculation = { ...resolvedElementSettings, [ propKey ]: existingOverrideValue };
42
+
43
+ const resolvedSettingsWithDefaults = getElementSettingsWithDefaults(
44
+ elementType.propsSchema,
45
+ settingsForDepsNewValuesCalculation
46
+ );
47
+
48
+ const dependents = extractOrderedDependencies( elementType.dependenciesPerTargetMapping ?? {} );
49
+
50
+ const settingsWithDepsNewValues = getUpdatedValues(
51
+ settingsForDepsNewValuesCalculation,
52
+ dependents,
53
+ elementType.propsSchema,
54
+ resolvedSettingsWithDefaults,
55
+ elementId
56
+ );
57
+
58
+ const overrideValue = settingsWithDepsNewValues[ propKey ];
59
+
60
+ return {
61
+ overrideValue,
62
+ isDisabled,
63
+ isHidden,
64
+ };
65
+ }, [
66
+ existingOverride,
67
+ resolvedElementSettings,
68
+ propKey,
69
+ elementType.propsSchema,
70
+ elementType.dependenciesPerTargetMapping,
71
+ elementId,
72
+ ] );
73
+ }
@@ -0,0 +1,111 @@
1
+ import { useMemo } from 'react';
2
+ import { useElement } from '@elementor/editor-editing-panel';
3
+ import { type ElementType, getElementSettings, getElementType } from '@elementor/editor-elements';
4
+ import { type AnyTransformable, type PropValue } from '@elementor/editor-props';
5
+
6
+ import { componentInstanceOverridePropTypeUtil } from '../../../prop-types/component-instance-override-prop-type';
7
+ import { type ComponentInstanceOverridesPropValue } from '../../../prop-types/component-instance-overrides-prop-type';
8
+ import { componentOverridablePropTypeUtil } from '../../../prop-types/component-overridable-prop-type';
9
+ import { useComponentId, useComponentInstanceOverrides } from '../../../provider/component-instance-context';
10
+ import { type OverridableProp } from '../../../types';
11
+ import { resolveOverridesChain } from '../../../utils/resolve-overrides-chain';
12
+ import { OverrideControlInnerElementNotFoundError } from '../../errors';
13
+ import {
14
+ applyOverridesToSettings,
15
+ type ElementSettings,
16
+ type OverridesMapping,
17
+ unwrapOverridableSettings,
18
+ } from './resolve-element-settings';
19
+
20
+ type ResolvedInnerElement = {
21
+ elementId: string;
22
+ elementType: ElementType;
23
+ resolvedOriginValues: ElementSettings;
24
+ resolvedElementSettings: ElementSettings;
25
+ };
26
+
27
+ export function useResolvedInnerElement( overridableProp: OverridableProp ): ResolvedInnerElement {
28
+ const componentInstanceElement = useElement();
29
+ const componentId = useComponentId();
30
+ const overrides = useComponentInstanceOverrides();
31
+
32
+ const { elementId: originElementId, widgetType, elType } = overridableProp.originPropFields ?? overridableProp;
33
+ const type = elType === 'widget' ? widgetType : elType;
34
+ const elementType = getElementType( type );
35
+
36
+ if ( ! elementType ) {
37
+ throw new Error( `Element type not found for ${ type }` );
38
+ }
39
+
40
+ const { elementId, overridesMapping } = useMemo( () => {
41
+ const overridesChainResult = resolveOverridesChain( {
42
+ outerOverridableProp: overridableProp,
43
+ outerInstanceId: componentInstanceElement.element.id,
44
+ } );
45
+
46
+ if ( overridesChainResult.isChainBroken ) {
47
+ throw new OverrideControlInnerElementNotFoundError( {
48
+ context: { componentId, elementId: originElementId },
49
+ } );
50
+ }
51
+
52
+ return {
53
+ elementId: overridesChainResult.innerElement.id,
54
+ overridesMapping: overridesChainResult.overridesMapping,
55
+ };
56
+ }, [ overridableProp, componentInstanceElement.element.id, componentId, originElementId ] );
57
+
58
+ // Not reactive to inner element store changes — intentional.
59
+ // Inner element settings can only change in component edit mode, which unmounts this component.
60
+ const settingsWithInnerOverrides = useMemo( () => {
61
+ const settings = getElementSettings< AnyTransformable >(
62
+ elementId,
63
+ Object.keys( elementType?.propsSchema ?? {} )
64
+ );
65
+
66
+ return applyOverridesToSettings( settings, overridesMapping );
67
+ }, [ elementId, elementType?.propsSchema, overridesMapping ] );
68
+
69
+ const resolvedElementSettings = useMemo( () => {
70
+ const withAllOverrides = applyOverridesToSettings(
71
+ settingsWithInnerOverrides,
72
+ formatOverridesToApply( overrides )
73
+ );
74
+ return unwrapOverridableSettings( withAllOverrides );
75
+ }, [ settingsWithInnerOverrides, overrides ] );
76
+
77
+ return {
78
+ elementId,
79
+ elementType,
80
+ resolvedOriginValues: settingsWithInnerOverrides,
81
+ resolvedElementSettings,
82
+ };
83
+ }
84
+
85
+ function formatOverridesToApply( overrides: ComponentInstanceOverridesPropValue ): OverridesMapping {
86
+ if ( ! overrides ) {
87
+ return {};
88
+ }
89
+
90
+ const result: OverridesMapping = {};
91
+
92
+ for ( const item of overrides ) {
93
+ const overridable = componentOverridablePropTypeUtil.extract( item );
94
+ let override: PropValue = item;
95
+
96
+ if ( overridable ) {
97
+ override = overridable.origin_value;
98
+ }
99
+
100
+ const extractedOverride = componentInstanceOverridePropTypeUtil.extract( override );
101
+ if ( ! extractedOverride ) {
102
+ continue;
103
+ }
104
+
105
+ result[ extractedOverride.override_key ] = {
106
+ value: extractedOverride.override_value as AnyTransformable | null,
107
+ };
108
+ }
109
+
110
+ return result;
111
+ }
@@ -16,6 +16,16 @@ export function ComponentInstanceProvider( { children, ...props }: PropsWithChil
16
16
  return <ComponentInstanceContext.Provider value={ props }>{ children }</ComponentInstanceContext.Provider>;
17
17
  }
18
18
 
19
- export const useComponentId = () => useContext( ComponentInstanceContext )?.componentId;
20
- export const useComponentInstanceOverrides = () => useContext( ComponentInstanceContext )?.overrides;
21
- export const useComponentOverridableProps = () => useContext( ComponentInstanceContext )?.overridableProps;
19
+ function useComponentInstanceContext() {
20
+ const context = useContext( ComponentInstanceContext );
21
+
22
+ if ( ! context ) {
23
+ throw new Error( 'useComponentInstanceContext must be used within a ComponentInstanceProvider' );
24
+ }
25
+
26
+ return context;
27
+ }
28
+
29
+ export const useComponentId = () => useComponentInstanceContext().componentId;
30
+ export const useComponentInstanceOverrides = () => useComponentInstanceContext().overrides;
31
+ export const useComponentOverridableProps = () => useComponentInstanceContext().overridableProps;
@@ -1,4 +1,4 @@
1
- import { type PropValue } from '@elementor/editor-props';
1
+ import { type AnyTransformable, type PropValue } from '@elementor/editor-props';
2
2
 
3
3
  import {
4
4
  type ComponentInstanceOverrideProp,
@@ -10,7 +10,9 @@ import {
10
10
  componentOverridablePropTypeUtil,
11
11
  } from '../prop-types/component-overridable-prop-type';
12
12
 
13
- export const resolveOverridePropValue = ( originalPropValue: ComponentInstanceOverride | PropValue ): PropValue => {
13
+ export const resolveOverridePropValue = (
14
+ originalPropValue: ComponentInstanceOverride | PropValue
15
+ ): AnyTransformable | null => {
14
16
  const isOverridable = componentOverridablePropTypeUtil.isValid( originalPropValue );
15
17
  if ( isOverridable ) {
16
18
  return getOverridableValue( originalPropValue as ComponentOverridableProp );
@@ -21,10 +23,10 @@ export const resolveOverridePropValue = ( originalPropValue: ComponentInstanceOv
21
23
  return getOverrideValue( originalPropValue );
22
24
  }
23
25
 
24
- return originalPropValue;
26
+ return originalPropValue as AnyTransformable | null;
25
27
  };
26
28
 
27
- function getOverridableValue( overridableProp: ComponentOverridableProp | null ): PropValue {
29
+ function getOverridableValue( overridableProp: ComponentOverridableProp | null ): AnyTransformable | null {
28
30
  const overridableValue = componentOverridablePropTypeUtil.extract( overridableProp );
29
31
 
30
32
  if ( ! overridableValue ) {
@@ -37,15 +39,15 @@ function getOverridableValue( overridableProp: ComponentOverridableProp | null )
37
39
  return getOverrideValue( overridableValue.origin_value as ComponentInstanceOverrideProp );
38
40
  }
39
41
 
40
- return overridableValue.origin_value;
42
+ return overridableValue.origin_value as AnyTransformable | null;
41
43
  }
42
44
 
43
- function getOverrideValue( overrideProp: ComponentInstanceOverrideProp | null ): PropValue {
45
+ function getOverrideValue( overrideProp: ComponentInstanceOverrideProp | null ): AnyTransformable | null {
44
46
  const overrideValue = componentInstanceOverridePropTypeUtil.extract( overrideProp );
45
47
 
46
48
  if ( ! overrideValue ) {
47
49
  return null;
48
50
  }
49
51
 
50
- return overrideValue.override_value as PropValue;
52
+ return overrideValue.override_value as AnyTransformable | null;
51
53
  }