@elementor/editor-canvas 3.33.0-220 → 3.33.0-221

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/dist/index.js CHANGED
@@ -281,6 +281,7 @@ function getLinkAttrs(el) {
281
281
  // src/hooks/use-style-items.ts
282
282
  var import_react9 = require("react");
283
283
  var import_editor_responsive2 = require("@elementor/editor-responsive");
284
+ var import_editor_styles3 = require("@elementor/editor-styles");
284
285
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
285
286
  var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
286
287
 
@@ -469,6 +470,7 @@ var import_react8 = require("react");
469
470
  var import_editor_responsive = require("@elementor/editor-responsive");
470
471
 
471
472
  // src/renderers/create-styles-renderer.ts
473
+ var import_editor_styles2 = require("@elementor/editor-styles");
472
474
  var import_utils3 = require("@elementor/utils");
473
475
 
474
476
  // src/renderers/errors.ts
@@ -477,6 +479,10 @@ var UnknownStyleTypeError = (0, import_utils2.createError)({
477
479
  code: "unknown_style_type",
478
480
  message: "Unknown style type"
479
481
  });
482
+ var UnknownStyleStateError = (0, import_utils2.createError)({
483
+ code: "unknown_style_state",
484
+ message: "Unknown style state"
485
+ });
480
486
 
481
487
  // src/renderers/create-styles-renderer.ts
482
488
  var SELECTORS_MAP = {
@@ -494,7 +500,8 @@ function createStylesRenderer({ resolve, breakpoints, selectorPrefix = "" }) {
494
500
  return {
495
501
  id: style.id,
496
502
  breakpoint: style?.variants[0]?.meta?.breakpoint || "desktop",
497
- value: variantsCss.join("")
503
+ value: variantsCss.join(""),
504
+ state: style?.variants[0]?.meta?.state || null
498
505
  };
499
506
  });
500
507
  return await Promise.all(stylesCssPromises);
@@ -510,7 +517,18 @@ function createStyleWrapper(value = "", wrapper) {
510
517
  return createStyleWrapper(`${value}${symbol}${cssName}`, wrapper);
511
518
  },
512
519
  withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
513
- withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
520
+ withState: (state) => {
521
+ if (!state) {
522
+ return createStyleWrapper(value, wrapper);
523
+ }
524
+ if ((0, import_editor_styles2.isClassState)(state)) {
525
+ return createStyleWrapper(`${value}.${state}`, wrapper);
526
+ }
527
+ if ((0, import_editor_styles2.isPseudoState)(state)) {
528
+ return createStyleWrapper(`${value}:${state}`, wrapper);
529
+ }
530
+ throw new UnknownStyleStateError({ context: { state } });
531
+ },
514
532
  withMediaQuery: (breakpoint) => {
515
533
  if (!breakpoint?.type) {
516
534
  return createStyleWrapper(value, wrapper);
@@ -591,14 +609,27 @@ function useStyleItems() {
591
609
  });
592
610
  const breakpointsOrder = (0, import_editor_responsive2.getBreakpoints)().map((breakpoint) => breakpoint.id);
593
611
  return (0, import_react9.useMemo)(
594
- () => Object.values(styleItems).sort(({ provider: providerA }, { provider: providerB }) => providerA.priority - providerB.priority).flatMap(({ items }) => items).sort(({ breakpoint: breakpointA }, { breakpoint: breakpointB }) => {
595
- return breakpointsOrder.indexOf(breakpointA) - breakpointsOrder.indexOf(breakpointB);
596
- }),
612
+ () => Object.values(styleItems).sort(sortByProviderPriority).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
597
613
  // eslint-disable-next-line
598
614
  // eslint-disable-next-line react-hooks/exhaustive-deps
599
615
  [styleItems, breakpointsOrder.join("-")]
600
616
  );
601
617
  }
618
+ function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
619
+ return providerA.priority - providerB.priority;
620
+ }
621
+ function sortByBreakpoint(breakpointsOrder) {
622
+ return ({ breakpoint: breakpointA }, { breakpoint: breakpointB }) => breakpointsOrder.indexOf(breakpointA) - breakpointsOrder.indexOf(breakpointB);
623
+ }
624
+ function sortByStateType({ state: stateA }, { state: stateB }) {
625
+ if ((0, import_editor_styles3.isClassState)(stateA) && !(0, import_editor_styles3.isClassState)(stateB)) {
626
+ return -1;
627
+ }
628
+ if (!(0, import_editor_styles3.isClassState)(stateA) && (0, import_editor_styles3.isClassState)(stateB)) {
629
+ return 1;
630
+ }
631
+ return 0;
632
+ }
602
633
  function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
