@elementor/editor-canvas 0.3.0 → 0.5.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.
Files changed (42) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +29 -0
  3. package/dist/index.js +162 -127
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +158 -123
  6. package/dist/index.mjs.map +1 -1
  7. package/package.json +4 -4
  8. package/src/__tests__/init-styles-renderer.test.ts +1 -1
  9. package/src/init-styles-renderer.ts +1 -1
  10. package/src/styles-renderer/__tests__/__mocks__/styles-schema.ts +785 -0
  11. package/src/styles-renderer/__tests__/index.test.ts +644 -71
  12. package/src/styles-renderer/get-styles-schema.ts +17 -0
  13. package/src/styles-renderer/multi-props.ts +26 -0
  14. package/src/styles-renderer/render.ts +10 -12
  15. package/src/styles-renderer/resolve.ts +99 -0
  16. package/src/styles-renderer/transformers/background-color-overlay-transformer.ts +9 -0
  17. package/src/styles-renderer/transformers/background-transformer.ts +12 -0
  18. package/src/styles-renderer/transformers/create-combine-array-transformer.ts +4 -15
  19. package/src/styles-renderer/transformers/create-corner-sizes-transformer.ts +33 -0
  20. package/src/styles-renderer/transformers/create-edge-sizes-transformer.ts +31 -0
  21. package/src/styles-renderer/transformers/gap-transformer.ts +20 -0
  22. package/src/styles-renderer/transformers/index.ts +22 -15
  23. package/src/styles-renderer/transformers/linked-dimensions-transformer.ts +13 -8
  24. package/src/styles-renderer/transformers/primitive-transformer.ts +7 -0
  25. package/src/styles-renderer/transformers/shadow-transformer.ts +5 -16
  26. package/src/styles-renderer/transformers/size-transformer.ts +3 -5
  27. package/src/styles-renderer/transformers/stroke-transformer.ts +3 -5
  28. package/src/styles-renderer/types.ts +3 -6
  29. package/src/styles-renderer/__tests__/__mocks__/style-definitions.ts +0 -171
  30. package/src/styles-renderer/transform.ts +0 -34
  31. package/src/styles-renderer/transformers/__tests__/background-overlay-transformer.test.ts +0 -46
  32. package/src/styles-renderer/transformers/__tests__/create-combine-array-transformer.test.ts +0 -61
  33. package/src/styles-renderer/transformers/__tests__/linked-dimensions-transformer.test.ts +0 -34
  34. package/src/styles-renderer/transformers/__tests__/shadow-transformer.test.ts +0 -127
  35. package/src/styles-renderer/transformers/__tests__/size-transformer.test.ts +0 -37
  36. package/src/styles-renderer/transformers/__tests__/stroke-transformer.test.ts +0 -59
  37. package/src/styles-renderer/transformers/background-overlay-transformer.ts +0 -13
  38. package/src/styles-renderer/transformers/border-radius-transformer.ts +0 -20
  39. package/src/styles-renderer/transformers/border-width-transformer.ts +0 -15
  40. package/src/styles-renderer/transformers/color-transformer.ts +0 -11
  41. package/src/styles-renderer/transformers/number-transformer.ts +0 -11
  42. package/src/styles-renderer/transformers/string-transformer.ts +0 -11
