@elementor/editor-canvas 0.21.3 → 0.22.1
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/.turbo/turbo-build.log +9 -9
- package/CHANGELOG.md +26 -0
- package/dist/index.js +44 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
- package/src/__tests__/settings-props-resolver.test.ts +29 -2
- package/src/hooks/use-style-items.ts +14 -1
- package/src/init-settings-transformers.ts +2 -2
- package/src/renderers/__tests__/__snapshots__/create-styles-renderer.test.ts.snap +14 -0
- package/src/renderers/__tests__/create-styles-renderer.test.ts +34 -59
- package/src/renderers/create-styles-renderer.ts +8 -4
- package/src/transformers/settings/classes-transformer.ts +31 -0
- package/src/transformers/settings/array-transformer.ts +0 -5
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`renderStyles should render styles 1`] = `
|
|
4
|
+
[
|
|
5
|
+
{
|
|
6
|
+
"id": "test",
|
|
7
|
+
"value": ".test{font-size:10px;}.test:hover{font-size:20px;}@media(max-width:992px){.test{font-size:30px;}}@media(max-width:768px){.test:focus{font-size:40px;}}",
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "test-2",
|
|
11
|
+
"value": ".custom-name{font-size:50px;}",
|
|
12
|
+
},
|
|
13
|
+
]
|
|
14
|
+
`;
|
|
@@ -1,72 +1,45 @@
|
|
|
1
1
|
/* eslint-disable testing-library/render-result-naming-convention */
|
|
2
2
|
import type { BreakpointsMap } from '@elementor/editor-responsive';
|
|
3
|
-
import { type StyleDefinition } from '@elementor/editor-styles';
|
|
4
3
|
|
|
5
|
-
import { createStylesRenderer } from '../create-styles-renderer';
|
|
4
|
+
import { createStylesRenderer, type RendererStyleDefinition } from '../create-styles-renderer';
|
|
6
5
|
|
|
7
6
|
describe( 'renderStyles', () => {
|
|
8
|
-
it( 'should render
|
|
7
|
+
it( 'should render styles', async () => {
|
|
9
8
|
// Arrange.
|
|
10
|
-
const styleDef:
|
|
9
|
+
const styleDef: RendererStyleDefinition = {
|
|
11
10
|
id: 'test',
|
|
12
11
|
type: 'class',
|
|
12
|
+
cssName: 'test',
|
|
13
13
|
label: 'Test',
|
|
14
14
|
variants: [
|
|
15
15
|
{
|
|
16
16
|
meta: { breakpoint: null, state: null },
|
|
17
|
-
props: { 'font-size': '
|
|
17
|
+
props: { 'font-size': '10px' },
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
meta: { breakpoint: null, state: 'hover' },
|
|
21
|
+
props: { 'font-size': '20px' },
|
|
18
22
|
},
|
|
19
23
|
{
|
|
20
24
|
meta: { breakpoint: 'tablet', state: null },
|
|
21
|
-
props: { 'font-size': '
|
|
25
|
+
props: { 'font-size': '30px' },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
meta: { breakpoint: 'mobile', state: 'focus' },
|
|
29
|
+
props: { 'font-size': '40px' },
|
|
22
30
|
},
|
|
23
31
|
],
|
|
24
32
|
};
|
|
25
33
|
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const renderStyles = createStylesRenderer( {
|
|
29
|
-
breakpoints: { tablet: { width: 992, type: 'max-width' } } as BreakpointsMap,
|
|
30
|
-
resolve,
|
|
31
|
-
} );
|
|
32
|
-
|
|
33
|
-
// Act.
|
|
34
|
-
const result = await renderStyles( { styles: [ styleDef ] } );
|
|
35
|
-
|
|
36
|
-
// Assert.
|
|
37
|
-
const defaultStyle = '.test{font-size:24px;}';
|
|
38
|
-
const tabletStyle = '@media(max-width:992px){.test{font-size:18px;}}';
|
|
39
|
-
|
|
40
|
-
expect( result ).toEqual( [
|
|
41
|
-
{
|
|
42
|
-
id: 'test',
|
|
43
|
-
value: `${ defaultStyle }${ tabletStyle }`,
|
|
44
|
-
},
|
|
45
|
-
] );
|
|
46
|
-
|
|
47
|
-
expect( resolve ).toHaveBeenCalledTimes( 2 );
|
|
48
|
-
expect( resolve ).toHaveBeenNthCalledWith( 1, { props: { 'font-size': '24px' } } );
|
|
49
|
-
expect( resolve ).toHaveBeenNthCalledWith( 2, { props: { 'font-size': '18px' } } );
|
|
50
|
-
} );
|
|
51
|
-
|
|
52
|
-
it( 'should render pseudo classes', async () => {
|
|
53
|
-
// Arrange.
|
|
54
|
-
const styleDef: StyleDefinition = {
|
|
55
|
-
id: 'test',
|
|
34
|
+
const styleDefWithCssName: RendererStyleDefinition = {
|
|
35
|
+
id: 'test-2',
|
|
56
36
|
type: 'class',
|
|
57
|
-
|
|
37
|
+
cssName: 'custom-name',
|
|
38
|
+
label: 'Test 2',
|
|
58
39
|
variants: [
|
|
59
40
|
{
|
|
60
41
|
meta: { breakpoint: null, state: null },
|
|
61
|
-
props: { 'font-size': '
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
meta: { breakpoint: null, state: 'hover' },
|
|
65
|
-
props: { 'font-size': '18px' },
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
meta: { breakpoint: 'mobile', state: 'focus' },
|
|
69
|
-
props: { 'font-size': '12px' },
|
|
42
|
+
props: { 'font-size': '50px' },
|
|
70
43
|
},
|
|
71
44
|
],
|
|
72
45
|
};
|
|
@@ -74,31 +47,33 @@ describe( 'renderStyles', () => {
|
|
|
74
47
|
const resolve = jest.fn( ( { props } ) => props );
|
|
75
48
|
|
|
76
49
|
const renderStyles = createStylesRenderer( {
|
|
77
|
-
breakpoints: {
|
|
50
|
+
breakpoints: {
|
|
51
|
+
tablet: { width: 992, type: 'max-width' },
|
|
52
|
+
mobile: { width: 768, type: 'max-width' },
|
|
53
|
+
} as BreakpointsMap,
|
|
78
54
|
resolve,
|
|
79
55
|
} );
|
|
80
56
|
|
|
81
57
|
// Act.
|
|
82
|
-
const
|
|
58
|
+
const result = await renderStyles( { styles: [ styleDef, styleDefWithCssName ] } );
|
|
83
59
|
|
|
84
60
|
// Assert.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
expect(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
] );
|
|
61
|
+
expect( result ).toMatchSnapshot();
|
|
62
|
+
|
|
63
|
+
expect( resolve ).toHaveBeenCalledTimes( 5 );
|
|
64
|
+
expect( resolve ).toHaveBeenNthCalledWith( 1, { props: { 'font-size': '10px' } } );
|
|
65
|
+
expect( resolve ).toHaveBeenNthCalledWith( 2, { props: { 'font-size': '20px' } } );
|
|
66
|
+
expect( resolve ).toHaveBeenNthCalledWith( 3, { props: { 'font-size': '30px' } } );
|
|
67
|
+
expect( resolve ).toHaveBeenNthCalledWith( 4, { props: { 'font-size': '40px' } } );
|
|
68
|
+
expect( resolve ).toHaveBeenNthCalledWith( 5, { props: { 'font-size': '50px' } } );
|
|
95
69
|
} );
|
|
96
70
|
|
|
97
71
|
it( 'should add selector prefix to the output', async () => {
|
|
98
72
|
// Arrange.
|
|
99
|
-
const styleDef:
|
|
73
|
+
const styleDef: RendererStyleDefinition = {
|
|
100
74
|
id: 'test',
|
|
101
75
|
type: 'class',
|
|
76
|
+
cssName: 'test',
|
|
102
77
|
label: 'Test',
|
|
103
78
|
variants: [
|
|
104
79
|
{
|
|
@@ -18,8 +18,12 @@ type CreateStyleRendererArgs = {
|
|
|
18
18
|
selectorPrefix?: string;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
+
export type RendererStyleDefinition = StyleDefinition & {
|
|
22
|
+
cssName: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
21
25
|
type StyleRendererArgs = {
|
|
22
|
-
styles:
|
|
26
|
+
styles: RendererStyleDefinition[];
|
|
23
27
|
signal?: AbortSignal;
|
|
24
28
|
};
|
|
25
29
|
|
|
@@ -40,7 +44,7 @@ export function createStylesRenderer( { resolve, breakpoints, selectorPrefix = '
|
|
|
40
44
|
const css = await propsToCss( { props: variant.props, resolve, signal } );
|
|
41
45
|
|
|
42
46
|
return createStyleWrapper()
|
|
43
|
-
.
|
|
47
|
+
.for( style.cssName, style.type )
|
|
44
48
|
.withPrefix( selectorPrefix )
|
|
45
49
|
.withState( variant.meta.state )
|
|
46
50
|
.withMediaQuery( variant.meta.breakpoint ? breakpoints[ variant.meta.breakpoint ] : null )
|
|
@@ -61,14 +65,14 @@ export function createStylesRenderer( { resolve, breakpoints, selectorPrefix = '
|
|
|
61
65
|
|
|
62
66
|
function createStyleWrapper( value: string = '', wrapper?: ( css: string ) => string ) {
|
|
63
67
|
return {
|
|
64
|
-
|
|
68
|
+
for: ( cssName: RendererStyleDefinition[ 'cssName' ], type: RendererStyleDefinition[ 'type' ] ) => {
|
|
65
69
|
const symbol = SELECTORS_MAP[ type ];
|
|
66
70
|
|
|
67
71
|
if ( ! symbol ) {
|
|
68
72
|
throw new UnknownStyleTypeError( { context: { type } } );
|
|
69
73
|
}
|
|
70
74
|
|
|
71
|
-
return createStyleWrapper( `${ value }${ symbol }${
|
|
75
|
+
return createStyleWrapper( `${ value }${ symbol }${ cssName }`, wrapper );
|
|
72
76
|
},
|
|
73
77
|
|
|
74
78
|
withPrefix: ( prefix: string ) =>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { stylesRepository } from '@elementor/editor-styles-repository';
|
|
2
|
+
|
|
3
|
+
import { createTransformer } from '../create-transformer';
|
|
4
|
+
|
|
5
|
+
export function createClassesTransformer() {
|
|
6
|
+
const cache = new Map< string, string >();
|
|
7
|
+
|
|
8
|
+
return createTransformer( ( value: string[] ) => {
|
|
9
|
+
return value
|
|
10
|
+
.map( ( id ) => {
|
|
11
|
+
if ( ! cache.has( id ) ) {
|
|
12
|
+
cache.set( id, getCssName( id ) );
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return cache.get( id );
|
|
16
|
+
} )
|
|
17
|
+
.filter( Boolean );
|
|
18
|
+
} );
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getCssName( id: string ) {
|
|
22
|
+
const provider = stylesRepository.getProviders().find( ( p ) => {
|
|
23
|
+
return p.actions.all().find( ( style ) => style.id === id );
|
|
24
|
+
} );
|
|
25
|
+
|
|
26
|
+
if ( ! provider ) {
|
|
27
|
+
return id;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return provider.actions.resolveCssName( id );
|
|
31
|
+
}
|