Skip to content

feat: component visual recipes, renderer, and static explorer site - #1569

Closed
GarthDB wants to merge 97 commits into
mainfrom
feat/component-visual-recipes
Closed

GarthDB wants to merge 97 commits into
mainfrom
feat/component-visual-recipes

Conversation

@GarthDB

@GarthDB GarthDB commented Oct 28, 2026 •

Copy link
Copy Markdown
Member

Description

Adds a draft, renderer-neutral format for component visuals, a Rust renderer, a static explorer site, and the first pieces of platform-aware rendering. This PR is large (about 100 commits). The review guide below groups them so each area can be read on its own.

Review guide

Area What it is Start with
1. Format and renderer Recipe format, scene graph, SVG, compile and solve spec/component-visuals.md, sdk/core/src/visual.rs
2. Recipes and data Five recipes bound through relationships packages/design-data/visuals/, relationships/
3. Explorer site Matrix, anatomy, specs, pan and zoom, Spectrum controls sdk/plugins/site/
4. Lints and anatomy SPEC-060 to 076, anatomy standard spec/anatomy-format.md, sdk/core/src/validate/rules/
5. Platforms --platform rendering, overrides, platform-owned recipes, artifact moves docs/proposals/014-...md, spec/artifact-moves.md

1. Format and renderer

  • Spec and schema: spec/component-visuals.md (RFC) and component-visual.schema.json. A recipe binds anatomy parts to tokens, with when conditions on options, states and modes.
  • Core: visual.rs resolves a recipe through the cascade into a scene graph and SVG. The renderer is split into compile (needs the token graph) and solve (a pure function of a compiled variant and a request), so repeated renders no longer re-resolve tokens. The WASM Dataset reuses compiled recipes across renders.
  • CLI: design-data render <component> and design-data site --out <dir>.
  • WASM: Dataset.renderScene and renderSvg, used as the parity oracle for the site's JS runtime.
  • Array option conditions (qkj5.49): when.options values may be an array that matches any listed value, as the spec already said.

2. Recipes and data

  • Recipes: visuals/{action-button,badge,button,checkbox,switch}.json, plus anatomy in the matching component files.
  • Relationship-first bindings (qkj5.56 to .66): a recipe takes its values from the component's relationships, not token selectors.
    • Relationship scope.options pin component options (arrays mean any of). The renderer keeps matching records and prefers the most pinned options; a record that pins none is the default. scope.options.state pins the states a token applies to and replaces the token's own name.state.
    • Badge, button and action-button bind colors, sizes, padding, fonts, press perspective, hold-icon inset and progress colors this way. Badge's recipe went from 1,896 to about 290 lines and button's from 1,309 to about 400. New role contexts (Label, Progress, Hold icon, and so on) reference the same tokens as before.
    • component-visuals.md has the authoring conventions. 103 duplicate relationship records now point at the mobile token.
  • Button static color (qkj5.43 to .48): static black and white rules are scoped to primary and secondary, with static focus ring, disabled and outline hover and down rules.
  • Focus indicator naming: the anatomy, gap token and recipe parts are focus-indicator, per design. The token keeps legacyKey: focus-ring-gap.

3. Explorer site (sdk/plugins/site)

  • A static site with a vanilla JS runtime (no WASM). A usage matrix zooms into anatomy and specs and tokens. Tokens group by part, show alias chains and Figma variable names (sdk/plugins/figma variable_names).
  • Spectrum controls: the control panel uses Spectrum Web Components (sp-picker, sp-switch, sp-action-button, sp-status-light, sp-help-text). They are bundled into assets/spectrum-controls.js (about 800 KB) by controls/build.sh, so the site stays static and self-contained.
  • Stage navigation: the stage opens fitted and supports pan, zoom at the pointer, actual size, Fit and full screen, with keyboard shortcuts. Anatomy and specs are redrawn at each zoom so labels keep one size.
  • Label accessibility: anatomy and token labels meet WCAG 2.1 and 2.2 contrast (text 4.5:1, lines 3:1) on the light, dark and static-color stages and are centered in their boxes. Labels are compact (10px) by default, with an Aa toggle for 14px.
  • Platform: --platform <id> names the platform in the heading and lists unresolved bindings in a panel.
  • docs/hub-prototype has a local preview server and a README.

