@elementor/editor-elements 0.4.2 → 0.5.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/CHANGELOG.md +26 -0
- package/dist/index.d.mts +30 -26
- package/dist/index.d.ts +30 -26
- package/dist/index.js +153 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +159 -73
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
- package/src/hooks/use-element-styles.ts +3 -6
- package/src/index.ts +5 -3
- package/src/styles/consts.ts +9 -0
- package/src/styles/create-element-style.ts +51 -0
- package/src/styles/errors.ts +11 -0
- package/src/styles/mutate-element-styles.ts +89 -0
- package/src/styles/update-element-style.ts +33 -0
- package/src/sync/types.ts +4 -1
- package/src/sync/update-element-settings.ts +26 -0
- package/src/hooks/use-element-style-props.ts +0 -54
- package/src/sync/update-settings.ts +0 -16
- package/src/sync/update-styles.ts +0 -28
package/dist/index.mjs
CHANGED
|
@@ -54,8 +54,17 @@ var useElementSetting = (elementId, settingKey) => {
|
|
|
54
54
|
);
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
// src/hooks/use-element-
|
|
58
|
-
import { __privateUseListenTo as useListenTo3
|
|
57
|
+
// src/hooks/use-element-styles.ts
|
|
58
|
+
import { __privateUseListenTo as useListenTo3 } from "@elementor/editor-v1-adapters";
|
|
59
|
+
|
|
60
|
+
// src/styles/consts.ts
|
|
61
|
+
import { commandEndEvent as commandEndEvent2, windowEvent as windowEvent2 } from "@elementor/editor-v1-adapters";
|
|
62
|
+
var ELEMENT_STYLE_CHANGE_EVENT = "elementor/editor-v2/editor-elements/style";
|
|
63
|
+
var styleRerenderEvents = [
|
|
64
|
+
commandEndEvent2("document/elements/create"),
|
|
65
|
+
commandEndEvent2("editor/documents/attach-preview"),
|
|
66
|
+
windowEvent2(ELEMENT_STYLE_CHANGE_EVENT)
|
|
67
|
+
];
|
|
59
68
|
|
|
60
69
|
// src/sync/get-element-styles.ts
|
|
61
70
|
var getElementStyles = (elementID) => {
|
|
@@ -63,50 +72,13 @@ var getElementStyles = (elementID) => {
|
|
|
63
72
|
return container?.model.get("styles") || null;
|
|
64
73
|
};
|
|
65
74
|
|
|
66
|
-
// src/hooks/use-element-style-props.ts
|
|
67
|
-
function useElementStyleProps({
|
|
68
|
-
elementID,
|
|
69
|
-
styleDefID,
|
|
70
|
-
meta,
|
|
71
|
-
propNames
|
|
72
|
-
}) {
|
|
73
|
-
return useListenTo3(
|
|
74
|
-
commandEndEvent2("document/atomic-widgets/styles"),
|
|
75
|
-
() => {
|
|
76
|
-
if (!styleDefID) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const styleDef = getElementStyles(elementID)?.[styleDefID];
|
|
80
|
-
if (!styleDef) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const variant = getVariantByMeta(styleDef, meta);
|
|
84
|
-
return propNames.reduce((acc, key) => {
|
|
85
|
-
acc[key] = variant?.props[key] ?? null;
|
|
86
|
-
return acc;
|
|
87
|
-
}, {});
|
|
88
|
-
},
|
|
89
|
-
[elementID, styleDefID, JSON.stringify(propNames), meta]
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
function getVariantByMeta(styleDef, meta) {
|
|
93
|
-
return styleDef.variants.find((variant) => {
|
|
94
|
-
return variant.meta.breakpoint === meta.breakpoint && variant.meta.state === meta.state;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
75
|
// src/hooks/use-element-styles.ts
|
|
99
|
-
import { __privateUseListenTo as useListenTo4, commandEndEvent as commandEndEvent3 } from "@elementor/editor-v1-adapters";
|
|
100
76
|
function useElementStyles(elementId) {
|
|
101
|
-
return
|
|
102
|
-
commandEndEvent3("document/atomic-widgets/styles"),
|
|
103
|
-
() => getElementStyles(elementId) ?? {},
|
|
104
|
-
[elementId]
|
|
105
|
-
);
|
|
77
|
+
return useListenTo3(styleRerenderEvents, () => getElementStyles(elementId) ?? {}, [elementId]);
|
|
106
78
|
}
|
|
107
79
|
|
|
108
80
|
// src/hooks/use-element-type.ts
|
|
109
|
-
import { __privateUseListenTo as
|
|
81
|
+
import { __privateUseListenTo as useListenTo4, commandEndEvent as commandEndEvent3 } from "@elementor/editor-v1-adapters";
|
|
110
82
|
|
|
111
83
|
// src/sync/get-widgets-cache.ts
|
|
112
84
|
function getWidgetsCache() {
|
|
@@ -116,8 +88,8 @@ function getWidgetsCache() {
|
|
|
116
88
|
|
|
117
89
|
// src/hooks/use-element-type.ts
|
|
118
90
|
function useElementType(type) {
|
|
119
|
-
return
|
|
120
|
-
|
|
91
|
+
return useListenTo4(
|
|
92
|
+
commandEndEvent3("editor/documents/load"),
|
|
121
93
|
() => {
|
|
122
94
|
if (!type) {
|
|
123
95
|
return null;
|
|
@@ -142,7 +114,7 @@ function useElementType(type) {
|
|
|
142
114
|
}
|
|
143
115
|
|
|
144
116
|
// src/hooks/use-selected-element.ts
|
|
145
|
-
import { __privateUseListenTo as
|
|
117
|
+
import { __privateUseListenTo as useListenTo5, commandEndEvent as commandEndEvent4 } from "@elementor/editor-v1-adapters";
|
|
146
118
|
|
|
147
119
|
// src/sync/get-selected-elements.ts
|
|
148
120
|
function getSelectedElements() {
|
|
@@ -162,8 +134,8 @@ function getSelectedElements() {
|
|
|
162
134
|
|
|
163
135
|
// src/hooks/use-selected-element.ts
|
|
164
136
|
function useSelectedElement() {
|
|
165
|
-
const elements =
|
|
166
|
-
[
|
|
137
|
+
const elements = useListenTo5(
|
|
138
|
+
[commandEndEvent4("document/elements/select"), commandEndEvent4("document/elements/deselect")],
|
|
167
139
|
getSelectedElements
|
|
168
140
|
);
|
|
169
141
|
const [element] = elements;
|
|
@@ -175,10 +147,10 @@ function useSelectedElement() {
|
|
|
175
147
|
}
|
|
176
148
|
|
|
177
149
|
// src/hooks/use-parent-element.ts
|
|
178
|
-
import { __privateUseListenTo as
|
|
150
|
+
import { __privateUseListenTo as useListenTo6, commandEndEvent as commandEndEvent5 } from "@elementor/editor-v1-adapters";
|
|
179
151
|
function useParentElement(elementId) {
|
|
180
|
-
return
|
|
181
|
-
[
|
|
152
|
+
return useListenTo6(
|
|
153
|
+
[commandEndEvent5("document/elements/create")],
|
|
182
154
|
() => {
|
|
183
155
|
if (!elementId) {
|
|
184
156
|
return null;
|
|
@@ -215,43 +187,157 @@ var isElementInContainer = (element, container) => {
|
|
|
215
187
|
return false;
|
|
216
188
|
};
|
|
217
189
|
|
|
218
|
-
// src/sync/update-settings.ts
|
|
219
|
-
import {
|
|
220
|
-
var
|
|
190
|
+
// src/sync/update-element-settings.ts
|
|
191
|
+
import { __privateRunCommandSync as runCommandSync } from "@elementor/editor-v1-adapters";
|
|
192
|
+
var updateElementSettings = ({ id, props, withHistory = true }) => {
|
|
221
193
|
const container = getContainer(id);
|
|
222
|
-
|
|
194
|
+
const args = {
|
|
223
195
|
container,
|
|
224
|
-
settings: {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
196
|
+
settings: { ...props }
|
|
197
|
+
};
|
|
198
|
+
if (withHistory) {
|
|
199
|
+
runCommandSync("document/elements/settings", args);
|
|
200
|
+
} else {
|
|
201
|
+
runCommandSync("document/elements/set-settings", args, { internal: true });
|
|
202
|
+
}
|
|
228
203
|
};
|
|
229
204
|
|
|
230
|
-
// src/
|
|
231
|
-
import {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
205
|
+
// src/styles/create-element-style.ts
|
|
206
|
+
import { classesPropTypeUtil as classesPropTypeUtil2 } from "@elementor/editor-props";
|
|
207
|
+
import { generateId } from "@elementor/editor-styles";
|
|
208
|
+
|
|
209
|
+
// src/styles/mutate-element-styles.ts
|
|
210
|
+
import { classesPropTypeUtil } from "@elementor/editor-props";
|
|
211
|
+
|
|
212
|
+
// src/styles/errors.ts
|
|
213
|
+
import { createError } from "@elementor/utils";
|
|
214
|
+
var ElementNotFoundError = createError({
|
|
215
|
+
code: "element_not_found",
|
|
216
|
+
message: "Element not found."
|
|
217
|
+
});
|
|
218
|
+
var StyleNotFoundError = createError({
|
|
219
|
+
code: "style_not_found",
|
|
220
|
+
message: "Style not found."
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// src/styles/mutate-element-styles.ts
|
|
224
|
+
function mutateElementStyles(elementId, mutator) {
|
|
225
|
+
const container = getContainer(elementId);
|
|
226
|
+
if (!container) {
|
|
227
|
+
throw new ElementNotFoundError({ context: { elementId } });
|
|
228
|
+
}
|
|
229
|
+
const oldIds = Object.keys(container.model.get("styles") ?? {});
|
|
230
|
+
const styles = mutateStyles(container, mutator);
|
|
231
|
+
const newIds = Object.keys(styles);
|
|
232
|
+
clearRemovedClasses(container, {
|
|
233
|
+
oldIds,
|
|
234
|
+
newIds
|
|
241
235
|
});
|
|
242
|
-
|
|
236
|
+
dispatchChangeEvent();
|
|
237
|
+
return styles;
|
|
238
|
+
}
|
|
239
|
+
function mutateStyles(container, mutator) {
|
|
240
|
+
const styles = structuredClone(container.model.get("styles")) ?? {};
|
|
241
|
+
const entries = Object.entries(mutator(styles)).map(([styleId, style]) => {
|
|
242
|
+
style.variants = removeEmptyVariants(style);
|
|
243
|
+
return [styleId, style];
|
|
244
|
+
}).filter(([, style]) => {
|
|
245
|
+
return !isStyleEmpty(style);
|
|
246
|
+
});
|
|
247
|
+
const mutatedStyles = Object.fromEntries(entries);
|
|
248
|
+
container.model.set("styles", mutatedStyles);
|
|
249
|
+
return mutatedStyles;
|
|
250
|
+
}
|
|
251
|
+
function removeEmptyVariants(style) {
|
|
252
|
+
return style.variants.filter(({ props }) => Object.keys(props).length > 0);
|
|
253
|
+
}
|
|
254
|
+
function isStyleEmpty(style) {
|
|
255
|
+
return style.variants.length === 0;
|
|
256
|
+
}
|
|
257
|
+
function clearRemovedClasses(container, { oldIds, newIds }) {
|
|
258
|
+
const removedIds = oldIds.filter((id) => !newIds.includes(id));
|
|
259
|
+
const classesProps = structuredClone(getClassesProps(container));
|
|
260
|
+
classesProps.forEach(([, prop]) => {
|
|
261
|
+
prop.value = prop.value.filter((value) => !removedIds.includes(value));
|
|
262
|
+
});
|
|
263
|
+
updateElementSettings({
|
|
264
|
+
id: container.id,
|
|
265
|
+
props: Object.fromEntries(classesProps),
|
|
266
|
+
withHistory: false
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
function getClassesProps(container) {
|
|
270
|
+
return Object.entries(container.settings.toJSON()).filter((prop) => {
|
|
271
|
+
const [, value] = prop;
|
|
272
|
+
return classesPropTypeUtil.isValid(value);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
function dispatchChangeEvent() {
|
|
276
|
+
window.dispatchEvent(new CustomEvent(ELEMENT_STYLE_CHANGE_EVENT));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// src/styles/create-element-style.ts
|
|
280
|
+
function createElementStyle({ elementId, classesProp, label, meta, props }) {
|
|
281
|
+
mutateElementStyles(elementId, (styles) => {
|
|
282
|
+
const id = generateId(`e-${elementId}-`, Object.keys(styles));
|
|
283
|
+
styles[id] = {
|
|
284
|
+
id,
|
|
285
|
+
label,
|
|
286
|
+
type: "class",
|
|
287
|
+
variants: [{ meta, props }]
|
|
288
|
+
};
|
|
289
|
+
addStyleToClassesProp(elementId, classesProp, id);
|
|
290
|
+
return styles;
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
function addStyleToClassesProp(elementId, classesProp, styleId) {
|
|
294
|
+
const base = getElementSetting(elementId, classesProp);
|
|
295
|
+
const classesPropValue = classesPropTypeUtil2.create(
|
|
296
|
+
(prev) => {
|
|
297
|
+
return [...prev ?? [], styleId];
|
|
298
|
+
},
|
|
299
|
+
{ base }
|
|
300
|
+
);
|
|
301
|
+
updateElementSettings({
|
|
302
|
+
id: elementId,
|
|
303
|
+
props: {
|
|
304
|
+
[classesProp]: classesPropValue
|
|
305
|
+
},
|
|
306
|
+
withHistory: false
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/styles/update-element-style.ts
|
|
311
|
+
import { mergeProps } from "@elementor/editor-props";
|
|
312
|
+
import { getVariantByMeta } from "@elementor/editor-styles";
|
|
313
|
+
function updateElementStyle(args) {
|
|
314
|
+
mutateElementStyles(args.elementId, (styles) => {
|
|
315
|
+
const style = styles[args.styleId];
|
|
316
|
+
if (!style) {
|
|
317
|
+
throw new StyleNotFoundError({ context: { styleId: args.styleId } });
|
|
318
|
+
}
|
|
319
|
+
const variant = getVariantByMeta(style, args.meta);
|
|
320
|
+
if (variant) {
|
|
321
|
+
variant.props = mergeProps(variant.props, args.props);
|
|
322
|
+
} else {
|
|
323
|
+
style.variants.push({ meta: args.meta, props: args.props });
|
|
324
|
+
}
|
|
325
|
+
return styles;
|
|
326
|
+
});
|
|
327
|
+
}
|
|
243
328
|
export {
|
|
329
|
+
ELEMENT_STYLE_CHANGE_EVENT,
|
|
330
|
+
createElementStyle,
|
|
244
331
|
getElementSetting,
|
|
245
332
|
getElementStyles,
|
|
246
333
|
getElements,
|
|
247
334
|
getSelectedElements,
|
|
248
|
-
getVariantByMeta,
|
|
249
335
|
getWidgetsCache,
|
|
250
336
|
isElementInContainer,
|
|
251
|
-
|
|
252
|
-
|
|
337
|
+
styleRerenderEvents,
|
|
338
|
+
updateElementSettings,
|
|
339
|
+
updateElementStyle,
|
|
253
340
|
useElementSetting,
|
|
254
|
-
useElementStyleProps,
|
|
255
341
|
useElementStyles,
|
|
256
342
|
useElementType,
|
|
257
343
|
useElementsDomRef,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-elements-dom-ref.ts","../src/sync/get-current-document-container.ts","../src/hooks/use-element-setting.ts","../src/sync/get-container.ts","../src/sync/get-element-setting.ts","../src/hooks/use-element-style-props.ts","../src/sync/get-element-styles.ts","../src/hooks/use-element-styles.ts","../src/hooks/use-element-type.ts","../src/sync/get-widgets-cache.ts","../src/hooks/use-selected-element.ts","../src/sync/get-selected-elements.ts","../src/hooks/use-parent-element.ts","../src/sync/get-elements.ts","../src/sync/is-element-in-container.ts","../src/sync/update-settings.ts","../src/sync/update-styles.ts"],"sourcesContent":["import { __privateUseListenTo as useListenTo, windowEvent } from '@elementor/editor-v1-adapters';\n\nimport getCurrentDocumentContainer from '../sync/get-current-document-container';\n\nconst ELEMENTS_DATA_ATTR = 'data-atomic';\n\nexport function useElementsDomRef(): HTMLElement[] {\n\treturn useListenTo(\n\t\t[\n\t\t\twindowEvent( 'elementor/preview/atomic-widget/render' ),\n\t\t\twindowEvent( 'elementor/preview/atomic-widget/destroy' ),\n\t\t\twindowEvent( 'elementor/editor/element-rendered' ),\n\t\t\twindowEvent( 'elementor/editor/element-destroyed' ),\n\t\t],\n\t\t() => getElementsDom()\n\t);\n}\n\nfunction getElementsDom(): HTMLElement[] {\n\tconst root = getCurrentDocumentContainer();\n\n\tif ( ! root?.view ) {\n\t\treturn [];\n\t}\n\n\treturn [ ...root.view.el.querySelectorAll< HTMLElement >( `[${ ELEMENTS_DATA_ATTR }]` ) ];\n}\n","import { type ExtendedWindow } from './types';\n\nexport default function getCurrentDocumentContainer() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor?.documents?.getCurrent?.()?.container ?? null;\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getElementSetting } from '../sync/get-element-setting';\nimport { type ElementID } from '../types';\n\nexport const useElementSetting = < TValue >( elementId: ElementID, settingKey: string ) => {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'document/elements/set-settings' ),\n\t\t() => getElementSetting< TValue >( elementId, settingKey ),\n\t\t[ elementId, settingKey ]\n\t);\n};\n","import { type ExtendedWindow } from './types';\n\nexport default function getContainer( id: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\tconst container = extendedWindow.elementor?.getContainer?.( id );\n\n\treturn container ?? null;\n}\n","import { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport const getElementSetting = < TValue >( elementId: ElementID, settingKey: string ): TValue | null => {\n\tconst container = getContainer( elementId );\n\tconst value = container?.settings?.get( settingKey ) as TValue;\n\n\treturn value ?? null;\n};\n","import { type Props } from '@elementor/editor-props';\nimport { type StyleDefinition, type StyleDefinitionID, type StyleVariant } from '@elementor/editor-styles';\nimport { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getElementStyles } from '../sync/get-element-styles';\nimport { type ElementID } from '../types';\n\nexport type UseElementStylePropsArgs< T extends Props > = {\n\telementID: ElementID;\n\tstyleDefID: StyleDefinitionID | null;\n\tmeta: StyleVariant[ 'meta' ];\n\tpropNames: Array< keyof T & string >;\n};\n\ntype NullableObjectValues< T extends Props > = {\n\t[ K in keyof T ]: T[ K ] | null;\n};\n\nexport function useElementStyleProps< T extends Props >( {\n\telementID,\n\tstyleDefID,\n\tmeta,\n\tpropNames,\n}: UseElementStylePropsArgs< T > ): NullableObjectValues< T > | null {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t() => {\n\t\t\tif ( ! styleDefID ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst styleDef = getElementStyles( elementID )?.[ styleDefID ];\n\n\t\t\tif ( ! styleDef ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst variant = getVariantByMeta( styleDef, meta );\n\n\t\t\treturn propNames.reduce< Record< string, unknown > >( ( acc, key ) => {\n\t\t\t\tacc[ key ] = variant?.props[ key ] ?? null;\n\n\t\t\t\treturn acc;\n\t\t\t}, {} ) as NullableObjectValues< T >;\n\t\t},\n\t\t[ elementID, styleDefID, JSON.stringify( propNames ), meta ]\n\t);\n}\n\nexport function getVariantByMeta( styleDef: StyleDefinition, meta: StyleVariant[ 'meta' ] ) {\n\treturn styleDef.variants.find( ( variant ) => {\n\t\treturn variant.meta.breakpoint === meta.breakpoint && variant.meta.state === meta.state;\n\t} );\n}\n","import { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport const getElementStyles = ( elementID: ElementID ): Record< string, StyleDefinition > | null => {\n\tconst container = getContainer( elementID );\n\n\treturn container?.model.get( 'styles' ) || null;\n};\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getElementStyles } from '../sync/get-element-styles';\nimport { type ElementID } from '../types';\n\nexport function useElementStyles( elementId: ElementID ) {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t() => getElementStyles( elementId ) ?? {},\n\t\t[ elementId ]\n\t);\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getWidgetsCache } from '../sync/get-widgets-cache';\nimport { type ElementType } from '../types';\n\nexport function useElementType( type?: string ) {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'editor/documents/load' ),\n\t\t(): ElementType | null => {\n\t\t\tif ( ! type ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst widgetsCache = getWidgetsCache();\n\t\t\tconst elementType = widgetsCache?.[ type ];\n\n\t\t\tif ( ! elementType?.atomic_controls ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( ! elementType?.atomic_props_schema ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkey: type,\n\t\t\t\tcontrols: elementType.atomic_controls,\n\t\t\t\tpropsSchema: elementType.atomic_props_schema,\n\t\t\t\ttitle: elementType.title,\n\t\t\t};\n\t\t},\n\t\t[ type ]\n\t);\n}\n","import { type ExtendedWindow } from './types';\n\nexport function getWidgetsCache() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow?.elementor?.widgetsCache || null;\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getSelectedElements } from '../sync/get-selected-elements';\nimport { useElementType } from './use-element-type';\n\nexport function useSelectedElement() {\n\tconst elements = useListenTo(\n\t\t[ commandEndEvent( 'document/elements/select' ), commandEndEvent( 'document/elements/deselect' ) ],\n\t\tgetSelectedElements\n\t);\n\n\tconst [ element ] = elements;\n\n\tconst elementType = useElementType( element?.type );\n\n\tif ( elements.length !== 1 || ! elementType ) {\n\t\treturn { element: null, elementType: null };\n\t}\n\n\treturn { element, elementType };\n}\n","import { type Element } from '../types';\nimport { type ExtendedWindow } from './types';\n\nexport function getSelectedElements(): Element[] {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst selectedElements = extendedWindow.elementor?.selection?.getElements?.() ?? [];\n\n\treturn selectedElements.reduce< Element[] >( ( acc, el ) => {\n\t\tconst type = el.model.get( 'widgetType' ) || el.model.get( 'elType' );\n\n\t\tif ( type ) {\n\t\t\tacc.push( {\n\t\t\t\tid: el.model.get( 'id' ),\n\t\t\t\ttype,\n\t\t\t} );\n\t\t}\n\n\t\treturn acc;\n\t}, [] );\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type ExtendedWindow } from '../sync/types';\n\nexport function useParentElement( elementId: string | null ) {\n\treturn useListenTo(\n\t\t[ commandEndEvent( 'document/elements/create' ) ],\n\t\t() => {\n\t\t\tif ( ! elementId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst extendedWindow = window as unknown as ExtendedWindow;\n\t\t\tconst element = extendedWindow?.elementor?.getContainer?.( elementId );\n\t\t\tif ( ! element ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn element.parent;\n\t\t},\n\t\t[ elementId ]\n\t);\n}\n","import { type ElementID } from '../types';\nimport getContainer from './get-container';\nimport getCurrentDocumentContainer from './get-current-document-container';\nimport { type V1Element } from './types';\n\nexport function getElements( root?: ElementID ): V1Element[] {\n\tconst container = root ? getContainer( root ) : getCurrentDocumentContainer();\n\n\tif ( ! container ) {\n\t\treturn [];\n\t}\n\n\tconst children = container.children?.flatMap( ( child ) => getElements( child.id ) ) ?? [];\n\n\treturn [ container, ...children ];\n}\n","import { type Element } from '../types';\nimport { type V1Element } from './types';\n\nexport const isElementInContainer = ( element: Element, container: V1Element ): boolean => {\n\tif ( container.model.get( 'id' ) === element.id && container.model.get( 'widgetType' ) === element.type ) {\n\t\treturn true;\n\t}\n\n\tif ( container.children && container.children.length > 0 ) {\n\t\treturn container.children.some( ( child ) => isElementInContainer( element, child ) );\n\t}\n\n\treturn false;\n};\n","import { type Props } from '@elementor/editor-props';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nimport { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport const updateSettings = ( { id, props }: { id: ElementID; props: Props } ) => {\n\tconst container = getContainer( id );\n\n\trunCommand( 'document/elements/settings', {\n\t\tcontainer,\n\t\tsettings: {\n\t\t\t...props,\n\t\t},\n\t} );\n};\n","import { type PropKey, type Props } from '@elementor/editor-props';\nimport { type StyleDefinitionID, type StyleVariant } from '@elementor/editor-styles';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nimport { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport type UpdateStyleProps = {\n\telementID: ElementID;\n\tstyleDefID: StyleDefinitionID | null;\n\tmeta: StyleVariant[ 'meta' ];\n\tprops: Props;\n\tbind: PropKey;\n\tlabel?: string;\n};\n\nexport const updateStyle = async ( { elementID, styleDefID, meta, props, bind, label }: UpdateStyleProps ) => {\n\tconst container = getContainer( elementID );\n\n\tawait runCommand( 'document/atomic-widgets/styles', {\n\t\tcontainer,\n\t\tstyleDefID,\n\t\tbind,\n\t\tmeta,\n\t\tprops,\n\t\tlabel,\n\t} );\n};\n"],"mappings":"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","names":["useListenTo","useListenTo","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","runCommand","runCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-elements-dom-ref.ts","../src/sync/get-current-document-container.ts","../src/hooks/use-element-setting.ts","../src/sync/get-container.ts","../src/sync/get-element-setting.ts","../src/hooks/use-element-styles.ts","../src/styles/consts.ts","../src/sync/get-element-styles.ts","../src/hooks/use-element-type.ts","../src/sync/get-widgets-cache.ts","../src/hooks/use-selected-element.ts","../src/sync/get-selected-elements.ts","../src/hooks/use-parent-element.ts","../src/sync/get-elements.ts","../src/sync/is-element-in-container.ts","../src/sync/update-element-settings.ts","../src/styles/create-element-style.ts","../src/styles/mutate-element-styles.ts","../src/styles/errors.ts","../src/styles/update-element-style.ts"],"sourcesContent":["import { __privateUseListenTo as useListenTo, windowEvent } from '@elementor/editor-v1-adapters';\n\nimport getCurrentDocumentContainer from '../sync/get-current-document-container';\n\nconst ELEMENTS_DATA_ATTR = 'data-atomic';\n\nexport function useElementsDomRef(): HTMLElement[] {\n\treturn useListenTo(\n\t\t[\n\t\t\twindowEvent( 'elementor/preview/atomic-widget/render' ),\n\t\t\twindowEvent( 'elementor/preview/atomic-widget/destroy' ),\n\t\t\twindowEvent( 'elementor/editor/element-rendered' ),\n\t\t\twindowEvent( 'elementor/editor/element-destroyed' ),\n\t\t],\n\t\t() => getElementsDom()\n\t);\n}\n\nfunction getElementsDom(): HTMLElement[] {\n\tconst root = getCurrentDocumentContainer();\n\n\tif ( ! root?.view ) {\n\t\treturn [];\n\t}\n\n\treturn [ ...root.view.el.querySelectorAll< HTMLElement >( `[${ ELEMENTS_DATA_ATTR }]` ) ];\n}\n","import { type ExtendedWindow } from './types';\n\nexport default function getCurrentDocumentContainer() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow.elementor?.documents?.getCurrent?.()?.container ?? null;\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getElementSetting } from '../sync/get-element-setting';\nimport { type ElementID } from '../types';\n\nexport const useElementSetting = < TValue >( elementId: ElementID, settingKey: string ) => {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'document/elements/set-settings' ),\n\t\t() => getElementSetting< TValue >( elementId, settingKey ),\n\t\t[ elementId, settingKey ]\n\t);\n};\n","import { type ExtendedWindow } from './types';\n\nexport default function getContainer( id: string ) {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\tconst container = extendedWindow.elementor?.getContainer?.( id );\n\n\treturn container ?? null;\n}\n","import { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport const getElementSetting = < TValue >( elementId: ElementID, settingKey: string ): TValue | null => {\n\tconst container = getContainer( elementId );\n\tconst value = container?.settings?.get( settingKey ) as TValue;\n\n\treturn value ?? null;\n};\n","import { __privateUseListenTo as useListenTo } from '@elementor/editor-v1-adapters';\n\nimport { styleRerenderEvents } from '../styles/consts';\nimport { getElementStyles } from '../sync/get-element-styles';\nimport { type ElementID } from '../types';\n\nexport function useElementStyles( elementId: ElementID ) {\n\treturn useListenTo( styleRerenderEvents, () => getElementStyles( elementId ) ?? {}, [ elementId ] );\n}\n","import { commandEndEvent, windowEvent } from '@elementor/editor-v1-adapters';\n\nexport const ELEMENT_STYLE_CHANGE_EVENT = 'elementor/editor-v2/editor-elements/style';\n\nexport const styleRerenderEvents = [\n\tcommandEndEvent( 'document/elements/create' ),\n\tcommandEndEvent( 'editor/documents/attach-preview' ),\n\twindowEvent( ELEMENT_STYLE_CHANGE_EVENT ),\n];\n","import { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport const getElementStyles = ( elementID: ElementID ): Record< string, StyleDefinition > | null => {\n\tconst container = getContainer( elementID );\n\n\treturn container?.model.get( 'styles' ) || null;\n};\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getWidgetsCache } from '../sync/get-widgets-cache';\nimport { type ElementType } from '../types';\n\nexport function useElementType( type?: string ) {\n\treturn useListenTo(\n\t\tcommandEndEvent( 'editor/documents/load' ),\n\t\t(): ElementType | null => {\n\t\t\tif ( ! type ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst widgetsCache = getWidgetsCache();\n\t\t\tconst elementType = widgetsCache?.[ type ];\n\n\t\t\tif ( ! elementType?.atomic_controls ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( ! elementType?.atomic_props_schema ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkey: type,\n\t\t\t\tcontrols: elementType.atomic_controls,\n\t\t\t\tpropsSchema: elementType.atomic_props_schema,\n\t\t\t\ttitle: elementType.title,\n\t\t\t};\n\t\t},\n\t\t[ type ]\n\t);\n}\n","import { type ExtendedWindow } from './types';\n\nexport function getWidgetsCache() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\treturn extendedWindow?.elementor?.widgetsCache || null;\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { getSelectedElements } from '../sync/get-selected-elements';\nimport { useElementType } from './use-element-type';\n\nexport function useSelectedElement() {\n\tconst elements = useListenTo(\n\t\t[ commandEndEvent( 'document/elements/select' ), commandEndEvent( 'document/elements/deselect' ) ],\n\t\tgetSelectedElements\n\t);\n\n\tconst [ element ] = elements;\n\n\tconst elementType = useElementType( element?.type );\n\n\tif ( elements.length !== 1 || ! elementType ) {\n\t\treturn { element: null, elementType: null };\n\t}\n\n\treturn { element, elementType };\n}\n","import { type Element } from '../types';\nimport { type ExtendedWindow } from './types';\n\nexport function getSelectedElements(): Element[] {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\tconst selectedElements = extendedWindow.elementor?.selection?.getElements?.() ?? [];\n\n\treturn selectedElements.reduce< Element[] >( ( acc, el ) => {\n\t\tconst type = el.model.get( 'widgetType' ) || el.model.get( 'elType' );\n\n\t\tif ( type ) {\n\t\t\tacc.push( {\n\t\t\t\tid: el.model.get( 'id' ),\n\t\t\t\ttype,\n\t\t\t} );\n\t\t}\n\n\t\treturn acc;\n\t}, [] );\n}\n","import { __privateUseListenTo as useListenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type ExtendedWindow } from '../sync/types';\n\nexport function useParentElement( elementId: string | null ) {\n\treturn useListenTo(\n\t\t[ commandEndEvent( 'document/elements/create' ) ],\n\t\t() => {\n\t\t\tif ( ! elementId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst extendedWindow = window as unknown as ExtendedWindow;\n\t\t\tconst element = extendedWindow?.elementor?.getContainer?.( elementId );\n\t\t\tif ( ! element ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn element.parent;\n\t\t},\n\t\t[ elementId ]\n\t);\n}\n","import { type ElementID } from '../types';\nimport getContainer from './get-container';\nimport getCurrentDocumentContainer from './get-current-document-container';\nimport { type V1Element } from './types';\n\nexport function getElements( root?: ElementID ): V1Element[] {\n\tconst container = root ? getContainer( root ) : getCurrentDocumentContainer();\n\n\tif ( ! container ) {\n\t\treturn [];\n\t}\n\n\tconst children = container.children?.flatMap( ( child ) => getElements( child.id ) ) ?? [];\n\n\treturn [ container, ...children ];\n}\n","import { type Element } from '../types';\nimport { type V1Element } from './types';\n\nexport const isElementInContainer = ( element: Element, container: V1Element ): boolean => {\n\tif ( container.model.get( 'id' ) === element.id && container.model.get( 'widgetType' ) === element.type ) {\n\t\treturn true;\n\t}\n\n\tif ( container.children && container.children.length > 0 ) {\n\t\treturn container.children.some( ( child ) => isElementInContainer( element, child ) );\n\t}\n\n\treturn false;\n};\n","import { type Props } from '@elementor/editor-props';\nimport { __privateRunCommandSync as runCommandSync } from '@elementor/editor-v1-adapters';\n\nimport { type ElementID } from '../types';\nimport getContainer from './get-container';\n\nexport type UpdateElementSettingsArgs = {\n\tid: ElementID;\n\tprops: Props;\n\twithHistory?: boolean;\n};\n\nexport const updateElementSettings = ( { id, props, withHistory = true }: UpdateElementSettingsArgs ) => {\n\tconst container = getContainer( id );\n\n\tconst args = {\n\t\tcontainer,\n\t\tsettings: { ...props },\n\t};\n\n\tif ( withHistory ) {\n\t\trunCommandSync( 'document/elements/settings', args );\n\t} else {\n\t\trunCommandSync( 'document/elements/set-settings', args, { internal: true } );\n\t}\n};\n","import { classesPropTypeUtil } from '@elementor/editor-props';\nimport { generateId, type StyleDefinition, type StyleDefinitionVariant } from '@elementor/editor-styles';\n\nimport { getElementSetting } from '../sync/get-element-setting';\nimport { updateElementSettings } from '../sync/update-element-settings';\nimport { type ElementID } from '../types';\nimport { mutateElementStyles } from './mutate-element-styles';\n\nexport type CreateElementStyleArgs = {\n\telementId: ElementID;\n\tclassesProp: string;\n\tlabel: string;\n\tmeta: StyleDefinitionVariant[ 'meta' ];\n\tprops: StyleDefinitionVariant[ 'props' ];\n};\n\nexport function createElementStyle( { elementId, classesProp, label, meta, props }: CreateElementStyleArgs ) {\n\tmutateElementStyles( elementId, ( styles ) => {\n\t\tconst id = generateId( `e-${ elementId }-`, Object.keys( styles ) );\n\n\t\tstyles[ id ] = {\n\t\t\tid,\n\t\t\tlabel,\n\t\t\ttype: 'class',\n\t\t\tvariants: [ { meta, props } ],\n\t\t} satisfies StyleDefinition;\n\n\t\taddStyleToClassesProp( elementId, classesProp, id );\n\n\t\treturn styles;\n\t} );\n}\n\nfunction addStyleToClassesProp( elementId: ElementID, classesProp: string, styleId: string ) {\n\tconst base = getElementSetting( elementId, classesProp );\n\n\tconst classesPropValue = classesPropTypeUtil.create(\n\t\t( prev ) => {\n\t\t\treturn [ ...( prev ?? [] ), styleId ];\n\t\t},\n\t\t{ base }\n\t);\n\n\tupdateElementSettings( {\n\t\tid: elementId,\n\t\tprops: {\n\t\t\t[ classesProp ]: classesPropValue,\n\t\t},\n\t\twithHistory: false,\n\t} );\n}\n","import { classesPropTypeUtil, type ClassesPropValue } from '@elementor/editor-props';\nimport { type StyleDefinition, type StyleDefinitionsMap } from '@elementor/editor-styles';\n\nimport getContainer from '../sync/get-container';\nimport { type V1Element } from '../sync/types';\nimport { updateElementSettings } from '../sync/update-element-settings';\nimport { type ElementID } from '../types';\nimport { ELEMENT_STYLE_CHANGE_EVENT } from './consts';\nimport { ElementNotFoundError } from './errors';\n\nexport type Mutator = ( styles: StyleDefinitionsMap ) => StyleDefinitionsMap;\n\nexport function mutateElementStyles( elementId: ElementID, mutator: Mutator ) {\n\tconst container = getContainer( elementId );\n\n\tif ( ! container ) {\n\t\tthrow new ElementNotFoundError( { context: { elementId } } );\n\t}\n\n\tconst oldIds = Object.keys( container.model.get( 'styles' ) ?? {} );\n\n\tconst styles = mutateStyles( container, mutator );\n\n\tconst newIds = Object.keys( styles );\n\n\tclearRemovedClasses( container, {\n\t\toldIds,\n\t\tnewIds,\n\t} );\n\n\tdispatchChangeEvent();\n\n\treturn styles;\n}\n\nfunction mutateStyles( container: V1Element, mutator: Mutator ) {\n\tconst styles: StyleDefinitionsMap = structuredClone( container.model.get( 'styles' ) ) ?? {};\n\n\tconst entries = Object.entries( mutator( styles ) )\n\t\t.map( ( [ styleId, style ] ) => {\n\t\t\tstyle.variants = removeEmptyVariants( style );\n\n\t\t\treturn [ styleId, style ] as const;\n\t\t} )\n\t\t.filter( ( [ , style ] ) => {\n\t\t\treturn ! isStyleEmpty( style );\n\t\t} );\n\n\tconst mutatedStyles = Object.fromEntries( entries );\n\n\tcontainer.model.set( 'styles', mutatedStyles );\n\n\treturn mutatedStyles;\n}\n\nfunction removeEmptyVariants( style: StyleDefinition ) {\n\treturn style.variants.filter( ( { props } ) => Object.keys( props ).length > 0 );\n}\n\nfunction isStyleEmpty( style: StyleDefinition ) {\n\treturn style.variants.length === 0;\n}\n\nfunction clearRemovedClasses( container: V1Element, { oldIds, newIds }: { oldIds: string[]; newIds: string[] } ) {\n\tconst removedIds = oldIds.filter( ( id ) => ! newIds.includes( id ) );\n\tconst classesProps = structuredClone( getClassesProps( container ) );\n\n\tclassesProps.forEach( ( [ , prop ] ) => {\n\t\tprop.value = prop.value.filter( ( value ) => ! removedIds.includes( value ) );\n\t} );\n\n\tupdateElementSettings( {\n\t\tid: container.id,\n\t\tprops: Object.fromEntries( classesProps ),\n\t\twithHistory: false,\n\t} );\n}\n\nfunction getClassesProps( container: V1Element ) {\n\treturn Object.entries( container.settings.toJSON() ).filter( ( prop ): prop is [ string, ClassesPropValue ] => {\n\t\tconst [ , value ] = prop;\n\n\t\treturn classesPropTypeUtil.isValid( value );\n\t} );\n}\n\nfunction dispatchChangeEvent() {\n\twindow.dispatchEvent( new CustomEvent( ELEMENT_STYLE_CHANGE_EVENT ) );\n}\n","import { createError } from '@elementor/utils';\n\nexport const ElementNotFoundError = createError< { elementId: string } >( {\n\tcode: 'element_not_found',\n\tmessage: 'Element not found.',\n} );\n\nexport const StyleNotFoundError = createError< { styleId: string } >( {\n\tcode: 'style_not_found',\n\tmessage: 'Style not found.',\n} );\n","import { mergeProps } from '@elementor/editor-props';\nimport { getVariantByMeta, type StyleDefinition, type StyleDefinitionVariant } from '@elementor/editor-styles';\n\nimport { type ElementID } from '../types';\nimport { StyleNotFoundError } from './errors';\nimport { mutateElementStyles } from './mutate-element-styles';\n\nexport type UpdateElementStyleArgs = {\n\telementId: ElementID;\n\tstyleId: StyleDefinition[ 'id' ];\n\tmeta: StyleDefinitionVariant[ 'meta' ];\n\tprops: StyleDefinitionVariant[ 'props' ];\n};\n\nexport function updateElementStyle( args: UpdateElementStyleArgs ) {\n\tmutateElementStyles( args.elementId, ( styles ) => {\n\t\tconst style = styles[ args.styleId ];\n\n\t\tif ( ! style ) {\n\t\t\tthrow new StyleNotFoundError( { context: { styleId: args.styleId } } );\n\t\t}\n\n\t\tconst variant = getVariantByMeta( style, args.meta );\n\n\t\tif ( variant ) {\n\t\t\tvariant.props = mergeProps( variant.props, args.props );\n\t\t} else {\n\t\t\tstyle.variants.push( { meta: args.meta, props: args.props } );\n\t\t}\n\n\t\treturn styles;\n\t} );\n}\n"],"mappings":"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","names":["useListenTo","useListenTo","useListenTo","commandEndEvent","windowEvent","useListenTo","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","useListenTo","commandEndEvent","classesPropTypeUtil","classesPropTypeUtil"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-elements",
|
|
3
3
|
"description": "This package contains the elements model for the Elementor editor",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -40,9 +40,10 @@
|
|
|
40
40
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@elementor/editor-props": "0.
|
|
44
|
-
"@elementor/editor-styles": "0.5.
|
|
45
|
-
"@elementor/editor-v1-adapters": "0.9.
|
|
43
|
+
"@elementor/editor-props": "0.8.0",
|
|
44
|
+
"@elementor/editor-styles": "0.5.4",
|
|
45
|
+
"@elementor/editor-v1-adapters": "0.9.1",
|
|
46
|
+
"@elementor/utils": "0.3.0"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"react": "^18.3.1"
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { __privateUseListenTo as useListenTo
|
|
1
|
+
import { __privateUseListenTo as useListenTo } from '@elementor/editor-v1-adapters';
|
|
2
2
|
|
|
3
|
+
import { styleRerenderEvents } from '../styles/consts';
|
|
3
4
|
import { getElementStyles } from '../sync/get-element-styles';
|
|
4
5
|
import { type ElementID } from '../types';
|
|
5
6
|
|
|
6
7
|
export function useElementStyles( elementId: ElementID ) {
|
|
7
|
-
return useListenTo(
|
|
8
|
-
commandEndEvent( 'document/atomic-widgets/styles' ),
|
|
9
|
-
() => getElementStyles( elementId ) ?? {},
|
|
10
|
-
[ elementId ]
|
|
11
|
-
);
|
|
8
|
+
return useListenTo( styleRerenderEvents, () => getElementStyles( elementId ) ?? {}, [ elementId ] );
|
|
12
9
|
}
|
package/src/index.ts
CHANGED
|
@@ -5,7 +5,6 @@ export type { V1Element, V1ElementModelProps, V1ElementSettingsProps } from './s
|
|
|
5
5
|
// hooks
|
|
6
6
|
export { useElementsDomRef } from './hooks/use-elements-dom-ref';
|
|
7
7
|
export { useElementSetting } from './hooks/use-element-setting';
|
|
8
|
-
export { useElementStyleProps, getVariantByMeta } from './hooks/use-element-style-props';
|
|
9
8
|
export { useElementStyles } from './hooks/use-element-styles';
|
|
10
9
|
export { useElementType } from './hooks/use-element-type';
|
|
11
10
|
export { useSelectedElement } from './hooks/use-selected-element';
|
|
@@ -18,5 +17,8 @@ export { getElements } from './sync/get-elements';
|
|
|
18
17
|
export { getSelectedElements } from './sync/get-selected-elements';
|
|
19
18
|
export { getWidgetsCache } from './sync/get-widgets-cache';
|
|
20
19
|
export { isElementInContainer } from './sync/is-element-in-container';
|
|
21
|
-
export {
|
|
22
|
-
|
|
20
|
+
export { updateElementSettings, type UpdateElementSettingsArgs } from './sync/update-element-settings';
|
|
21
|
+
|
|
22
|
+
export { ELEMENT_STYLE_CHANGE_EVENT, styleRerenderEvents } from './styles/consts';
|
|
23
|
+
export { createElementStyle, type CreateElementStyleArgs } from './styles/create-element-style';
|
|
24
|
+
export { updateElementStyle, type UpdateElementStyleArgs } from './styles/update-element-style';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { commandEndEvent, windowEvent } from '@elementor/editor-v1-adapters';
|
|
2
|
+
|
|
3
|
+
export const ELEMENT_STYLE_CHANGE_EVENT = 'elementor/editor-v2/editor-elements/style';
|
|
4
|
+
|
|
5
|
+
export const styleRerenderEvents = [
|
|
6
|
+
commandEndEvent( 'document/elements/create' ),
|
|
7
|
+
commandEndEvent( 'editor/documents/attach-preview' ),
|
|
8
|
+
windowEvent( ELEMENT_STYLE_CHANGE_EVENT ),
|
|
9
|
+
];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { classesPropTypeUtil } from '@elementor/editor-props';
|
|
2
|
+
import { generateId, type StyleDefinition, type StyleDefinitionVariant } from '@elementor/editor-styles';
|
|
3
|
+
|
|
4
|
+
import { getElementSetting } from '../sync/get-element-setting';
|
|
5
|
+
import { updateElementSettings } from '../sync/update-element-settings';
|
|
6
|
+
import { type ElementID } from '../types';
|
|
7
|
+
import { mutateElementStyles } from './mutate-element-styles';
|
|
8
|
+
|
|
9
|
+
export type CreateElementStyleArgs = {
|
|
10
|
+
elementId: ElementID;
|
|
11
|
+
classesProp: string;
|
|
12
|
+
label: string;
|
|
13
|
+
meta: StyleDefinitionVariant[ 'meta' ];
|
|
14
|
+
props: StyleDefinitionVariant[ 'props' ];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export function createElementStyle( { elementId, classesProp, label, meta, props }: CreateElementStyleArgs ) {
|
|
18
|
+
mutateElementStyles( elementId, ( styles ) => {
|
|
19
|
+
const id = generateId( `e-${ elementId }-`, Object.keys( styles ) );
|
|
20
|
+
|
|
21
|
+
styles[ id ] = {
|
|
22
|
+
id,
|
|
23
|
+
label,
|
|
24
|
+
type: 'class',
|
|
25
|
+
variants: [ { meta, props } ],
|
|
26
|
+
} satisfies StyleDefinition;
|
|
27
|
+
|
|
28
|
+
addStyleToClassesProp( elementId, classesProp, id );
|
|
29
|
+
|
|
30
|
+
return styles;
|
|
31
|
+
} );
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function addStyleToClassesProp( elementId: ElementID, classesProp: string, styleId: string ) {
|
|
35
|
+
const base = getElementSetting( elementId, classesProp );
|
|
36
|
+
|
|
37
|
+
const classesPropValue = classesPropTypeUtil.create(
|
|
38
|
+
( prev ) => {
|
|
39
|
+
return [ ...( prev ?? [] ), styleId ];
|
|
40
|
+
},
|
|
41
|
+
{ base }
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
updateElementSettings( {
|
|
45
|
+
id: elementId,
|
|
46
|
+
props: {
|
|
47
|
+
[ classesProp ]: classesPropValue,
|
|
48
|
+
},
|
|
49
|
+
withHistory: false,
|
|
50
|
+
} );
|
|
51
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createError } from '@elementor/utils';
|
|
2
|
+
|
|
3
|
+
export const ElementNotFoundError = createError< { elementId: string } >( {
|
|
4
|
+
code: 'element_not_found',
|
|
5
|
+
message: 'Element not found.',
|
|
6
|
+
} );
|
|
7
|
+
|
|
8
|
+
export const StyleNotFoundError = createError< { styleId: string } >( {
|
|
9
|
+
code: 'style_not_found',
|
|
10
|
+
message: 'Style not found.',
|
|
11
|
+
} );
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { classesPropTypeUtil, type ClassesPropValue } from '@elementor/editor-props';
|
|
2
|
+
import { type StyleDefinition, type StyleDefinitionsMap } from '@elementor/editor-styles';
|
|
3
|
+
|
|
4
|
+
import getContainer from '../sync/get-container';
|
|
5
|
+
import { type V1Element } from '../sync/types';
|
|
6
|
+
import { updateElementSettings } from '../sync/update-element-settings';
|
|
7
|
+
import { type ElementID } from '../types';
|
|
8
|
+
import { ELEMENT_STYLE_CHANGE_EVENT } from './consts';
|
|
9
|
+
import { ElementNotFoundError } from './errors';
|
|
10
|
+
|
|
11
|
+
export type Mutator = ( styles: StyleDefinitionsMap ) => StyleDefinitionsMap;
|
|
12
|
+
|
|
13
|
+
export function mutateElementStyles( elementId: ElementID, mutator: Mutator ) {
|
|
14
|
+
const container = getContainer( elementId );
|
|
15
|
+
|
|
16
|
+
if ( ! container ) {
|
|
17
|
+
throw new ElementNotFoundError( { context: { elementId } } );
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const oldIds = Object.keys( container.model.get( 'styles' ) ?? {} );
|
|
21
|
+
|
|
22
|
+
const styles = mutateStyles( container, mutator );
|
|
23
|
+
|
|
24
|
+
const newIds = Object.keys( styles );
|
|
25
|
+
|
|
26
|
+
clearRemovedClasses( container, {
|
|
27
|
+
oldIds,
|
|
28
|
+
newIds,
|
|
29
|
+
} );
|
|
30
|
+
|
|
31
|
+
dispatchChangeEvent();
|
|
32
|
+
|
|
33
|
+
return styles;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function mutateStyles( container: V1Element, mutator: Mutator ) {
|
|
37
|
+
const styles: StyleDefinitionsMap = structuredClone( container.model.get( 'styles' ) ) ?? {};
|
|
38
|
+
|
|
39
|
+
const entries = Object.entries( mutator( styles ) )
|
|
40
|
+
.map( ( [ styleId, style ] ) => {
|
|
41
|
+
style.variants = removeEmptyVariants( style );
|
|
42
|
+
|
|
43
|
+
return [ styleId, style ] as const;
|
|
44
|
+
} )
|
|
45
|
+
.filter( ( [ , style ] ) => {
|
|
46
|
+
return ! isStyleEmpty( style );
|
|
47
|
+
} );
|
|
48
|
+
|
|
49
|
+
const mutatedStyles = Object.fromEntries( entries );
|
|
50
|
+
|
|
51
|
+
container.model.set( 'styles', mutatedStyles );
|
|
52
|
+
|
|
53
|
+
return mutatedStyles;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function removeEmptyVariants( style: StyleDefinition ) {
|
|
57
|
+
return style.variants.filter( ( { props } ) => Object.keys( props ).length > 0 );
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function isStyleEmpty( style: StyleDefinition ) {
|
|
61
|
+
return style.variants.length === 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function clearRemovedClasses( container: V1Element, { oldIds, newIds }: { oldIds: string[]; newIds: string[] } ) {
|
|
65
|
+
const removedIds = oldIds.filter( ( id ) => ! newIds.includes( id ) );
|
|
66
|
+
const classesProps = structuredClone( getClassesProps( container ) );
|
|
67
|
+
|
|
68
|
+
classesProps.forEach( ( [ , prop ] ) => {
|
|
69
|
+
prop.value = prop.value.filter( ( value ) => ! removedIds.includes( value ) );
|
|
70
|
+
} );
|
|
71
|
+
|
|
72
|
+
updateElementSettings( {
|
|
73
|
+
id: container.id,
|
|
74
|
+
props: Object.fromEntries( classesProps ),
|
|
75
|
+
withHistory: false,
|
|
76
|
+
} );
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function getClassesProps( container: V1Element ) {
|
|
80
|
+
return Object.entries( container.settings.toJSON() ).filter( ( prop ): prop is [ string, ClassesPropValue ] => {
|
|
81
|
+
const [ , value ] = prop;
|
|
82
|
+
|
|
83
|
+
return classesPropTypeUtil.isValid( value );
|
|
84
|
+
} );
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function dispatchChangeEvent() {
|
|
88
|
+
window.dispatchEvent( new CustomEvent( ELEMENT_STYLE_CHANGE_EVENT ) );
|
|
89
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { mergeProps } from '@elementor/editor-props';
|
|
2
|
+
import { getVariantByMeta, type StyleDefinition, type StyleDefinitionVariant } from '@elementor/editor-styles';
|
|
3
|
+
|
|
4
|
+
import { type ElementID } from '../types';
|
|
5
|
+
import { StyleNotFoundError } from './errors';
|
|
6
|
+
import { mutateElementStyles } from './mutate-element-styles';
|
|
7
|
+
|
|
8
|
+
export type UpdateElementStyleArgs = {
|
|
9
|
+
elementId: ElementID;
|
|
10
|
+
styleId: StyleDefinition[ 'id' ];
|
|
11
|
+
meta: StyleDefinitionVariant[ 'meta' ];
|
|
12
|
+
props: StyleDefinitionVariant[ 'props' ];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function updateElementStyle( args: UpdateElementStyleArgs ) {
|
|
16
|
+
mutateElementStyles( args.elementId, ( styles ) => {
|
|
17
|
+
const style = styles[ args.styleId ];
|
|
18
|
+
|
|
19
|
+
if ( ! style ) {
|
|
20
|
+
throw new StyleNotFoundError( { context: { styleId: args.styleId } } );
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const variant = getVariantByMeta( style, args.meta );
|
|
24
|
+
|
|
25
|
+
if ( variant ) {
|
|
26
|
+
variant.props = mergeProps( variant.props, args.props );
|
|
27
|
+
} else {
|
|
28
|
+
style.variants.push( { meta: args.meta, props: args.props } );
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return styles;
|
|
32
|
+
} );
|
|
33
|
+
}
|