@elementor/editor-canvas 0.10.0 → 0.11.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 +10 -10
- package/CHANGELOG.md +40 -0
- package/dist/index.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
- package/src/__tests__/__mocks__/styles-schema.ts +259 -139
- package/src/__tests__/styles-prop-resolver.test.ts +18 -20
- package/src/components/__tests__/elements-overlays.test.tsx +3 -6
- package/src/components/elements-overlays.tsx +4 -6
- package/src/init-style-transformers.ts +5 -2
- package/src/renderers/__tests__/create-props-resolver.test.ts +10 -9
- package/src/transformers/create-transformer.ts +11 -4
- package/src/transformers/styles/create-multi-props-transformer.ts +1 -1
- package/src/transformers/types.ts +7 -1
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { createDOMElement, createMockElementType } from 'test-utils';
|
|
3
3
|
import { useElementsDomRef, useSelectedElement } from '@elementor/editor-elements';
|
|
4
|
-
import {
|
|
5
|
-
__privateUseIsPreviewMode as useIsPreviewMode,
|
|
6
|
-
__privateUseIsRouteActive as useIsRouteActive,
|
|
7
|
-
} from '@elementor/editor-v1-adapters';
|
|
4
|
+
import { __privateUseIsRouteActive as useIsRouteActive, useEditMode } from '@elementor/editor-v1-adapters';
|
|
8
5
|
import { render, screen } from '@testing-library/react';
|
|
9
6
|
|
|
10
7
|
import { CANVAS_WRAPPER_ID } from '../element-overlay';
|
|
@@ -48,7 +45,7 @@ describe( '<ElementsOverlays />', () => {
|
|
|
48
45
|
} )
|
|
49
46
|
);
|
|
50
47
|
|
|
51
|
-
jest.mocked(
|
|
48
|
+
jest.mocked( useEditMode ).mockReturnValue( 'edit' );
|
|
52
49
|
jest.mocked( useIsRouteActive ).mockReturnValue( false );
|
|
53
50
|
|
|
54
51
|
jest.mocked( useElementsDomRef ).mockImplementation( () => atomicElements );
|
|
@@ -103,7 +100,7 @@ describe( '<ElementsOverlays />', () => {
|
|
|
103
100
|
},
|
|
104
101
|
] )( 'should not render overlays if $message', ( { payload } ) => {
|
|
105
102
|
// Arrange.
|
|
106
|
-
jest.mocked(
|
|
103
|
+
jest.mocked( useEditMode ).mockReturnValue( payload.isPreviewMode ? 'preview' : 'edit' );
|
|
107
104
|
jest.mocked( useIsRouteActive ).mockReturnValue( payload.isKitRouteActive );
|
|
108
105
|
|
|
109
106
|
jest.mocked( useSelectedElement ).mockReturnValue(
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useElementsDomRef, useSelectedElement } from '@elementor/editor-elements';
|
|
3
|
-
import {
|
|
4
|
-
__privateUseIsPreviewMode as useIsPreviewMode,
|
|
5
|
-
__privateUseIsRouteActive as useIsRouteActive,
|
|
6
|
-
} from '@elementor/editor-v1-adapters';
|
|
3
|
+
import { __privateUseIsRouteActive as useIsRouteActive, useEditMode } from '@elementor/editor-v1-adapters';
|
|
7
4
|
|
|
8
5
|
import { ElementOverlay } from './element-overlay';
|
|
9
6
|
|
|
10
7
|
export function ElementsOverlays() {
|
|
11
8
|
const selected = useSelectedElement();
|
|
12
9
|
const domElements = useElementsDomRef();
|
|
10
|
+
const currentEditMode = useEditMode();
|
|
13
11
|
|
|
14
|
-
const
|
|
12
|
+
const isEditMode = currentEditMode === 'edit';
|
|
15
13
|
const isKitRouteActive = useIsRouteActive( 'panel/global' );
|
|
16
14
|
|
|
17
|
-
const isActive =
|
|
15
|
+
const isActive = isEditMode && ! isKitRouteActive;
|
|
18
16
|
|
|
19
17
|
return (
|
|
20
18
|
isActive &&
|
|
@@ -22,7 +22,7 @@ export function initStyleTransformers() {
|
|
|
22
22
|
.register(
|
|
23
23
|
'dimensions',
|
|
24
24
|
createMultiPropsTransformer(
|
|
25
|
-
[ '
|
|
25
|
+
[ 'block-start', 'block-end', 'inline-start', 'inline-end' ],
|
|
26
26
|
( { propKey, key } ) => `${ propKey }-${ key }`
|
|
27
27
|
)
|
|
28
28
|
)
|
|
@@ -46,7 +46,10 @@ export function initStyleTransformers() {
|
|
|
46
46
|
)
|
|
47
47
|
.register(
|
|
48
48
|
'border-width',
|
|
49
|
-
createMultiPropsTransformer(
|
|
49
|
+
createMultiPropsTransformer(
|
|
50
|
+
[ 'block-start', 'block-end', 'inline-start', 'inline-end' ],
|
|
51
|
+
( { key } ) => `border-${ key }-width`
|
|
52
|
+
)
|
|
50
53
|
)
|
|
51
54
|
.register(
|
|
52
55
|
'border-radius',
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createMockPropType } from 'test-utils';
|
|
2
2
|
|
|
3
|
+
import { createTransformer } from '../../transformers/create-transformer';
|
|
3
4
|
import { createPropsResolver } from '../create-props-resolver';
|
|
4
5
|
|
|
5
6
|
describe( 'createPropsResolver', () => {
|
|
6
7
|
it( 'should resolve simple props', async () => {
|
|
7
8
|
// Arrange.
|
|
8
9
|
const resolve = createPropsResolver( {
|
|
9
|
-
transformers: { int: ( value ) => value + 1 },
|
|
10
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
10
11
|
schema: { int: createMockPropType( { kind: 'plain', key: 'int' } ) },
|
|
11
12
|
} );
|
|
12
13
|
|
|
@@ -24,7 +25,7 @@ describe( 'createPropsResolver', () => {
|
|
|
24
25
|
it( 'should skip disabled props', async () => {
|
|
25
26
|
// Arrange.
|
|
26
27
|
const resolve = createPropsResolver( {
|
|
27
|
-
transformers: { int: ( value ) => value + 1 },
|
|
28
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
28
29
|
schema: { int: createMockPropType( { kind: 'plain', key: 'int' } ) },
|
|
29
30
|
} );
|
|
30
31
|
|
|
@@ -46,7 +47,7 @@ describe( 'createPropsResolver', () => {
|
|
|
46
47
|
it( 'should fallback to default value when there is no value', async () => {
|
|
47
48
|
// Arrange.
|
|
48
49
|
const resolve = createPropsResolver( {
|
|
49
|
-
transformers: { int: ( value ) => value + 1 },
|
|
50
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
50
51
|
schema: {
|
|
51
52
|
int: createMockPropType( {
|
|
52
53
|
kind: 'plain',
|
|
@@ -66,7 +67,7 @@ describe( 'createPropsResolver', () => {
|
|
|
66
67
|
it( 'should skip props that are not in the schema', async () => {
|
|
67
68
|
// Arrange.
|
|
68
69
|
const resolve = createPropsResolver( {
|
|
69
|
-
transformers: { int: ( value ) => value + 1 },
|
|
70
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
70
71
|
schema: {
|
|
71
72
|
int: createMockPropType( { kind: 'plain', key: 'int' } ),
|
|
72
73
|
},
|
|
@@ -93,7 +94,7 @@ describe( 'createPropsResolver', () => {
|
|
|
93
94
|
it( "should skip props that don't have a transformer", async () => {
|
|
94
95
|
// Arrange.
|
|
95
96
|
const resolve = createPropsResolver( {
|
|
96
|
-
transformers: { int: ( value ) => value + 1 },
|
|
97
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
97
98
|
schema: {
|
|
98
99
|
int: createMockPropType( { kind: 'plain', key: 'int' } ),
|
|
99
100
|
invalid: createMockPropType( { kind: 'plain', key: 'invalid' } ),
|
|
@@ -121,10 +122,10 @@ describe( 'createPropsResolver', () => {
|
|
|
121
122
|
it( 'should skip props when their transformer throws an error', async () => {
|
|
122
123
|
const resolve = createPropsResolver( {
|
|
123
124
|
transformers: {
|
|
124
|
-
int: ( value ) => value + 1,
|
|
125
|
-
throws: () => {
|
|
125
|
+
int: createTransformer( ( value: number ) => value + 1 ),
|
|
126
|
+
throws: createTransformer< number >( () => {
|
|
126
127
|
throw new Error( 'Not Working!' );
|
|
127
|
-
},
|
|
128
|
+
} ),
|
|
128
129
|
},
|
|
129
130
|
schema: {
|
|
130
131
|
int: createMockPropType( { kind: 'plain', key: 'int' } ),
|
|
@@ -154,7 +155,7 @@ describe( 'createPropsResolver', () => {
|
|
|
154
155
|
const onResolve = jest.fn();
|
|
155
156
|
|
|
156
157
|
const resolve = createPropsResolver( {
|
|
157
|
-
transformers: { int: ( value ) => value + 1 },
|
|
158
|
+
transformers: { int: createTransformer( ( value: number ) => value + 1 ) },
|
|
158
159
|
schema: {
|
|
159
160
|
int: createMockPropType( { kind: 'plain', key: 'int' } ),
|
|
160
161
|
int2: createMockPropType( { kind: 'plain', key: 'int' } ),
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AnyTransformable } from '@elementor/editor-props';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { type Transformer, type UnbrandedTransformer } from './types';
|
|
4
|
+
|
|
5
|
+
// Wrap transformer for better DX (types).
|
|
6
|
+
// Inspired by: https://tkdodo.eu/blog/the-query-options-api
|
|
7
|
+
export function createTransformer< TValue = never >(
|
|
8
|
+
cb: TValue extends AnyTransformable
|
|
9
|
+
? 'Transformable values are invalid, use the actual value instead.'
|
|
10
|
+
: UnbrandedTransformer< TValue >
|
|
11
|
+
): Transformer< NoInfer< TValue > > {
|
|
12
|
+
return cb as never;
|
|
6
13
|
}
|
|
@@ -4,7 +4,7 @@ import { createTransformer } from '../create-transformer';
|
|
|
4
4
|
type KeyGenerator = ( { propKey, key }: { propKey: string; key: string } ) => string;
|
|
5
5
|
|
|
6
6
|
export const createMultiPropsTransformer = ( keys: string[], keyGenerator: KeyGenerator ) => {
|
|
7
|
-
return createTransformer
|
|
7
|
+
return createTransformer< Record< string, string > >( ( value, { key: propKey } ) => {
|
|
8
8
|
const entries = keys
|
|
9
9
|
.filter( ( key ) => value[ key ] )
|
|
10
10
|
.map( ( key ) => [ keyGenerator( { propKey, key } ), value[ key ] ] );
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type UnbrandedTransformer< TValue > = (
|
|
2
2
|
value: TValue,
|
|
3
3
|
options: {
|
|
4
4
|
key: string;
|
|
@@ -6,6 +6,12 @@ export type Transformer< TValue > = (
|
|
|
6
6
|
}
|
|
7
7
|
) => unknown;
|
|
8
8
|
|
|
9
|
+
const brand = Symbol( 'transformer-brand' );
|
|
10
|
+
|
|
11
|
+
export type Transformer< TValue > = UnbrandedTransformer< TValue > & {
|
|
12
|
+
[ brand ]: true;
|
|
13
|
+
};
|
|
14
|
+
|
|
9
15
|
export type TransformerName = string;
|
|
10
16
|
|
|
11
17
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|