603
634
  return abortPreviousRuns(
604
635
  (abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
package/dist/index.mjs CHANGED
@@ -241,6 +241,7 @@ function getLinkAttrs(el) {
241
241
  // src/hooks/use-style-items.ts
242
242
  import { useEffect as useEffect5, useMemo as useMemo3, useState as useState2 } from "react";
243
243
  import { getBreakpoints } from "@elementor/editor-responsive";
244
+ import { isClassState as isClassState2 } from "@elementor/editor-styles";
244
245
  import { stylesRepository as stylesRepository2 } from "@elementor/editor-styles-repository";
245
246
  import { registerDataHook } from "@elementor/editor-v1-adapters";
246
247
 
@@ -431,6 +432,10 @@ import { useMemo as useMemo2 } from "react";
431
432
  import { useBreakpointsMap } from "@elementor/editor-responsive";
432
433
 
433
434
  // src/renderers/create-styles-renderer.ts
435
+ import {
436
+ isClassState,
437
+ isPseudoState
438
+ } from "@elementor/editor-styles";
434
439
  import { decodeString } from "@elementor/utils";
435
440
 
436
441
  // src/renderers/errors.ts
@@ -439,6 +444,10 @@ var UnknownStyleTypeError = createError({
439
444
  code: "unknown_style_type",
440
445
  message: "Unknown style type"
441
446
  });
447
+ var UnknownStyleStateError = createError({
448
+ code: "unknown_style_state",
449
+ message: "Unknown style state"
450
+ });
442
451
 
443
452
  // src/renderers/create-styles-renderer.ts
444
453
  var SELECTORS_MAP = {
@@ -456,7 +465,8 @@ function createStylesRenderer({ resolve, breakpoints, selectorPrefix = "" }) {
456
465
  return {
457
466
  id: style.id,
458
467
  breakpoint: style?.variants[0]?.meta?.breakpoint || "desktop",
459
- value: variantsCss.join("")
468
+ value: variantsCss.join(""),
469
+ state: style?.variants[0]?.meta?.state || null
460
470
  };
461
471
  });
462
472
  return await Promise.all(stylesCssPromises);
@@ -472,7 +482,18 @@ function createStyleWrapper(value = "", wrapper) {
472
482
  return createStyleWrapper(`${value}${symbol}${cssName}`, wrapper);
473
483
  },
474
484
  withPrefix: (prefix) => createStyleWrapper([prefix, value].filter(Boolean).join(" "), wrapper),
475
- withState: (state) => createStyleWrapper(state ? `${value}:${state}` : value, wrapper),
485
+ withState: (state) => {
486
+ if (!state) {
487
+ return createStyleWrapper(value, wrapper);
488
+ }
489
+ if (isClassState(state)) {
490
+ return createStyleWrapper(`${value}.${state}`, wrapper);
491
+ }
492
+ if (isPseudoState(state)) {
493
+ return createStyleWrapper(`${value}:${state}`, wrapper);
494
+ }
495
+ throw new UnknownStyleStateError({ context: { state } });
496
+ },
476
497
  withMediaQuery: (breakpoint) => {
477
498
  if (!breakpoint?.type) {
478
499
  return createStyleWrapper(value, wrapper);
@@ -553,14 +574,27 @@ function useStyleItems() {
553
574
  });
554
575
  const breakpointsOrder = getBreakpoints().map((breakpoint) => breakpoint.id);
555
576
  return useMemo3(
556
- () => Object.values(styleItems).sort(({ provider: providerA }, { provider: providerB }) => providerA.priority - providerB.priority).flatMap(({ items }) => items).sort(({ breakpoint: breakpointA }, { breakpoint: breakpointB }) => {
557
- return breakpointsOrder.indexOf(breakpointA) - breakpointsOrder.indexOf(breakpointB);
558
- }),
577
+ () => Object.values(styleItems).sort(sortByProviderPriority).flatMap(({ items }) => items).sort(sortByStateType).sort(sortByBreakpoint(breakpointsOrder)),
559
578
  // eslint-disable-next-line
560
579
  // eslint-disable-next-line react-hooks/exhaustive-deps
561
580
  [styleItems, breakpointsOrder.join("-")]
562
581
  );
563
582
  }
583
+ function sortByProviderPriority({ provider: providerA }, { provider: providerB }) {
584
+ return providerA.priority - providerB.priority;
585
+ }
586
+ function sortByBreakpoint(breakpointsOrder) {
587
+ return ({ breakpoint: breakpointA }, { breakpoint: breakpointB }) => breakpointsOrder.indexOf(breakpointA) - breakpointsOrder.indexOf(breakpointB);
588
+ }
589
+ function sortByStateType({ state: stateA }, { state: stateB }) {
590
+ if (isClassState2(stateA) && !isClassState2(stateB)) {
591
+ return -1;
592
+ }
593
+ if (!isClassState2(stateA) && isClassState2(stateB)) {
594
+ return 1;
595
+ }
596
+ return 0;
597
+ }
564
598
  function createProviderSubscriber({ provider, renderStyles, setStyleItems }) {
565
599
  return abortPreviousRuns(
566
600
  (abortController) => signalizedProcess(abortController.signal).then((_, signal) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-canvas",
3
3
  "description": "Elementor Editor Canvas",
4
- "version": "3.33.0-220",
4
+ "version": "3.33.0-221",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -37,19 +37,19 @@
37
37
  "react-dom": "^18.3.1"
38
38
  },
39
39
  "dependencies": {
40
- "@elementor/editor": "3.33.0-220",
41
- "@elementor/editor-notifications": "3.33.0-220",
42
- "@elementor/editor-documents": "3.33.0-220",
43
- "@elementor/editor-elements": "3.33.0-220",
44
- "@elementor/editor-props": "3.33.0-220",
45
- "@elementor/editor-responsive": "3.33.0-220",
46
- "@elementor/editor-styles": "3.33.0-220",
47
- "@elementor/editor-styles-repository": "3.33.0-220",
48
- "@elementor/editor-v1-adapters": "3.33.0-220",
49
- "@elementor/twing": "3.33.0-220",
40
+ "@elementor/editor": "3.33.0-221",
41
+ "@elementor/editor-notifications": "3.33.0-221",
42
+ "@elementor/editor-documents": "3.33.0-221",
43
+ "@elementor/editor-elements": "3.33.0-221",
44
+ "@elementor/editor-props": "3.33.0-221",
45
+ "@elementor/editor-responsive": "3.33.0-221",
46
+ "@elementor/editor-styles": "3.33.0-221",
47
+ "@elementor/editor-styles-repository": "3.33.0-221",
48
+ "@elementor/editor-v1-adapters": "3.33.0-221",
49
+ "@elementor/twing": "3.33.0-221",
50
50
  "@elementor/ui": "1.36.12",
51
- "@elementor/utils": "3.33.0-220",
52
- "@elementor/wp-media": "3.33.0-220",
51
+ "@elementor/utils": "3.33.0-221",
52
+ "@elementor/wp-media": "3.33.0-221",
53
53
  "@floating-ui/react": "^0.27.5",
54
54
  "@wordpress/i18n": "^5.13.0"
55
55
  },
@@ -46,8 +46,8 @@ describe( '<StyleRenderer />', () => {
46
46
  const mockContainer = document.createElement( 'div' );
47
47
 
48
48
  const mockCssItems = [
49
- { id: 'style1', value: '.test { color: red; }', breakpoint: 'desktop' },
50
- { id: 'style2', value: '.test2 { color: blue; }', breakpoint: 'desktop' },
49
+ { id: 'style1', value: '.test { color: red; }', breakpoint: 'desktop', state: null },
50
+ { id: 'style2', value: '.test2 { color: blue; }', breakpoint: 'desktop', state: null },
51
51
  ];
52
52
 
53
53
  const mockLinkAttrs = [
@@ -1,5 +1,6 @@
1
1
  import { type Dispatch, type SetStateAction, useEffect, useMemo, useState } from 'react';
2
2
  import { type BreakpointId, getBreakpoints } from '@elementor/editor-responsive';
3
+ import { isClassState, type StyleDefinitionClassState } from '@elementor/editor-styles';
3
4
  import { type StylesProvider, stylesRepository } from '@elementor/editor-styles-repository';
4
5
  import { registerDataHook } from '@elementor/editor-v1-adapters';
5
6
 
@@ -58,19 +59,45 @@ export function useStyleItems() {
58
59
  return useMemo(
59
60
  () =>
60
61
  Object.values( styleItems )
61
- .sort( ( { provider: providerA }, { provider: providerB } ) => providerA.priority - providerB.priority )
62
+ .sort( sortByProviderPriority )
62
63
  .flatMap( ( { items } ) => items )
63
- .sort( ( { breakpoint: breakpointA }, { breakpoint: breakpointB } ) => {
64
- return (
65
- breakpointsOrder.indexOf( breakpointA as BreakpointId ) -
66
- breakpointsOrder.indexOf( breakpointB as BreakpointId )
67
- );
68
- } ),
64
+ .sort( sortByStateType )
65
+ .sort( sortByBreakpoint( breakpointsOrder ) ),
69
66
  // eslint-disable-next-line
70
67
  // eslint-disable-next-line react-hooks/exhaustive-deps
71
68
  [ styleItems, breakpointsOrder.join( '-' ) ]
72
69
  );
73
70
  }
71
+ function sortByProviderPriority(
72
+ { provider: providerA }: ProviderAndStyleItems,
73
+ { provider: providerB }: ProviderAndStyleItems
74
+ ) {
75
+ return providerA.priority - providerB.priority;
76
+ }
77
+
78
+ function sortByBreakpoint( breakpointsOrder: BreakpointId[] ) {
79
+ return ( { breakpoint: breakpointA }: StyleItem, { breakpoint: breakpointB }: StyleItem ) =>
80
+ breakpointsOrder.indexOf( breakpointA as BreakpointId ) -
81
+ breakpointsOrder.indexOf( breakpointB as BreakpointId );
82
+ }
83
+
84
+ function sortByStateType( { state: stateA }: StyleItem, { state: stateB }: StyleItem ) {
85
+ if (
86
+ isClassState( stateA as StyleDefinitionClassState ) &&
87
+ ! isClassState( stateB as StyleDefinitionClassState )
88
+ ) {
89
+ return -1;
90
+ }
91
+
92
+ if (
93
+ ! isClassState( stateA as StyleDefinitionClassState ) &&
94
+ isClassState( stateB as StyleDefinitionClassState )
95
+ ) {
96
+ return 1;
97
+ }
98
+
99
+ return 0;
100
+ }
74
101
 
75
102
  type CreateProviderSubscriberArgs = {
76
103
  provider: StylesProvider;
@@ -5,11 +5,13 @@ exports[`renderStyles should render styles 1`] = `
5
5
  {
6
6
  "breakpoint": "desktop",
7
7
  "id": "test",
8
+ "state": null,
8
9
  "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;}}",
9
10
  },
10
11
  {
11
12
  "breakpoint": "desktop",
12
13
  "id": "test-2",
14
+ "state": null,
13
15
  "value": ".custom-name{font-size:50px;}",
14
16
  },
15
17
  ]
@@ -112,6 +112,7 @@ describe( 'renderStyles', () => {
112
112
  breakpoint: 'desktop',
113
113
  id: 'test',
114
114
  value: '.elementor-prefix .test{font-size:24px;}',
115
+ state: null,
115
116
  },
116
117
  ] );
117
118
  } );
@@ -200,4 +201,28 @@ describe( 'custom_css rendering', () => {
200
201
  // Assert.
201
202
  expect( result[ 0 ].value ).toContain( css );
202
203
  } );
204
+
205
+ it( 'should render class state with selector', async () => {
206
+ // Arrange.
207
+ const styleDef: RendererStyleDefinition = {
208
+ id: 'test',
209
+ type: 'class',
210
+ cssName: 'test',
211
+ label: 'Test',
212
+ variants: [
213
+ {
214
+ meta: { breakpoint: null, state: 'e--selected' },
215
+ props: {},
216
+ custom_css: null,
217
+ },
218
+ ],
219
+ };
220
+
221
+ // Act.
222
+ const renderStyles = createStylesRenderer( { breakpoints: {} as BreakpointsMap, resolve: async () => ( {} ) } );
223
+ const result = await renderStyles( { styles: [ styleDef ] } );
224
+
225
+ // Assert.
226
+ expect( result[ 0 ].value ).toContain( '.test.e--selected{}' );
227
+ } );
203
228
  } );
@@ -2,6 +2,8 @@ import type { Props } from '@elementor/editor-props';
2
2
  import { type Breakpoint, type BreakpointsMap } from '@elementor/editor-responsive';
3
3
  import {
4
4
  type CustomCss,
5
+ isClassState,
6
+ isPseudoState,
5
7
  type StyleDefinition,
6
8
  type StyleDefinitionState,
7
9
  type StyleDefinitionType,
@@ -9,12 +11,13 @@ import {
9
11
  import { decodeString } from '@elementor/utils';
10
12
 
11
13
  import { type PropsResolver } from './create-props-resolver';
12
- import { UnknownStyleTypeError } from './errors';
14
+ import { UnknownStyleStateError, UnknownStyleTypeError } from './errors';
13
15
 
14
16
  export type StyleItem = {
15
17
  id: string;
16
18
  value: string;
17
19
  breakpoint: string;
20
+ state: StyleDefinitionState | null;
18
21
  };
19
22
 
20
23
  export type StyleRenderer = ReturnType< typeof createStylesRenderer >;
@@ -65,6 +68,7 @@ export function createStylesRenderer( { resolve, breakpoints, selectorPrefix = '
65
68
  id: style.id,
66
69
  breakpoint: style?.variants[ 0 ]?.meta?.breakpoint || 'desktop',
67
70
  value: variantsCss.join( '' ),
71
+ state: style?.variants[ 0 ]?.meta?.state || null,
68
72
  };
69
73
  } );
70
74
 
@@ -87,9 +91,21 @@ function createStyleWrapper( value: string = '', wrapper?: ( css: string ) => st
87
91
  withPrefix: ( prefix: string ) =>
88
92
  createStyleWrapper( [ prefix, value ].filter( Boolean ).join( ' ' ), wrapper ),
89
93
 
90
- withState: ( state: StyleDefinitionState ) =>
91
- createStyleWrapper( state ? `${ value }:${ state }` : value, wrapper ),
94
+ withState: ( state: StyleDefinitionState ) => {
95
+ if ( ! state ) {
96
+ return createStyleWrapper( value, wrapper );
97
+ }
98
+
99
+ if ( isClassState( state ) ) {
100
+ return createStyleWrapper( `${ value }.${ state }`, wrapper );
101
+ }
92
102
 
103
+ if ( isPseudoState( state ) ) {
104
+ return createStyleWrapper( `${ value }:${ state }`, wrapper );
105
+ }
106
+
107
+ throw new UnknownStyleStateError( { context: { state } } );
108
+ },
93
109
  withMediaQuery: ( breakpoint: Breakpoint | null ) => {
94
110
  if ( ! breakpoint?.type ) {
95
111
  return createStyleWrapper( value, wrapper );
@@ -1,6 +1,12 @@
1
+ import { type StyleDefinitionState } from '@elementor/editor-styles';
1
2
  import { createError } from '@elementor/utils';
2
3
 
3
4
  export const UnknownStyleTypeError = createError< { type: string } >( {
4
5
  code: 'unknown_style_type',
5
6
  message: 'Unknown style type',
6
7
  } );
8
+
9
+ export const UnknownStyleStateError = createError< { state: StyleDefinitionState } >( {
10
+ code: 'unknown_style_state',
11
+ message: 'Unknown style state',
12
+ } );