Repository navigation
Conversation
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 detectedLatest commit: 22b4570 The changes in this PR will be included in the next version bump. This PR includes changesets to release 15 packages
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 |
Contributor
Run report for 22b45707Total time: 8m 37s | Comparison time: 24m 33s | Estimated savings: 15m 55s (64.9% faster)
Expanded report
Changed files |
Contributor
🎨 Token Changes ReportTokens Changed (0)Original Branch: This comment was automatically generated by the token diff tool. 🤖 |
Contributor
🧩 Component Schema Changes ReportComponent Schemas Changed (0 added, 0 deleted, 6 updated)Original Branch: ✅ No Breaking ChangesThis PR contains only non-breaking changes to component schemas. 🔄 Non-Breaking Updatesaction-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. 🤖 |
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.
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.
This was referenced Oct 31, 2026
Merged
Merged
Merged
Member
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
spec/component-visuals.md,sdk/core/src/visual.rspackages/design-data/visuals/,relationships/sdk/plugins/site/spec/anatomy-format.md,sdk/core/src/validate/rules/--platformrendering, overrides, platform-owned recipes, artifact movesdocs/proposals/014-...md,spec/artifact-moves.md1. Format and renderer
spec/component-visuals.md(RFC) andcomponent-visual.schema.json. A recipe binds anatomy parts to tokens, withwhenconditions on options, states and modes.visual.rsresolves 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 WASMDatasetreuses compiled recipes across renders.design-data render <component>anddesign-data site --out <dir>.Dataset.renderSceneandrenderSvg, used as the parity oracle for the site's JS runtime.when.optionsvalues may be an array that matches any listed value, as the spec already said.2. Recipes and data
visuals/{action-button,badge,button,checkbox,switch}.json, plus anatomy in the matching component files.scope.optionspin 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.statepins the states a token applies to and replaces the token's ownname.state.Label,Progress,Hold icon, and so on) reference the same tokens as before.component-visuals.mdhas the authoring conventions. 103 duplicate relationship records now point at the mobile token.focus-indicator, per design. The token keepslegacyKey: focus-ring-gap.3. Explorer site (
sdk/plugins/site)sdk/plugins/figmavariable_names).sp-picker,sp-switch,sp-action-button,sp-status-light,sp-help-text). They are bundled intoassets/spectrum-controls.js(about 800 KB) bycontrols/build.sh, so the site stays static and self-contained.--platform <id>names the platform in the heading and lists unresolved bindings in a panel.docs/hub-prototypehas a local preview server and a README.4. Lints, anatomy and validation
recipe_lint_baseline). SPEC-064 and SPEC-065 validate option constraints. SPEC-072 flags a duplicated relationship whose token has a scale counterpart.spec/anatomy-format.mddefines what counts as an anatomy part and a review status (anatomyReview), applied to the five recipe components. Partstatesis renamedpresentInand rejected on required parts. SPEC-073 (info) lists components without reviewed anatomy, SPEC-074 checkspresentInstates are declared, SPEC-075 checks a recipe agrees with its anatomy.design-data anatomy-suggestproposes candidate parts for human review.5. Platforms
--platformfor render and site:design-data renderandsiteapply the Foundation to Platform cascade. SPEC-076 reports recipe bindings that do not resolve under a platform (validate --platform <id> --visuals-path). The WASMDataset.applyPlatformtakes a merged manifest.includewhitelist is gone, so iOS ships the full foundation minus wireframe.overriddenBy,overriddenFrom, held in memory and stripped from legacy output).spec/manifest.mdnow says so. The Figma export keeps an overridden token's other modes (it used to drop them).docs/proposals/014-platform-owned-visual-recipes.md): a platform can shipextensions/visuals/<component>.json, which replaces the foundation recipe of the same name, and acomponentAliasesmap (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).spec/artifact-moves.mddescribes 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 inrules.yaml), theplatform movecommand, 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, includingrecipe_snapshots(every option, state, size and color scheme of all five recipes), therecipe_lint_baselineratchet, 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 withVISUAL_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:validateandvalidate-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-recipesandroot:test-platform-recipes-guard: pass.moon run tokens:testand the legacy output tasks: passed. The no-platform output is byte-identical after every platform change.cargo clippy -D warningsandcargo fmt --checkon the touched crates: clean.--platform ios, with no console errors.node tools/changeset-linter/src/cli.js check --fail-on-warnings: passes.Screenshots (if appropriate):
Not attached yet.
Types of changes
Checklist: