@elementor/editor-styles-repository 0.4.1 → 0.6.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @elementor/editor-styles-repository@0.4.1 build
2
+ > @elementor/editor-styles-repository@0.6.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 4.13 KB
14
- CJS dist/index.js.map 7.04 KB
15
- CJS ⚡️ Build success in 58ms
16
- ESM dist/index.mjs 2.77 KB
17
- ESM dist/index.mjs.map 6.98 KB
18
- ESM ⚡️ Build success in 61ms
13
+ CJS dist/index.js 5.33 KB
14
+ CJS dist/index.js.map 9.60 KB
15
+ CJS ⚡️ Build success in 54ms
16
+ ESM dist/index.mjs 3.96 KB
17
+ ESM dist/index.mjs.map 9.52 KB
18
+ ESM ⚡️ Build success in 57ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 4588ms
21
- DTS dist/index.d.mts 1.84 KB
22
- DTS dist/index.d.ts 1.84 KB
20
+ DTS ⚡️ Build success in 5068ms
21
+ DTS dist/index.d.mts 1.94 KB
22
+ DTS dist/index.d.ts 1.94 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @elementor/editor-styles-repository
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 19b0381: Change styles repository API
8
+
9
+ ### Patch Changes
10
+
11
+ - d61b1bc: Added a new event to update the elements styles repository + organized all events in a central location
12
+ - b34f498: Fix global class styles not updating
13
+ - Updated dependencies [d61b1bc]
14
+ - Updated dependencies [a8b60c9]
15
+ - Updated dependencies [b34f498]
16
+ - @elementor/editor-elements@0.5.1
17
+ - @elementor/editor-v1-adapters@0.9.1
18
+ - @elementor/editor-styles@0.5.4
19
+
20
+ ## 0.5.0
21
+
22
+ ### Minor Changes
23
+
24
+ - f691712: Load element type defaults on editor load.
25
+
26
+ ### Patch Changes
27
+
28
+ - b8b2053: Rename default classes to base classes
29
+ - a13a209: Refactor editor-elements to not use the commands
30
+ - Updated dependencies [b8b2053]
31
+ - Updated dependencies [f691712]
32
+ - Updated dependencies [a13a209]
33
+ - @elementor/editor-elements@0.5.0
34
+ - @elementor/editor-styles@0.5.3
35
+
3
36
  ## 0.4.1
4
37
 
5
38
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,17 +1,25 @@
1
+ import { Props } from '@elementor/editor-props';
1
2
  import * as _elementor_editor_styles from '@elementor/editor-styles';
2
- import { StyleDefinition } from '@elementor/editor-styles';
3
+ import { StyleDefinition, StyleDefinitionID, StyleDefinitionVariant } from '@elementor/editor-styles';
3
4
 
4
5
  type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
5
- type GetActionPayload = Record<string, unknown>;
6
6
  type CreateActionPayload = MakeOptional<StyleDefinition, 'id' | 'type' | 'variants'>;
7
7
  type UpdateActionPayload = MakeOptional<StyleDefinition, 'label' | 'variants' | 'type'>;