4. Lints, anatomy and validation

  • Recipe lints SPEC-066 to SPEC-072, with a ratchet test (recipe_lint_baseline). SPEC-064 and SPEC-065 validate option constraints. SPEC-072 flags a duplicated relationship whose token has a scale counterpart.
  • Anatomy standard: spec/anatomy-format.md defines what counts as an anatomy part and a review status (anatomyReview), applied to the five recipe components. Part states is renamed presentIn and rejected on required parts. SPEC-073 (info) lists components without reviewed anatomy, SPEC-074 checks presentIn states are declared, SPEC-075 checks a recipe agrees with its anatomy. design-data anatomy-suggest proposes candidate parts for human review.
  • A recipe that binds a deprecated token, a literal color or a token a relationship already covers is reported (SPEC-067 to SPEC-069).

5. Platforms

  • --platform for render and site: design-data render and site apply the Foundation to Platform cascade. SPEC-076 reports recipe bindings that do not resolve under a platform (validate --platform <id> --visuals-path). The WASM Dataset.applyPlatform takes a merged manifest.
  • iOS manifest: the include whitelist is gone, so iOS ships the full foundation minus wireframe.
  • Overrides: a manifest override now replaces the foundation record in place but keeps every field and records provenance (overriddenBy, overriddenFrom, held in memory and stripped from legacy output). spec/manifest.md now says so. The Figma export keeps an overridden token's other modes (it used to drop them).
  • Platform-owned recipes (proposal docs/proposals/014-platform-owned-visual-recipes.md): a platform can ship extensions/visuals/<component>.json, which replaces the foundation recipe of the same name, and a componentAliases map (SPEC-081). Loading and the alias are implemented in core. Render, site and WASM do not use them yet (follow-up beads p6ga.8.36 to 8.40).
  • Artifact moves: spec/artifact-moves.md describes how one artifact is promoted from a platform to the foundation or demoted back. SPEC-077 and 078 are reserved there and not implemented.

Not in this PR

Rendering an iOS component through a platform-owned recipe (the first slice, button-ios), SPEC-079 and 080 (planned in rules.yaml), the platform move command, Dark Elevated, and the open data questions tracked under epics qkj5 and p6ga.8.

Related Issue

Discussion #1568. No tracking issue yet.

Motivation and Context

Spectrum Hub mockups need component visuals (usage matrix, anatomy, specs and tokens) from the design data, not from Figma. One recipe format can feed SVG now and PNG and Figma later. Not Figma-native, and not tied to Playground/Domino (the RFC covers the fit). Platform-aware rendering is the first step toward showing the same component for iOS and other platforms from their manifests.

How Has This Been Tested?

  • cargo test -p design-data-core -p design-data-cli: 1,043 passed across all test binaries, including recipe_snapshots (every option, state, size and color scheme of all five recipes), the recipe_lint_baseline ratchet, the platform cascade fixture (platform_cascade.rs) and the conformance fixtures.
  • moon run sdk-wasm:test: 119 passed. The JS runtime vs WASM parity test derives its coverage from the recipes and component data (a seeded sample by default, the full matrix with VISUAL_PARITY_FULL=1) and compares against golden SVGs. An exhaustive run earlier found 0 differences in 101,760 renders of the five recipes.
  • moon run design-data:validate and validate-dataset: exit 0, with diagnostics compared before and after each recipe change.
  • design-data validate-manifest --platform ios, moon run root:validate-platforms, root:validate-platform-recipes and root:test-platform-recipes-guard: pass.
  • moon run tokens:test and the legacy output tasks: passed. The no-platform output is byte-identical after every platform change.
  • cargo clippy -D warnings and cargo fmt --check on the touched crates: clean.
  • The site was built and checked in headless Chrome (matrix, zoom, pan, full screen, specs, tokens, label toggle) with and without --platform ios, with no console errors.
  • node tools/changeset-linter/src/cli.js check --fail-on-warnings: passes.
  • Open data questions are tracked under epic qkj5, for example action-button icon sizes (qkj5.66).

Screenshots (if appropriate):

Not attached yet.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • I have signed the Adobe Open Source CLA.
  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

test and others added 3 commits October 27, 2026 21:05
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@changeset-bot

changeset-bot Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 22b4570

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 15 packages
Name Type
@adobe/design-data-spec Minor
@adobe/spectrum-design-data Minor
@adobe/design-data-wasm Minor
@adobe/design-data-tui Patch
@adobe/spectrum-component-api-schemas Patch
@adobe/design-data Patch
@adobe/design-system-registry Patch
@adobe/design-data-agent-mcp Patch
@adobe/design-data-mcp Patch
markdown-generator Patch
@adobe/token-corpus-migrate Patch
@adobe/token-naming-audit Patch
s2-tokens-viewer Patch
@adobe/spectrum-design-data-mcp Patch
component-options-editor Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Run report for 22b45707

