@elementor/editor-canvas 0.1.0 → 0.3.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/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +36 -0
- package/dist/index.js +295 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +295 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -5
- package/src/__tests__/init-styles-renderer.test.ts +69 -0
- package/src/init-styles-renderer.ts +43 -0
- package/src/init.tsx +3 -0
- package/src/styles-renderer/__tests__/__mocks__/style-definitions.ts +171 -0
- package/src/styles-renderer/__tests__/enqueue-used-fonts.test.ts +54 -0
- package/src/styles-renderer/__tests__/index.test.ts +132 -0
- package/src/styles-renderer/enqueue-used-fonts.ts +21 -0
- package/src/styles-renderer/index.ts +2 -0
- package/src/styles-renderer/render.ts +112 -0
- package/src/styles-renderer/transform.ts +34 -0
- package/src/styles-renderer/transformers/__tests__/background-overlay-transformer.test.ts +46 -0
- package/src/styles-renderer/transformers/__tests__/create-combine-array-transformer.test.ts +61 -0
- package/src/styles-renderer/transformers/__tests__/linked-dimensions-transformer.test.ts +34 -0
- package/src/styles-renderer/transformers/__tests__/shadow-transformer.test.ts +127 -0
- package/src/styles-renderer/transformers/__tests__/size-transformer.test.ts +37 -0
- package/src/styles-renderer/transformers/__tests__/stroke-transformer.test.ts +59 -0
- package/src/styles-renderer/transformers/background-overlay-transformer.ts +13 -0
- package/src/styles-renderer/transformers/border-radius-transformer.ts +20 -0
- package/src/styles-renderer/transformers/border-width-transformer.ts +15 -0
- package/src/styles-renderer/transformers/color-transformer.ts +11 -0
- package/src/styles-renderer/transformers/create-combine-array-transformer.ts +20 -0
- package/src/styles-renderer/transformers/index.ts +26 -0
- package/src/styles-renderer/transformers/linked-dimensions-transformer.ts +15 -0
- package/src/styles-renderer/transformers/number-transformer.ts +11 -0
- package/src/styles-renderer/transformers/shadow-transformer.ts +22 -0
- package/src/styles-renderer/transformers/size-transformer.ts +11 -0
- package/src/styles-renderer/transformers/string-transformer.ts +11 -0
- package/src/styles-renderer/transformers/stroke-transformer.ts +11 -0
- package/src/styles-renderer/types.ts +9 -0
- package/src/sync/enqueue-font.ts +7 -0
- package/src/sync/get-canvas-iframe-body.ts +7 -0
- package/src/sync/types.ts +10 -0
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
} );
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
} );
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
} );
|
|
@@ -0,0 +1,13 @@
|
|
|
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;
|
|
@@ -0,0 +1,20 @@
|
|
|
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;
|
|
@@ -0,0 +1,15 @@
|
|
|
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;
|
|
@@ -0,0 +1,11 @@
|
|
|
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;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from '@elementor/schema';
|
|
2
|
+
|
|
3
|
+
import { type Transformer } from '../types';
|
|
4
|
+
|
|
5
|
+
export const schema = z.object( {
|
|
6
|
+
$$type: z.string(),
|
|
7
|
+
value: z.array( z.any() ),
|
|
8
|
+
} );
|
|
9
|
+
|
|
10
|
+
const createCombineArrayTransformer =
|
|
11
|
+
( delimiter: string ): Transformer =>
|
|
12
|
+
( propValue, { transform } ) => {
|
|
13
|
+
const { success, data } = schema.safeParse( propValue );
|
|
14
|
+
|
|
15
|
+
if ( success ) {
|
|
16
|
+
return data.value.map( ( item ) => transform( item ) ).join( delimiter );
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default createCombineArrayTransformer;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { default as backgroundOverlay } from './background-overlay-transformer';
|
|
2
|
+
import { default as borderRadius } from './border-radius-transformer';
|
|
3
|
+
import { default as borderWidth } from './border-width-transformer';
|
|
4
|
+
import { default as color } from './color-transformer';
|
|
5
|
+
import { default as createCombineArrayTransformer } from './create-combine-array-transformer';
|
|
6
|
+
import { default as linkedDimensions } from './linked-dimensions-transformer';
|
|
7
|
+
import { default as number } from './number-transformer';
|
|
8
|
+
import { default as shadow } from './shadow-transformer';
|
|
9
|
+
import { default as size } from './size-transformer';
|
|
10
|
+
import { default as string } from './string-transformer';
|
|
11
|
+
import { default as stroke } from './stroke-transformer';
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
color,
|
|
15
|
+
number,
|
|
16
|
+
size,
|
|
17
|
+
shadow,
|
|
18
|
+
string,
|
|
19
|
+
stroke,
|
|
20
|
+
'border-radius': borderRadius,
|
|
21
|
+
'border-width': borderWidth,
|
|
22
|
+
'box-shadow': createCombineArrayTransformer( ', ' ),
|
|
23
|
+
'background-image': createCombineArrayTransformer( ', ' ),
|
|
24
|
+
'linked-dimensions': linkedDimensions,
|
|
25
|
+
'background-overlay': backgroundOverlay,
|
|
26
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { linkedDimensionsPropTypeUtil } from '@elementor/editor-props';
|
|
2
|
+
|
|
3
|
+
import { type Transformer } from '../types';
|
|
4
|
+
|
|
5
|
+
const linkedDimensionsTransformer: Transformer = ( propValue, { transform } ) => {
|
|
6
|
+
if ( linkedDimensionsPropTypeUtil.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 linkedDimensionsTransformer;
|
|
@@ -0,0 +1,11 @@
|
|
|
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;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { shadowPropTypeUtil } from '@elementor/editor-props';
|
|
2
|
+
|
|
3
|
+
import { type Transformer } from '../types';
|
|
4
|
+
|
|
5
|
+
const shadowTransformer: Transformer = ( propValue, { transform } ) => {
|
|
6
|
+
if ( shadowPropTypeUtil.isValid( propValue ) ) {
|
|
7
|
+
const { position, hOffset, vOffset, blur, spread, color } = propValue.value || {};
|
|
8
|
+
|
|
9
|
+
return [
|
|
10
|
+
transform( hOffset ),
|
|
11
|
+
transform( vOffset ),
|
|
12
|
+
transform( blur ),
|
|
13
|
+
transform( spread ),
|
|
14
|
+
transform( color ),
|
|
15
|
+
position,
|
|
16
|
+
]
|
|
17
|
+
.filter( Boolean )
|
|
18
|
+
.join( ' ' );
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default shadowTransformer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { sizePropTypeUtil } from '@elementor/editor-props';
|
|
2
|
+
|
|
3
|
+
import { type Transformer } from '../types';
|
|
4
|
+
|
|
5
|
+
const sizeTransformer: Transformer = ( propValue ) => {
|
|
6
|
+
if ( sizePropTypeUtil.isValid( propValue ) ) {
|
|
7
|
+
return propValue.value && propValue.value.size + propValue.value.unit;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default sizeTransformer;
|
|
@@ -0,0 +1,11 @@
|
|
|
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;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { strokePropTypeUtil } from '@elementor/editor-props';
|
|
2
|
+
|
|
3
|
+
import { type Transformer } from '../types';
|
|
4
|
+
|
|
5
|
+
const strokeTransformer: Transformer = ( propValue, { transform } ) => {
|
|
6
|
+
if ( strokePropTypeUtil.isValid( propValue ) ) {
|
|
7
|
+
return `${ transform( propValue.value?.width ) } ${ transform( propValue.value?.color ) }`;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default strokeTransformer;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type PropValue } from '@elementor/editor-props';
|
|
2
|
+
|
|
3
|
+
type TransformerOptions = {
|
|
4
|
+
transform: ( value: PropValue ) => PropValue;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export type Transformer = ( value: PropValue, options: TransformerOptions ) => PropValue;
|
|
8
|
+
|
|
9
|
+
export type TransformersMap = Record< string, Transformer >;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CanvasExtendedWindow, type EnqueueFont } from './types';
|
|
2
|
+
|
|
3
|
+
export const enqueueFont: EnqueueFont = ( fontFamily, context = 'preview' ) => {
|
|
4
|
+
const extendedWindow = window as unknown as CanvasExtendedWindow;
|
|
5
|
+
|
|
6
|
+
return extendedWindow.elementor?.helpers?.enqueueFont?.( fontFamily, context ) ?? null;
|
|
7
|
+
};
|