@elementor/editor-editing-panel 1.18.0 → 1.20.0
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/CHANGELOG.md +27 -0
- package/dist/index.js +639 -533
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +490 -384
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/components/control-label-with-adornments.tsx +13 -0
- package/src/components/section.tsx +6 -2
- package/src/components/style-sections/layout-section/display-field.tsx +1 -1
- package/src/components/style-sections/layout-section/justify-content-field.tsx +1 -1
- package/src/components/style-sections/position-section/dimensions-field.tsx +1 -1
- package/src/components/style-sections/size-section/size-section.tsx +1 -1
- package/src/contexts/styles-inheritance-context.tsx +18 -3
- package/src/controls-registry/styles-field.tsx +14 -4
- package/src/dynamics/components/dynamic-selection-control.tsx +1 -1
- package/src/hooks/use-styles-fields.ts +3 -4
- package/src/hooks/use-styles-rerender.ts +10 -0
- package/src/styles-inheritance/styles-inheritance-indicator.tsx +70 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-editing-panel",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -40,14 +40,14 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@elementor/editor": "0.18.3",
|
|
43
|
-
"@elementor/editor-controls": "0.
|
|
43
|
+
"@elementor/editor-controls": "0.18.1",
|
|
44
44
|
"@elementor/editor-current-user": "0.3.0",
|
|
45
|
-
"@elementor/editor-elements": "0.6.
|
|
45
|
+
"@elementor/editor-elements": "0.6.4",
|
|
46
46
|
"@elementor/editor-panels": "0.13.0",
|
|
47
47
|
"@elementor/editor-props": "0.11.0",
|
|
48
48
|
"@elementor/editor-responsive": "0.13.3",
|
|
49
49
|
"@elementor/editor-styles": "0.6.3",
|
|
50
|
-
"@elementor/editor-styles-repository": "0.7.
|
|
50
|
+
"@elementor/editor-styles-repository": "0.7.7",
|
|
51
51
|
"@elementor/editor-ui": "0.4.2",
|
|
52
52
|
"@elementor/editor-v1-adapters": "0.11.0",
|
|
53
53
|
"@elementor/icons": "1.37.0",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type PropsWithChildren } from 'react';
|
|
3
|
+
import { ControlAdornments, ControlLabel } from '@elementor/editor-controls';
|
|
4
|
+
import { Stack } from '@elementor/ui';
|
|
5
|
+
|
|
6
|
+
export const ControlLabelWithAdornments = ( { children }: PropsWithChildren< object > ) => {
|
|
7
|
+
return (
|
|
8
|
+
<Stack direction="row" alignItems="center" justifyItems="start" gap={ 1 }>
|
|
9
|
+
<ControlLabel>{ children }</ControlLabel>
|
|
10
|
+
<ControlAdornments />
|
|
11
|
+
</Stack>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
@@ -22,9 +22,13 @@ export function Section( { title, children, defaultExpanded = false }: Props ) {
|
|
|
22
22
|
id={ labelId }
|
|
23
23
|
aria-controls={ contentId }
|
|
24
24
|
onClick={ () => setIsOpen( ( prev ) => ! prev ) }
|
|
25
|
+
sx={ { '&:hover': { backgroundColor: 'transparent' } } }
|
|
25
26
|
>
|
|
26
|
-
<ListItemText
|
|
27
|
-
|
|
27
|
+
<ListItemText
|
|
28
|
+
secondary={ title }
|
|
29
|
+
secondaryTypographyProps={ { sx: { typography: 'caption', fontWeight: 'bold' } } }
|
|
30
|
+
/>
|
|
31
|
+
<CollapseIcon open={ isOpen } color="secondary" fontSize="tiny" />
|
|
28
32
|
</ListItemButton>
|
|
29
33
|
<Collapse id={ contentId } aria-labelledby={ labelId } in={ isOpen } timeout="auto" unmountOnExit>
|
|
30
34
|
<Stack gap={ 2.5 } p={ 2 }>
|
|
@@ -37,7 +37,7 @@ export const DisplayField = () => {
|
|
|
37
37
|
|
|
38
38
|
return (
|
|
39
39
|
<StylesField bind="display">
|
|
40
|
-
<Stack gap={
|
|
40
|
+
<Stack gap={ 0.75 }>
|
|
41
41
|
<ControlLabel>{ __( 'Display', 'elementor' ) }</ControlLabel>
|
|
42
42
|
<ToggleControl options={ options } fullWidth={ true } />
|
|
43
43
|
</Stack>
|
|
@@ -71,7 +71,7 @@ export const JustifyContentField = () => {
|
|
|
71
71
|
<DirectionProvider rtl={ isSiteRtl }>
|
|
72
72
|
<ThemeProvider>
|
|
73
73
|
<StylesField bind="justify-content">
|
|
74
|
-
<Stack gap={
|
|
74
|
+
<Stack gap={ 0.75 }>
|
|
75
75
|
<ControlLabel>{ __( 'Justify content', 'elementor' ) }</ControlLabel>
|
|
76
76
|
<ToggleControl options={ options } fullWidth={ true } />
|
|
77
77
|
</Stack>
|
|
@@ -44,7 +44,7 @@ export const DimensionsField = () => {
|
|
|
44
44
|
};
|
|
45
45
|
const DimensionField = ( { side, label }: { side: Side; label: string } ) => {
|
|
46
46
|
return (
|
|
47
|
-
<Grid container gap={
|
|
47
|
+
<Grid container gap={ 0.75 } alignItems="center">
|
|
48
48
|
<Grid item xs={ 12 }>
|
|
49
49
|
<ControlLabel>{ label }</ControlLabel>
|
|
50
50
|
</Grid>
|
|
@@ -60,7 +60,7 @@ type ControlProps = {
|
|
|
60
60
|
const SizeField = ( { label, bind, extendedValues }: ControlProps ) => {
|
|
61
61
|
return (
|
|
62
62
|
<StylesField bind={ bind }>
|
|
63
|
-
<Grid container gap={
|
|
63
|
+
<Grid container gap={ 0.75 } alignItems="center">
|
|
64
64
|
<Grid item xs={ 12 }>
|
|
65
65
|
<ControlLabel>{ label }</ControlLabel>
|
|
66
66
|
</Grid>
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { createContext, type PropsWithChildren, useContext } from 'react';
|
|
3
|
-
import { useElementSetting } from '@elementor/editor-elements';
|
|
3
|
+
import { getWidgetsCache, useElementSetting } from '@elementor/editor-elements';
|
|
4
4
|
import { classesPropTypeUtil, type ClassesPropValue } from '@elementor/editor-props';
|
|
5
5
|
import { getBreakpointsTree } from '@elementor/editor-responsive';
|
|
6
6
|
import { stylesRepository } from '@elementor/editor-styles-repository';
|
|
7
7
|
|
|
8
|
+
import { useStylesRerender } from '../hooks/use-styles-rerender';
|
|
8
9
|
import { createStylesInheritance } from '../styles-inheritance/create-styles-inheritance';
|
|
9
10
|
import { type SnapshotPropValue, type StylesInheritanceSnapshotGetter } from '../styles-inheritance/types';
|
|
10
11
|
import { useClassesProp } from './classes-prop-context';
|
|
@@ -56,10 +57,24 @@ export function useStylesInheritanceField( field: string ): SnapshotPropValue[]
|
|
|
56
57
|
const useAppliedStyles = () => {
|
|
57
58
|
const { element } = useElement();
|
|
58
59
|
const currentClassesProp = useClassesProp();
|
|
60
|
+
const baseStyles = useBaseStyles();
|
|
61
|
+
|
|
62
|
+
useStylesRerender();
|
|
63
|
+
|
|
59
64
|
const classesProp = useElementSetting< ClassesPropValue >( element.id, currentClassesProp );
|
|
60
65
|
|
|
61
66
|
const appliedStyles = classesPropTypeUtil.extract( classesProp );
|
|
62
|
-
const allStyles = stylesRepository.all();
|
|
63
67
|
|
|
64
|
-
return
|
|
68
|
+
return stylesRepository
|
|
69
|
+
.all()
|
|
70
|
+
.filter( ( style ) => appliedStyles?.includes( style.id ) )
|
|
71
|
+
.concat( baseStyles );
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const useBaseStyles = () => {
|
|
75
|
+
const { elementType } = useElement();
|
|
76
|
+
const widgetsCache = getWidgetsCache();
|
|
77
|
+
const widgetCache = widgetsCache?.[ elementType.key ];
|
|
78
|
+
|
|
79
|
+
return Object.values( widgetCache?.base_styles ?? {} );
|
|
65
80
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { PropKeyProvider, PropProvider } from '@elementor/editor-controls';
|
|
2
|
+
import { ControlAdornmentsProvider, PropKeyProvider, PropProvider } from '@elementor/editor-controls';
|
|
3
3
|
import { type PropKey, type PropValue } from '@elementor/editor-props';
|
|
4
4
|
import { getStylesSchema } from '@elementor/editor-styles';
|
|
5
5
|
|
|
6
6
|
import { useStylesField } from '../hooks/use-styles-field';
|
|
7
|
+
import { StylesInheritanceIndicator } from '../styles-inheritance/styles-inheritance-indicator';
|
|
7
8
|
import { createTopLevelOjectType } from './create-top-level-object-type';
|
|
8
9
|
|
|
9
10
|
export type StylesFieldProps = {
|
|
@@ -25,8 +26,17 @@ export const StylesField = ( { bind, children }: StylesFieldProps ) => {
|
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
return (
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
<ControlAdornmentsProvider
|
|
30
|
+
items={ [
|
|
31
|
+
{
|
|
32
|
+
id: 'styles-inheritance',
|
|
33
|
+
Adornment: StylesInheritanceIndicator,
|
|
34
|
+
},
|
|
35
|
+
] }
|
|
36
|
+
>
|
|
37
|
+
<PropProvider propType={ propType } value={ values } setValue={ setValues }>
|
|
38
|
+
<PropKeyProvider bind={ bind }>{ children }</PropKeyProvider>
|
|
39
|
+
</PropProvider>
|
|
40
|
+
</ControlAdornmentsProvider>
|
|
31
41
|
);
|
|
32
42
|
};
|
|
@@ -178,7 +178,7 @@ const Control = ( { control }: { control: Control[ 'value' ] } ) => {
|
|
|
178
178
|
|
|
179
179
|
return (
|
|
180
180
|
<DynamicControl bind={ control.bind }>
|
|
181
|
-
<Grid container gap={
|
|
181
|
+
<Grid container gap={ 0.75 }>
|
|
182
182
|
{ control.label ? (
|
|
183
183
|
<Grid item xs={ 12 }>
|
|
184
184
|
<ControlLabel>{ control.label }</ControlLabel>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
createElementStyle,
|
|
4
4
|
type CreateElementStyleArgs,
|
|
@@ -17,6 +17,7 @@ import { useClassesProp } from '../contexts/classes-prop-context';
|
|
|
17
17
|
import { useElement } from '../contexts/element-context';
|
|
18
18
|
import { useStyle } from '../contexts/style-context';
|
|
19
19
|
import { StyleNotFoundUnderProviderError, StylesProviderCannotUpdatePropsError } from '../errors';
|
|
20
|
+
import { useStylesRerender } from './use-styles-rerender';
|
|
20
21
|
|
|
21
22
|
export function useStylesFields< T extends Props >( propNames: ( keyof T & string )[] ) {
|
|
22
23
|
const { element } = useElement();
|
|
@@ -26,9 +27,7 @@ export function useStylesFields< T extends Props >( propNames: ( keyof T & strin
|
|
|
26
27
|
const undoableUpdateStyle = useUndoableUpdateStyle();
|
|
27
28
|
const undoableCreateElementStyle = useUndoableCreateElementStyle();
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
useEffect( () => provider?.subscribe( reRender ), [ provider ] );
|
|
30
|
+
useStylesRerender();
|
|
32
31
|
|
|
33
32
|
const value = getProps< T >( {
|
|
34
33
|
elementId: element.id,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useEffect, useReducer } from 'react';
|
|
2
|
+
|
|
3
|
+
import { useStyle } from '../contexts/style-context';
|
|
4
|
+
|
|
5
|
+
export const useStylesRerender = () => {
|
|
6
|
+
const { provider } = useStyle();
|
|
7
|
+
const [ , reRender ] = useReducer( ( p ) => ! p, false );
|
|
8
|
+
|
|
9
|
+
useEffect( () => provider?.subscribe( reRender ), [ provider ] );
|
|
10
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useBoundProp } from '@elementor/editor-controls';
|
|
3
|
+
import { ELEMENTS_STYLES_PROVIDER_KEY } from '@elementor/editor-styles-repository';
|
|
4
|
+
import { styled } from '@elementor/ui';
|
|
5
|
+
import { __ } from '@wordpress/i18n';
|
|
6
|
+
|
|
7
|
+
import { useStyle } from '../contexts/style-context';
|
|
8
|
+
import { useStylesInheritanceField } from '../contexts/styles-inheritance-context';
|
|
9
|
+
import { useStylesField } from '../hooks/use-styles-field';
|
|
10
|
+
|
|
11
|
+
const Circle = styled( 'div', {
|
|
12
|
+
shouldForwardProp: ( prop ) => prop !== 'variant',
|
|
13
|
+
} )< { variant?: 'overridden' | 'local-affects' | 'global-affects' } >`
|
|
14
|
+
width: 5px;
|
|
15
|
+
height: 5px;
|
|
16
|
+
border-radius: 50%;
|
|
17
|
+
background-color: ${ ( { theme, variant } ) => {
|
|
18
|
+
switch ( variant ) {
|
|
19
|
+
case 'overridden':
|
|
20
|
+
return theme.palette.warning.main;
|
|
21
|
+
case 'global-affects':
|
|
22
|
+
return theme.palette.global.main;
|
|
23
|
+
case 'local-affects':
|
|
24
|
+
return theme.palette.primary.main;
|
|
25
|
+
default:
|
|
26
|
+
return theme.palette.text.secondary;
|
|
27
|
+
}
|
|
28
|
+
} };
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
export const StylesInheritanceIndicator = () => {
|
|
32
|
+
const { bind } = useBoundProp();
|
|
33
|
+
const { id: currentStyleId, provider: currentStyleProvider, meta: currentStyleMeta } = useStyle();
|
|
34
|
+
const [ value ] = useStylesField( bind );
|
|
35
|
+
const inheritanceChain = useStylesInheritanceField( bind );
|
|
36
|
+
|
|
37
|
+
if ( ! inheritanceChain.length ) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const [ { styleId, styleVariant } ] = inheritanceChain;
|
|
42
|
+
|
|
43
|
+
const { breakpoint, state } = styleVariant.meta;
|
|
44
|
+
|
|
45
|
+
if (
|
|
46
|
+
styleId === currentStyleId &&
|
|
47
|
+
breakpoint === currentStyleMeta.breakpoint &&
|
|
48
|
+
state === currentStyleMeta.state
|
|
49
|
+
) {
|
|
50
|
+
return (
|
|
51
|
+
<Circle
|
|
52
|
+
aria-label={ __( 'This is the final value', 'elementor' ) }
|
|
53
|
+
variant={
|
|
54
|
+
currentStyleProvider?.key === ELEMENTS_STYLES_PROVIDER_KEY ? 'local-affects' : 'global-affects'
|
|
55
|
+
}
|
|
56
|
+
/>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if ( value !== null && value !== undefined ) {
|
|
61
|
+
return (
|
|
62
|
+
<Circle
|
|
63
|
+
aria-label={ __( 'This value is overridden by another style', 'elementor' ) }
|
|
64
|
+
variant="overridden"
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return <Circle aria-label={ __( 'This has value from another style', 'elementor' ) } />;
|
|
70
|
+
};
|