@elementor/editor-canvas 4.3.3 → 4.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +310 -114
- package/dist/index.mjs +268 -69
- package/package.json +21 -21
- package/src/legacy/__tests__/build-editor-attributes.test.ts +41 -0
- package/src/legacy/__tests__/create-pending-element.test.ts +128 -0
- package/src/legacy/__tests__/create-templated-element-type.test.ts +50 -14
- package/src/legacy/create-nested-templated-element-type.ts +4 -2
- package/src/legacy/create-pending-element.ts +9 -5
- package/src/legacy/create-templated-element-type.ts +2 -1
- package/src/mcp/canvas-mcp.ts +5 -0
- package/src/mcp/icon-library-experiment.ts +5 -0
- package/src/mcp/tools/configure-element/prompt.ts +47 -1
- package/src/mcp/tools/find-icons/__tests__/tool.test.ts +143 -0
- package/src/mcp/tools/find-icons/prompt.ts +43 -0
- package/src/mcp/tools/find-icons/tool.ts +153 -0
- package/src/transformers/shared/__tests__/icon-transformer.test.ts +39 -0
- package/src/transformers/shared/icon-transformer.ts +56 -12
package/dist/index.js
CHANGED
|
@@ -195,7 +195,7 @@ var convertCssToAtomic = async (style) => {
|
|
|
195
195
|
|
|
196
196
|
// src/init.tsx
|
|
197
197
|
var import_editor = require("@elementor/editor");
|
|
198
|
-
var
|
|
198
|
+
var import_editor_mcp5 = require("@elementor/editor-mcp");
|
|
199
199
|
|
|
200
200
|
// src/components/classes-rename.tsx
|
|
201
201
|
var import_react = require("react");
|
|
@@ -2131,32 +2131,101 @@ function processSvgContent(svgText) {
|
|
|
2131
2131
|
return svgElement.outerHTML;
|
|
2132
2132
|
}
|
|
2133
2133
|
|
|
2134
|
+
// src/transformers/shared/svg-src-transformer.ts
|
|
2135
|
+
var import_wp_media = require("@elementor/wp-media");
|
|
2136
|
+
async function fetchSvgContent(url, signal) {
|
|
2137
|
+
try {
|
|
2138
|
+
const response = await fetch(url, { signal });
|
|
2139
|
+
if (!response.ok) {
|
|
2140
|
+
return null;
|
|
2141
|
+
}
|
|
2142
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
2143
|
+
const isSvg = contentType.includes("svg") || contentType.includes("xml") || url.endsWith(".svg");
|
|
2144
|
+
if (!isSvg) {
|
|
2145
|
+
return null;
|
|
2146
|
+
}
|
|
2147
|
+
return await response.text();
|
|
2148
|
+
} catch {
|
|
2149
|
+
return null;
|
|
2150
|
+
}
|
|
2151
|
+
}
|
|
2152
|
+
function resolveSvgSrcId(id) {
|
|
2153
|
+
if (typeof id !== "number" || id <= 0) {
|
|
2154
|
+
return null;
|
|
2155
|
+
}
|
|
2156
|
+
return id;
|
|
2157
|
+
}
|
|
2158
|
+
var svgSrcTransformer = createTransformer(async (value, { signal }) => {
|
|
2159
|
+
const id = resolveSvgSrcId(value.id);
|
|
2160
|
+
const urlFromValue = typeof value.url === "string" ? value.url : null;
|
|
2161
|
+
let url = urlFromValue;
|
|
2162
|
+
if (id && !urlFromValue) {
|
|
2163
|
+
const attachment = await (0, import_wp_media.getMediaAttachment)({ id });
|
|
2164
|
+
url = attachment?.url ?? null;
|
|
2165
|
+
}
|
|
2166
|
+
const resolvedUrl = typeof url === "string" ? url : null;
|
|
2167
|
+
if (!resolvedUrl) {
|
|
2168
|
+
return { html: null, url: null };
|
|
2169
|
+
}
|
|
2170
|
+
const svgText = await fetchSvgContent(resolvedUrl, signal);
|
|
2171
|
+
const html = svgText ? processSvgContent(svgText) : null;
|
|
2172
|
+
return { html, url: resolvedUrl };
|
|
2173
|
+
});
|
|
2174
|
+
|
|
2134
2175
|
// src/transformers/shared/icon-transformer.ts
|
|
2135
2176
|
var EMPTY_ICON_RESULT = { html: null, url: null };
|
|
2136
2177
|
var ICON_SVG_SIZE = "100%";
|
|
2137
2178
|
var ICON_SVG_OVERFLOW = "visible";
|
|
2179
|
+
var DEFAULT_SVG_RELATIVE_PATH = "images/default-svg.svg";
|
|
2138
2180
|
var iconTransformer = createTransformer(async (value, { signal }) => {
|
|
2139
2181
|
const iconValue = typeof value.value === "string" ? value.value : null;
|
|
2140
2182
|
const library = typeof value.library === "string" ? value.library : null;
|
|
2141
2183
|
if (!iconValue || !library) {
|
|
2142
2184
|
return EMPTY_ICON_RESULT;
|
|
2143
2185
|
}
|
|
2186
|
+
const fontAwesomeHtml = await resolveFontAwesomeSvg(library, iconValue, signal);
|
|
2187
|
+
if (fontAwesomeHtml) {
|
|
2188
|
+
return { html: fontAwesomeHtml, url: null };
|
|
2189
|
+
}
|
|
2190
|
+
if ((0, import_editor_controls.isDeletedCustomIconLibrary)(library, iconValue)) {
|
|
2191
|
+
return resolveDefaultSvg(signal);
|
|
2192
|
+
}
|
|
2193
|
+
const customHtml = await resolveCustomSvg(library, iconValue, signal);
|
|
2194
|
+
if (customHtml) {
|
|
2195
|
+
return { html: customHtml, url: null };
|
|
2196
|
+
}
|
|
2197
|
+
return EMPTY_ICON_RESULT;
|
|
2198
|
+
});
|
|
2199
|
+
async function resolveDefaultSvg(signal) {
|
|
2200
|
+
const assetsUrl = window.elementorCommon?.config?.urls?.assets;
|
|
2201
|
+
if (typeof assetsUrl !== "string" || assetsUrl === "") {
|
|
2202
|
+
return EMPTY_ICON_RESULT;
|
|
2203
|
+
}
|
|
2204
|
+
return svgSrcTransformer(
|
|
2205
|
+
{
|
|
2206
|
+
id: null,
|
|
2207
|
+
url: `${assetsUrl}${DEFAULT_SVG_RELATIVE_PATH}`
|
|
2208
|
+
},
|
|
2209
|
+
{ key: "svg", signal }
|
|
2210
|
+
);
|
|
2211
|
+
}
|
|
2212
|
+
async function resolveCustomSvg(library, iconValue, signal) {
|
|
2213
|
+
const markup = await (0, import_editor_controls.resolveCustomIconSvg)(library, iconValue, signal);
|
|
2214
|
+
return markup ? processIconSvgContent(markup) : null;
|
|
2215
|
+
}
|
|
2216
|
+
async function resolveFontAwesomeSvg(library, iconValue, signal) {
|
|
2144
2217
|
const iconName = (0, import_editor_controls.getFontAwesome7IconName)(iconValue);
|
|
2145
2218
|
if (!iconName) {
|
|
2146
|
-
return
|
|
2219
|
+
return null;
|
|
2147
2220
|
}
|
|
2148
2221
|
const iconData = await (0, import_editor_controls.resolveFontAwesome7Icon)(library, iconName, signal);
|
|
2149
2222
|
if (!iconData) {
|
|
2150
|
-
return
|
|
2151
|
-
}
|
|
2152
|
-
const svgText = buildFontAwesomeSvg(iconData);
|
|
2153
|
-
if (!svgText) {
|
|
2154
|
-
return EMPTY_ICON_RESULT;
|
|
2223
|
+
return null;
|
|
2155
2224
|
}
|
|
2156
|
-
const
|
|
2157
|
-
return
|
|
2158
|
-
}
|
|
2159
|
-
function
|
|
2225
|
+
const svgText = buildPathSvg(iconData);
|
|
2226
|
+
return svgText ? processIconSvgContent(svgText) : null;
|
|
2227
|
+
}
|
|
2228
|
+
function buildPathSvg(iconData) {
|
|
2160
2229
|
if (iconData.paths.length === 0) {
|
|
2161
2230
|
return null;
|
|
2162
2231
|
}
|
|
@@ -2192,13 +2261,13 @@ var imageSrcTransformer = createTransformer((value) => ({
|
|
|
2192
2261
|
}));
|
|
2193
2262
|
|
|
2194
2263
|
// src/transformers/shared/image-transformer.ts
|
|
2195
|
-
var
|
|
2264
|
+
var import_wp_media2 = require("@elementor/wp-media");
|
|
2196
2265
|
var imageTransformer = createTransformer(async (value) => {
|
|
2197
2266
|
const { src, size: size2 } = value;
|
|
2198
2267
|
if (!src?.id) {
|
|
2199
2268
|
return src?.url ? { src: src.url, alt: src.alt ?? "" } : null;
|
|
2200
2269
|
}
|
|
2201
|
-
const attachment = await (0,
|
|
2270
|
+
const attachment = await (0, import_wp_media2.getMediaAttachment)({ id: src.id });
|
|
2202
2271
|
const sizedAttachment = attachment?.sizes?.[size2 ?? ""];
|
|
2203
2272
|
if (sizedAttachment) {
|
|
2204
2273
|
return {
|
|
@@ -2224,47 +2293,6 @@ var plainTransformer = createTransformer((value) => {
|
|
|
2224
2293
|
return value;
|
|
2225
2294
|
});
|
|
2226
2295
|
|
|
2227
|
-
// src/transformers/shared/svg-src-transformer.ts
|
|
2228
|
-
var import_wp_media2 = require("@elementor/wp-media");
|
|
2229
|
-
async function fetchSvgContent(url, signal) {
|
|
2230
|
-
try {
|
|
2231
|
-
const response = await fetch(url, { signal });
|
|
2232
|
-
if (!response.ok) {
|
|
2233
|
-
return null;
|
|
2234
|
-
}
|
|
2235
|
-
const contentType = response.headers.get("content-type") ?? "";
|
|
2236
|
-
const isSvg = contentType.includes("svg") || contentType.includes("xml") || url.endsWith(".svg");
|
|
2237
|
-
if (!isSvg) {
|
|
2238
|
-
return null;
|
|
2239
|
-
}
|
|
2240
|
-
return await response.text();
|
|
2241
|
-
} catch {
|
|
2242
|
-
return null;
|
|
2243
|
-
}
|
|
2244
|
-
}
|
|
2245
|
-
function resolveSvgSrcId(id) {
|
|
2246
|
-
if (typeof id !== "number" || id <= 0) {
|
|
2247
|
-
return null;
|
|
2248
|
-
}
|
|
2249
|
-
return id;
|
|
2250
|
-
}
|
|
2251
|
-
var svgSrcTransformer = createTransformer(async (value, { signal }) => {
|
|
2252
|
-
const id = resolveSvgSrcId(value.id);
|
|
2253
|
-
const urlFromValue = typeof value.url === "string" ? value.url : null;
|
|
2254
|
-
let url = urlFromValue;
|
|
2255
|
-
if (id && !urlFromValue) {
|
|
2256
|
-
const attachment = await (0, import_wp_media2.getMediaAttachment)({ id });
|
|
2257
|
-
url = attachment?.url ?? null;
|
|
2258
|
-
}
|
|
2259
|
-
const resolvedUrl = typeof url === "string" ? url : null;
|
|
2260
|
-
if (!resolvedUrl) {
|
|
2261
|
-
return { html: null, url: null };
|
|
2262
|
-
}
|
|
2263
|
-
const svgText = await fetchSvgContent(resolvedUrl, signal);
|
|
2264
|
-
const html = svgText ? processSvgContent(svgText) : null;
|
|
2265
|
-
return { html, url: resolvedUrl };
|
|
2266
|
-
});
|
|
2267
|
-
|
|
2268
2296
|
// src/transformers/shared/video-src-transformer.ts
|
|
2269
2297
|
var import_wp_media3 = require("@elementor/wp-media");
|
|
2270
2298
|
var videoSrcTransformer = createTransformer(async (value) => {
|
|
@@ -2544,11 +2572,11 @@ function getVal2(val) {
|
|
|
2544
2572
|
var transformOriginTransformer = createTransformer((value) => {
|
|
2545
2573
|
const x = getVal2(value.x);
|
|
2546
2574
|
const y = getVal2(value.y);
|
|
2547
|
-
const
|
|
2548
|
-
if (x === DEFAULT_XY && y === DEFAULT_XY &&
|
|
2575
|
+
const z4 = getVal2(value.z);
|
|
2576
|
+
if (x === DEFAULT_XY && y === DEFAULT_XY && z4 === DEFAULT_Z) {
|
|
2549
2577
|
return null;
|
|
2550
2578
|
}
|
|
2551
|
-
return `${x} ${y} ${
|
|
2579
|
+
return `${x} ${y} ${z4}`;
|
|
2552
2580
|
});
|
|
2553
2581
|
|
|
2554
2582
|
// src/transformers/styles/transform-rotate-transformer.ts
|
|
@@ -2807,14 +2835,17 @@ function isRecord(value) {
|
|
|
2807
2835
|
var import_editor_elements5 = require("@elementor/editor-elements");
|
|
2808
2836
|
function createPendingElement(wrapperView, data, options = {}) {
|
|
2809
2837
|
const parentContainer = wrapperView.getContainer();
|
|
2810
|
-
const model = { ...data };
|
|
2811
|
-
if (!model.id) {
|
|
2838
|
+
const model = options.clone ? (0, import_editor_elements5.cloneElementTree)(data) : { ...data };
|
|
2839
|
+
if (!options.clone && !model.id) {
|
|
2812
2840
|
model.id = (0, import_editor_elements5.generateElementId)();
|
|
2813
2841
|
}
|
|
2814
2842
|
if (!model.elements) {
|
|
2815
2843
|
model.elements = [];
|
|
2816
2844
|
}
|
|
2817
|
-
const added = (0, import_editor_elements5.addModelToParent)(parentContainer.id, model,
|
|
2845
|
+
const added = (0, import_editor_elements5.addModelToParent)(parentContainer.id, model, {
|
|
2846
|
+
...options,
|
|
2847
|
+
clone: false
|
|
2848
|
+
});
|
|
2818
2849
|
if (!added) {
|
|
2819
2850
|
return void 0;
|
|
2820
2851
|
}
|
|
@@ -2975,6 +3006,7 @@ function createTemplatedElementView({
|
|
|
2975
3006
|
this._domUpdateWasSkipped = false;
|
|
2976
3007
|
this._lastResolvedSettingsHash = settingsHash;
|
|
2977
3008
|
const context = {
|
|
3009
|
+
...element.template_context ?? {},
|
|
2978
3010
|
id: this.model.get("id"),
|
|
2979
3011
|
interaction_id: this.getInteractionId(),
|
|
2980
3012
|
type,
|
|
@@ -3053,10 +3085,12 @@ function buildEditorAttributes(model) {
|
|
|
3053
3085
|
const id = model.get("id");
|
|
3054
3086
|
const originId = model.get("originId");
|
|
3055
3087
|
const cid = model.cid ?? "";
|
|
3088
|
+
const isDecorative = model.get("editor_settings")?.decorative === true;
|
|
3056
3089
|
const attrs = {
|
|
3057
3090
|
"data-model-cid": cid,
|
|
3058
3091
|
"data-interaction-id": originId ?? id,
|
|
3059
|
-
"x-ignore": "true"
|
|
3092
|
+
"x-ignore": "true",
|
|
3093
|
+
...isDecorative ? { "data-e-decorative": "true" } : {}
|
|
3060
3094
|
};
|
|
3061
3095
|
return Object.entries(attrs).map(([key, value]) => `${key}="${value}"`).join(" ");
|
|
3062
3096
|
}
|
|
@@ -4151,6 +4185,11 @@ function initTabsModelExtensions() {
|
|
|
4151
4185
|
// src/mcp/canvas-mcp.ts
|
|
4152
4186
|
var import_editor_props8 = require("@elementor/editor-props");
|
|
4153
4187
|
|
|
4188
|
+
// src/mcp/icon-library-experiment.ts
|
|
4189
|
+
var import_editor_v1_adapters15 = require("@elementor/editor-v1-adapters");
|
|
4190
|
+
var ICON_LIBRARY_EXPERIMENT = "e_svg_library";
|
|
4191
|
+
var isIconLibraryActive = () => (0, import_editor_v1_adapters15.isExperimentActive)(ICON_LIBRARY_EXPERIMENT);
|
|
4192
|
+
|
|
4154
4193
|
// src/mcp/resources/available-widgets-resource.ts
|
|
4155
4194
|
var import_http_client3 = require("@elementor/http-client");
|
|
4156
4195
|
var MCP_PROXY_URL2 = "elementor/v1/mcp-proxy";
|
|
@@ -4227,7 +4266,7 @@ var initBestPracticesResource = (reg) => {
|
|
|
4227
4266
|
|
|
4228
4267
|
// src/mcp/resources/document-structure-resource.ts
|
|
4229
4268
|
var import_editor_elements9 = require("@elementor/editor-elements");
|
|
4230
|
-
var
|
|
4269
|
+
var import_editor_v1_adapters16 = require("@elementor/editor-v1-adapters");
|
|
4231
4270
|
var DOCUMENT_STRUCTURE_URI = "elementor://document/structure";
|
|
4232
4271
|
var initDocumentStructureResource = (reg) => {
|
|
4233
4272
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4240,15 +4279,15 @@ var initDocumentStructureResource = (reg) => {
|
|
|
4240
4279
|
sendResourceUpdated({ uri: DOCUMENT_STRUCTURE_URI });
|
|
4241
4280
|
}
|
|
4242
4281
|
};
|
|
4243
|
-
(0,
|
|
4282
|
+
(0, import_editor_v1_adapters16.__privateListenTo)(
|
|
4244
4283
|
[
|
|
4245
|
-
(0,
|
|
4246
|
-
(0,
|
|
4247
|
-
(0,
|
|
4248
|
-
(0,
|
|
4249
|
-
(0,
|
|
4250
|
-
(0,
|
|
4251
|
-
(0,
|
|
4284
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("document/elements/create"),
|
|
4285
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("document/elements/delete"),
|
|
4286
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("document/elements/move"),
|
|
4287
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("document/elements/copy"),
|
|
4288
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("document/elements/paste"),
|
|
4289
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("editor/documents/attach-preview"),
|
|
4290
|
+
(0, import_editor_v1_adapters16.commandEndEvent)("editor/documents/switch")
|
|
4252
4291
|
],
|
|
4253
4292
|
updateDocumentStructure
|
|
4254
4293
|
);
|
|
@@ -4351,7 +4390,7 @@ var initDynamicTagsResource = (reg) => {
|
|
|
4351
4390
|
};
|
|
4352
4391
|
|
|
4353
4392
|
// src/mcp/resources/editor-state-resource.ts
|
|
4354
|
-
var
|
|
4393
|
+
var import_editor_v1_adapters17 = require("@elementor/editor-v1-adapters");
|
|
4355
4394
|
var CURRENTLY_VIEWED_SCREEN = "The user is currently viewing the Elementor editor";
|
|
4356
4395
|
var PAGE_CONTENT_CHARACTER_LIMIT = 500;
|
|
4357
4396
|
var PREVIEW_TEXT_NODE_MIN_LENGTH = 2;
|
|
@@ -4372,8 +4411,8 @@ var initEditorStateResource = (reg) => {
|
|
|
4372
4411
|
lastSerializedState = serialized;
|
|
4373
4412
|
sendResourceUpdated({ uri: EDITOR_STATE_URI });
|
|
4374
4413
|
};
|
|
4375
|
-
(0,
|
|
4376
|
-
[(0,
|
|
4414
|
+
(0, import_editor_v1_adapters17.__privateListenTo)(
|
|
4415
|
+
[(0, import_editor_v1_adapters17.commandEndEvent)("editor/documents/switch"), (0, import_editor_v1_adapters17.commandEndEvent)("editor/documents/attach-preview")],
|
|
4377
4416
|
notifyIfChanged
|
|
4378
4417
|
);
|
|
4379
4418
|
lastSerializedState = JSON.stringify(buildState());
|
|
@@ -4447,7 +4486,7 @@ function getPageTitle() {
|
|
|
4447
4486
|
}
|
|
4448
4487
|
|
|
4449
4488
|
// src/mcp/resources/general-context-resource.ts
|
|
4450
|
-
var
|
|
4489
|
+
var import_editor_v1_adapters18 = require("@elementor/editor-v1-adapters");
|
|
4451
4490
|
var GENERAL_CONTEXT_URI = "elementor://context/general";
|
|
4452
4491
|
var initGeneralContextResource = (reg) => {
|
|
4453
4492
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4508,11 +4547,11 @@ var initGeneralContextResource = (reg) => {
|
|
|
4508
4547
|
};
|
|
4509
4548
|
}
|
|
4510
4549
|
);
|
|
4511
|
-
(0,
|
|
4550
|
+
(0, import_editor_v1_adapters18.__privateListenTo)(
|
|
4512
4551
|
[
|
|
4513
|
-
(0,
|
|
4514
|
-
(0,
|
|
4515
|
-
(0,
|
|
4552
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("editor/documents/switch"),
|
|
4553
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("editor/documents/attach-preview"),
|
|
4554
|
+
(0, import_editor_v1_adapters18.commandEndEvent)("document/elements/settings")
|
|
4516
4555
|
],
|
|
4517
4556
|
pushUpdateIfChanged
|
|
4518
4557
|
);
|
|
@@ -4521,7 +4560,7 @@ var initGeneralContextResource = (reg) => {
|
|
|
4521
4560
|
|
|
4522
4561
|
// src/mcp/resources/selected-element-resource.ts
|
|
4523
4562
|
var import_editor_elements10 = require("@elementor/editor-elements");
|
|
4524
|
-
var
|
|
4563
|
+
var import_editor_v1_adapters19 = require("@elementor/editor-v1-adapters");
|
|
4525
4564
|
var SELECTED_ELEMENT_URI = "elementor://context/selected-element";
|
|
4526
4565
|
var initSelectedElementResource = (reg) => {
|
|
4527
4566
|
const { resource, sendResourceUpdated } = reg;
|
|
@@ -4552,11 +4591,11 @@ var initSelectedElementResource = (reg) => {
|
|
|
4552
4591
|
}
|
|
4553
4592
|
publishIfChanged(readSelectionFromEditor());
|
|
4554
4593
|
};
|
|
4555
|
-
(0,
|
|
4594
|
+
(0, import_editor_v1_adapters19.__privateListenTo)(
|
|
4556
4595
|
[
|
|
4557
|
-
(0,
|
|
4558
|
-
(0,
|
|
4559
|
-
(0,
|
|
4596
|
+
(0, import_editor_v1_adapters19.commandEndEvent)("document/elements/select"),
|
|
4597
|
+
(0, import_editor_v1_adapters19.commandEndEvent)("document/elements/deselect-all"),
|
|
4598
|
+
(0, import_editor_v1_adapters19.commandEndEvent)("document/elements/settings")
|
|
4560
4599
|
],
|
|
4561
4600
|
onCommand
|
|
4562
4601
|
);
|
|
@@ -4674,7 +4713,7 @@ var import_editor_props7 = require("@elementor/editor-props");
|
|
|
4674
4713
|
var import_editor_elements12 = require("@elementor/editor-elements");
|
|
4675
4714
|
var import_editor_props6 = require("@elementor/editor-props");
|
|
4676
4715
|
var import_editor_styles4 = require("@elementor/editor-styles");
|
|
4677
|
-
var
|
|
4716
|
+
var import_editor_v1_adapters21 = require("@elementor/editor-v1-adapters");
|
|
4678
4717
|
|
|
4679
4718
|
// src/mcp/utils/merge-custom-css.ts
|
|
4680
4719
|
var CUSTOM_CSS_SEPARATOR = "\n";
|
|
@@ -4743,11 +4782,11 @@ function resolveCanonicalPropKeys(elementType, props) {
|
|
|
4743
4782
|
}
|
|
4744
4783
|
|
|
4745
4784
|
// src/mcp/utils/resolve-dynamic-tag.ts
|
|
4746
|
-
var
|
|
4785
|
+
var import_editor_v1_adapters20 = require("@elementor/editor-v1-adapters");
|
|
4747
4786
|
var DYNAMIC_PROP_TYPE_KEY = "dynamic";
|
|
4748
4787
|
var OMITTED_DYNAMIC_SETTING_KEYS = ["fallback"];
|
|
4749
4788
|
var getAtomicDynamicTags = () => {
|
|
4750
|
-
const config = (0,
|
|
4789
|
+
const config = (0, import_editor_v1_adapters20.getElementorConfig)();
|
|
4751
4790
|
return config.atomicDynamicTags?.tags ?? {};
|
|
4752
4791
|
};
|
|
4753
4792
|
var getDynamicTagNamesByCategories = (categories) => {
|
|
@@ -4948,13 +4987,51 @@ Expected Schema: ${jsonSchema}`
|
|
|
4948
4987
|
},
|
|
4949
4988
|
withHistory: false
|
|
4950
4989
|
});
|
|
4951
|
-
(0,
|
|
4990
|
+
(0, import_editor_v1_adapters21.__privateRunCommandSync)("document/save/set-is-modified", { status: true }, { internal: true });
|
|
4952
4991
|
};
|
|
4953
4992
|
|
|
4954
4993
|
// src/mcp/tools/configure-element/prompt.ts
|
|
4955
4994
|
var import_editor_mcp2 = require("@elementor/editor-mcp");
|
|
4995
|
+
var ICONS_SECTION = `# Icons (the \`svg\` property on e-svg)
|
|
4996
|
+
The \`svg\` property accepts two variants. Prefer a library icon for iconography (carts, arrows, social marks, check marks) \u2014 it needs no upload and inherits \`color\` via \`currentColor\`. Use an uploaded file only for custom artwork such as a brand logo.
|
|
4997
|
+
|
|
4998
|
+
Resolve the icon with the \`find-icons\` tool FIRST, then copy its \`value\` and \`library\` verbatim. Never assemble those strings yourself: Font Awesome renamed many icons between major versions (\`shopping-cart\` became \`cart-shopping\`), so a plausible guess renders nothing. \`find-icons\` matches on names, aliases, human search terms, and categories, so describe the intent \u2014 "add to cart" finds \`cart-shopping\`. It takes a batch of \`queries\`, so resolve every icon you need in one call.
|
|
4999
|
+
|
|
5000
|
+
Library icon (note the nested PropValues \u2014 \`value\` and \`library\` are each a \`string\` PropValue):
|
|
5001
|
+
{ "$$type": "icon", "value": { "value": { "$$type": "string", "value": "fa-solid fa-cart-shopping" }, "library": { "$$type": "string", "value": "fa-solid" } } }
|
|
5002
|
+
|
|
5003
|
+
Uploaded SVG file:
|
|
5004
|
+
{ "$$type": "svg-src", "value": { "id": { "$$type": "image-attachment-id", "value": 123 } } }
|
|
5005
|
+
|
|
5006
|
+
Size and colour an e-svg through \`style\` (\`width\`, \`height\`, \`color\`), never through \`propertiesToChange\`.
|
|
5007
|
+
`;
|
|
5008
|
+
var ICON_EXAMPLE = `
|
|
5009
|
+
Setting a Font Awesome icon on an e-svg, after resolving it with \`find-icons\`:
|
|
5010
|
+
|
|
5011
|
+
\`\`\`json
|
|
5012
|
+
{
|
|
5013
|
+
propertiesToChange: {
|
|
5014
|
+
svg: {
|
|
5015
|
+
$$type: 'icon',
|
|
5016
|
+
value: {
|
|
5017
|
+
value: { $$type: 'string', value: 'fa-solid fa-cart-shopping' },
|
|
5018
|
+
library: { $$type: 'string', value: 'fa-solid' }
|
|
5019
|
+
}
|
|
5020
|
+
}
|
|
5021
|
+
},
|
|
5022
|
+
style: {
|
|
5023
|
+
'width': '1.25rem',
|
|
5024
|
+
'height': '1.25rem',
|
|
5025
|
+
'color': '#1a1a1a'
|
|
5026
|
+
},
|
|
5027
|
+
elementId: 'element-id',
|
|
5028
|
+
elementType: 'e-svg'
|
|
5029
|
+
};
|
|
5030
|
+
\`\`\`
|
|
5031
|
+
`;
|
|
4956
5032
|
var CONFIGURE_ELEMENT_GUIDE_URI = "elementor://canvas/tools/configure-element-guide";
|
|
4957
5033
|
var generatePrompt = () => {
|
|
5034
|
+
const iconLibraryActive = isIconLibraryActive();
|
|
4958
5035
|
const configureElementToolPrompt = (0, import_editor_mcp2.toolPrompts)("configure-element");
|
|
4959
5036
|
configureElementToolPrompt.description(`
|
|
4960
5037
|
Configure an existing element on the page.
|
|
@@ -5012,7 +5089,8 @@ Put the dynamic object EXACTLY at the node whose schema offers the "dynamic" var
|
|
|
5012
5089
|
}
|
|
5013
5090
|
Image example: { "$$type": "image", "value": { "src": { "$$type": "dynamic", "value": { "name": "<image tag>", "settings": { ... } } } } }
|
|
5014
5091
|
Do NOT send "group" (it is resolved automatically). Use { "settings": {} } only when the tag has no settings.
|
|
5015
|
-
|
|
5092
|
+
|
|
5093
|
+
${iconLibraryActive ? ICONS_SECTION : ""}`);
|
|
5016
5094
|
configureElementToolPrompt.parameter("elementId", "The ID of the element to configure. MANDATORY.");
|
|
5017
5095
|
configureElementToolPrompt.parameter(
|
|
5018
5096
|
"elementType",
|
|
@@ -5049,6 +5127,9 @@ Do NOT send "group" (it is resolved automatically). Use { "settings": {} } only
|
|
|
5049
5127
|
};
|
|
5050
5128
|
\`\`\`
|
|
5051
5129
|
`);
|
|
5130
|
+
if (iconLibraryActive) {
|
|
5131
|
+
configureElementToolPrompt.example(ICON_EXAMPLE);
|
|
5132
|
+
}
|
|
5052
5133
|
configureElementToolPrompt.instruction(
|
|
5053
5134
|
"The $$type property is MANDATORY for every value in propertiesToChange; it is not used in the style parameter (raw CSS only)."
|
|
5054
5135
|
);
|
|
@@ -5222,8 +5303,7 @@ Provide styling as raw CSS via the "style" parameter (a flat map of CSS property
|
|
|
5222
5303
|
}`;
|
|
5223
5304
|
}
|
|
5224
5305
|
|
|
5225
|
-
// src/mcp/tools/
|
|
5226
|
-
var import_editor_documents2 = require("@elementor/editor-documents");
|
|
5306
|
+
// src/mcp/tools/find-icons/tool.ts
|
|
5227
5307
|
var import_http_client7 = require("@elementor/http-client");
|
|
5228
5308
|
var import_schema3 = require("@elementor/schema");
|
|
5229
5309
|
|
|
@@ -5242,24 +5322,137 @@ function getMcpErrorMessage(error, toolName) {
|
|
|
5242
5322
|
return `${toolName} failed with an unknown error.`;
|
|
5243
5323
|
}
|
|
5244
5324
|
|
|
5245
|
-
// src/mcp/tools/
|
|
5325
|
+
// src/mcp/tools/find-icons/prompt.ts
|
|
5326
|
+
var import_editor_mcp4 = require("@elementor/editor-mcp");
|
|
5327
|
+
var findIconsToolPrompt = (0, import_editor_mcp4.toolPrompts)("find-icons");
|
|
5328
|
+
findIconsToolPrompt.description(
|
|
5329
|
+
"Finds icons for the `svg` property of an `e-svg` element, across Font Awesome and any icon packs uploaded to this site. Returns the exact `value` and `library` pair to write - never assemble those strings yourself, and never guess an icon name. Call this before placing or configuring an `e-svg`. Nothing has to be uploaded to the Media Library for an icon to work."
|
|
5330
|
+
);
|
|
5331
|
+
findIconsToolPrompt.instruction(
|
|
5332
|
+
'Call it when the user names an icon ("use the cart-shopping icon") and take the first exact `name` match, and also when the user describes a page and you decide icons belong in it ("create a product page") - in that case pass one query per icon you intend to place, in a single call.'
|
|
5333
|
+
);
|
|
5334
|
+
findIconsToolPrompt.instruction(
|
|
5335
|
+
'Write queries the way a person would describe the icon ("shopping cart", "credit card", "phone"). Icons are matched on their name, aliases, Font Awesome search terms and category, so plain language works better than guessed icon names.'
|
|
5336
|
+
);
|
|
5337
|
+
findIconsToolPrompt.instruction(
|
|
5338
|
+
'Results are ordered best first; `matched_on: "name"` is a stronger signal than `matched_on: "term"`. Check each result\'s `license` and only use `free` icons; skip any `pro` entry. Prefer `fa-solid` for UI iconography and keep one style across a page; brand marks only exist in `fa-brands`. An empty `matches` array means no match was found: broaden the phrase instead of inventing a value.'
|
|
5339
|
+
);
|
|
5340
|
+
findIconsToolPrompt.instruction(
|
|
5341
|
+
'Pass the chosen pair to `configure-element` as the `svg` property: { "$$type": "icon", "value": { "value": { "$$type": "string", "value": "fa-solid fa-cart-shopping" }, "library": { "$$type": "string", "value": "fa-solid" } } }. An `e-svg` has no colour or size of its own, so set `width`, `height` and `color` in the same `configure-element` call.'
|
|
5342
|
+
);
|
|
5343
|
+
findIconsToolPrompt.example(`Icon named by the user:
|
|
5344
|
+
{ "queries": ["cart-shopping"] }`);
|
|
5345
|
+
findIconsToolPrompt.example(`Every icon a product page needs, in one call:
|
|
5346
|
+
{ "queries": ["add to cart", "free shipping", "secure payment", "instagram"] }`);
|
|
5347
|
+
findIconsToolPrompt.example(`Browse a category, one style only:
|
|
5348
|
+
{ "category": "shopping", "library": "fa-solid", "perPage": 25 }`);
|
|
5349
|
+
|
|
5350
|
+
// src/mcp/tools/find-icons/tool.ts
|
|
5246
5351
|
var MCP_PROXY_URL5 = "elementor/v1/mcp-proxy";
|
|
5352
|
+
var MAX_QUERIES = 10;
|
|
5353
|
+
var MAX_PER_PAGE = 25;
|
|
5354
|
+
var initFindIconsTool = (reg) => {
|
|
5355
|
+
const { addTool } = reg;
|
|
5356
|
+
addTool({
|
|
5357
|
+
name: "find-icons",
|
|
5358
|
+
description: findIconsToolPrompt.prompt(),
|
|
5359
|
+
schema: {
|
|
5360
|
+
queries: import_schema3.z.array(import_schema3.z.string()).max(MAX_QUERIES).optional().describe(
|
|
5361
|
+
'One plain-language phrase per icon you need, for example ["add to cart", "free shipping"]. Batch every icon a page needs into a single call.'
|
|
5362
|
+
),
|
|
5363
|
+
library: import_schema3.z.string().optional().describe(
|
|
5364
|
+
'Restrict results to one library key reported in "libraries", for example "fa-solid". Omit to search every library installed on the site.'
|
|
5365
|
+
),
|
|
5366
|
+
category: import_schema3.z.string().optional().describe(
|
|
5367
|
+
'Restrict results to one Font Awesome category reported in "categories", for example "shopping". May be used without a query to browse that category.'
|
|
5368
|
+
),
|
|
5369
|
+
page: import_schema3.z.number().int().min(1).optional(),
|
|
5370
|
+
perPage: import_schema3.z.number().int().min(1).max(MAX_PER_PAGE).optional()
|
|
5371
|
+
},
|
|
5372
|
+
outputSchema: {
|
|
5373
|
+
results: import_schema3.z.array(
|
|
5374
|
+
import_schema3.z.object({
|
|
5375
|
+
query: import_schema3.z.string(),
|
|
5376
|
+
matches: import_schema3.z.array(
|
|
5377
|
+
import_schema3.z.object({
|
|
5378
|
+
value: import_schema3.z.string(),
|
|
5379
|
+
library: import_schema3.z.string(),
|
|
5380
|
+
name: import_schema3.z.string(),
|
|
5381
|
+
label: import_schema3.z.string(),
|
|
5382
|
+
matched_on: import_schema3.z.enum(["name", "alias", "term", "category", "library"]),
|
|
5383
|
+
license: import_schema3.z.enum(["free", "pro"])
|
|
5384
|
+
})
|
|
5385
|
+
),
|
|
5386
|
+
total: import_schema3.z.number(),
|
|
5387
|
+
page: import_schema3.z.number(),
|
|
5388
|
+
per_page: import_schema3.z.number(),
|
|
5389
|
+
truncated: import_schema3.z.boolean()
|
|
5390
|
+
})
|
|
5391
|
+
).describe(
|
|
5392
|
+
'One entry per query, each with ranked "matches". Every match carries the "value" and "library" pair to write on the e-svg icon prop, plus "matched_on" and "license".'
|
|
5393
|
+
),
|
|
5394
|
+
libraries: import_schema3.z.array(import_schema3.z.string()).optional().describe(
|
|
5395
|
+
"Icon library keys installed on this site. Only sent when nothing matched or when browsing."
|
|
5396
|
+
),
|
|
5397
|
+
customLibraries: import_schema3.z.record(import_schema3.z.string(), import_schema3.z.string()).optional().describe(
|
|
5398
|
+
"Custom (uploaded) icon libraries keyed by library. Only sent when nothing matched or when browsing."
|
|
5399
|
+
),
|
|
5400
|
+
categories: import_schema3.z.array(import_schema3.z.string()).optional().describe(
|
|
5401
|
+
'Icon categories for the "category" filter. Only sent when nothing matched or when browsing.'
|
|
5402
|
+
),
|
|
5403
|
+
truncatedCustomLibraries: import_schema3.z.array(import_schema3.z.string()).optional().describe("Custom libraries with more than 250 icons; only their first 250 icons are searchable."),
|
|
5404
|
+
fontAwesomeVersion: import_schema3.z.string().nullable().describe("Font Awesome version the site renders icons from."),
|
|
5405
|
+
llmInstructions: import_schema3.z.string().optional().describe("Present only when nothing matched, explaining what to do next.")
|
|
5406
|
+
},
|
|
5407
|
+
handler: async ({ queries, library, category, page, perPage }) => {
|
|
5408
|
+
try {
|
|
5409
|
+
const { data } = await (0, import_http_client7.httpService)().post(MCP_PROXY_URL5, {
|
|
5410
|
+
tool: "find-icons",
|
|
5411
|
+
input: {
|
|
5412
|
+
...queries ? { queries } : {},
|
|
5413
|
+
...library ? { library } : {},
|
|
5414
|
+
...category ? { category } : {},
|
|
5415
|
+
...page ? { page } : {},
|
|
5416
|
+
...perPage ? { per_page: perPage } : {}
|
|
5417
|
+
}
|
|
5418
|
+
});
|
|
5419
|
+
return {
|
|
5420
|
+
results: data.data.results,
|
|
5421
|
+
...data.data.libraries ? { libraries: data.data.libraries } : {},
|
|
5422
|
+
...data.data.custom_libraries ? { customLibraries: data.data.custom_libraries } : {},
|
|
5423
|
+
...data.data.categories ? { categories: data.data.categories } : {},
|
|
5424
|
+
...data.data.truncated_custom_libraries ? { truncatedCustomLibraries: data.data.truncated_custom_libraries } : {},
|
|
5425
|
+
fontAwesomeVersion: data.data.font_awesome_version,
|
|
5426
|
+
...data.data.llm_instructions ? { llmInstructions: data.data.llm_instructions } : {}
|
|
5427
|
+
};
|
|
5428
|
+
} catch (error) {
|
|
5429
|
+
throw new Error(getMcpErrorMessage(error, "find-icons"));
|
|
5430
|
+
}
|
|
5431
|
+
}
|
|
5432
|
+
});
|
|
5433
|
+
};
|
|
5434
|
+
|
|
5435
|
+
// src/mcp/tools/get-page-structure/tool.ts
|
|
5436
|
+
var import_editor_documents2 = require("@elementor/editor-documents");
|
|
5437
|
+
var import_http_client8 = require("@elementor/http-client");
|
|
5438
|
+
var import_schema4 = require("@elementor/schema");
|
|
5439
|
+
var MCP_PROXY_URL6 = "elementor/v1/mcp-proxy";
|
|
5247
5440
|
var initGetPageStructureTool = (reg) => {
|
|
5248
5441
|
const { addTool } = reg;
|
|
5249
5442
|
addTool({
|
|
5250
5443
|
name: "get-page-structure",
|
|
5251
5444
|
description: "Returns a lean Elementor element tree skeleton (id, elType, widgetType, title, nested elements) for a post or page. If no postId is provided, uses the currently open document. Optionally scope to a subtree with elementId. Set includeContent=true (requires elementId) to also return each node's settings and styles.",
|
|
5252
5445
|
schema: {
|
|
5253
|
-
postId:
|
|
5446
|
+
postId: import_schema4.z.number().optional().describe(
|
|
5254
5447
|
"WordPress post ID of the Elementor document. If omitted, uses the currently open document."
|
|
5255
5448
|
),
|
|
5256
|
-
elementId:
|
|
5257
|
-
includeContent:
|
|
5449
|
+
elementId: import_schema4.z.string().optional().describe("If provided, returns only the subtree rooted at that element id."),
|
|
5450
|
+
includeContent: import_schema4.z.boolean().optional().describe(
|
|
5258
5451
|
"If true, includes each node's settings and styles (same shape build-composition accepts as input). Requires elementId."
|
|
5259
5452
|
)
|
|
5260
5453
|
},
|
|
5261
5454
|
outputSchema: {
|
|
5262
|
-
elements:
|
|
5455
|
+
elements: import_schema4.z.array(import_schema4.z.any()).describe(
|
|
5263
5456
|
"Skeleton of Elementor elements (id, elType, widgetType, title, nested elements). When includeContent is true, each node also includes settings and styles."
|
|
5264
5457
|
)
|
|
5265
5458
|
},
|
|
@@ -5269,7 +5462,7 @@ var initGetPageStructureTool = (reg) => {
|
|
|
5269
5462
|
throw new Error("No post ID provided and no active document found.");
|
|
5270
5463
|
}
|
|
5271
5464
|
try {
|
|
5272
|
-
const { data } = await (0,
|
|
5465
|
+
const { data } = await (0, import_http_client8.httpService)().post(MCP_PROXY_URL6, {
|
|
5273
5466
|
tool: "get-page-structure",
|
|
5274
5467
|
input: {
|
|
5275
5468
|
post_id: resolvedPostId,
|
|
@@ -5299,6 +5492,9 @@ var initCanvasMcp = (reg) => {
|
|
|
5299
5492
|
initGeneralContextResource(reg);
|
|
5300
5493
|
initBestPracticesResource(reg);
|
|
5301
5494
|
initConfigureElementTool(reg);
|
|
5495
|
+
if (isIconLibraryActive()) {
|
|
5496
|
+
initFindIconsTool(reg);
|
|
5497
|
+
}
|
|
5302
5498
|
initGetPageStructureTool(reg);
|
|
5303
5499
|
initBreakpointsResource(reg);
|
|
5304
5500
|
};
|
|
@@ -5402,14 +5598,14 @@ Note: The "size" property controls image resolution/loading, not visual size. Se
|
|
|
5402
5598
|
// src/prevent-link-in-link-commands.ts
|
|
5403
5599
|
var import_editor_elements14 = require("@elementor/editor-elements");
|
|
5404
5600
|
var import_editor_notifications3 = require("@elementor/editor-notifications");
|
|
5405
|
-
var
|
|
5601
|
+
var import_editor_v1_adapters22 = require("@elementor/editor-v1-adapters");
|
|
5406
5602
|
var import_i18n4 = require("@wordpress/i18n");
|
|
5407
5603
|
function initLinkInLinkPrevention() {
|
|
5408
|
-
(0,
|
|
5604
|
+
(0, import_editor_v1_adapters22.blockCommand)({
|
|
5409
5605
|
command: "document/elements/paste",
|
|
5410
5606
|
condition: blockLinkInLinkPaste
|
|
5411
5607
|
});
|
|
5412
|
-
(0,
|
|
5608
|
+
(0, import_editor_v1_adapters22.blockCommand)({
|
|
5413
5609
|
command: "document/elements/move",
|
|
5414
5610
|
condition: blockLinkInLinkMove
|
|
5415
5611
|
});
|
|
@@ -5485,7 +5681,7 @@ function shouldBlock(sourceElements, targetElements) {
|
|
|
5485
5681
|
// src/style-commands/paste-style.ts
|
|
5486
5682
|
var import_editor_elements17 = require("@elementor/editor-elements");
|
|
5487
5683
|
var import_editor_props10 = require("@elementor/editor-props");
|
|
5488
|
-
var
|
|
5684
|
+
var import_editor_v1_adapters24 = require("@elementor/editor-v1-adapters");
|
|
5489
5685
|
|
|
5490
5686
|
// src/utils/command-utils.ts
|
|
5491
5687
|
var import_editor_elements15 = require("@elementor/editor-elements");
|
|
@@ -5532,9 +5728,9 @@ function getTitleForContainers(containers) {
|
|
|
5532
5728
|
// src/style-commands/undoable-actions/paste-element-style.ts
|
|
5533
5729
|
var import_editor_elements16 = require("@elementor/editor-elements");
|
|
5534
5730
|
var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
|
|
5535
|
-
var
|
|
5731
|
+
var import_editor_v1_adapters23 = require("@elementor/editor-v1-adapters");
|
|
5536
5732
|
var import_i18n6 = require("@wordpress/i18n");
|
|
5537
|
-
var undoablePasteElementStyle = () => (0,
|
|
5733
|
+
var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
|
|
5538
5734
|
{
|
|
5539
5735
|
do: ({ containers, newStyle }) => {
|
|
5540
5736
|
return containers.map((container) => {
|
|
@@ -5610,12 +5806,12 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters22.undoable)(
|
|
|
5610
5806
|
// src/style-commands/paste-style.ts
|
|
5611
5807
|
function initPasteStyleCommand() {
|
|
5612
5808
|
const pasteElementStyleCommand = undoablePasteElementStyle();
|
|
5613
|
-
(0,
|
|
5809
|
+
(0, import_editor_v1_adapters24.blockCommand)({
|
|
5614
5810
|
command: "document/elements/paste-style",
|
|
5615
5811
|
condition: hasAtomicWidgets
|
|
5616
5812
|
});
|
|
5617
|
-
(0,
|
|
5618
|
-
(0,
|
|
5813
|
+
(0, import_editor_v1_adapters24.__privateListenTo)(
|
|
5814
|
+
(0, import_editor_v1_adapters24.commandStartEvent)("document/elements/paste-style"),
|
|
5619
5815
|
(e) => pasteStyles(e.args, pasteElementStyleCommand)
|
|
5620
5816
|
);
|
|
5621
5817
|
}
|
|
@@ -5666,14 +5862,14 @@ function pasteClasses(containers, classes) {
|
|
|
5666
5862
|
}
|
|
5667
5863
|
|
|
5668
5864
|
// src/style-commands/reset-style.ts
|
|
5669
|
-
var
|
|
5865
|
+
var import_editor_v1_adapters26 = require("@elementor/editor-v1-adapters");
|
|
5670
5866
|
|
|
5671
5867
|
// src/style-commands/undoable-actions/reset-element-style.ts
|
|
5672
5868
|
var import_editor_elements18 = require("@elementor/editor-elements");
|
|
5673
5869
|
var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
|
|
5674
|
-
var
|
|
5870
|
+
var import_editor_v1_adapters25 = require("@elementor/editor-v1-adapters");
|
|
5675
5871
|
var import_i18n7 = require("@wordpress/i18n");
|
|
5676
|
-
var undoableResetElementStyle = () => (0,
|
|
5872
|
+
var undoableResetElementStyle = () => (0, import_editor_v1_adapters25.undoable)(
|
|
5677
5873
|
{
|
|
5678
5874
|
do: ({ containers }) => {
|
|
5679
5875
|
return containers.map((container) => {
|
|
@@ -5717,12 +5913,12 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters24.undoable)(
|
|
|
5717
5913
|
// src/style-commands/reset-style.ts
|
|
5718
5914
|
function initResetStyleCommand() {
|
|
5719
5915
|
const resetElementStyles = undoableResetElementStyle();
|
|
5720
|
-
(0,
|
|
5916
|
+
(0, import_editor_v1_adapters26.blockCommand)({
|
|
5721
5917
|
command: "document/elements/reset-style",
|
|
5722
5918
|
condition: hasAtomicWidgets
|
|
5723
5919
|
});
|
|
5724
|
-
(0,
|
|
5725
|
-
(0,
|
|
5920
|
+
(0, import_editor_v1_adapters26.__privateListenTo)(
|
|
5921
|
+
(0, import_editor_v1_adapters26.commandStartEvent)("document/elements/reset-style"),
|
|
5726
5922
|
(e) => resetStyles(e.args, resetElementStyles)
|
|
5727
5923
|
);
|
|
5728
5924
|
}
|
|
@@ -5768,7 +5964,7 @@ function init() {
|
|
|
5768
5964
|
component: ClassesRename
|
|
5769
5965
|
});
|
|
5770
5966
|
initCanvasMcp(
|
|
5771
|
-
(0,
|
|
5967
|
+
(0, import_editor_mcp5.getMCPByDomain)("canvas", {
|
|
5772
5968
|
instructions: `Everything related to V4 ( Atomic ) canvas.
|
|
5773
5969
|
# Canvas workflow
|
|
5774
5970
|
- Configure element settings and styles with configure-element
|
|
@@ -5871,9 +6067,9 @@ function getRectClipPath(rect, viewport) {
|
|
|
5871
6067
|
}
|
|
5872
6068
|
|
|
5873
6069
|
// src/hooks/use-canvas-document.ts
|
|
5874
|
-
var
|
|
6070
|
+
var import_editor_v1_adapters27 = require("@elementor/editor-v1-adapters");
|
|
5875
6071
|
function useCanvasDocument() {
|
|
5876
|
-
return (0,
|
|
6072
|
+
return (0, import_editor_v1_adapters27.__privateUseListenTo)((0, import_editor_v1_adapters27.commandEndEvent)("editor/documents/attach-preview"), () => (0, import_editor_v1_adapters27.getCanvasIframeDocument)());
|
|
5877
6073
|
}
|
|
5878
6074
|
|
|
5879
6075
|
// src/hooks/use-escape-on-canvas.ts
|