@elementor/editor-canvas 4.2.0-938 → 4.2.0-940

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1443,7 +1443,7 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
1443
1443
  Object.entries(schema2).map(async ([key, type]) => {
1444
1444
  const value = props[key] ?? type.default;
1445
1445
  const transformed = await transform({ value, key, type, signal, renderContext });
1446
- onPropResolve?.({ key, value: transformed });
1446
+ onPropResolve?.({ key, value: transformed, propValue: value, propType: type });
1447
1447
  if (isMultiProps(transformed)) {
1448
1448
  return getMultiPropsValue(transformed);
1449
1449
  }
@@ -1513,6 +1513,27 @@ function createPropsResolver({ transformers, schema: initialSchema, onPropResolv
1513
1513
  return resolve;
1514
1514
  }
1515
1515
 
1516
+ // src/renderers/enqueue-font-from-style-prop.ts
1517
+ var import_editor_props4 = require("@elementor/editor-props");
1518
+ var maybeEnqueueFontFromStyleProp = (propType, propValue, enqueue) => {
1519
+ if (!(0, import_editor_props4.isTransformable)(propValue) || propValue.disabled) {
1520
+ return;
1521
+ }
1522
+ const typeKey = propType.kind === "union" ? propValue.$$type : propType.key;
1523
+ const propTypeUtil = (0, import_editor_props4.getPropSchemaFromCache)(typeKey);
1524
+ if (!propTypeUtil || !("getEnqueueFontFamily" in propTypeUtil) || typeof propTypeUtil.getEnqueueFontFamily !== "function") {
1525
+ return;
1526
+ }
1527
+ const stored = propValue.value;
1528
+ if (typeof stored !== "string") {
1529
+ return;
1530
+ }
1531
+ const font = propTypeUtil.getEnqueueFontFamily(stored);
1532
+ if (font) {
1533
+ enqueue(font);
1534
+ }
1535
+ };
1536
+
1516
1537
  // src/transformers/create-transformers-registry.ts
1517
1538
  function createTransformersRegistry() {
1518
1539
  const transformers = {};
@@ -1545,11 +1566,8 @@ function useStylePropResolver() {
1545
1566
  return createPropsResolver({
1546
1567
  transformers: styleTransformersRegistry,
1547
1568
  schema: (0, import_editor_styles.getStylesSchema)(),
1548
- onPropResolve: ({ key, value }) => {
1549
- if (key !== "font-family" || typeof value !== "string") {
1550
- return;
1551
- }
1552
- (0, import_editor_v1_adapters8.enqueueFont)(value);
1569
+ onPropResolve: ({ propValue, propType }) => {
1570
+ maybeEnqueueFontFromStyleProp(propType, propValue, import_editor_v1_adapters8.enqueueFont);
1553
1571
  }
1554
1572
  });
1555
1573
  }, []);
@@ -2477,6 +2495,18 @@ var flexTransformer = createTransformer((value) => {
2477
2495
  return null;
2478
2496
  });
2479
2497
 
2498
+ // src/transformers/styles/font-family-transformer.ts
2499
+ var fontFamilyTransformer = createTransformer((value) => {
2500
+ if (typeof value !== "string" || !value.trim()) {
2501
+ return null;
2502
+ }
2503
+ const trimmed = value.trim();
2504
+ if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
2505
+ return trimmed;
2506
+ }
2507
+ return `"${trimmed}"`;
2508
+ });
2509
+
2480
2510
  // src/transformers/styles/grid-track-renderer.ts
2481
2511
  var GRID_TRACK_PROPERTIES = /* @__PURE__ */ new Set(["grid-template-columns", "grid-template-rows"]);
2482
2512
  var isGridTrackProperty = (cssProperty) => GRID_TRACK_PROPERTIES.has(cssProperty);
@@ -2628,7 +2658,7 @@ var mapToTransitionString = (value, allowedProperties) => {
2628
2658
 
2629
2659
  // src/init-style-transformers.ts
2630
2660
  function initStyleTransformers() {
2631
- styleTransformersRegistry.register("size", sizeTransformer).register("grid-track-size", gridTrackSizeTransformer).register("shadow", shadowTransformer).register("stroke", strokeTransformer).register(
2661
+ styleTransformersRegistry.register("font-family", fontFamilyTransformer).register("size", sizeTransformer).register("grid-track-size", gridTrackSizeTransformer).register("shadow", shadowTransformer).register("stroke", strokeTransformer).register(
2632
2662
  "dimensions",
2633
2663
  createMultiPropsTransformer(
2634
2664
  ["block-start", "block-end", "inline-start", "inline-end"],
@@ -3346,7 +3376,7 @@ var import_client = require("react-dom/client");
3346
3376
  // src/legacy/replacements/inline-editing/inline-editing-elements.tsx
3347
3377
  var React11 = __toESM(require("react"));
3348
3378
  var import_editor_elements9 = require("@elementor/editor-elements");
3349
- var import_editor_props5 = require("@elementor/editor-props");
3379
+ var import_editor_props6 = require("@elementor/editor-props");
3350
3380
  var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
3351
3381
  var import_i18n3 = require("@wordpress/i18n");
3352
3382
 
@@ -3623,11 +3653,11 @@ var InlineEditingToolbar = ({ anchor, editor, id }) => {
3623
3653
  };
3624
3654
 
3625
3655
  // src/legacy/replacements/inline-editing/inline-editing-eligibility.ts
3626
- var import_editor_props4 = require("@elementor/editor-props");
3656
+ var import_editor_props5 = require("@elementor/editor-props");
3627
3657
  var hasKey = (propType) => {
3628
3658
  return "key" in propType;
3629
3659
  };
3630
- var TEXT_PROP_TYPE_KEYS = /* @__PURE__ */ new Set([import_editor_props4.htmlV3PropTypeUtil.key, import_editor_props4.stringPropTypeUtil.key]);
3660
+ var TEXT_PROP_TYPE_KEYS = /* @__PURE__ */ new Set([import_editor_props5.htmlV3PropTypeUtil.key, import_editor_props5.stringPropTypeUtil.key]);
3631
3661
  var isCoreTextPropTypeKey = (key) => {
3632
3662
  return TEXT_PROP_TYPE_KEYS.has(key);
3633
3663
  };
@@ -3647,7 +3677,7 @@ var isInlineEditingAllowed = ({ rawValue, propTypeFromSchema }) => {
3647
3677
  if (rawValue === null || rawValue === void 0) {
3648
3678
  return isAllowedBySchema(propTypeFromSchema);
3649
3679
  }
3650
- return import_editor_props4.htmlV3PropTypeUtil.isValid(rawValue) || import_editor_props4.stringPropTypeUtil.isValid(rawValue);
3680
+ return import_editor_props5.htmlV3PropTypeUtil.isValid(rawValue) || import_editor_props5.stringPropTypeUtil.isValid(rawValue);
3651
3681
  };
3652
3682
 
3653
3683
  // src/legacy/replacements/inline-editing/inline-editing-elements.tsx
@@ -3732,15 +3762,15 @@ var InlineEditingReplacement = class extends ReplacementBase {
3732
3762
  }
3733
3763
  getExtractedContentValue() {
3734
3764
  const propValue = this.getInlineEditablePropValue();
3735
- const extracted = import_editor_props5.htmlV3PropTypeUtil.extract(propValue);
3736
- return import_editor_props5.stringPropTypeUtil.extract(extracted?.content ?? null) ?? "";
3765
+ const extracted = import_editor_props6.htmlV3PropTypeUtil.extract(propValue);
3766
+ return import_editor_props6.stringPropTypeUtil.extract(extracted?.content ?? null) ?? "";
3737
3767
  }
3738
3768
  setContentValue(value) {
3739
3769
  const settingKey = this.getInlineEditablePropertyName();
3740
3770
  const html = value || "";
3741
- const parsed = (0, import_editor_props5.parseHtmlChildren)(html);
3742
- const valueToSave = import_editor_props5.htmlV3PropTypeUtil.create({
3743
- content: parsed.content ? import_editor_props5.stringPropTypeUtil.create(parsed.content) : null,
3771
+ const parsed = (0, import_editor_props6.parseHtmlChildren)(html);
3772
+ const valueToSave = import_editor_props6.htmlV3PropTypeUtil.create({
3773
+ content: parsed.content ? import_editor_props6.stringPropTypeUtil.create(parsed.content) : null,
3744
3774
  children: parsed.children
3745
3775
  });
3746
3776
  (0, import_editor_v1_adapters13.undoable)(
@@ -3771,7 +3801,7 @@ var InlineEditingReplacement = class extends ReplacementBase {
3771
3801
  return null;
3772
3802
  }
3773
3803
  if (propType.kind === "union") {
3774
- const textKeys = [import_editor_props5.htmlV3PropTypeUtil.key, import_editor_props5.stringPropTypeUtil.key];
3804
+ const textKeys = [import_editor_props6.htmlV3PropTypeUtil.key, import_editor_props6.stringPropTypeUtil.key];
3775
3805
  for (const key of textKeys) {
3776
3806
  if (propType.prop_types[key]) {
3777
3807
  return key;
@@ -3800,7 +3830,7 @@ var InlineEditingReplacement = class extends ReplacementBase {
3800
3830
  getExpectedTag() {
3801
3831
  const tagPropType = this.getTagPropType();
3802
3832
  const tagSettingKey = "tag";
3803
- return import_editor_props5.stringPropTypeUtil.extract(this.getSetting(tagSettingKey) ?? null) ?? import_editor_props5.stringPropTypeUtil.extract(tagPropType?.default ?? null) ?? null;
3833
+ return import_editor_props6.stringPropTypeUtil.extract(this.getSetting(tagSettingKey) ?? null) ?? import_editor_props6.stringPropTypeUtil.extract(tagPropType?.default ?? null) ?? null;
3804
3834
  }
3805
3835
  getTagPropType() {
3806
3836
  const propsSchema = (0, import_editor_elements9.getElementType)(this.type)?.propsSchema;
@@ -4027,7 +4057,7 @@ function createNestedTemplatedType(type, renderer, element) {
4027
4057
  }
4028
4058
 
4029
4059
  // src/legacy/tabs-model-extensions.ts
4030
- var import_editor_props6 = require("@elementor/editor-props");
4060
+ var import_editor_props7 = require("@elementor/editor-props");
4031
4061
  var tabModelExtensions = {
4032
4062
  modifyDefaultChildren(elements) {
4033
4063
  if (!Array.isArray(elements) || elements.length === 0) {
@@ -4043,8 +4073,8 @@ var tabModelExtensions = {
4043
4073
  ...paragraphElement,
4044
4074
  settings: {
4045
4075
  ...paragraphElement.settings,
4046
- paragraph: import_editor_props6.htmlV3PropTypeUtil.create({
4047
- content: import_editor_props6.stringPropTypeUtil.create(`Tab ${position}`),
4076
+ paragraph: import_editor_props7.htmlV3PropTypeUtil.create({
4077
+ content: import_editor_props7.stringPropTypeUtil.create(`Tab ${position}`),
4048
4078
  children: []
4049
4079
  })
4050
4080
  }
@@ -4057,7 +4087,7 @@ function initTabsModelExtensions() {
4057
4087
  }
4058
4088
 
4059
4089
  // src/mcp/canvas-mcp.ts
4060
- var import_editor_props11 = require("@elementor/editor-props");
4090
+ var import_editor_props12 = require("@elementor/editor-props");
4061
4091
 
4062
4092
  // src/mcp/resources/available-widgets-resource.ts
4063
4093
  var import_editor_v1_adapters15 = require("@elementor/editor-v1-adapters");
@@ -4198,7 +4228,7 @@ function extractElementData(element) {
4198
4228
  widgetType: model.widgetType || void 0,
4199
4229
  version: resolveElementVersion(element)
4200
4230
  };
4201
- const title = model.title || element.model?.editor_settings?.title;
4231
+ const title = model.title || element.model?.editor_settings?.title || element.model.getTitle?.();
4202
4232
  if (title) {
4203
4233
  result.title = title;
4204
4234
  }
@@ -4209,7 +4239,7 @@ function extractElementData(element) {
4209
4239
  }
4210
4240
 
4211
4241
  // src/mcp/resources/dynamic-tags-resource.ts
4212
- var import_editor_props7 = require("@elementor/editor-props");
4242
+ var import_editor_props8 = require("@elementor/editor-props");
4213
4243
 
4214
4244
  // src/mcp/utils/resolve-dynamic-tag.ts
4215
4245
  var import_editor_v1_adapters17 = require("@elementor/editor-v1-adapters");
@@ -4277,7 +4307,7 @@ var defaultSettingValue = (propType) => {
4277
4307
  var DYNAMIC_TAGS_URI = "elementor://dynamic-tags";
4278
4308
  var settingsSchema = (propsSchema) => {
4279
4309
  return Object.fromEntries(
4280
- Object.entries(propsSchema ?? {}).filter(([key]) => !OMITTED_DYNAMIC_SETTING_KEYS.includes(key)).map(([key, propType]) => [key, import_editor_props7.Schema.propTypeToJsonSchema(propType)])
4310
+ Object.entries(propsSchema ?? {}).filter(([key]) => !OMITTED_DYNAMIC_SETTING_KEYS.includes(key)).map(([key, propType]) => [key, import_editor_props8.Schema.propTypeToJsonSchema(propType)])
4281
4311
  );
4282
4312
  };
4283
4313
  var buildDynamicTagsList = () => {
@@ -4626,14 +4656,14 @@ function getElementDisplayName(container) {
4626
4656
 
4627
4657
  // src/mcp/tools/build-composition/tool.ts
4628
4658
  var import_editor_documents3 = require("@elementor/editor-documents");
4629
- var import_editor_elements15 = require("@elementor/editor-elements");
4659
+ var import_editor_elements16 = require("@elementor/editor-elements");
4630
4660
 
4631
4661
  // src/composition-builder/composition-builder.ts
4632
- var import_editor_elements14 = require("@elementor/editor-elements");
4662
+ var import_editor_elements15 = require("@elementor/editor-elements");
4633
4663
 
4634
4664
  // src/mcp/utils/do-update-element-property.ts
4635
- var import_editor_elements13 = require("@elementor/editor-elements");
4636
- var import_editor_props8 = require("@elementor/editor-props");
4665
+ var import_editor_elements14 = require("@elementor/editor-elements");
4666
+ var import_editor_props9 = require("@elementor/editor-props");
4637
4667
  var import_editor_styles4 = require("@elementor/editor-styles");
4638
4668
  var import_editor_v1_adapters21 = require("@elementor/editor-v1-adapters");
4639
4669
 
@@ -4651,6 +4681,58 @@ var readStoredCustomCssText = (raw) => {
4651
4681
  }
4652
4682
  };
4653
4683
 
4684
+ // src/mcp/utils/resolve-canonical-prop-name.ts
4685
+ var import_editor_elements13 = require("@elementor/editor-elements");
4686
+ function buildAliasToCanonicalMap(schema2) {
4687
+ const aliasToCanonical = {};
4688
+ for (const [canonical, propType] of Object.entries(schema2)) {
4689
+ const aliases = propType.meta?.aliases;
4690
+ if (!Array.isArray(aliases)) {
4691
+ continue;
4692
+ }
4693
+ for (const alias of aliases) {
4694
+ if (typeof alias === "string" && alias) {
4695
+ aliasToCanonical[alias] = canonical;
4696
+ }
4697
+ }
4698
+ }
4699
+ return aliasToCanonical;
4700
+ }
4701
+ function resolveCanonicalPropName(elementType, propertyName) {
4702
+ const schema2 = (0, import_editor_elements13.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
4703
+ if (!schema2 || schema2[propertyName]) {
4704
+ return propertyName;
4705
+ }
4706
+ return buildAliasToCanonicalMap(schema2)[propertyName] ?? propertyName;
4707
+ }
4708
+ function resolveCanonicalPropKeys(elementType, props) {
4709
+ const schema2 = (0, import_editor_elements13.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
4710
+ if (!schema2) {
4711
+ return { ...props };
4712
+ }
4713
+ const aliasToCanonical = buildAliasToCanonicalMap(schema2);
4714
+ const resolved = {};
4715
+ for (const [key, value] of Object.entries(props)) {
4716
+ if (schema2[key]) {
4717
+ resolved[key] = value;
4718
+ }
4719
+ }
4720
+ for (const [key, value] of Object.entries(props)) {
4721
+ if (schema2[key]) {
4722
+ continue;
4723
+ }
4724
+ const canonical = aliasToCanonical[key];
4725
+ if (!canonical) {
4726
+ resolved[key] = value;
4727
+ continue;
4728
+ }
4729
+ if (!Object.prototype.hasOwnProperty.call(resolved, canonical)) {
4730
+ resolved[canonical] = value;
4731
+ }
4732
+ }
4733
+ return resolved;
4734
+ }
4735
+
4654
4736
  // src/mcp/utils/do-update-element-property.ts
4655
4737
  var LOCAL_STYLE_META = {
4656
4738
  breakpoint: "desktop",
@@ -4658,7 +4740,7 @@ var LOCAL_STYLE_META = {
4658
4740
  };
4659
4741
  function resolvePropValue(value, forceKey) {
4660
4742
  const Utils = window.elementorV2.editorVariables.Utils;
4661
- return import_editor_props8.Schema.adjustLlmPropValueSchema(value, {
4743
+ return import_editor_props9.Schema.adjustLlmPropValueSchema(value, {
4662
4744
  forceKey,
4663
4745
  transformers: {
4664
4746
  ...Utils.globalVariablesLLMResolvers,
@@ -4667,9 +4749,10 @@ function resolvePropValue(value, forceKey) {
4667
4749
  });
4668
4750
  }
4669
4751
  var doUpdateElementProperty = (params) => {
4670
- const { elementId, propertyName, propertyValue, elementType, customCssWriteMode = "replace" } = params;
4752
+ const { elementId, propertyValue, elementType, customCssWriteMode = "replace" } = params;
4753
+ const propertyName = params.propertyName === "_styles" ? params.propertyName : resolveCanonicalPropName(elementType, params.propertyName);
4671
4754
  if (propertyName === "_styles") {
4672
- const elementStyles = (0, import_editor_elements13.getElementStyles)(elementId) || {};
4755
+ const elementStyles = (0, import_editor_elements14.getElementStyles)(elementId) || {};
4673
4756
  const propertyMapValue = propertyValue;
4674
4757
  const styleSchema = (0, import_editor_styles4.getStylesSchema)();
4675
4758
  const transformedStyleValues = Object.fromEntries(
@@ -4716,7 +4799,7 @@ var doUpdateElementProperty = (params) => {
4716
4799
  }
4717
4800
  if (propertyRawSchema.kind === "plain") {
4718
4801
  if (typeof propertyMapValue[stylePropName] !== "object") {
4719
- const propUtil = (0, import_editor_props8.getPropSchemaFromCache)(propertyRawSchema.key);
4802
+ const propUtil = (0, import_editor_props9.getPropSchemaFromCache)(propertyRawSchema.key);
4720
4803
  if (propUtil) {
4721
4804
  const plainValue = propUtil.create(propertyMapValue[stylePropName]);
4722
4805
  propertyMapValue[stylePropName] = plainValue;
@@ -4726,7 +4809,7 @@ var doUpdateElementProperty = (params) => {
4726
4809
  });
4727
4810
  delete transformedStyleValues.custom_css;
4728
4811
  if (!localStyle) {
4729
- (0, import_editor_elements13.createElementStyle)({
4812
+ (0, import_editor_elements14.createElementStyle)({
4730
4813
  elementId,
4731
4814
  ...typeof customCss !== "undefined" ? { custom_css: customCss } : {},
4732
4815
  classesProp: "classes",
@@ -4740,7 +4823,7 @@ var doUpdateElementProperty = (params) => {
4740
4823
  }
4741
4824
  });
4742
4825
  } else {
4743
- (0, import_editor_elements13.updateElementStyle)({
4826
+ (0, import_editor_elements14.updateElementStyle)({
4744
4827
  elementId,
4745
4828
  styleId: localStyle.id,
4746
4829
  meta: {
@@ -4755,7 +4838,7 @@ var doUpdateElementProperty = (params) => {
4755
4838
  }
4756
4839
  return;
4757
4840
  }
4758
- const elementPropSchema = (0, import_editor_elements13.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
4841
+ const elementPropSchema = (0, import_editor_elements14.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
4759
4842
  if (!elementPropSchema) {
4760
4843
  throw new Error(`No prop schema found for element type: ${elementType}`);
4761
4844
  }
@@ -4769,7 +4852,7 @@ var doUpdateElementProperty = (params) => {
4769
4852
  }
4770
4853
  const propKey = elementPropSchema[propertyName].key;
4771
4854
  const value = resolvePropValue(propertyValue, propKey);
4772
- const { valid, jsonSchema } = import_editor_props8.Schema.validatePropValue(elementPropSchema[propertyName], propertyValue);
4855
+ const { valid, jsonSchema } = import_editor_props9.Schema.validatePropValue(elementPropSchema[propertyName], propertyValue);
4773
4856
  if (!valid) {
4774
4857
  throw new Error(
4775
4858
  `Invalid PropValue for elementId: ${elementId}. PropKey: ${propKey}, PropValue: ${JSON.stringify(
@@ -4778,7 +4861,7 @@ var doUpdateElementProperty = (params) => {
4778
4861
  Expected Schema: ${jsonSchema}`
4779
4862
  );
4780
4863
  }
4781
- (0, import_editor_elements13.updateElementSettings)({
4864
+ (0, import_editor_elements14.updateElementSettings)({
4782
4865
  id: elementId,
4783
4866
  props: {
4784
4867
  [propertyName]: value
@@ -4836,11 +4919,11 @@ var CompositionBuilder = class _CompositionBuilder {
4836
4919
  elementCustomCSS = {};
4837
4920
  rootContainers = [];
4838
4921
  api = {
4839
- createElement: import_editor_elements14.createElement,
4840
- deleteElement: import_editor_elements14.deleteElement,
4841
- getWidgetsCache: import_editor_elements14.getWidgetsCache,
4842
- generateElementId: import_editor_elements14.generateElementId,
4843
- getContainer: import_editor_elements14.getContainer,
4922
+ createElement: import_editor_elements15.createElement,
4923
+ deleteElement: import_editor_elements15.deleteElement,
4924
+ getWidgetsCache: import_editor_elements15.getWidgetsCache,
4925
+ generateElementId: import_editor_elements15.generateElementId,
4926
+ getContainer: import_editor_elements15.getContainer,
4844
4927
  doUpdateElementProperty
4845
4928
  };
4846
4929
  xml;
@@ -5360,19 +5443,19 @@ var initBuildCompositionsTool = (reg) => {
5360
5443
  const { xmlStructure, elementConfig, stylesConfig } = adaptLeafRootParams({
5361
5444
  ...rawParams,
5362
5445
  stylesConfig: convertedStyles,
5363
- widgetsCache: (0, import_editor_elements15.getWidgetsCache)() ?? {}
5446
+ widgetsCache: (0, import_editor_elements16.getWidgetsCache)() ?? {}
5364
5447
  });
5365
5448
  let generatedXML = "";
5366
5449
  const errors = [];
5367
5450
  const rootContainers = [];
5368
- const documentContainer = (0, import_editor_elements15.getContainer)("document");
5451
+ const documentContainer = (0, import_editor_elements16.getContainer)("document");
5369
5452
  const currentDocument = (0, import_editor_documents3.getCurrentDocument)();
5370
5453
  const targetContainer = getCompositionTargetContainer(documentContainer, currentDocument?.type.value);
5371
5454
  try {
5372
5455
  const compositionBuilder = CompositionBuilder.fromXMLString(xmlStructure, {
5373
- createElement: import_editor_elements15.createElement,
5374
- deleteElement: import_editor_elements15.deleteElement,
5375
- getWidgetsCache: import_editor_elements15.getWidgetsCache
5456
+ createElement: import_editor_elements16.createElement,
5457
+ deleteElement: import_editor_elements16.deleteElement,
5458
+ getWidgetsCache: import_editor_elements16.getWidgetsCache
5376
5459
  });
5377
5460
  compositionBuilder.setElementConfig(elementConfig);
5378
5461
  compositionBuilder.setStylesConfig(stylesConfig);
@@ -5388,7 +5471,7 @@ var initBuildCompositionsTool = (reg) => {
5388
5471
  }
5389
5472
  if (errors.length) {
5390
5473
  rootContainers.forEach((rootContainer) => {
5391
- (0, import_editor_elements15.deleteElement)({
5474
+ (0, import_editor_elements16.deleteElement)({
5392
5475
  container: rootContainer,
5393
5476
  options: { useHistory: false }
5394
5477
  });
@@ -5457,7 +5540,7 @@ function assertCompositionXmlUsesV4WidgetsOnly(xmlStructure) {
5457
5540
  if (doc.querySelector("parsererror")) {
5458
5541
  throw new Error("Failed to parse XML string: " + doc);
5459
5542
  }
5460
- const widgetsCache = (0, import_editor_elements15.getWidgetsCache)() ?? {};
5543
+ const widgetsCache = (0, import_editor_elements16.getWidgetsCache)() ?? {};
5461
5544
  for (const node of doc.querySelectorAll("*")) {
5462
5545
  const type = node.tagName;
5463
5546
  const widgetData = widgetsCache[type];
@@ -5474,18 +5557,18 @@ function assertCompositionXmlUsesV4WidgetsOnly(xmlStructure) {
5474
5557
  }
5475
5558
 
5476
5559
  // src/mcp/tools/configure-element/tool.ts
5477
- var import_editor_elements17 = require("@elementor/editor-elements");
5560
+ var import_editor_elements18 = require("@elementor/editor-elements");
5478
5561
 
5479
5562
  // src/mcp/utils/validate-input.ts
5480
- var import_editor_elements16 = require("@elementor/editor-elements");
5481
- var import_editor_props9 = require("@elementor/editor-props");
5563
+ var import_editor_elements17 = require("@elementor/editor-elements");
5564
+ var import_editor_props10 = require("@elementor/editor-props");
5482
5565
  var import_editor_styles5 = require("@elementor/editor-styles");
5483
5566
  var _widgetsSchema = null;
5484
5567
  var validateInput = {
5485
5568
  get widgetsSchema() {
5486
5569
  if (!_widgetsSchema) {
5487
5570
  const schema2 = {};
5488
- const cache = (0, import_editor_elements16.getWidgetsCache)();
5571
+ const cache = (0, import_editor_elements17.getWidgetsCache)();
5489
5572
  if (!cache) {
5490
5573
  return {};
5491
5574
  }
@@ -5512,10 +5595,10 @@ var validateInput = {
5512
5595
  if (!propSchema) {
5513
5596
  errors.push(`Property "${propName}" is not defined in the schema.`);
5514
5597
  hasInvalidKey = true;
5515
- } else if (!import_editor_props9.Schema.isPropKeyConfigurable(propName, propSchema)) {
5598
+ } else if (!import_editor_props10.Schema.isPropKeyConfigurable(propName, propSchema)) {
5516
5599
  errors.push(`Property "${propName}" is not configurable.`);
5517
5600
  } else {
5518
- const { valid } = import_editor_props9.Schema.validatePropValue(propSchema, propValue);
5601
+ const { valid } = import_editor_props10.Schema.validatePropValue(propSchema, propValue);
5519
5602
  if (!valid) {
5520
5603
  errors.push(
5521
5604
  `Invalid property "${propName}". Validate input with resource [${STYLE_SCHEMA_URI.replace(
@@ -5726,19 +5809,28 @@ var initConfigureElementTool = (reg) => {
5726
5809
  { description: "Dynamic tags catalog", uri: DYNAMIC_TAGS_URI }
5727
5810
  ],
5728
5811
  handler: async ({ elementId, propertiesToChange, elementType, style }) => {
5729
- const widgetData = (0, import_editor_elements17.getWidgetsCache)()?.[elementType];
5812
+ const widgetData = (0, import_editor_elements18.getWidgetsCache)()?.[elementType];
5730
5813
  if (!widgetData) {
5731
5814
  throw new Error(
5732
5815
  `Unknown element type: ${elementType}. Check the available-widgets resource for valid types.`
5733
5816
  );
5734
5817
  }
5818
+ const container = (0, import_editor_elements18.getContainer)(elementId);
5819
+ if (!container) {
5820
+ throw new Error(`Element with id ${elementId} not found`);
5821
+ }
5822
+ const isElementTypeMatchingId = container.settings.get("widgetType") === elementType || container.type === elementType;
5823
+ if (!isElementTypeMatchingId) {
5824
+ throw new Error(`Element with ID ${elementId} is not of type ${elementType}`);
5825
+ }
5735
5826
  if (!widgetData.atomic_props_schema) {
5736
5827
  throw new Error(
5737
5828
  `This tool does not support V3 elements. Please use the elementor-v3-mcp tools instead for element type: ${elementType}`
5738
5829
  );
5739
5830
  }
5740
- const toUpdate = Object.entries(propertiesToChange);
5741
- const { valid, errors } = validateInput.validatePropSchema(elementType, propertiesToChange);
5831
+ const propertiesToUpdate = resolveCanonicalPropKeys(elementType, propertiesToChange);
5832
+ const toUpdate = Object.entries(propertiesToUpdate);
5833
+ const { valid, errors } = validateInput.validatePropSchema(elementType, propertiesToUpdate);
5742
5834
  if (!valid) {
5743
5835
  const errorMessage = `Failed to configure element "${elementId}" due to invalid properties: ${errors?.join(
5744
5836
  "\n- "
@@ -5818,8 +5910,8 @@ Provide styling as raw CSS via the "style" parameter (a flat map of CSS property
5818
5910
  }
5819
5911
 
5820
5912
  // src/mcp/tools/get-element-config/tool.ts
5821
- var import_editor_elements18 = require("@elementor/editor-elements");
5822
- var import_editor_props10 = require("@elementor/editor-props");
5913
+ var import_editor_elements19 = require("@elementor/editor-elements");
5914
+ var import_editor_props11 = require("@elementor/editor-props");
5823
5915
  var import_schema5 = require("@elementor/schema");
5824
5916
  var schema = {
5825
5917
  elementId: import_schema5.z.string()
@@ -5853,12 +5945,12 @@ var initGetElementConfigTool = (reg) => {
5853
5945
  schema,
5854
5946
  outputSchema: outputSchema3,
5855
5947
  handler: async ({ elementId }) => {
5856
- const element = (0, import_editor_elements18.getContainer)(elementId);
5948
+ const element = (0, import_editor_elements19.getContainer)(elementId);
5857
5949
  if (!element) {
5858
5950
  throw new Error(`Element with ID ${elementId} not found.`);
5859
5951
  }
5860
5952
  const elementType = element.model.get("widgetType") || element.model.get("elType") || "";
5861
- const widgetData = (0, import_editor_elements18.getWidgetsCache)()?.[elementType];
5953
+ const widgetData = (0, import_editor_elements19.getWidgetsCache)()?.[elementType];
5862
5954
  if (!widgetData) {
5863
5955
  throw new Error(
5864
5956
  `Unknown element type: ${elementType}. Check the available-widgets resource for valid types.`
@@ -5870,16 +5962,16 @@ var initGetElementConfigTool = (reg) => {
5870
5962
  );
5871
5963
  }
5872
5964
  const elementRawSettings = element.settings;
5873
- const propSchema = (0, import_editor_elements18.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
5965
+ const propSchema = (0, import_editor_elements19.getWidgetsCache)()?.[elementType]?.atomic_props_schema;
5874
5966
  if (!elementRawSettings || !propSchema) {
5875
5967
  throw new Error(`No settings or prop schema found for element ID: ${elementId}`);
5876
5968
  }
5877
5969
  const propValues = {};
5878
5970
  const stylePropValues = {};
5879
- import_editor_props10.Schema.configurableKeys(propSchema).forEach((key) => {
5971
+ import_editor_props11.Schema.configurableKeys(propSchema).forEach((key) => {
5880
5972
  propValues[key] = structuredClone(elementRawSettings.get(key));
5881
5973
  });
5882
- const elementStyles = (0, import_editor_elements18.getElementStyles)(elementId) || {};
5974
+ const elementStyles = (0, import_editor_elements19.getElementStyles)(elementId) || {};
5883
5975
  const localStyle = Object.values(elementStyles).find((style) => style.label === "local");
5884
5976
  if (localStyle) {
5885
5977
  const defaultVariant = localStyle.variants.find(
@@ -5912,7 +6004,7 @@ var initGetElementConfigTool = (reg) => {
5912
6004
 
5913
6005
  // src/mcp/canvas-mcp.ts
5914
6006
  var initCanvasMcp = (reg) => {
5915
- import_editor_props11.Schema.setDynamicTagNamesResolver(getDynamicTagNamesByCategories);
6007
+ import_editor_props12.Schema.setDynamicTagNamesResolver(getDynamicTagNamesByCategories);
5916
6008
  initWidgetsSchemaResource(reg);
5917
6009
  initAvailableWidgetsResource(reg);
5918
6010
  initDocumentStructureResource(reg);
@@ -6035,7 +6127,7 @@ Note: The "size" property controls image resolution/loading, not visual size. Se
6035
6127
  `;
6036
6128
 
6037
6129
  // src/prevent-link-in-link-commands.ts
6038
- var import_editor_elements19 = require("@elementor/editor-elements");
6130
+ var import_editor_elements20 = require("@elementor/editor-elements");
6039
6131
  var import_editor_notifications3 = require("@elementor/editor-notifications");
6040
6132
  var import_editor_v1_adapters22 = require("@elementor/editor-v1-adapters");
6041
6133
  var import_i18n4 = require("@wordpress/i18n");
@@ -6106,25 +6198,25 @@ function shouldBlock(sourceElements, targetElements) {
6106
6198
  return false;
6107
6199
  }
6108
6200
  const isSourceContainsAnAnchor = sourceElements.some((src) => {
6109
- return src?.id ? (0, import_editor_elements19.isElementAnchored)(src.id) || !!(0, import_editor_elements19.getAnchoredDescendantId)(src.id) : false;
6201
+ return src?.id ? (0, import_editor_elements20.isElementAnchored)(src.id) || !!(0, import_editor_elements20.getAnchoredDescendantId)(src.id) : false;
6110
6202
  });
6111
6203
  if (!isSourceContainsAnAnchor) {
6112
6204
  return false;
6113
6205
  }
6114
6206
  const isTargetContainsAnAnchor = targetElements.some((target) => {
6115
- return target?.id ? (0, import_editor_elements19.isElementAnchored)(target.id) || !!(0, import_editor_elements19.getAnchoredAncestorId)(target.id) : false;
6207
+ return target?.id ? (0, import_editor_elements20.isElementAnchored)(target.id) || !!(0, import_editor_elements20.getAnchoredAncestorId)(target.id) : false;
6116
6208
  });
6117
6209
  return isTargetContainsAnAnchor;
6118
6210
  }
6119
6211
 
6120
6212
  // src/style-commands/paste-style.ts
6121
- var import_editor_elements22 = require("@elementor/editor-elements");
6122
- var import_editor_props13 = require("@elementor/editor-props");
6213
+ var import_editor_elements23 = require("@elementor/editor-elements");
6214
+ var import_editor_props14 = require("@elementor/editor-props");
6123
6215
  var import_editor_v1_adapters24 = require("@elementor/editor-v1-adapters");
6124
6216
 
6125
6217
  // src/utils/command-utils.ts
6126
- var import_editor_elements20 = require("@elementor/editor-elements");
6127
- var import_editor_props12 = require("@elementor/editor-props");
6218
+ var import_editor_elements21 = require("@elementor/editor-elements");
6219
+ var import_editor_props13 = require("@elementor/editor-props");
6128
6220
  var import_i18n5 = require("@wordpress/i18n");
6129
6221
  function hasAtomicWidgets(args) {
6130
6222
  const { containers = [args.container] } = args;
@@ -6142,13 +6234,13 @@ function getClassesProp(container) {
6142
6234
  return null;
6143
6235
  }
6144
6236
  const [propKey] = Object.entries(propsSchema).find(
6145
- ([, propType]) => propType.kind === "plain" && propType.key === import_editor_props12.CLASSES_PROP_KEY
6237
+ ([, propType]) => propType.kind === "plain" && propType.key === import_editor_props13.CLASSES_PROP_KEY
6146
6238
  ) ?? [];
6147
6239
  return propKey ?? null;
6148
6240
  }
6149
6241
  function getContainerSchema(container) {
6150
6242
  const type = container?.model.get("widgetType") || container?.model.get("elType");
6151
- const widgetsCache = (0, import_editor_elements20.getWidgetsCache)();
6243
+ const widgetsCache = (0, import_editor_elements21.getWidgetsCache)();
6152
6244
  const elementType = widgetsCache?.[type];
6153
6245
  return elementType?.atomic_props_schema ?? null;
6154
6246
  }
@@ -6161,11 +6253,11 @@ function getClipboardElements(storageKey = "clipboard") {
6161
6253
  }
6162
6254
  }
6163
6255
  function getTitleForContainers(containers) {
6164
- return containers.length > 1 ? (0, import_i18n5.__)("Elements", "elementor") : (0, import_editor_elements20.getElementLabel)(containers[0].id);
6256
+ return containers.length > 1 ? (0, import_i18n5.__)("Elements", "elementor") : (0, import_editor_elements21.getElementLabel)(containers[0].id);
6165
6257
  }
6166
6258
 
6167
6259
  // src/style-commands/undoable-actions/paste-element-style.ts
6168
- var import_editor_elements21 = require("@elementor/editor-elements");
6260
+ var import_editor_elements22 = require("@elementor/editor-elements");
6169
6261
  var import_editor_styles_repository4 = require("@elementor/editor-styles-repository");
6170
6262
  var import_editor_v1_adapters23 = require("@elementor/editor-v1-adapters");
6171
6263
  var import_i18n6 = require("@wordpress/i18n");
@@ -6178,7 +6270,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
6178
6270
  if (!classesProp) {
6179
6271
  return null;
6180
6272
  }
6181
- const originalStyles = (0, import_editor_elements21.getElementStyles)(container.id);
6273
+ const originalStyles = (0, import_editor_elements22.getElementStyles)(container.id);
6182
6274
  const [styleId, styleDef] = Object.entries(originalStyles ?? {})[0] ?? [];
6183
6275
  const originalStyle = Object.keys(styleDef ?? {}).length ? styleDef : null;
6184
6276
  const revertData = {
@@ -6187,7 +6279,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
6187
6279
  };
6188
6280
  if (styleId) {
6189
6281
  newStyle.variants.forEach(({ meta, props, custom_css: customCss }) => {
6190
- (0, import_editor_elements21.updateElementStyle)({
6282
+ (0, import_editor_elements22.updateElementStyle)({
6191
6283
  elementId,
6192
6284
  styleId,
6193
6285
  meta,
@@ -6198,7 +6290,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
6198
6290
  } else {
6199
6291
  const [firstVariant] = newStyle.variants;
6200
6292
  const additionalVariants = newStyle.variants.slice(1);
6201
- revertData.styleId = (0, import_editor_elements21.createElementStyle)({
6293
+ revertData.styleId = (0, import_editor_elements22.createElementStyle)({
6202
6294
  elementId,
6203
6295
  classesProp,
6204
6296
  label: import_editor_styles_repository4.ELEMENTS_STYLES_RESERVED_LABEL,
@@ -6216,7 +6308,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
6216
6308
  return;
6217
6309
  }
6218
6310
  if (!revertData.originalStyle) {
6219
- (0, import_editor_elements21.deleteElementStyle)(container.id, revertData.styleId);
6311
+ (0, import_editor_elements22.deleteElementStyle)(container.id, revertData.styleId);
6220
6312
  return;
6221
6313
  }
6222
6314
  const classesProp = getClassesProp(container);
@@ -6225,7 +6317,7 @@ var undoablePasteElementStyle = () => (0, import_editor_v1_adapters23.undoable)(
6225
6317
  }
6226
6318
  const [firstVariant] = revertData.originalStyle.variants;
6227
6319
  const additionalVariants = revertData.originalStyle.variants.slice(1);
6228
- (0, import_editor_elements21.createElementStyle)({
6320
+ (0, import_editor_elements22.createElementStyle)({
6229
6321
  elementId: container.id,
6230
6322
  classesProp,
6231
6323
  label: import_editor_styles_repository4.ELEMENTS_STYLES_RESERVED_LABEL,
@@ -6262,7 +6354,7 @@ function pasteStyles(args, pasteLocalStyle) {
6262
6354
  }
6263
6355
  const clipboardElements = getClipboardElements(storageKey);
6264
6356
  const [clipboardElement] = clipboardElements ?? [];
6265
- const clipboardContainer = (0, import_editor_elements22.getContainer)(clipboardElement.id);
6357
+ const clipboardContainer = (0, import_editor_elements23.getContainer)(clipboardElement.id);
6266
6358
  if (!clipboardElement || !clipboardContainer || !isAtomicWidget(clipboardContainer)) {
6267
6359
  return;
6268
6360
  }
@@ -6281,7 +6373,7 @@ function getClassesWithoutLocalStyle(clipboardContainer, style) {
6281
6373
  if (!classesProp) {
6282
6374
  return [];
6283
6375
  }
6284
- const classesSetting = (0, import_editor_elements22.getElementSetting)(clipboardContainer.id, classesProp);
6376
+ const classesSetting = (0, import_editor_elements23.getElementSetting)(clipboardContainer.id, classesProp);
6285
6377
  return classesSetting?.value.filter((styleId) => styleId !== style?.id) ?? [];
6286
6378
  }
6287
6379
  function pasteClasses(containers, classes) {
@@ -6290,10 +6382,10 @@ function pasteClasses(containers, classes) {
6290
6382
  if (!classesProp) {
6291
6383
  return;
6292
6384
  }
6293
- const classesSetting = (0, import_editor_elements22.getElementSetting)(container.id, classesProp);
6294
- const currentClasses = import_editor_props13.classesPropTypeUtil.extract(classesSetting) ?? [];
6295
- const newClasses = import_editor_props13.classesPropTypeUtil.create(Array.from(/* @__PURE__ */ new Set([...classes, ...currentClasses])));
6296
- (0, import_editor_elements22.updateElementSettings)({
6385
+ const classesSetting = (0, import_editor_elements23.getElementSetting)(container.id, classesProp);
6386
+ const currentClasses = import_editor_props14.classesPropTypeUtil.extract(classesSetting) ?? [];
6387
+ const newClasses = import_editor_props14.classesPropTypeUtil.create(Array.from(/* @__PURE__ */ new Set([...classes, ...currentClasses])));
6388
+ (0, import_editor_elements23.updateElementSettings)({
6297
6389
  id: container.id,
6298
6390
  props: { [classesProp]: newClasses }
6299
6391
  });
@@ -6304,7 +6396,7 @@ function pasteClasses(containers, classes) {
6304
6396
  var import_editor_v1_adapters26 = require("@elementor/editor-v1-adapters");
6305
6397
 
6306
6398
  // src/style-commands/undoable-actions/reset-element-style.ts
6307
- var import_editor_elements23 = require("@elementor/editor-elements");
6399
+ var import_editor_elements24 = require("@elementor/editor-elements");
6308
6400
  var import_editor_styles_repository5 = require("@elementor/editor-styles-repository");
6309
6401
  var import_editor_v1_adapters25 = require("@elementor/editor-v1-adapters");
6310
6402
  var import_i18n7 = require("@wordpress/i18n");
@@ -6313,9 +6405,9 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters25.undoable)(
6313
6405
  do: ({ containers }) => {
6314
6406
  return containers.map((container) => {
6315
6407
  const elementId = container.model.get("id");
6316
- const containerStyles = (0, import_editor_elements23.getElementStyles)(elementId);
6408
+ const containerStyles = (0, import_editor_elements24.getElementStyles)(elementId);
6317
6409
  Object.keys(containerStyles ?? {}).forEach(
6318
- (styleId) => (0, import_editor_elements23.deleteElementStyle)(elementId, styleId)
6410
+ (styleId) => (0, import_editor_elements24.deleteElementStyle)(elementId, styleId)
6319
6411
  );
6320
6412
  return containerStyles;
6321
6413
  });
@@ -6331,7 +6423,7 @@ var undoableResetElementStyle = () => (0, import_editor_v1_adapters25.undoable)(
6331
6423
  Object.entries(containerStyles ?? {}).forEach(([styleId, style]) => {
6332
6424
  const [firstVariant] = style.variants;
6333
6425
  const additionalVariants = style.variants.slice(1);
6334
- (0, import_editor_elements23.createElementStyle)({
6426
+ (0, import_editor_elements24.createElementStyle)({
6335
6427
  elementId,
6336
6428
  classesProp,
6337
6429
  styleId,
@@ -6531,10 +6623,10 @@ function useEscapeOnCanvas(canvasDocument, onEscape) {
6531
6623
  }
6532
6624
 
6533
6625
  // src/utils/after-render.ts
6534
- var import_editor_elements24 = require("@elementor/editor-elements");
6626
+ var import_editor_elements25 = require("@elementor/editor-elements");
6535
6627
  function doAfterRender(elementIds, callback) {
6536
6628
  const pending = elementIds.map((elementId) => {
6537
- const view = (0, import_editor_elements24.getContainer)(elementId)?.view;
6629
+ const view = (0, import_editor_elements25.getContainer)(elementId)?.view;
6538
6630
  if (!view || !hasDoAfterRender(view)) {
6539
6631
  return void 0;
6540
6632
  }