Total time: 8m 37s | Comparison time: 24m 33s | Estimated savings: 15m 55s (64.9% faster)

Action Time Status Info
⬛️ SetupProto(0.57.4) 0ms Skipped
🟩 SyncWorkspace 9.8ms Passed
🟩 SyncProject(sdk) 0.5ms Passed
🟩 SyncProject(design-data-spec) 0.8ms Passed
🟩 SyncProject(root) 0.6ms Passed
🟩 SyncProject(sdk-wasm) 0.7ms Passed
🟩 SyncProject(design-data) 1.2ms Passed
🟩 SyncProject(design-data-glue) 1.4ms Passed
🟩 SyncProject(component-schemas) 1ms Passed
🟩 SyncProject(design-data-mcp) 1.3ms Passed
⬛️ SetupToolchain(node:20.17.0) 239.9ms Skipped
⬛️ SetupToolchain(rust:1.88.0) 334.4ms Skipped
⬛️ SetupToolchain(pnpm:10.17.1) 188.7ms Skipped
⬛️ SetupToolchain(javascript) 0ms Skipped
🟩 SetupEnvironment(javascript) 0.8ms Passed
⬛️ SetupEnvironment(javascript, sdk) 0.9ms Skipped
⬛️ InstallDependencies(javascript) 0.1ms Skipped
🟩 SetupEnvironment(rust, sdk) 132.4ms Passed
🟩 RunTask(design-data:validate-registry) 311.8ms Passed
⬛️ InstallDependencies(rust, sdk) 10.8ms Skipped
And 23 more...
Expanded report
Action Time Status Info
🟩 RunTask(design-data:validate-visuals) 317ms Passed
🟩 RunTask(sdk:fmt-check) 2.7s Passed
🟩 RunTask(component-schemas:test) 3.7s Passed
🟩 InstallDependencies(javascript, sdk) 5.3s Passed
🟩 RunTask(sdk:codegen-check) 66.9ms Passed
🟩 RunTask(sdk:lint) 1m 2s Passed
🟩 RunTask(sdk-wasm:cache-build) 1m 53s Passed
🟩 RunTask(sdk:build) 2m 28s Passed SLOW
🟩 RunTask(sdk:test-doc) 3m 26s Passed SLOW
🟩 RunTask(design-data:legacy-output) 1.8s Passed
🟩 RunTask(design-data:validate-dataset) 40.7s Passed
🟩 RunTask(design-data:roundtrip-verify) 3.3s Passed
🟩 RunTask(root:validate-platforms) 11s Passed
🟩 RunTask(design-data:validate) 40.7s Passed
🟩 RunTask(markdown-generator:generate) 1.8s Passed
🟩 RunTask(sdk-wasm:site-data) 4m 57s Passed SLOW
🟩 RunTask(sdk-wasm:build) 5m 19s Passed SLOW
🟩 RunTask(design-data-mcp:stage) 2.7s Passed
🟩 RunTask(design-data-agent-mcp:test) 16.1s Passed
🟩 RunTask(sdk-wasm:test) 26.3s Passed
🟩 RunTask(sdk-wasm:ci) 23.2ms Passed
🟩 RunTask(design-data-mcp-eval:test) 28.6s Passed
🟩 RunTask(sdk:test) 6m 38s Passed SLOW
Changed files
.ai/inventory.json
.ai/skills/beads-jira-sync/SKILL.md
.changeset/anatomy-definition-and-review.md
.changeset/artifact-moves.md
.changeset/button-static-color-recipe.md
.changeset/checkbox-relationship-context-prefix.md
.changeset/component-visual-recipes.md
.changeset/figma-export-override-modes.md
.changeset/flowed-box-paints.md
.changeset/option-constraints-matrix.md
.changeset/option-constraints-rules.md
.changeset/option-constraints.md
.changeset/platform-override-keeps-fields.md
.changeset/platform-recipe-check.md
.changeset/platform-recipes-core.md
.changeset/platform-recipes-spec-text.md
.changeset/render-platform-cascade.md
.changeset/visual-recipe-array-conditions.md
.changeset/wasm-visual-compile-solve.md
.gitattributes
.github/scripts/fixtures/platform-recipes-clean.json
.github/scripts/fixtures/platform-recipes-spec079.json
.github/scripts/validate-platform-recipes.mjs
.github/scripts/validate-platform-recipes.test.mjs
.gitignore
.prettierignore
AGENTS.md
docs/hub-prototype/.gitignore
docs/hub-prototype/README.md
docs/hub-prototype/serve.mjs
docs/proposals/014-platform-owned-visual-recipes.md
docs/repo-index.md
llms.txt
moon.yml
packages/design-data-spec/conformance/README.md
packages/design-data-spec/conformance/invalid/SPEC-059/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-059/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-060/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-060/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-061/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-061/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-062/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-062/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-063/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-063/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-064/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-064/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-065/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-065/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-066/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-066/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-067/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-067/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-068/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-068/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-069/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-069/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-070/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-070/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-071/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-071/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-072/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-072/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-073/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-073/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-074/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-074/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-075/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-075/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-076/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-076/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-076/manifest.json
packages/design-data-spec/conformance/invalid/SPEC-081/dataset.json
packages/design-data-spec/conformance/invalid/SPEC-081/expected-errors.json
packages/design-data-spec/conformance/invalid/SPEC-081/manifest.json
packages/design-data-spec/conformance/valid/SPEC-025/dataset.json
packages/design-data-spec/conformance/valid/SPEC-049/dataset.json
packages/design-data-spec/conformance/valid/SPEC-064/dataset.json
packages/design-data-spec/conformance/valid/SPEC-064/expected-errors.json
packages/design-data-spec/conformance/valid/SPEC-065/dataset.json
packages/design-data-spec/conformance/valid/SPEC-065/expected-errors.json
packages/design-data-spec/rules/rules.yaml
packages/design-data-spec/schemas/anatomy-part.schema.json
packages/design-data-spec/schemas/component-visual.schema.json
packages/design-data-spec/schemas/component.schema.json
packages/design-data-spec/schemas/manifest.schema.json
packages/design-data-spec/schemas/relationship.schema.json
packages/design-data-spec/spec/anatomy-format.md
packages/design-data-spec/spec/artifact-moves.md
packages/design-data-spec/spec/component-format.md
packages/design-data-spec/spec/component-visuals.md
packages/design-data-spec/spec/index.md
packages/design-data-spec/spec/manifest.md
packages/design-data-spec/spec/option-constraints.md
packages/design-data-spec/spec/relationship-format.md
packages/design-data/components/action-button.json
packages/design-data/components/badge.json
packages/design-data/components/button.json
packages/design-data/components/checkbox.json
packages/design-data/components/radio-button.json
packages/design-data/components/switch.json
packages/design-data/moon.yml
packages/design-data/registry/anatomy-terms.json
packages/design-data/registry/token-terminology.json
packages/design-data/relationships/accordion.json
packages/design-data/relationships/action-button.json
packages/design-data/relationships/badge.json
packages/design-data/relationships/button.json
packages/design-data/relationships/checkbox.json
packages/design-data/relationships/combo-box.json
packages/design-data/relationships/date-picker.json
packages/design-data/relationships/drop-zone.json
packages/design-data/relationships/list-view.json
packages/design-data/relationships/menu.json
packages/design-data/relationships/number-field.json
packages/design-data/relationships/picker.json
packages/design-data/relationships/radio-button.json
packages/design-data/relationships/search-field.json
packages/design-data/relationships/segmented-control.json
packages/design-data/relationships/side-navigation.json
packages/design-data/relationships/switch.json
packages/design-data/relationships/tag-field.json
packages/design-data/relationships/tag.json
packages/design-data/relationships/text-area.json
packages/design-data/relationships/text-field.json
packages/design-data/relationships/tooltip.json
packages/design-data/relationships/tree-view.json
packages/design-data/scripts/validate-visuals.js
packages/design-data/tokens/layout.tokens.json
packages/design-data/visuals/action-button.json
packages/design-data/visuals/badge.json
packages/design-data/visuals/button.json
packages/design-data/visuals/checkbox.json
packages/design-data/visuals/switch.json
platforms/README.md
platforms/ios/manifest.json
sdk/Cargo.lock
sdk/Cargo.toml
sdk/cli/Cargo.toml
sdk/cli/src/main.rs
sdk/cli/tests/cli_manifest.rs
sdk/cli/tests/cli_platform.rs
sdk/core/src/anatomy_suggest.rs
sdk/core/src/constraints.rs
sdk/core/src/graph.rs
sdk/core/src/legacy.rs
sdk/core/src/lib.rs
sdk/core/src/manifest.rs
sdk/core/src/registry_data.rs
sdk/core/src/schema.rs
sdk/core/src/validate/mod.rs
sdk/core/src/validate/rules/mod.rs
sdk/core/src/validate/rules/spec025.rs
sdk/core/src/validate/rules/spec049.rs
sdk/core/src/validate/rules/spec053.rs
sdk/core/src/validate/rules/spec060.rs
sdk/core/src/validate/rules/spec061.rs
sdk/core/src/validate/rules/spec062.rs
sdk/core/src/validate/rules/spec063.rs
sdk/core/src/validate/rules/spec064.rs
sdk/core/src/validate/rules/spec065.rs
sdk/core/src/validate/rules/spec066.rs
sdk/core/src/validate/rules/spec067.rs
sdk/core/src/validate/rules/spec068.rs
sdk/core/src/validate/rules/spec069.rs
sdk/core/src/validate/rules/spec070.rs
sdk/core/src/validate/rules/spec071.rs
sdk/core/src/validate/rules/spec072.rs
sdk/core/src/validate/rules/spec073.rs
sdk/core/src/validate/rules/spec074.rs
sdk/core/src/validate/rules/spec075.rs
sdk/core/src/validate/rules/spec076.rs
sdk/core/src/validate/rules/spec081.rs
sdk/core/src/validate/rules/visual_util.rs
sdk/core/src/visual.rs
sdk/core/tests/constraint_cases.rs
sdk/core/tests/fixtures/option-constraint-cases.json
sdk/core/tests/fixtures/platform-cascade/extensions/mode-sets/fixture.json
sdk/core/tests/fixtures/platform-cascade/extensions/relationships/fixture.json
sdk/core/tests/fixtures/platform-cascade/extensions/tokens/fixture.tokens.json
sdk/core/tests/fixtures/platform-cascade/manifest.json
sdk/core/tests/fixtures/recipe-lint-baseline.json
sdk/core/tests/fixtures/recipe-snapshots.json
sdk/core/tests/platform_cascade.rs
sdk/core/tests/recipe_lint_baseline.rs
sdk/core/tests/recipe_snapshots.rs
sdk/core/tests/relationship_states.rs
sdk/moon.yml
sdk/plugins/PLUGINS.md
sdk/plugins/figma/src/mapping.rs
sdk/plugins/figma/src/mapping/golden_tests.rs
sdk/plugins/figma/src/mapping/graph.rs
sdk/plugins/figma/src/mapping/names.rs
sdk/plugins/site/AGENTS.md
sdk/plugins/site/Cargo.toml
sdk/plugins/site/assets/AGENTS.md
sdk/plugins/site/assets/backend.js
sdk/plugins/site/assets/constraints.js
sdk/plugins/site/assets/index.html
sdk/plugins/site/assets/package.json
sdk/plugins/site/assets/spectrum-controls.js
sdk/plugins/site/assets/visual-runtime.js
sdk/plugins/site/controls/build.sh
sdk/plugins/site/controls/entry.js
sdk/plugins/site/src/lib.rs
sdk/wasm/ava.config.js
sdk/wasm/moon.yml
sdk/wasm/src/dataset.rs
sdk/wasm/test/constraints-parity.test.js
sdk/wasm/test/fixtures/visual-golden/action-button/all-on-dark-mobile.svg
sdk/wasm/test/fixtures/visual-golden/action-button/default.svg
sdk/wasm/test/fixtures/visual-golden/action-button/first-values-wireframe.svg
sdk/wasm/test/fixtures/visual-golden/badge/all-on-dark-mobile.svg
sdk/wasm/test/fixtures/visual-golden/badge/default.svg
sdk/wasm/test/fixtures/visual-golden/badge/first-values-wireframe.svg
sdk/wasm/test/fixtures/visual-golden/button/all-on-dark-mobile.svg
sdk/wasm/test/fixtures/visual-golden/button/default.svg
sdk/wasm/test/fixtures/visual-golden/button/first-values-wireframe.svg
sdk/wasm/test/fixtures/visual-golden/checkbox/all-on-dark-mobile.svg
sdk/wasm/test/fixtures/visual-golden/checkbox/default.svg
sdk/wasm/test/fixtures/visual-golden/checkbox/first-values-wireframe.svg
sdk/wasm/test/fixtures/visual-golden/switch/all-on-dark-mobile.svg
sdk/wasm/test/fixtures/visual-golden/switch/default.svg
sdk/wasm/test/fixtures/visual-golden/switch/first-values-wireframe.svg
sdk/wasm/test/render.test.js
sdk/wasm/test/visual-runtime-parity.test.js

