Summary
There is no working write path to change a widget's design properties on a page or snippet. ALTER STYLING rejects pages and snippets with unsupported container type: PAGE/SNIPPET, and the two alternative paths (ALTER PAGE ... SET DesignProperties and UPDATE WIDGETS) also fail or do not target design properties. Design properties can be read (they show up in DESCRIBE PAGE/DESCRIBE SNIPPET), but not written.
This blocks an otherwise highly automatable task: bulk-migrating Atlas 3 design properties to their Atlas 4 equivalents after a theme upgrade (e.g. Display Flex → Flex container, Justify content → Align items X, Gutter size → Item gap). The mapping is deterministic and the values are readable, but they cannot be applied through mxcli.
Environment
- mxcli version:
v0.11.0 (2026-05-21T18:04:46Z)
- Mendix project version: 11.6.6 (Atlas 4 theme)
- Platform: Linux (WSL2)
Steps to Reproduce
Given a page with a container that carries design properties, e.g. DESCRIBE PAGE UxWeb.AanvraagTypeAanpassenPopup shows:
container container2 (
Class: 'inter-popup-button-container',
DesignProperties: ['Display Flex': on, 'Justify content': 'Space between', 'Align items': 'Space between']
)
-
ALTER STYLING on a page
ALTER STYLING ON PAGE [page name] WIDGET container2 SET 'Flex container' = 'Horizontal (row)'
→ Error: unsupported container type: PAGE
-
ALTER STYLING on a snippet
ALTER STYLING ON SNIPPET [snippet name] WIDGET container21 SET 'Flex container' = 'Horizontal (row)'
→ Error: unsupported container type: SNIPPET
-
ALTER PAGE ... SET DesignProperties (passes mxcli check, fails at execution)
ALTER PAGE [page name] {
SET DesignProperties = ['Flex container': 'Horizontal (row)'] ON container2
}
→ Error: failed to set: failed to set DesignProperties on container2: property "DesignProperties" not found (widget has no pluggable Object)
On a pluggable widget the message differs but still fails:
→ Error: failed to set: failed to set DesignProperties on comboBox1: pluggable property "DesignProperties" not found
-
UPDATE WIDGETS does not target design properties (the CATALOG.WIDGETS table has no design-property column), so a design-property name in the SET clause matches nothing.
Expected Behavior
A supported, documented command can set/clear a design property on a named widget inside a page or snippet, round-tripping with the DesignProperties: [...] output already produced by DESCRIBE PAGE/DESCRIBE SNIPPET. For example, either of these should work:
ALTER STYLING ON PAGE Module.Page WIDGET container2 SET 'Flex container' = 'Horizontal (row)'
or
ALTER PAGE Module.Page {
SET DesignProperties = ['Flex container': 'Horizontal (row)'] ON container2
}
Ideally a dry run option is supported and design property keys/values are validated against SHOW DESIGN PROPERTIES for the widget type.
Actual Behavior
ALTER STYLING ON PAGE|SNIPPET ... SET '<design property>' = ... → unsupported container type: PAGE/SNIPPET.
ALTER PAGE ... SET DesignProperties = [...] ON widget → passes mxcli check but errors at execution with property "DesignProperties" not found (core widget) / pluggable property "DesignProperties" not found (pluggable widget).
UPDATE WIDGETS SET '<design property>' = ... → no match; design properties are not catalog columns.
Net result: design properties are readable but not writable through any current command.
Impact
Migrating widgets after an Atlas 3 → Atlas 4 theme upgrade currently requires manual right-click "see more options" per widget in Studio Pro. In one real project this affects 114 occurrences (CE6083) across 35 documents. A working write path would make this a scripted, validated bulk operation.
Additional Notes / Suggestions
- That
ALTER PAGE ... SET DesignProperties passes mxcli check but fails at execution suggests the parser accepts a property the executor does not implement; aligning the two (either implement it, or reject at check time) would help.
- A read-completeness gap may be related:
DESCRIBE PAGE appears to omit design properties on deeply nested widgets (e.g. inside table cells / layout-grid columns), so a fix should ensure the same traversal is used for both read and write.
- Happy to provide a full sample project and the complete Atlas 3 → Atlas 4 design-property mapping table if useful.
Summary
There is no working write path to change a widget's design properties on a page or snippet.
ALTER STYLINGrejects pages and snippets withunsupported container type: PAGE/SNIPPET, and the two alternative paths (ALTER PAGE ... SET DesignPropertiesandUPDATE WIDGETS) also fail or do not target design properties. Design properties can be read (they show up inDESCRIBE PAGE/DESCRIBE SNIPPET), but not written.This blocks an otherwise highly automatable task: bulk-migrating Atlas 3 design properties to their Atlas 4 equivalents after a theme upgrade (e.g.
Display Flex→Flex container,Justify content→Align items X,Gutter size→Item gap). The mapping is deterministic and the values are readable, but they cannot be applied through mxcli.Environment
v0.11.0 (2026-05-21T18:04:46Z)Steps to Reproduce
Given a page with a container that carries design properties, e.g.
DESCRIBE PAGE UxWeb.AanvraagTypeAanpassenPopupshows:ALTER STYLINGon a page→
Error: unsupported container type: PAGEALTER STYLINGon a snippet→
Error: unsupported container type: SNIPPETALTER PAGE ... SET DesignProperties(passesmxcli check, fails at execution)→
Error: failed to set: failed to set DesignProperties on container2: property "DesignProperties" not found (widget has no pluggable Object)On a pluggable widget the message differs but still fails:
→
Error: failed to set: failed to set DesignProperties on comboBox1: pluggable property "DesignProperties" not foundUPDATE WIDGETSdoes not target design properties (theCATALOG.WIDGETStable has no design-property column), so a design-property name in theSETclause matches nothing.Expected Behavior
A supported, documented command can set/clear a design property on a named widget inside a page or snippet, round-tripping with the
DesignProperties: [...]output already produced byDESCRIBE PAGE/DESCRIBE SNIPPET. For example, either of these should work:or
Ideally a
dry runoption is supported and design property keys/values are validated againstSHOW DESIGN PROPERTIESfor the widget type.Actual Behavior
ALTER STYLING ON PAGE|SNIPPET ... SET '<design property>' = ...→unsupported container type: PAGE/SNIPPET.ALTER PAGE ... SET DesignProperties = [...] ON widget→ passesmxcli checkbut errors at execution withproperty "DesignProperties" not found(core widget) /pluggable property "DesignProperties" not found(pluggable widget).UPDATE WIDGETS SET '<design property>' = ...→ no match; design properties are not catalog columns.Net result: design properties are readable but not writable through any current command.
Impact
Migrating widgets after an Atlas 3 → Atlas 4 theme upgrade currently requires manual right-click "see more options" per widget in Studio Pro. In one real project this affects 114 occurrences (CE6083) across 35 documents. A working write path would make this a scripted, validated bulk operation.
Additional Notes / Suggestions
ALTER PAGE ... SET DesignPropertiespassesmxcli checkbut fails at execution suggests the parser accepts a property the executor does not implement; aligning the two (either implement it, or reject at check time) would help.DESCRIBE PAGEappears to omit design properties on deeply nested widgets (e.g. inside table cells / layout-grid columns), so a fix should ensure the same traversal is used for both read and write.