@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.
@@ -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( useIsPreviewMode ).mockReturnValue( false );
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( useIsPreviewMode ).mockReturnValue( payload.isPreviewMode );
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 isPreviewMode = useIsPreviewMode();
12
+ const isEditMode = currentEditMode === 'edit';
15
13
  const isKitRouteActive = useIsRouteActive( 'panel/global' );
16
14
 
17
- const isActive = ! isPreviewMode && ! isKitRouteActive;
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
- [ 'top', 'right', 'bottom', 'left' ],
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( [ 'top', 'right', 'bottom', 'left' ], ( { key } ) => `border-${ key }-width` )
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 Transformer } from './types';
1
+ import { type AnyTransformable } from '@elementor/editor-props';
2
2
 
3
- // Wrap transformer for better DX (types) + it will allow us to add more features in the future.
4
- export function createTransformer< TValue >( cb: Transformer< TValue > ): Transformer< TValue > {
5
- return cb;
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( ( value: Record< string, string >, { key: propKey } ) => {
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 Transformer< TValue > = (
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