@github-actions

Copy link
Copy Markdown
Contributor

🎨 Token Changes Report

Tokens Changed (0)

Original Branch: main


This comment was automatically generated by the token diff tool. 🤖

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

🧩 Component Schema Changes Report

Component Schemas Changed (0 added, 0 deleted, 6 updated)

Original Branch: main

✅ No Breaking Changes

This PR contains only non-breaking changes to component schemas.

🔄 Non-Breaking Updates

action-button

badge

button

checkbox

radio-button

switch


This diff was generated automatically and contains only backward-compatible changes.


This comment was automatically generated by the component schema diff tool. 🤖

test and others added 23 commits October 27, 2026 21:14
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds switch anatomy, color relationships, nested box layout, ring around a part,
and handle-only press target to the renderers (Rust + JS runtime).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Allow a single conditional entry per prop (when, relativeTo), add the
trackColor prop, and validate every recipe in design-data:validate.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…EC-060..063)

Add Layer 2 rules that check visuals/*.json against component and
relationship data, and a --visuals-path option on design-data validate.
Add the progress anatomy part to action-button and drop xs from the
button sizeScale.
… candidates

Rank candidates against the requested size instead of dropping those
pinned to another size, and cover it with a gap-by-size test.
…eout

root:ai-check failed because sdk/plugins/site and its assets package were
not in the inventory.

sdk-wasm:test timed out because the visual parity test builds the site
with the debug CLI at import time.
Add fuchsia-subtle background relationships, trim the non-semantic
background context string, default variant and style, and rename the
info variant to informative to match the registry, tokens, and Figma.
…kens

The badge relationships and recipe referenced the white and black palette
tokens deprecated in 15.6.0. Repoint them to transparent-static-white-1000
and transparent-static-black-1000, which have identical values.
The size M, L, and XL icon-only relationships pointed at accessory-item
padding (5, 7, 9px). Figma resolves 7, 10, and 13px, which is
base-padding-vertical, as size S already did.
Ignore .opencode/, opencode.jsonc and the beads gate lock file, which are local tooling.
Add the checkbox anatomy, the box and dash anatomy terms, and a recipe covering
size, selected, indeterminate, emphasized, disabled, and error.

The renderers draw checkmark and dash glyphs through a new recipe glyph field, and
size conditions now match the requested size instead of the default.
Read component constraints in sdk/core.
SPEC-064 (error) checks that constraint option names and values are declared.
SPEC-065 (warning) flags recipes and relationships that match only combinations
excluded by an error constraint.

Closes hb15.4, hb15.5.
… explain them

Evaluate component constraints in the browser (constraints.js, mirroring
constraints.rs), drop excluded matrix rows and columns, footnote advisory
cells, mark unsupported picker values, and explain unsupported selections
with one-click fixes. A shared fixture keeps the Rust and JS evaluations
in lockstep.
…ption conditions

Button static black/white now renders correctly (qkj5.43-.48): variant and
style conditions on static label, icon, fill and border rules, plus static
focus ring, disabled and outline hover/down rules.

The recipe renderers (sdk/core, site runtime) now match array values in
when.options, as the spec already described (qkj5.49).
SPEC-061 compared the whole array to the option's declared values, so
button.json's variant [primary, secondary] failed with 14 errors. Check each
element, for both the declared-values and boolean checks.
test added 17 commits October 30, 2026 23:50
Adds spec/artifact-moves.md and a platforms/README.md section with two worked examples.

SPEC-077, SPEC-078 and lifecycle.moves are proposed, not implemented.
…ga.8.7)

Design for letting a platform ship its own recipes: extensions/visuals,
replace precedence, a button-ios component with a button alias, SPEC-077 to 079,
loading across render, site and WASM, and a first iOS Button slice. Records the
scoped exception that lets platform-owned components bind tokens directly.
SPEC-077 and SPEC-078 are reserved elsewhere.
@GarthDB

GarthDB commented Nov 1, 2026

Copy link
Copy Markdown
Member Author

Closing in favor of the sliced PRs. This 97-commit PR was reviewed as seven slices into next/visual-recipes: #1575, #1576, #1577, #1578, #1579, #1580 and #1581. The final promotion PR is #1582, and it supersedes this one. Override fixes already released in #1573 are not repeated in the slices.

@GarthDB GarthDB closed this Nov 1, 2026
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.

1 participant