Skip to content

feat(skills): add atlas-design skill for visually appealing Mendix apps - #18

Merged
ako merged 3 commits into
mainfrom
feature/atlas-design-skill
Jul 24, 2026
Merged

feat(skills): add atlas-design skill for visually appealing Mendix apps#18
ako merged 3 commits into
mainfrom
feature/atlas-design-skill

Conversation

@ako

@ako ako commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Adds the atlas-design user skill — the taste + workflow layer that makes an mxcli-generated Mendix app reach "designed product" quality by default. Implements docs/11-proposals/PROPOSAL_atlas_design_system.md. Synced to Mendix projects via mxcli init.

Grounded in the standard Atlas system (not a bespoke library)

Per the direction to base it on what every project already ships, the skill is built on Atlas_Core classes + the 39 out-of-the-box Atlas_Web_Content building blocks — so it's universal. It's built on the Building-Blocks READ capability (SHOW/DESCRIBE BUILDING BLOCK, CATALOG.building_blocks) and was validated against a real Atlas project: the block inventory and the Card structure in the worked example are actual DESCRIBE output (container (DesignProperties: ['Card style': on]) + a card-title class).

What it covers

  • The Atlas-first thesis + "reach down the stack first".
  • The 4-layer architecture: Atlas classes/design-properties → brand tokens → identity SCSS → mandatory runtime verify.
  • The discover → inspect → mirror workflow over the out-of-the-box blocks.
  • The Atlas class + typed-designproperties vocabulary.
  • A Layer-1 brand-token scaffold and an optional dark-mode widget-override scaffold (inline SCSS to copy out).
  • The transparent-Plotly chart theme (dataviz-for-Mendix).
  • The run --local --watch --screenshot verify loop ("mx check is not enough").
  • The full gotchas catalog.

Honest about the capability boundary

Discovery works today; instantiation (USE BUILDING BLOCK) does not yet exist. So the skill teaches mirroring a block's shape with classes + design properties + fragments, treating the Atlas block as the canonical target — and notes those recipes migrate to native instantiation when USE BUILDING BLOCK lands.