@@ -1,34 +0,0 @@
1
- import { isTransformable, type PropValue } from '@elementor/editor-props';
2
-
3
- import { type TransformersMap } from './types';
4
-
5
- const FALLBACK_VALUE = 'unset';
6
-
7
- export function transformValue( value: PropValue | undefined, transformers: TransformersMap ): PropValue {
8
- if ( ! isTransformable( value ) ) {
9
- return value;
10
- }
11
-
12
- const transformer = transformers[ value.$$type ];
13
-
14
- if ( ! transformer ) {
15
- // eslint-disable-next-line no-console
16
- console.error( `Transformer not found for prop type '${ value.$$type }'` );
17
-
18
- return FALLBACK_VALUE;
19
- }
20
-
21
- const transformedValue = transformer( value, {
22
- transform: ( v ) => transformValue( v, transformers ),
23
- } );
24
-
25
- if ( transformedValue === undefined ) {
26
- // eslint-disable-next-line no-console
27
- console.error( `Transformer '${ value.$$type }' received unsupported value` );
28
-
29
- return FALLBACK_VALUE;
30
- }
31
-
32
- // Transform recursively to support transformers that return transformable values.
33
- return transformValue( transformedValue, transformers );
34
- }
@@ -1,46 +0,0 @@
1
- import backgroundOverlayTransformer from '../background-overlay-transformer';
2
-
3
- describe( 'background-overlay-transformer', () => {
4
- it( 'should return undefined if invalid', () => {
5
- // Arrange.
6
- const transform = jest.fn( ( item ) => item );
7
- const initialData = {
8
- $$type: 'background-overlay',
9
- value: {
10
- color: {
11
- $$type: 'color',
12
- value: null,
13
- },
14
- 'invalid-key': null,
15
- },
16
- };
17
-
18
- // Act.
19
- const result = backgroundOverlayTransformer( initialData, { transform } );
20
-
21
- expect( result ).toBe( undefined );
22
- expect( transform ).not.toHaveBeenCalled();
23
- } );
24
-
25
- it( 'should transform valid color input to linear gradient string', () => {
26
- const transform = jest.fn( ( item ) =>
27
- item?.value.size ? `${ item.value.size }${ item.value.unit }` : item?.value
28
- );
29
-
30
- const prop = {
31
- $$type: 'background-overlay',
32
- value: {
33
- color: {
34
- $$type: 'color',
35
- value: 'rgba(0, 0, 0, 0.2)',
36
- },
37
- },
38
- };
39
-
40
- // Act.
41
- const result = backgroundOverlayTransformer( prop, { transform } );
42
-
43
- // Assert.
44
- expect( result ).toBe( `linear-gradient( rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2) )` );
45
- } );
46
- } );
@@ -1,61 +0,0 @@
1
- import { type PropValue } from '@elementor/editor-props';
2
-
3
- import createCombineArrayTransformer from '../create-combine-array-transformer';
4
-
5
- describe( 'combine-array-transformer', () => {
6
- it.each( [
7
- 'string',
8
- { $$type: 'object', value: { unit: 'px', size: 1 } },
9
- { $$type: 'string', value: 'rgba(0, 0, 0, 1)' },
10
- { $$type: 'number', value: 1 },
11
- { $$type: 'boolean', value: true },
12
- ] )( 'should return undefined if value is not an array', ( data ) => {
13
- // Arrange.
14
- const transform = jest.fn();
15
- const transformer = createCombineArrayTransformer( ' ' );
16
-
17
- // Act.
18
- const result = transformer( data, { transform } );
19
-
20
- // Assert.
21
- expect( result ).toBe( undefined );
22
- expect( transform ).not.toHaveBeenCalled();
23
- } );
24
-
25
- it( 'should return empty string if value is an empty array', () => {
26
- // Arrange.
27
- const transform = jest.fn();
28
- const transformer = createCombineArrayTransformer( ' ' );
29
- const data = {
30
- $$type: 'array',
31
- value: [],
32
- };
33
-
34
- // Act.
35
- const result = transformer( data, { transform } );
36
-
37
- // Assert.
38
- expect( result ).toBe( '' );
39
- } );
40
-
41
- it( 'should combine array of strings with given delimiter', () => {
42
- // Arrange.
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
- const transform = ( item: PropValue ) => ( item as any ).value;
45
- const transformer = createCombineArrayTransformer( ', ' );
46
- const data = {
47
- $$type: 'array',
48
- value: [
49
- { $$type: 'string', value: 'a' },
50
- { $$type: 'string', value: 'b' },
51
- { $$type: 'string', value: 'c' },
52
- ],
53
- };
54
-
55
- // Act.
56
- const result = transformer( data, { transform } );
57
-
58
- // Assert.
59
- expect( result ).toBe( 'a, b, c' );
60
- } );
61
- } );
@@ -1,34 +0,0 @@
1
- import LinkedDimensionsTransformer from '../linked-dimensions-transformer';
2
-
3
- describe( 'linked-dimensions-transformer', () => {
4
- it.each( [
5
- { value: { isLinked: true, top: '10', right: '10', bottom: '10', 'invalid-left-key': '10' } },
6
- { value: { 'invalid-key': '10' } },
7
- ] )( 'should return undefined if invalid', async ( { value } ) => {
8
- // Arrange.
9
- const transform = jest.fn( ( item ) => item );
10
- const initialData = { $$type: 'linked-dimensions', value };
11
-
12
- // Act.
13
- const result = LinkedDimensionsTransformer( initialData, { transform } );
14
-
15
- // Assert.
16
- expect( result ).toBe( undefined );
17
- expect( transform ).not.toHaveBeenCalled();
18
- } );
19
-
20
- it( 'should transform linked-dimensions to a string', () => {
21
- // Arrange.
22
- const transform = jest.fn( ( value ) => value );
23
- const linkedDimensions = { isLinked: false, top: undefined, right: '10', bottom: undefined, left: '10' };
24
-
25
- // Act.
26
- const result = LinkedDimensionsTransformer(
27
- { $$type: 'linked-dimensions', value: linkedDimensions },
28
- { transform }
29
- );
30
-
31
- // Assert.
32
- expect( result ).toBe( 'unset 10 unset 10' );
33
- } );
34
- } );
@@ -1,127 +0,0 @@
1
- import shadowTransformer from '../shadow-transformer';
2
-
3
- describe( 'box-shadow-transformer', () => {
4
- const validShadow = {
5
- position: 'inset',
6
- hOffset: {
7
- $$type: 'size',
8
- value: { unit: 'px', size: 1 },
9
- },
10
- vOffset: {
11
- $$type: 'size',
12
- value: { unit: 'px', size: 2 },
13
- },
14
- blur: {
15
- $$type: 'size',
16
- value: { unit: 'px', size: 3 },
17
- },
18
- spread: {
19
- $$type: 'size',
20
- value: { unit: 'px', size: 4 },
21
- },
22
- color: {
23
- $$type: 'color',
24
- value: 'rgba(0, 0, 0, 1)',
25
- },
26
- };
27
-
28
- it.each( [ 'position', 'hOffset', 'vOffset', 'blur', 'spread', 'color' ] )(
29
- 'should return undefined if %s is missing',
30
- ( prop ) => {
31
- // Arrange.
32
- const transform = jest.fn( ( item ) => item?.value.size ?? item?.value );
33
- const { [ prop as never ]: _, ...shadowWithoutProp } = validShadow;
34
- const data = {
35
- $$type: 'shadow',
36
- value: {
37
- ...shadowWithoutProp,
38
- 'invalid-key': undefined,
39
- },
40
- };
41
-
42
- // Act.
43
- const result = shadowTransformer( data, { transform } );
44
-
45
- // Assert.
46
- expect( result ).toBe( undefined );
47
- expect( transform ).not.toHaveBeenCalled();
48
- }
49
- );
50
-
51
- it( 'should transform box-shadow to a string position is null', () => {
52
- // Arrange.
53
-
54
- const transform = jest.fn( ( item ) => item?.value.size ?? item?.value );
55
- const data = {
56
- $$type: 'shadow',
57
- value: {
58
- position: null,
59
- hOffset: {
60
- $$type: 'size',
61
- value: { unit: 'px', size: 1 },
62
- },
63
- vOffset: {
64
- $$type: 'size',
65
- value: { unit: 'px', size: 2 },
66
- },
67
- blur: {
68
- $$type: 'size',
69
- value: { unit: 'px', size: 3 },
70
- },
71
- spread: {
72
- $$type: 'size',
73
- value: { unit: 'px', size: 4 },
74
- },
75
- color: {
76
- $$type: 'color',
77
- value: 'rgba(0, 0, 0, 1)',
78
- },
79
- },
80
- };
81
-
82
- // Act.
83
- const result = shadowTransformer( data, { transform } );
84
-
85
- // Assert.
86
- expect( result ).toBe( '1 2 3 4 rgba(0, 0, 0, 1)' );
87
- expect( transform ).toHaveBeenCalledTimes( 5 );
88
- } );
89
-
90
- it( 'should transform box-shadow to a string if all the props exist', () => {
91
- // Arrange.
92
- const transform = jest.fn( ( item ) => item?.value.size ?? item?.value );
93
- const data = {
94
- $$type: 'shadow',
95
- value: {
96
- position: 'inset',
97
- hOffset: {
98
- $$type: 'size',
99
- value: { unit: 'px', size: 1 },
100
- },
101
- vOffset: {
102
- $$type: 'size',
103
- value: { unit: 'px', size: 2 },
104
- },
105
- blur: {
106
- $$type: 'size',
107
- value: { unit: 'px', size: 3 },
108
- },
109
- spread: {
110
- $$type: 'size',
111
- value: { unit: 'px', size: 4 },
112
- },
113
- color: {
114
- $$type: 'color',
115
- value: 'rgba(0, 0, 0, 1)',
116
- },
117
- },
118
- };
119
-
120
- // Act.
121
- const result = shadowTransformer( data, { transform } );
122
-
123
- // Assert.
124
- expect( result ).toBe( '1 2 3 4 rgba(0, 0, 0, 1) inset' );
125
- expect( transform ).toHaveBeenCalledTimes( 5 );
126
- } );
127
- } );
@@ -1,37 +0,0 @@
1
- import sizeTransformer from '../size-transformer';
2
-
3
- describe( 'size-transformer', () => {
4
- it( 'should return undefined if invalid', () => {
5
- // Arrange.
6
- const transform = jest.fn( ( value ) => value );
7
- const props = [ '20px', { unit: 'px' }, { size: 20 } ].map( ( array ) => ( { $$type: 'array', array } ) );
8
-
9
- // Act.
10
- const results = props.map( ( prop ) => sizeTransformer( prop, { transform } ) );
11
-
12
- // Assert.
13
- results.forEach( ( result ) => {
14
- expect( result ).toBe( undefined );
15
- } );
16
- expect( transform ).not.toHaveBeenCalled();
17
- } );
18
-
19
- it( 'should transform a valid transformable size prop to a string', () => {
20
- // Arrange.
21
- const transform = jest.fn();
22
- const prop = {
23
- $$type: 'size',
24
- value: {
25
- unit: 'px',
26
- size: 20,
27
- },
28
- };
29
-
30
- // Act.
31
- const result = sizeTransformer( prop, { transform } );
32
-
33
- // Assert.
34
- expect( result ).toBe( '20px' );
35
- expect( transform ).not.toHaveBeenCalled();
36
- } );
37
- } );
@@ -1,59 +0,0 @@
1
- import strokeTransformer from '../stroke-transformer';
2
-
3
- describe( 'stroke-transformer', () => {
4
- it( 'should return undefined if invalid', () => {
5
- // Arrange.
6
- const transform = jest.fn( ( item ) => item );
7
- const initialData = {
8
- $$type: 'stroke',
9
- value: {
10
- color: {
11
- $$type: 'color',
12
- value: 'red',
13
- },
14
- width: {
15
- $$type: 'size',
16
- value: {
17
- unit: 'px',
18
- },
19
- },
20
- 'invalid-key': null,
21
- },
22
- };
23
-
24
- // Act.
25
- const result = strokeTransformer( initialData, { transform } );
26
-
27
- expect( result ).toBe( undefined );
28
- expect( transform ).not.toHaveBeenCalled();
29
- } );
30
-
31
- it( 'should transform valid stroke to text-stroke string', () => {
32
- const transform = jest.fn( ( item ) =>
33
- item?.value.size ? `${ item.value.size }${ item.value.unit }` : item?.value
34
- );
35
-
36
- const prop = {
37
- $$type: 'stroke',
38
- value: {
39
- color: {
40
- $$type: 'color',
41
- value: '#ff0000',
42
- },
43
- width: {
44
- $$type: 'size',
45
- value: {
46
- unit: 'px',
47
- size: 5,
48
- },
49
- },
50
- },
51
- };
52
-
53
- // Act.
54
- const result = strokeTransformer( prop, { transform } );
55
-
56
- // Assert.
57
- expect( result ).toBe( '5px #ff0000' );
58
- } );
59
- } );
@@ -1,13 +0,0 @@
1
- import { colorGradientPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const backgroundOverlayTransformer: Transformer = ( propValue, { transform } ) => {
6
- if ( colorGradientPropTypeUtil.isValid( propValue ) ) {
7
- return `linear-gradient( ${ [ transform( propValue.value.color ) ] }, ${ [
8
- transform( propValue.value.color ),
9
- ] } )`;
10
- }
11
- };
12
-
13
- export default backgroundOverlayTransformer;
@@ -1,20 +0,0 @@
1
- import { borderRadiusPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const borderRadiusTransformer: Transformer = ( propValue, { transform } ) => {
6
- if ( borderRadiusPropTypeUtil.isValid( propValue ) ) {
7
- const {
8
- 'top-left': topLeft,
9
- 'top-right': topRight,
10
- 'bottom-right': bottomRight,
11
- 'bottom-left': bottomLeft,
12
- } = propValue.value || {};
13
-
14
- return `${ transform( topLeft ) || 'unset' } ${ transform( topRight ) || 'unset' } ${
15
- transform( bottomRight ) || 'unset'
16
- } ${ transform( bottomLeft ) || 'unset' }`;
17
- }
18
- };
19
-
20
- export default borderRadiusTransformer;
@@ -1,15 +0,0 @@
1
- import { borderWidthPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const borderWidthTransformer: Transformer = ( propValue, { transform } ) => {
6
- if ( borderWidthPropTypeUtil.isValid( propValue ) ) {
7
- const { top, right, bottom, left } = propValue.value || {};
8
-
9
- return `${ transform( top ) || 'unset' } ${ transform( right ) || 'unset' } ${
10
- transform( bottom ) || 'unset'
11
- } ${ transform( left ) || 'unset' }`;
12
- }
13
- };
14
-
15
- export default borderWidthTransformer;
@@ -1,11 +0,0 @@
1
- import { colorPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const colorTransformer: Transformer = ( propValue ) => {
6
- if ( colorPropTypeUtil.isValid( propValue ) ) {
7
- return propValue.value;
8
- }
9
- };
10
-
11
- export default colorTransformer;
@@ -1,11 +0,0 @@
1
- import { numberPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const numberTransformer: Transformer = ( propValue ) => {
6
- if ( numberPropTypeUtil.isValid( propValue ) ) {
7
- return propValue.value;
8
- }
9
- };
10
-
11
- export default numberTransformer;
@@ -1,11 +0,0 @@
1
- import { stringPropTypeUtil } from '@elementor/editor-props';
2
-
3
- import { type Transformer } from '../types';
4
-
5
- const stringTransformer: Transformer = ( propValue ) => {
6
- if ( stringPropTypeUtil.isValid( propValue ) ) {
7
- return propValue.value;
8
- }
9
- };
10
-
11
- export default stringTransformer;