8
+ type UpdatePropsActionPayload = {
9
+ id: StyleDefinitionID;
10
+ meta: StyleDefinitionVariant['meta'];
11
+ props: Props;
12
+ };
13
+ type Meta = Record<string, unknown>;
8
14
  type StylesProvider = {
9
15
  key: string;
10
16
  priority: number;
11
17
  actions: {
12
- get: (meta?: GetActionPayload) => StyleDefinition[];
18
+ get: (meta?: Meta) => StyleDefinition[];
19
+ getById?: (id: StyleDefinitionID, meta?: Meta) => StyleDefinition | null;
13
20
  create?: (data: CreateActionPayload) => Promise<StyleDefinition>;
14
21
  update?: (data: UpdateActionPayload) => Promise<StyleDefinition>;
22
+ updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
15
23
  };
16
24
  subscribe: (callback: () => void) => () => void;
17
25
  labels?: {
@@ -21,15 +29,14 @@ type StylesProvider = {
21
29
  };
22
30
 
23
31
  declare const stylesRepository: {
24
- all: (meta?: GetActionPayload) => _elementor_editor_styles.StyleDefinition[];
25
- allByProvider: (meta?: GetActionPayload) => (readonly [StylesProvider, _elementor_editor_styles.StyleDefinition[]])[];
32
+ all: (meta?: Meta) => _elementor_editor_styles.StyleDefinition[];
26
33
  register: (provider: StylesProvider) => void;
27
34
  subscribe: (cb: () => void) => () => void;
28
35
  getProviders: () => StylesProvider[];
29
36
  getProviderByKey: (key: string) => StylesProvider | undefined;
30
37
  };
31
38
 
32
- declare function useAllStylesByProvider(meta?: GetActionPayload): (readonly [StylesProvider, _elementor_editor_styles.StyleDefinition[]])[];
39
+ declare function useProviders(): StylesProvider[];
33
40
 
34
41
  type CreateAction = Required<StylesProvider['actions']>['create'];
35
42
  type CreateTuple = [StylesProvider, CreateAction];
@@ -37,4 +44,4 @@ declare function useCreateActionsByProvider(): CreateTuple[];
37
44
 
38
45
  declare const ELEMENTS_STYLES_PROVIDER_KEY = "elements";
39
46
 
40
- export { type CreateActionPayload, ELEMENTS_STYLES_PROVIDER_KEY, type GetActionPayload, type StylesProvider, type UpdateActionPayload, stylesRepository, useAllStylesByProvider, useCreateActionsByProvider };
47
+ export { type CreateActionPayload, ELEMENTS_STYLES_PROVIDER_KEY, type Meta, type StylesProvider, type UpdateActionPayload, stylesRepository, useCreateActionsByProvider, useProviders };
package/dist/index.d.ts CHANGED
@@ -1,17 +1,25 @@
1
+ import { Props } from '@elementor/editor-props';
1
2
  import * as _elementor_editor_styles from '@elementor/editor-styles';
2
- import { StyleDefinition } from '@elementor/editor-styles';
3
+ import { StyleDefinition, StyleDefinitionID, StyleDefinitionVariant } from '@elementor/editor-styles';
3
4
 
4
5
  type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
5
- type GetActionPayload = Record<string, unknown>;
6
6
  type CreateActionPayload = MakeOptional<StyleDefinition, 'id' | 'type' | 'variants'>;
7
7
  type UpdateActionPayload = MakeOptional<StyleDefinition, 'label' | 'variants' | 'type'>;
8
+ type UpdatePropsActionPayload = {
9
+ id: StyleDefinitionID;
10
+ meta: StyleDefinitionVariant['meta'];
11
+ props: Props;
12
+ };
13
+ type Meta = Record<string, unknown>;
8
14
  type StylesProvider = {
9
15
  key: string;
10
16
  priority: number;
11
17
  actions: {
12
- get: (meta?: GetActionPayload) => StyleDefinition[];
18
+ get: (meta?: Meta) => StyleDefinition[];
19
+ getById?: (id: StyleDefinitionID, meta?: Meta) => StyleDefinition | null;
13
20
  create?: (data: CreateActionPayload) => Promise<StyleDefinition>;
14
21
  update?: (data: UpdateActionPayload) => Promise<StyleDefinition>;
22
+ updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
15
23
  };
16
24
  subscribe: (callback: () => void) => () => void;
17
25
  labels?: {
@@ -21,15 +29,14 @@ type StylesProvider = {
21
29
  };
22
30
 
23
31
  declare const stylesRepository: {
24
- all: (meta?: GetActionPayload) => _elementor_editor_styles.StyleDefinition[];
25
- allByProvider: (meta?: GetActionPayload) => (readonly [StylesProvider, _elementor_editor_styles.StyleDefinition[]])[];
32
+ all: (meta?: Meta) => _elementor_editor_styles.StyleDefinition[];
26
33
  register: (provider: StylesProvider) => void;
27
34
  subscribe: (cb: () => void) => () => void;
28
35
  getProviders: () => StylesProvider[];
29
36
  getProviderByKey: (key: string) => StylesProvider | undefined;
30
37
  };
31
38
 
32
- declare function useAllStylesByProvider(meta?: GetActionPayload): (readonly [StylesProvider, _elementor_editor_styles.StyleDefinition[]])[];
39
+ declare function useProviders(): StylesProvider[];
33
40
 
34
41
  type CreateAction = Required<StylesProvider['actions']>['create'];
35
42
  type CreateTuple = [StylesProvider, CreateAction];
@@ -37,4 +44,4 @@ declare function useCreateActionsByProvider(): CreateTuple[];
37
44
 
38
45
  declare const ELEMENTS_STYLES_PROVIDER_KEY = "elements";
39
46
 
40
- export { type CreateActionPayload, ELEMENTS_STYLES_PROVIDER_KEY, type GetActionPayload, type StylesProvider, type UpdateActionPayload, stylesRepository, useAllStylesByProvider, useCreateActionsByProvider };
47
+ export { type CreateActionPayload, ELEMENTS_STYLES_PROVIDER_KEY, type Meta, type StylesProvider, type UpdateActionPayload, stylesRepository, useCreateActionsByProvider, useProviders };
package/dist/index.js CHANGED
@@ -22,8 +22,8 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  ELEMENTS_STYLES_PROVIDER_KEY: () => ELEMENTS_STYLES_PROVIDER_KEY,
24
24
  stylesRepository: () => stylesRepository,
25
- useAllStylesByProvider: () => useAllStylesByProvider,
26
- useCreateActionsByProvider: () => useCreateActionsByProvider
25
+ useCreateActionsByProvider: () => useCreateActionsByProvider,
26
+ useProviders: () => useProviders
27
27
  });
28
28
  module.exports = __toCommonJS(index_exports);
29
29
 
@@ -36,9 +36,6 @@ var createStylesRepository = () => {
36
36
  const register = (provider) => {
37
37
  providers.push(provider);
38
38
  };
39
- const allByProvider = (meta = {}) => {
40
- return getProviders().map((provider) => [provider, provider.actions.get(meta)]);
41
- };
42
39
  const all = (meta = {}) => {
43
40
  return getProviders().flatMap((provider) => provider.actions.get(meta));
44
41
  };
@@ -55,7 +52,6 @@ var createStylesRepository = () => {
55
52
  };
56
53
  return {
57
54
  all,
58
- allByProvider,
59
55
  register,
60
56
  subscribe,
61
57
  getProviders,
@@ -66,12 +62,12 @@ var createStylesRepository = () => {
66
62
  // src/styles-repository.ts
67
63
  var stylesRepository = createStylesRepository();
68
64
 
69
- // src/hooks/use-all-styles-by-provider.ts
65
+ // src/hooks/use-providers.ts
70
66
  var import_react = require("react");
71
- function useAllStylesByProvider(meta = {}) {
67
+ function useProviders() {
72
68
  const [, rerender] = (0, import_react.useReducer)((prev) => !prev, false);
73
69
  (0, import_react.useEffect)(() => stylesRepository.subscribe(rerender), []);
74
- return stylesRepository.allByProvider(meta);
70
+ return stylesRepository.getProviders();
75
71
  }
76
72
 
77
73
  // src/hooks/use-create-actions-by-provider.ts
@@ -90,6 +86,15 @@ function useCreateActionsByProvider() {
90
86
  // src/elements-styles-provider.ts
91
87
  var import_editor_elements = require("@elementor/editor-elements");
92
88
  var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
89
+
90
+ // src/errors.ts
91
+ var import_utils = require("@elementor/utils");
92
+ var InvalidElementsStyleProviderMetaError = (0, import_utils.createError)({
93
+ code: "invalid_elements_style_provider_meta",
94
+ message: "Invalid elements style provider meta."
95
+ });
96
+
97
+ // src/elements-styles-provider.ts
93
98
  var ELEMENTS_STYLES_PROVIDER_KEY = "elements";
94
99
  var elementsStylesProvider = {
95
100
  key: ELEMENTS_STYLES_PROVIDER_KEY,
@@ -97,26 +102,58 @@ var elementsStylesProvider = {
97
102
  actions: {
98
103
  get: (meta = {}) => {
99
104
  let elements = (0, import_editor_elements.getElements)();
100
- if ("elementId" in meta && meta.elementId) {
105
+ if (isValidElementsMeta(meta)) {
101
106
  elements = elements.filter((element) => element.id === meta.elementId);
102
107
  }
103
108
  return elements.flatMap((element) => Object.values(element.model.get("styles") ?? {}));
109
+ },
110
+ getById: (id, meta = {}) => {
111
+ if (!isValidElementsMeta(meta)) {
112
+ throw new InvalidElementsStyleProviderMetaError({ context: { meta } });
113
+ }
114
+ const styles = (0, import_editor_elements.getElementStyles)(meta.elementId) ?? {};
115
+ return styles[id] ?? null;
116
+ },
117
+ updateProps: (args, meta = {}) => {
118
+ if (!isValidElementsMeta(meta)) {
119
+ throw new InvalidElementsStyleProviderMetaError({ context: { meta } });
120
+ }
121
+ (0, import_editor_elements.updateElementStyle)({
122
+ elementId: meta.elementId,
123
+ styleId: args.id,
124
+ meta: args.meta,
125
+ props: args.props
126
+ });
104
127
  }
105
128
  },
106
- subscribe: (cb) => {
107
- return (0, import_editor_v1_adapters.__privateListenTo)(
108
- [
109
- (0, import_editor_v1_adapters.commandEndEvent)("editor/documents/attach-preview"),
110
- (0, import_editor_v1_adapters.commandEndEvent)("document/atomic-widgets/styles")
111
- ],
112
- cb
113
- );
129
+ subscribe: (cb) => (0, import_editor_v1_adapters.__privateListenTo)(import_editor_elements.styleRerenderEvents, cb)
130
+ };
131
+ function isValidElementsMeta(meta) {
132
+ return "elementId" in meta && typeof meta.elementId === "string" && !!meta.elementId;
133
+ }
134
+
135
+ // src/element-base-styles-provider.ts
136
+ var import_editor_elements2 = require("@elementor/editor-elements");
137
+ var ELEMENTS_BASE_STYLES_PROVIDER_KEY = "element-base-styles";
138
+ var elementBaseStylesProvider = {
139
+ key: ELEMENTS_BASE_STYLES_PROVIDER_KEY,
140
+ priority: 10,
141
+ actions: {
142
+ get: () => {
143
+ const widgetsCache = (0, import_editor_elements2.getWidgetsCache)();
144
+ return Object.values(widgetsCache ?? {}).flatMap((widget) => widget.base_styles ?? []);
145
+ }
146
+ },
147
+ subscribe: () => {
148
+ return () => {
149
+ };
114
150
  }
115
151
  };
116
152
 
117
153
  // src/init.ts
118
154
  function init() {
119
155
  stylesRepository.register(elementsStylesProvider);
156
+ stylesRepository.register(elementBaseStylesProvider);
120
157
  }
121
158
 
122
159
  // src/index.ts
@@ -125,7 +162,7 @@ init();
125
162
  0 && (module.exports = {
126
163
  ELEMENTS_STYLES_PROVIDER_KEY,
127
164
  stylesRepository,
128
- useAllStylesByProvider,
129
- useCreateActionsByProvider
165
+ useCreateActionsByProvider,
166
+ useProviders
130
167
  });
131
168
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-all-styles-by-provider.ts","../src/hooks/use-create-actions-by-provider.ts","../src/elements-styles-provider.ts","../src/init.ts"],"sourcesContent":["export {\n\ttype StylesProvider,\n\ttype CreateActionPayload,\n\ttype GetActionPayload,\n\ttype UpdateActionPayload,\n} from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';\nexport { useCreateActionsByProvider } from './hooks/use-create-actions-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n","import { type StyleDefinition } from '@elementor/editor-styles';\n\nexport type MakeOptional< T, K extends keyof T > = Omit< T, K > & Partial< T >;\n\nexport type GetActionPayload = Record< string, unknown >;\nexport type CreateActionPayload = MakeOptional< StyleDefinition, 'id' | 'type' | 'variants' >;\nexport type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tactions: {\n\t\tget: ( meta?: GetActionPayload ) => StyleDefinition[];\n\t\tcreate?: ( data: CreateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdate?: ( data: UpdateActionPayload ) => Promise< StyleDefinition >;\n\t};\n\tsubscribe: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst allByProvider = ( meta: GetActionPayload = {} ) => {\n\t\treturn getProviders().map( ( provider ) => [ provider, provider.actions.get( meta ) ] as const );\n\t};\n\n\tconst all = ( meta: GetActionPayload = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.key === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tallByProvider,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type GetActionPayload } from '../utils/create-styles-repository';\n\nexport function useAllStylesByProvider( meta: GetActionPayload = {} ) {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.allByProvider( meta );\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../utils/create-styles-repository';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useCreateActionsByProvider() {\n\treturn useMemo( () => {\n\t\treturn stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\t}, [] );\n}\n","import { getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tactions: {\n\t\tget: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( 'elementId' in meta && meta.elementId ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\t},\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo(\n\t\t\t[\n\t\t\t\tcommandEndEvent( 'editor/documents/attach-preview' ),\n\t\t\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t\t],\n\t\t\tcb\n\t\t);\n\t},\n};\n","import { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( elementsStylesProvider );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuBO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAA8B,CAAC;AAErC,QAAM,eAAe,MAAM;AAC1B,WAAO,UAAU,MAAO,CAAE,EAAE,KAAM,CAAE,GAAG,MAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAI;AAAA,EACpF;AAEA,QAAM,WAAW,CAAE,aAA8B;AAChD,cAAU,KAAM,QAAS;AAAA,EAC1B;AAEA,QAAM,gBAAgB,CAAE,OAAyB,CAAC,MAAO;AACxD,WAAO,aAAa,EAAE,IAAK,CAAE,aAAc,CAAE,UAAU,SAAS,QAAQ,IAAK,IAAK,CAAE,CAAW;AAAA,EAChG;AAEA,QAAM,MAAM,CAAE,OAAyB,CAAC,MAAO;AAC9C,WAAO,aAAa,EAAE,QAAS,CAAE,aAAc,SAAS,QAAQ,IAAK,IAAK,CAAE;AAAA,EAC7E;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,UAAU,IAAK,CAAE,aAAc;AACnD,aAAO,SAAS,UAAW,EAAG;AAAA,IAC/B,CAAE;AAEF,WAAO,MAAM;AACZ,mBAAa,QAAS,CAAE,gBAAiB,YAAY,CAAE;AAAA,IACxD;AAAA,EACD;AAEA,QAAM,mBAAmB,CAAE,QAAiB;AAC3C,WAAO,UAAU,KAAM,CAAE,aAAc,SAAS,QAAQ,GAAI;AAAA,EAC7D;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;AC9DO,IAAM,mBAAmB,uBAAuB;;;ACFvD,mBAAsC;AAK/B,SAAS,uBAAwB,OAAyB,CAAC,GAAI;AACrE,QAAM,CAAE,EAAE,QAAS,QAAI,yBAAY,CAAE,SAAU,CAAE,MAAM,KAAM;AAE7D,8BAAW,MAAM,iBAAiB,UAAW,QAAS,GAAG,CAAC,CAAE;AAE5D,SAAO,iBAAiB,cAAe,IAAK;AAC7C;;;ACXA,IAAAA,gBAAwB;AAQjB,SAAS,6BAA6B;AAC5C,aAAO,uBAAS,MAAM;AACrB,WAAO,iBACL,aAAa,EACb,IAA2B,CAAE,aAAc;AAC3C,UAAK,CAAE,SAAS,QAAQ,QAAS;AAChC,eAAO;AAAA,MACR;AAEA,aAAO,CAAE,UAAU,SAAS,QAAQ,MAAO;AAAA,IAC5C,CAAE,EACD,OAAQ,CAAE,SAAU,CAAC,CAAE,IAAK;AAAA,EAC/B,GAAG,CAAC,CAAE;AACP;;;ACrBA,6BAA4B;AAC5B,gCAA+D;AAIxD,IAAM,+BAA+B;AAErC,IAAM,yBAAyC;AAAA,EACrD,KAAK;AAAA,EACL,UAAU;AAAA,EACV,SAAS;AAAA,IACR,KAAK,CAAE,OAAO,CAAC,MAAO;AACrB,UAAI,eAAW,oCAAY;AAE3B,UAAK,eAAe,QAAQ,KAAK,WAAY;AAC5C,mBAAW,SAAS,OAAQ,CAAE,YAAa,QAAQ,OAAO,KAAK,SAAU;AAAA,MAC1E;AAEA,aAAO,SAAS,QAAS,CAAE,YAAa,OAAO,OAAQ,QAAQ,MAAM,IAAK,QAAS,KAAK,CAAC,CAAE,CAAE;AAAA,IAC9F;AAAA,EACD;AAAA,EACA,WAAW,CAAE,OAAQ;AACpB,eAAO,0BAAAC;AAAA,MACN;AAAA,YACC,2CAAiB,iCAAkC;AAAA,YACnD,2CAAiB,gCAAiC;AAAA,MACnD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;;;AC3BO,SAAS,OAAO;AACtB,mBAAiB,SAAU,sBAAuB;AACnD;;;ANUA,KAAK;","names":["import_react","listenTo"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-providers.ts","../src/hooks/use-create-actions-by-provider.ts","../src/elements-styles-provider.ts","../src/errors.ts","../src/element-base-styles-provider.ts","../src/init.ts"],"sourcesContent":["export {\n\ttype StylesProvider,\n\ttype CreateActionPayload,\n\ttype UpdateActionPayload,\n\ttype Meta,\n} from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useProviders } from './hooks/use-providers';\nexport { useCreateActionsByProvider } from './hooks/use-create-actions-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n","import { type Props } from '@elementor/editor-props';\nimport { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionVariant } from '@elementor/editor-styles';\n\nexport type MakeOptional< T, K extends keyof T > = Omit< T, K > & Partial< T >;\n\nexport type CreateActionPayload = MakeOptional< StyleDefinition, 'id' | 'type' | 'variants' >;\nexport type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;\n\nexport type UpdatePropsActionPayload = {\n\tid: StyleDefinitionID;\n\tmeta: StyleDefinitionVariant[ 'meta' ];\n\tprops: Props;\n};\n\nexport type Meta = Record< string, unknown >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tactions: {\n\t\tget: ( meta?: Meta ) => StyleDefinition[];\n\t\tgetById?: ( id: StyleDefinitionID, meta?: Meta ) => StyleDefinition | null;\n\t\tcreate?: ( data: CreateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdate?: ( data: UpdateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdateProps?: ( args: UpdatePropsActionPayload, meta?: Meta ) => void;\n\t};\n\tsubscribe: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.key === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../utils/create-styles-repository';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useCreateActionsByProvider() {\n\treturn useMemo( () => {\n\t\treturn stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\t}, [] );\n}\n","import { getElements, getElementStyles, styleRerenderEvents, updateElementStyle } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { InvalidElementsStyleProviderMetaError } from './errors';\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tactions: {\n\t\tget: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tgetById: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n} satisfies StylesProvider;\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nconst ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tpriority: 10,\n\tactions: {\n\t\tget: () => {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) => widget.base_styles ?? [] );\n\t\t},\n\t},\n\tsubscribe: () => {\n\t\treturn () => {};\n\t},\n};\n","import { elementBaseStylesProvider } from './element-base-styles-provider';\nimport { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( elementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n"],"mappings":"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","names":["import_react","listenTo","import_editor_elements"]}
package/dist/index.mjs CHANGED
@@ -7,9 +7,6 @@ var createStylesRepository = () => {
7
7
  const register = (provider) => {
8
8
  providers.push(provider);
9
9
  };
10
- const allByProvider = (meta = {}) => {
11
- return getProviders().map((provider) => [provider, provider.actions.get(meta)]);
12
- };
13
10
  const all = (meta = {}) => {
14
11
  return getProviders().flatMap((provider) => provider.actions.get(meta));
15
12
  };
@@ -26,7 +23,6 @@ var createStylesRepository = () => {
26
23
  };
27
24
  return {
28
25
  all,
29
- allByProvider,
30
26
  register,
31
27
  subscribe,
32
28
  getProviders,
@@ -37,12 +33,12 @@ var createStylesRepository = () => {
37
33
  // src/styles-repository.ts
38
34
  var stylesRepository = createStylesRepository();
39
35
 
40
- // src/hooks/use-all-styles-by-provider.ts
36
+ // src/hooks/use-providers.ts
41
37
  import { useEffect, useReducer } from "react";
42
- function useAllStylesByProvider(meta = {}) {
38
+ function useProviders() {
43
39
  const [, rerender] = useReducer((prev) => !prev, false);
44
40
  useEffect(() => stylesRepository.subscribe(rerender), []);
45
- return stylesRepository.allByProvider(meta);
41
+ return stylesRepository.getProviders();
46
42
  }
47
43
 
48
44
  // src/hooks/use-create-actions-by-provider.ts
@@ -59,8 +55,17 @@ function useCreateActionsByProvider() {
59
55
  }
60
56
 
61
57
  // src/elements-styles-provider.ts
62
- import { getElements } from "@elementor/editor-elements";
63
- import { __privateListenTo as listenTo, commandEndEvent } from "@elementor/editor-v1-adapters";
58
+ import { getElements, getElementStyles, styleRerenderEvents, updateElementStyle } from "@elementor/editor-elements";
59
+ import { __privateListenTo as listenTo } from "@elementor/editor-v1-adapters";
60
+
61
+ // src/errors.ts
62
+ import { createError } from "@elementor/utils";
63
+ var InvalidElementsStyleProviderMetaError = createError({
64
+ code: "invalid_elements_style_provider_meta",
65
+ message: "Invalid elements style provider meta."
66
+ });
67
+
68
+ // src/elements-styles-provider.ts
64
69
  var ELEMENTS_STYLES_PROVIDER_KEY = "elements";
65
70
  var elementsStylesProvider = {
66
71
  key: ELEMENTS_STYLES_PROVIDER_KEY,
@@ -68,26 +73,58 @@ var elementsStylesProvider = {
68
73
  actions: {
69
74
  get: (meta = {}) => {
70
75
  let elements = getElements();
71
- if ("elementId" in meta && meta.elementId) {
76
+ if (isValidElementsMeta(meta)) {
72
77
  elements = elements.filter((element) => element.id === meta.elementId);
73
78
  }
74
79
  return elements.flatMap((element) => Object.values(element.model.get("styles") ?? {}));
80
+ },
81
+ getById: (id, meta = {}) => {
82
+ if (!isValidElementsMeta(meta)) {
83
+ throw new InvalidElementsStyleProviderMetaError({ context: { meta } });
84
+ }
85
+ const styles = getElementStyles(meta.elementId) ?? {};
86
+ return styles[id] ?? null;
87
+ },
88
+ updateProps: (args, meta = {}) => {
89
+ if (!isValidElementsMeta(meta)) {
90
+ throw new InvalidElementsStyleProviderMetaError({ context: { meta } });
91
+ }
92
+ updateElementStyle({
93
+ elementId: meta.elementId,
94
+ styleId: args.id,
95
+ meta: args.meta,
96
+ props: args.props
97
+ });
98
+ }
99
+ },
100
+ subscribe: (cb) => listenTo(styleRerenderEvents, cb)
101
+ };
102
+ function isValidElementsMeta(meta) {
103
+ return "elementId" in meta && typeof meta.elementId === "string" && !!meta.elementId;
104
+ }
105
+
106
+ // src/element-base-styles-provider.ts
107
+ import { getWidgetsCache } from "@elementor/editor-elements";
108
+ var ELEMENTS_BASE_STYLES_PROVIDER_KEY = "element-base-styles";
109
+ var elementBaseStylesProvider = {
110
+ key: ELEMENTS_BASE_STYLES_PROVIDER_KEY,
111
+ priority: 10,
112
+ actions: {
113
+ get: () => {
114
+ const widgetsCache = getWidgetsCache();
115
+ return Object.values(widgetsCache ?? {}).flatMap((widget) => widget.base_styles ?? []);
75
116
  }
76
117
  },
77
- subscribe: (cb) => {
78
- return listenTo(
79
- [
80
- commandEndEvent("editor/documents/attach-preview"),
81
- commandEndEvent("document/atomic-widgets/styles")
82
- ],
83
- cb
84
- );
118
+ subscribe: () => {
119
+ return () => {
120
+ };
85
121
  }
86
122
  };
87
123
 
88
124
  // src/init.ts
89
125
  function init() {
90
126
  stylesRepository.register(elementsStylesProvider);
127
+ stylesRepository.register(elementBaseStylesProvider);
91
128
  }
92
129
 
93
130
  // src/index.ts
@@ -95,7 +132,7 @@ init();
95
132
  export {
96
133
  ELEMENTS_STYLES_PROVIDER_KEY,
97
134
  stylesRepository,
98
- useAllStylesByProvider,
99
- useCreateActionsByProvider
135
+ useCreateActionsByProvider,
136
+ useProviders
100
137
  };
101
138
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-all-styles-by-provider.ts","../src/hooks/use-create-actions-by-provider.ts","../src/elements-styles-provider.ts","../src/init.ts","../src/index.ts"],"sourcesContent":["import { type StyleDefinition } from '@elementor/editor-styles';\n\nexport type MakeOptional< T, K extends keyof T > = Omit< T, K > & Partial< T >;\n\nexport type GetActionPayload = Record< string, unknown >;\nexport type CreateActionPayload = MakeOptional< StyleDefinition, 'id' | 'type' | 'variants' >;\nexport type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tactions: {\n\t\tget: ( meta?: GetActionPayload ) => StyleDefinition[];\n\t\tcreate?: ( data: CreateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdate?: ( data: UpdateActionPayload ) => Promise< StyleDefinition >;\n\t};\n\tsubscribe: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst allByProvider = ( meta: GetActionPayload = {} ) => {\n\t\treturn getProviders().map( ( provider ) => [ provider, provider.actions.get( meta ) ] as const );\n\t};\n\n\tconst all = ( meta: GetActionPayload = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.key === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tallByProvider,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type GetActionPayload } from '../utils/create-styles-repository';\n\nexport function useAllStylesByProvider( meta: GetActionPayload = {} ) {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.allByProvider( meta );\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../utils/create-styles-repository';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useCreateActionsByProvider() {\n\treturn useMemo( () => {\n\t\treturn stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\t}, [] );\n}\n","import { getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tactions: {\n\t\tget: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( 'elementId' in meta && meta.elementId ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\t},\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo(\n\t\t\t[\n\t\t\t\tcommandEndEvent( 'editor/documents/attach-preview' ),\n\t\t\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t\t],\n\t\t\tcb\n\t\t);\n\t},\n};\n","import { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( elementsStylesProvider );\n}\n","export {\n\ttype StylesProvider,\n\ttype CreateActionPayload,\n\ttype GetActionPayload,\n\ttype UpdateActionPayload,\n} from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';\nexport { useCreateActionsByProvider } from './hooks/use-create-actions-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n"],"mappings":";AAuBO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAA8B,CAAC;AAErC,QAAM,eAAe,MAAM;AAC1B,WAAO,UAAU,MAAO,CAAE,EAAE,KAAM,CAAE,GAAG,MAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAI;AAAA,EACpF;AAEA,QAAM,WAAW,CAAE,aAA8B;AAChD,cAAU,KAAM,QAAS;AAAA,EAC1B;AAEA,QAAM,gBAAgB,CAAE,OAAyB,CAAC,MAAO;AACxD,WAAO,aAAa,EAAE,IAAK,CAAE,aAAc,CAAE,UAAU,SAAS,QAAQ,IAAK,IAAK,CAAE,CAAW;AAAA,EAChG;AAEA,QAAM,MAAM,CAAE,OAAyB,CAAC,MAAO;AAC9C,WAAO,aAAa,EAAE,QAAS,CAAE,aAAc,SAAS,QAAQ,IAAK,IAAK,CAAE;AAAA,EAC7E;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,UAAU,IAAK,CAAE,aAAc;AACnD,aAAO,SAAS,UAAW,EAAG;AAAA,IAC/B,CAAE;AAEF,WAAO,MAAM;AACZ,mBAAa,QAAS,CAAE,gBAAiB,YAAY,CAAE;AAAA,IACxD;AAAA,EACD;AAEA,QAAM,mBAAmB,CAAE,QAAiB;AAC3C,WAAO,UAAU,KAAM,CAAE,aAAc,SAAS,QAAQ,GAAI;AAAA,EAC7D;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;AC9DO,IAAM,mBAAmB,uBAAuB;;;ACFvD,SAAS,WAAW,kBAAkB;AAK/B,SAAS,uBAAwB,OAAyB,CAAC,GAAI;AACrE,QAAM,CAAE,EAAE,QAAS,IAAI,WAAY,CAAE,SAAU,CAAE,MAAM,KAAM;AAE7D,YAAW,MAAM,iBAAiB,UAAW,QAAS,GAAG,CAAC,CAAE;AAE5D,SAAO,iBAAiB,cAAe,IAAK;AAC7C;;;ACXA,SAAS,eAAe;AAQjB,SAAS,6BAA6B;AAC5C,SAAO,QAAS,MAAM;AACrB,WAAO,iBACL,aAAa,EACb,IAA2B,CAAE,aAAc;AAC3C,UAAK,CAAE,SAAS,QAAQ,QAAS;AAChC,eAAO;AAAA,MACR;AAEA,aAAO,CAAE,UAAU,SAAS,QAAQ,MAAO;AAAA,IAC5C,CAAE,EACD,OAAQ,CAAE,SAAU,CAAC,CAAE,IAAK;AAAA,EAC/B,GAAG,CAAC,CAAE;AACP;;;ACrBA,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB,UAAU,uBAAuB;AAIxD,IAAM,+BAA+B;AAErC,IAAM,yBAAyC;AAAA,EACrD,KAAK;AAAA,EACL,UAAU;AAAA,EACV,SAAS;AAAA,IACR,KAAK,CAAE,OAAO,CAAC,MAAO;AACrB,UAAI,WAAW,YAAY;AAE3B,UAAK,eAAe,QAAQ,KAAK,WAAY;AAC5C,mBAAW,SAAS,OAAQ,CAAE,YAAa,QAAQ,OAAO,KAAK,SAAU;AAAA,MAC1E;AAEA,aAAO,SAAS,QAAS,CAAE,YAAa,OAAO,OAAQ,QAAQ,MAAM,IAAK,QAAS,KAAK,CAAC,CAAE,CAAE;AAAA,IAC9F;AAAA,EACD;AAAA,EACA,WAAW,CAAE,OAAQ;AACpB,WAAO;AAAA,MACN;AAAA,QACC,gBAAiB,iCAAkC;AAAA,QACnD,gBAAiB,gCAAiC;AAAA,MACnD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;;;AC3BO,SAAS,OAAO;AACtB,mBAAiB,SAAU,sBAAuB;AACnD;;;ACUA,KAAK;","names":[]}
1
+ {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-providers.ts","../src/hooks/use-create-actions-by-provider.ts","../src/elements-styles-provider.ts","../src/errors.ts","../src/element-base-styles-provider.ts","../src/init.ts","../src/index.ts"],"sourcesContent":["import { type Props } from '@elementor/editor-props';\nimport { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionVariant } from '@elementor/editor-styles';\n\nexport type MakeOptional< T, K extends keyof T > = Omit< T, K > & Partial< T >;\n\nexport type CreateActionPayload = MakeOptional< StyleDefinition, 'id' | 'type' | 'variants' >;\nexport type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;\n\nexport type UpdatePropsActionPayload = {\n\tid: StyleDefinitionID;\n\tmeta: StyleDefinitionVariant[ 'meta' ];\n\tprops: Props;\n};\n\nexport type Meta = Record< string, unknown >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tactions: {\n\t\tget: ( meta?: Meta ) => StyleDefinition[];\n\t\tgetById?: ( id: StyleDefinitionID, meta?: Meta ) => StyleDefinition | null;\n\t\tcreate?: ( data: CreateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdate?: ( data: UpdateActionPayload ) => Promise< StyleDefinition >;\n\t\tupdateProps?: ( args: UpdatePropsActionPayload, meta?: Meta ) => void;\n\t};\n\tsubscribe: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.key === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../utils/create-styles-repository';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useCreateActionsByProvider() {\n\treturn useMemo( () => {\n\t\treturn stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\t}, [] );\n}\n","import { getElements, getElementStyles, styleRerenderEvents, updateElementStyle } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { InvalidElementsStyleProviderMetaError } from './errors';\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tactions: {\n\t\tget: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tgetById: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n} satisfies StylesProvider;\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nconst ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tpriority: 10,\n\tactions: {\n\t\tget: () => {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) => widget.base_styles ?? [] );\n\t\t},\n\t},\n\tsubscribe: () => {\n\t\treturn () => {};\n\t},\n};\n","import { elementBaseStylesProvider } from './element-base-styles-provider';\nimport { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( elementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n","export {\n\ttype StylesProvider,\n\ttype CreateActionPayload,\n\ttype UpdateActionPayload,\n\ttype Meta,\n} from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useProviders } from './hooks/use-providers';\nexport { useCreateActionsByProvider } from './hooks/use-create-actions-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-styles-repository",
3
3
  "description": "Elementor Editor Styles Repository",
4
- "version": "0.4.1",
4
+ "version": "0.6.0",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -33,9 +33,10 @@
33
33
  "dev": "tsup --config=../../tsup.dev.ts"
34
34
  },
35
35
  "dependencies": {
36
- "@elementor/editor-elements": "0.4.2",
37
- "@elementor/editor-styles": "0.5.2",
38
- "@elementor/editor-v1-adapters": "0.9.0"
36
+ "@elementor/editor-elements": "0.5.1",
37
+ "@elementor/editor-styles": "0.5.4",
38
+ "@elementor/editor-v1-adapters": "0.9.1",
39
+ "@elementor/utils": "0.3.0"
39
40
  },
40
41
  "peerDependencies": {
41
42
  "react": "^18.3.1"
@@ -0,0 +1,32 @@
1
+ import { createMockStyleDefinition } from 'test-utils';
2
+ import { getWidgetsCache } from '@elementor/editor-elements';
3
+
4
+ import { elementBaseStylesProvider } from '../element-base-styles-provider';
5
+
6
+ jest.mock( '@elementor/editor-elements' );
7
+
8
+ describe( 'elementBaseStylesProvider', () => {
9
+ beforeEach( () => {
10
+ jest.mocked( getWidgetsCache ).mockReturnValue( {
11
+ 'widget-1': {
12
+ base_styles: [ createMockStyleDefinition( { id: 's-1' } ), createMockStyleDefinition( { id: 's-2' } ) ],
13
+ },
14
+ 'widget-2': {
15
+ base_styles: [ createMockStyleDefinition( { id: 's-3' } ) ],
16
+ },
17
+ 'widget-3': {},
18
+ } as unknown as ReturnType< typeof getWidgetsCache > );
19
+ } );
20
+
21
+ it( 'should return all the styles attached to all the document elements', () => {
22
+ // Act.
23
+ const styles = elementBaseStylesProvider.actions.get();
24
+
25
+ // Assert.
26
+ expect( styles ).toEqual( [
27
+ expect.objectContaining( { id: 's-1' } ),
28
+ expect.objectContaining( { id: 's-2' } ),
29
+ expect.objectContaining( { id: 's-3' } ),
30
+ ] );
31
+ } );
32
+ } );
@@ -1,7 +1,9 @@
1
1
  import { createMockElement, createMockStyleDefinition } from 'test-utils';
2
- import { getElements } from '@elementor/editor-elements';
2
+ import { getElements, getElementStyles } from '@elementor/editor-elements';
3
+ import type { StyleDefinition } from '@elementor/editor-styles';
3
4
 
4
5
  import { elementsStylesProvider } from '../elements-styles-provider';
6
+ import { InvalidElementsStyleProviderMetaError } from '../errors';
5
7
 
6
8
  jest.mock( '@elementor/editor-elements' );
7
9
 
@@ -50,4 +52,63 @@ describe( 'elementsStylesProvider', () => {
50
52
  expect.objectContaining( { id: 's-2' } ),
51
53
  ] );
52
54
  } );
55
+
56
+ it( 'should retrieve an element style by id', () => {
57
+ const styles: Record< string, StyleDefinition > = {
58
+ 'style-1': {
59
+ id: 'style-1',
60
+ label: 'Style 1',
61
+ variants: [],
62
+ type: 'class',
63
+ },
64
+ 'style-2': {
65
+ id: 'style-2',
66
+ label: 'Style 2',
67
+ variants: [],
68
+ type: 'class',
69
+ },
70
+ };
71
+
72
+ jest.mocked( getElementStyles ).mockImplementation( ( elementId ) => {
73
+ return elementId === 'test-element-id' ? styles : null;
74
+ } );
75
+
76
+ // Act.
77
+ const elementStyle = elementsStylesProvider.actions.getById( 'style-2', { elementId: 'test-element-id' } );
78
+
79
+ // Assert.
80
+ expect( elementStyle ).toStrictEqual( styles[ 'style-2' ] );
81
+ } );
82
+
83
+ it( 'should throw when trying to get a style by id without passing an element id', () => {
84
+ // Act & Assert.
85
+ expect( () => elementsStylesProvider.actions.getById( 'style', { notElementId: 'test-value' } ) ).toThrow(
86
+ new InvalidElementsStyleProviderMetaError()
87
+ );
88
+ } );
89
+
90
+ it.each( [
91
+ { elementsMeta: { notElementId: 'test-value' } },
92
+ { elementsMeta: { elementId: 123 } },
93
+ { elementsMeta: { elementId: null } },
94
+ { elementsMeta: { elementId: '' } },
95
+ { elementsMeta: { elementId: {} } },
96
+ ] )( 'should throw when updating props with invalid elements meta', ( { elementsMeta } ) => {
97
+ // Act & Assert.
98
+ expect( () =>
99
+ elementsStylesProvider.actions.updateProps(
100
+ {
101
+ id: 'test-id',
102
+ meta: {
103
+ breakpoint: null,
104
+ state: null,
105
+ },
106
+ props: {
107
+ prop: 'value',
108
+ },
109
+ },
110
+ elementsMeta
111
+ )
112
+ ).toThrow( new InvalidElementsStyleProviderMetaError() );
113
+ } );
53
114
  } );
@@ -0,0 +1,20 @@
1
+ import { getWidgetsCache } from '@elementor/editor-elements';
2
+
3
+ import { type StylesProvider } from './utils/create-styles-repository';
4
+
5
+ const ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';
6
+
7
+ export const elementBaseStylesProvider: StylesProvider = {
8
+ key: ELEMENTS_BASE_STYLES_PROVIDER_KEY,
9
+ priority: 10,
10
+ actions: {
11
+ get: () => {
12
+ const widgetsCache = getWidgetsCache();
13
+
14
+ return Object.values( widgetsCache ?? {} ).flatMap( ( widget ) => widget.base_styles ?? [] );
15
+ },
16
+ },
17
+ subscribe: () => {
18
+ return () => {};
19
+ },
20
+ };
@@ -1,31 +1,55 @@
1
- import { getElements } from '@elementor/editor-elements';
2
- import { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';
1
+ import { getElements, getElementStyles, styleRerenderEvents, updateElementStyle } from '@elementor/editor-elements';
2
+ import { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';
3
3
 
4
+ import { InvalidElementsStyleProviderMetaError } from './errors';
4
5
  import { type StylesProvider } from './utils/create-styles-repository';
5
6
 
6
7
  export const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';
7
8
 
8
- export const elementsStylesProvider: StylesProvider = {
9
+ export const elementsStylesProvider = {
9
10
  key: ELEMENTS_STYLES_PROVIDER_KEY,
10
11
  priority: 50,
11
12
  actions: {
12
13
  get: ( meta = {} ) => {
13
14
  let elements = getElements();
14
15
 
15
- if ( 'elementId' in meta && meta.elementId ) {
16
+ if ( isValidElementsMeta( meta ) ) {
16
17
  elements = elements.filter( ( element ) => element.id === meta.elementId );
17
18
  }
18
19
 
19
20
  return elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );
20
21
  },
22
+
23
+ getById: ( id, meta = {} ) => {
24
+ if ( ! isValidElementsMeta( meta ) ) {
25
+ throw new InvalidElementsStyleProviderMetaError( { context: { meta } } );
26
+ }
27
+
28
+ const styles = getElementStyles( meta.elementId ) ?? {};
29
+
30
+ return styles[ id ] ?? null;
31
+ },
32
+
33
+ updateProps: ( args, meta = {} ) => {
34
+ if ( ! isValidElementsMeta( meta ) ) {
35
+ throw new InvalidElementsStyleProviderMetaError( { context: { meta } } );
36
+ }
37
+
38
+ updateElementStyle( {
39
+ elementId: meta.elementId,
40
+ styleId: args.id,
41
+ meta: args.meta,
42
+ props: args.props,
43
+ } );
44
+ },
21
45
  },
22
- subscribe: ( cb ) => {
23
- return listenTo(
24
- [
25
- commandEndEvent( 'editor/documents/attach-preview' ),
26
- commandEndEvent( 'document/atomic-widgets/styles' ),
27
- ],
28
- cb
29
- );
30
- },
46
+ subscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),
47
+ } satisfies StylesProvider;
48
+
49
+ type ElementsMeta = {
50
+ elementId: string;
31
51
  };
52
+
53
+ function isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {
54
+ return 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;
55
+ }
package/src/errors.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { createError } from '@elementor/utils';
2
+
3
+ export const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {
4
+ code: 'invalid_elements_style_provider_meta',
5
+ message: 'Invalid elements style provider meta.',
6
+ } );
@@ -1,12 +1,11 @@
1
1
  import { useEffect, useReducer } from 'react';
2
2
 
3
3
  import { stylesRepository } from '../styles-repository';
4
- import { type GetActionPayload } from '../utils/create-styles-repository';
5
4
 
6
- export function useAllStylesByProvider( meta: GetActionPayload = {} ) {
5
+ export function useProviders() {
7
6
  const [ , rerender ] = useReducer( ( prev ) => ! prev, false );
8
7
 
9
8
  useEffect( () => stylesRepository.subscribe( rerender ), [] );
10
9
 
11
- return stylesRepository.allByProvider( meta );
10
+ return stylesRepository.getProviders();
12
11
  }
package/src/index.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export {
2
2
  type StylesProvider,
3
3
  type CreateActionPayload,
4
- type GetActionPayload,
5
4
  type UpdateActionPayload,
5
+ type Meta,
6
6
  } from './utils/create-styles-repository';
7
7
 
8
8
  export { stylesRepository } from './styles-repository';
9
- export { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';
9
+ export { useProviders } from './hooks/use-providers';
10
10
  export { useCreateActionsByProvider } from './hooks/use-create-actions-by-provider';
11
11
 
12
12
  export { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';
package/src/init.ts CHANGED
@@ -1,6 +1,8 @@
1
+ import { elementBaseStylesProvider } from './element-base-styles-provider';
1
2
  import { elementsStylesProvider } from './elements-styles-provider';
2
3
  import { stylesRepository } from './styles-repository';
3
4
 
4
5
  export function init() {
5
6
  stylesRepository.register( elementsStylesProvider );
7
+ stylesRepository.register( elementBaseStylesProvider );
6
8
  }
@@ -5,7 +5,6 @@ import { createStylesRepository, type StylesProvider } from '../create-styles-re
5
5
 
6
6
  const styleDef1 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#dddddd' } } } );
7
7
  const styleDef2 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#eeeeee' } } } );
8
- const styleDef3 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#111111' } } } );
9
8
 
10
9
  describe( 'createStylesRepository', () => {
11
10
  it( 'should get all the style defs from all providers ordered by priority', () => {
@@ -19,20 +18,6 @@ describe( 'createStylesRepository', () => {
19
18
  expect( repo.all() ).toEqual( [ styleDef2, styleDef1 ] );
20
19
  } );
21
20
 
22
- it( 'should get all the style defs grouped by providers', () => {
23
- // Arrange
24
- const repo = createStylesRepository();
25
-
26
- repo.register( createMockProvider( 'mock1', 10, [ styleDef1 ] ).provider );
27
- repo.register( createMockProvider( 'mock2', 20, [ styleDef2, styleDef3 ] ).provider );
28
-
29
- // Assert
30
- expect( repo.allByProvider() ).toEqual( [
31
- [ expect.objectContaining( { key: 'mock2' } ), [ styleDef2, styleDef3 ] ],
32
- [ expect.objectContaining( { key: 'mock1' } ), [ styleDef1 ] ],
33
- ] );
34
- } );
35
-
36
21
  it( 'should subscribe and unsubscribe to all style providers', () => {
37
22
  // Arrange
38
23
  const repo = createStylesRepository();
@@ -1,18 +1,28 @@
1
- import { type StyleDefinition } from '@elementor/editor-styles';
1
+ import { type Props } from '@elementor/editor-props';
2
+ import { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionVariant } from '@elementor/editor-styles';
2
3
 
3
4
  export type MakeOptional< T, K extends keyof T > = Omit< T, K > & Partial< T >;
4
5
 
5
- export type GetActionPayload = Record< string, unknown >;
6
6
  export type CreateActionPayload = MakeOptional< StyleDefinition, 'id' | 'type' | 'variants' >;
7
7
  export type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;
8
8
 
9
+ export type UpdatePropsActionPayload = {
10
+ id: StyleDefinitionID;
11
+ meta: StyleDefinitionVariant[ 'meta' ];
12
+ props: Props;
13
+ };
14
+
15
+ export type Meta = Record< string, unknown >;
16
+
9
17
  export type StylesProvider = {
10
18
  key: string;
11
19
  priority: number;
12
20
  actions: {
13
- get: ( meta?: GetActionPayload ) => StyleDefinition[];
21
+ get: ( meta?: Meta ) => StyleDefinition[];
22
+ getById?: ( id: StyleDefinitionID, meta?: Meta ) => StyleDefinition | null;
14
23
  create?: ( data: CreateActionPayload ) => Promise< StyleDefinition >;
15
24
  update?: ( data: UpdateActionPayload ) => Promise< StyleDefinition >;
25
+ updateProps?: ( args: UpdatePropsActionPayload, meta?: Meta ) => void;
16
26
  };
17
27
  subscribe: ( callback: () => void ) => () => void;
18
28
  labels?: {
@@ -32,11 +42,7 @@ export const createStylesRepository = () => {
32
42
  providers.push( provider );
33
43
  };
34
44
 
35
- const allByProvider = ( meta: GetActionPayload = {} ) => {
36
- return getProviders().map( ( provider ) => [ provider, provider.actions.get( meta ) ] as const );
37
- };
38
-
39
- const all = ( meta: GetActionPayload = {} ) => {
45
+ const all = ( meta: Meta = {} ) => {
40
46
  return getProviders().flatMap( ( provider ) => provider.actions.get( meta ) );
41
47
  };
42
48
 
@@ -56,7 +62,6 @@ export const createStylesRepository = () => {
56
62
 
57
63
  return {
58
64
  all,
59
- allByProvider,
60
65
  register,
61
66
  subscribe,
62
67
  getProviders,