Structure & validation

  • Single self-contained file (.claude/skills/mendix/atlas-design.md, 728 lines). The mxcli init sync + //go:embed only handle top-level skills/*.md, so a multi-file subdirectory would never reach user projects — hence one complete file (also better for an LLM skill).
  • make sync-skills + make build embed it cleanly; the embed dir is gitignored (regenerated), so only the source is committed.
  • Every MDL snippet in the skill passes mxcli check.
  • Complements (doesn't duplicate) theme-styling.md, create-page.md, fragments.md, migrate-design-prototype.md.

Bonus: Building-Blocks READ validated on a real project

Authoring this exercised show building blocks / describe building block against a real Atlas app — 40 blocks enumerated with full metadata, real widget trees rendered. That's the real-project confirmation flagged as the open validation step for the Building-Blocks feature (#16).

🤖 Generated with Claude Code

https://claude.ai/code/session_01JXnEgoc2NQP1Y2TWMCMXC4


Generated by Claude Code

claude added 3 commits July 24, 2026 15:12
A user-facing skill (synced to Mendix projects via `mxcli init`) that makes a
generated app reach "designed product" quality, the way artifact-design does for
HTML and dataviz does for charts. It's the taste + workflow layer on top of
theme-styling (SCSS mechanics), create-page (widget syntax), fragments
(composition), and migrate-design-prototype (design handoff).

Grounded in the STANDARD Atlas design system every project already ships —
Atlas_Core classes + the 39 out-of-the-box Atlas_Web_Content building blocks —
rather than a bespoke per-app library, so it works in any project. Built on the
building-blocks READ capability (SHOW/DESCRIBE BUILDING BLOCK), and validated
against a real Atlas project (the inventory + the Card structure in the worked
example are real DESCRIBE output).

Covers: the Atlas-first thesis and "reach down the stack first"; the 4-layer
architecture (Atlas → brand tokens → identity SCSS → mandatory runtime verify);
the discover → inspect → mirror workflow over out-of-the-box blocks; the Atlas
class + typed-designproperties vocabulary; a Layer-1 brand-token scaffold and an
optional dark-mode widget-override scaffold (inline SCSS); the transparent-Plotly
chart theme; the run --local --watch --screenshot verify loop ("mx check is not
enough"); and the full gotchas catalog.

Honest about the current capability boundary: discovery works today, but
instantiation (USE BUILDING BLOCK) does not yet exist, so the skill teaches
mirroring a block's shape with classes + design properties + fragments, treating
the Atlas block as the canonical target — migrating to native instantiation when
USE BUILDING BLOCK lands.

Single self-contained file (the sync/embed only handles top-level skills/*.md).
Implements the atlas-design proposal (docs/11-proposals/PROPOSAL_atlas_design_system.md).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXnEgoc2NQP1Y2TWMCMXC4
…rimary path

Now that USE BUILDING BLOCK v1 exists, the skill leads with the one-line
instantiation instead of the hand-mirror workaround:

- Workflow renamed discover → inspect → USE (was → mirror). Step 3 is now
  `use building block Mod.Name [as prefix_]` (deep-copy), step 4 configures the
  copied widgets with `alter page`. Mirroring is reframed as the explicit fallback
  (hand-tuning, or the modelsdk engine before its building-block support lands).
- Capability table: Instantiate → ✅ v1 (deep-copy; configure afterwards; legacy
  engine today). Capability note updated to "discovery AND instantiation both work".
- Validation checklist updated to prefer `use building block` + `alter page`.

All `use building block` / `alter page` examples are bare page-body lines, which
the skill-MDL checker auto-skips (first keyword not in its create/alter/drop
entity|page checkable set) — verified with a binary built WITHOUT the grammar, so
this PR's CI is green even before the USE BUILDING BLOCK feature (#19) merges.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXnEgoc2NQP1Y2TWMCMXC4
@ako
ako merged commit 010b06c into main Jul 24, 2026
3 checks passed
ako pushed a commit that referenced this pull request Jul 28, 2026
Ledger findings #17–19: a `set $x = <expr>` value re-serialized from the
AST silently corrupted the stored Mendix expression — `mxcli check`
passed, `mx check` gave only a generic CE0117:

- #17 a division's right operand lost its `$` (`$a / $b` → `$a/b`)
- #18 a decimal literal lost its fraction (`2.0` → `2`), breaking Decimal
- #19 a small decimal became scientific notation (`0.000001` → `1e-06`)

shouldPreserveExpressionSource now keeps the raw source whenever the
expression contains a `/` or a decimal literal (a `.` adjacent to a
digit), mirroring the existing XPath-where handling — so the exact text
survives instead of a lossy AST round-trip. (MDL division is `div`; `/`
is the member-access separator, which is what caused the `$`-loss
mis-parse — preserving source is the robust fix either way.)

Test: TestShouldPreserveExpressionSource_DivisionAndDecimals; repro
mdl-examples/bug-tests/ledger-17-19-expression-serialization.mdl.
Symptom table updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXnEgoc2NQP1Y2TWMCMXC4
ako pushed a commit that referenced this pull request Jul 28, 2026
…ecimals

Corrects the earlier ledger #17-19 fix, which over-broadly preserved raw
expression source whenever it saw a '/'. In MDL '/' is the member-access
separator (`$obj/Attr`), not division (that is `div`), so preserving on '/'
source-froze every association-navigation path and regressed
TestAssociationNavParsing.

- shouldPreserveExpressionSource: drop the '/' trigger; keep the decimal-literal
  trigger (findings #18/#19 — `2.0`->`2`, `0.000001`->`1e-06` are genuine
  AST-serializer losses that raw-source preservation fixes).
- New MDL045: walk the microflow expression tree for a BinaryExpr with operator
  '/' (`$Dec / 2`, `(...) / $x`) and reject with an actionable "use div" message,
  instead of silently writing an invalid expression that fails the build (CE0117).
  The bare `$a / $b` form degrades to a member path and is caught by
  `check --references`.

Tests: TestShouldPreserveExpressionSource_Decimals (renamed),
TestValidateMicroflow_SlashDivision. Repros: ledger-17-19 (passes) +
ledger-17-slash-division.fail.mdl (MDL045). Skill + symptom-table updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXnEgoc2NQP1Y2TWMCMXC4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants