Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
35f94a3
feat(design-data): add component visual recipe spec and pilot recipes
Oct 28, 2026
41fe33b
feat(sdk): render component visuals and add design-data-site plugin
Oct 28, 2026
e7d705e
docs: add hub prototype server and plugin index entry
Oct 28, 2026
bb2db84
feat(site): style specs overlay like the Hub prototype
Oct 28, 2026
8c280c3
feat(site): matrix rows from variant and style; drop badge isDisabled
Oct 28, 2026
f8874cf
docs: shorten changeset
Oct 28, 2026
5a5e125
docs: shorten changeset line
Oct 28, 2026
c99dda9
docs: shorten changeset line
Oct 28, 2026
b6f4580
fix(design-data): button gap uses size-keyed base-gap token
Oct 28, 2026
7ba709f
feat(visuals): add switch visual recipe
Oct 28, 2026
6704542
fix(visuals): enforce component-visual schema on recipes
Oct 28, 2026
14ee398
feat(design-data): validate visual recipes against component data (SP…
Oct 28, 2026
3dad64f
fix(design-data): follow the requested size when ranking relationship…
Oct 28, 2026
ff67f19
fix(ci): register site plugin in AI inventory and raise wasm test tim…
Oct 28, 2026
293ffab
fix(design-data): badge data fixes found by visual rendering
Oct 28, 2026
4cf2a3f
fix(design-data): badge label colors use active static white/black to…
Oct 28, 2026
ea265e5
fix(design-data): button icon-only padding uses base-padding-vertical
Oct 28, 2026
9c795d8
chore: ignore local OpenCode setup
Oct 28, 2026
ff717c9
feat(visuals): add checkbox visual recipe
Oct 28, 2026
4a33785
docs(ai): add beads-jira-sync skill and document sprint handling
Oct 29, 2026
a819de9
feat(design-data-spec): add option constraints to the component format
Oct 29, 2026
7cec58b
chore(docs): ignore .awesome in hub-prototype
Oct 29, 2026
db57df8
feat(sdk): validate option constraints (SPEC-064, SPEC-065)
Oct 29, 2026
429f75c
feat(site): skip error-excluded option combinations in the matrix and…
Oct 29, 2026
6bbfb5c
fix(design-data): scope Button static color recipe and accept array o…
Oct 29, 2026
ab21731
fix(sdk): validate each element of an array option condition (SPEC-061)
Oct 29, 2026
1ab04b2
fix(design-data): strip 'S2 ' prefix from checkbox relationship contexts
Oct 29, 2026
de85f51
docs(ai): require --parent epic on new beads so work rolls up to an i…
Oct 29, 2026
09936a2
fix(design-data): checkbox relationship contexts and error/disabled b…
Oct 29, 2026
9601ad6
fix(sdk): scale nested parts with the pressed target
Oct 29, 2026
46f1225
docs(design-data): document that switch isReadOnly has no visual
Oct 29, 2026
41383db
fix(design-data): scope selected relationships with isSelected, not s…
Oct 29, 2026
bd7a769
feat(design-data): lint visual recipes for coverage and conventions
Oct 29, 2026
635ab6c
feat(design-data): bind badge through option-scoped relationships
Oct 29, 2026
ab95b1f
feat(design-data): move button and action-button non-color bindings t…
Oct 29, 2026
91ba69b
feat(sdk): count a relationship's scope.options.state as a state of i…
Oct 29, 2026
7f43958
feat(design-data): bind button and action-button colours through opti…
Oct 29, 2026
70b9668
feat(design-data): bind the press max-perspective token through a rel…
Oct 29, 2026
867d1c8
feat(design-data): bind the action-button hold-icon inset through a r…
Oct 29, 2026
f4c324d
refactor(design-data): name the focus indicator anatomy focus-indicat…
Oct 29, 2026
a356625
chore: tighten the changeset
Oct 29, 2026
510756e
feat(design-data): bind button's static focus indicator colors throug…
Oct 30, 2026
5f51c2b
fix(design-data): point the second duplicate relationship at the mobi…
Oct 30, 2026
5c38e34
feat(validate): add SPEC-072 for duplicated relationships with a scal…
Oct 30, 2026
d4f4b59
feat(design-data): bind button and action-button progress colors thro…
Oct 30, 2026
506dbe1
feat(site): build the control panel from Spectrum Web Components and …
Oct 30, 2026
bd06dcc
feat(site): show the current selection with Spectrum status light, he…
Oct 30, 2026
b75256c
feat(site): pan, zoom, fit and full screen for the component stage
Oct 30, 2026
13c555c
fix(site): make anatomy and token labels readable, accessible and cen…
Oct 30, 2026
ca93d1d
feat(site): compact anatomy labels by default with a large-label toggle
Oct 30, 2026
12ef196
test(wasm): derive visual parity coverage from recipe and component data
Oct 30, 2026
255fe6b
test(wasm): cache site build and add golden SVGs for visual parity
Oct 31, 2026
95d4240
refactor(sdk): split visual renderer into compile and solve
Oct 31, 2026
f017753
perf(wasm): reuse compiled visual recipes across Dataset renders
Oct 31, 2026
d81cefc
chore: add changeset for faster WASM visual renders
Oct 31, 2026
be069b5
chore: wrap changeset lines
Oct 31, 2026
f1137ab
docs(spec): define anatomy parts, add part states and anatomyReview
Oct 31, 2026
e846cb9
feat(data): review button anatomy against the anatomy definition
Oct 31, 2026
865f290
feat(data): review action-button anatomy against the anatomy definition
Oct 31, 2026
c0a2227
feat(data): review badge anatomy against the anatomy definition
Oct 31, 2026
086fc60
feat(data): review checkbox anatomy against the anatomy definition
Oct 31, 2026
4771093
feat(data): review switch anatomy against the anatomy definition
Oct 31, 2026
dc4f413
fix(site): show state-only parts such as the focus indicator in the a…
Oct 31, 2026
a693ccd
feat(spec): add SPEC-073 info report for components without reviewed …
Oct 31, 2026
2f8072b
feat(sdk): paint flowed boxes so checkbox and switch drop the control…
Oct 31, 2026
d30e294
feat(sdk): add anatomy-suggest to propose candidate anatomy parts for…
Oct 31, 2026
aeb0a8c
feat(spec): rename anatomy part states to presentIn and reject it on …
Oct 31, 2026
d29b45b
refactor(sdk): share state-name normalization as state_ids
Oct 31, 2026
e007ab1
feat(spec): add SPEC-074 warning for undeclared anatomy presentIn states
Oct 31, 2026
b3c4201
test(sdk): load visuals from conformance datasets
Oct 31, 2026
34fb221
feat(spec): add SPEC-075 warning when a recipe and its anatomy disagr…
Oct 31, 2026
7053383
test(spec): add conformance fixtures for the visual recipe rules
Oct 31, 2026
a473eaa
test(spec): add a conformance fixture for SPEC-059
Oct 31, 2026
5ece8a9
feat(spec): make SPEC-074 and SPEC-075 errors
Oct 31, 2026
f28fb38
test(core): audit the platform manifest cascade with a fixture platform
Oct 31, 2026
45f5eef
feat(cli): apply the platform cascade in render and site
Oct 31, 2026
53257c4
feat(wasm): render through a platform manifest with applyPlatform
Oct 31, 2026
9c96eb3
chore: add changeset for platform-aware rendering
Oct 31, 2026
b068629
fix(platforms): ship the full foundation on iOS, drop the include whi…
Oct 31, 2026
60a6526
feat(core): add SPEC-076 to check recipe bindings resolve under a pla…
Oct 31, 2026
332ccd2
test(cli): cover SPEC-076 through validate --platform
Oct 31, 2026
cdd7609
build: add root:validate-platform-recipes moon task
Oct 31, 2026
53a14d0
test(cli): use a fixture platform for the render warning, add changeset
Oct 31, 2026
c646f95
test(core): pin override field preservation and provenance (p6ga.8.9)
Oct 31, 2026
bbb4274
fix(core): keep all fields and record provenance when a manifest over…
Oct 31, 2026
ac5845e
style(core): cargo fmt
Oct 31, 2026
7bd60e1
fix(core): keep override provenance out of legacy output
Oct 31, 2026
89a6018
docs(spec): an override replaces the foundation record and records pr…
Oct 31, 2026
13bb410
docs(spec): add artifact moves process (promote and demote)
Oct 31, 2026
674130a
fix(figma): keep an overridden token's other modes in the export
Oct 31, 2026
0391d74
docs(proposals): platform-owned visual recipes and the iOS Button (p6…
Oct 31, 2026
6e74196
docs(proposals): renumber the platform recipe rules to SPEC-079 to 081
Oct 31, 2026
c87ec4c
ci: fail the platform recipe guard on SPEC-079
Oct 31, 2026
606a351
docs(spec): platform-owned visual recipes, componentAliases and SPEC-…
Oct 31, 2026
b76c4cf
feat(core): load platform extensions/visuals into graph.visuals with …
Oct 31, 2026
b48f508
feat(core): componentAliases, canonical_component and SPEC-081
Oct 31, 2026
22b4570
chore(changeset): wrap long lines in figma-export-override-modes
Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .ai/inventory.json
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,24 @@
"llms": false,
"summary": "Figma variables import, export, and diff plugin."
},
{
"path": "sdk/plugins/site",
"kind": "crate",
"audience": "consumer",
"lifecycle": "active",
"published": false,
"llms": false,
"summary": "Static component explorer site generator."
},
{
"path": "sdk/plugins/site/assets",
"kind": "package",
"audience": "consumer",
"lifecycle": "active",
"published": false,
"llms": false,
"summary": "Browser assets (HTML and visual runtime) embedded by the site generator."
},
{
"path": "sdk/tui",
"kind": "package",
Expand Down
62 changes: 62 additions & 0 deletions .ai/skills/beads-jira-sync/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
name: beads-jira-sync
description: >-
Syncs beads issues to the Jira DNA project with import-beads.js from the standalone
beads-jira-import repo. Covers dry-run, state-file backup, live sync, initiative labels on
epics, and bead/Jira key lookup. Use for the weekly beads to Jira sync, linking an epic to a
DNA initiative, or finding the Jira key for a bead id.
---

<!-- Copyright 2026 Adobe. All rights reserved. -->

# Beads → Jira sync

`import-beads.js` lives in the local `beads-jira-import` checkout (no remote; extracted from `adobe-mcp-servers` `src/corp-jira/scripts/`). Fix bugs in the TypeScript source and rebuild `dist/` before a live sync. Below, `$BJI` is that checkout (e.g. `~/Projects/beads-jira-import`).

## Safety rules

* **Never run `--help`.** Unknown flags are ignored and the script falls through to a LIVE sync.
* Safe modes: `--lookup <ids>`, `--dry-run`, `--discover`. Check the argument parser before using any other flag.
* Always `--dry-run` first, and back up `$BJI/scripts/beads-jira-map.json` before a live sync.
* Known issue: `--dry-run` can fail with ENOBUFS when the beads export exceeds 1 MiB (bead `cr71`).
* Known issue: nested epics with both a parent and an initiative label overwrite the same Parent Link field (bead `vd61`).

## Weekly sync

1. `bd dolt pull` so the export is current.
2. Back up state: `cp -f $BJI/scripts/beads-jira-map.json $BJI/scripts/beads-jira-map.json.bak`.
3. Dry run: `node $BJI/dist/scripts/import-beads.js --dry-run`. Review the preview with the user.
4. After approval, run live: `node $BJI/dist/scripts/import-beads.js`.
5. Report created/updated issues and any diagnostics.

## Sprints

The sync assigns sprints itself (`operations/sprints.ts`): closed beads go to the sprint containing their close date, `in_progress` beads go to the active sprint, open beads stay in the backlog. Jira rejects adds to closed sprints, so beads closed in an already-closed sprint are skipped. The board is the project's first scrum board, or `BEADS_JIRA_BOARD_ID`. Open and close sprints in Jira first so the active sprint is the current one.

## Initiative linking

New beads get `bd create --parent <epic>`. Work with no labeled ancestor epic never reaches an initiative or a status update. The sync prints the count of beads closed in the last 30 days with no initiative; reparent them with `bd update <id> --parent <epic>`. Environment and personal-tooling tasks (MCP config, local TUI setup) are exempt.

Only **Epics** link to Initiatives, through the `initiative:DNA-XXXX` label. One initiative per epic; omit the label if none fits.

* New epic: `bd create -t epic -l initiative:DNA-XXXX ...`
* Existing epic: `bd label add <epic-id> initiative:DNA-XXXX`

Initiatives:

| Key | Theme |
| -------- | -------------------------------------- |
| DNA-1522 | Adaptive support per platform |
| DNA-1520 | Multi-platform governance |
| DNA-1516 | Metrics |
| DNA-1740 | Per-platform usage baselines |
| DNA-1741 | Connect Web/iOS/Android to design data |
| DNA-1747 | AI-authored Spectrum 2 code |
| DNA-1748 | Documentation |
| DNA-1796 | Design data authoring |

## Lookup

`node $BJI/dist/scripts/import-beads.js --lookup <bead-id or DNA-key>`

Ad hoc Jira work (not bulk sync) uses the `corp-jira` MCP server tools.
24 changes: 24 additions & 0 deletions .changeset/anatomy-definition-and-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
"@adobe/design-data-spec": minor
"@adobe/spectrum-design-data": patch
"@adobe/design-data-wasm": patch
---

Define what an anatomy part is and review the first five components against it.

**Spec:**

- `anatomy-format.md` says what counts as a part, how to name and nest parts, when a part
is required, and what is not anatomy. It adds a review checklist.
- New optional `presentIn` lists the states a part is present in. Not allowed on a required part.
- New optional `anatomyReview` on a component records `draft` or `reviewed`.
- New info rule SPEC-073 lists components with relationships but no anatomy, or draft anatomy.
- New error SPEC-074: a part's `presentIn` states must be declared on the component.
- New error SPEC-075: a recipe's `visibleWhen.states` must agree with the part's `presentIn`.

**Data:**

- Button, action-button and badge anatomy are reviewed.
- Button `label` is now optional. The focus indicator is state-only on all four.

**WASM:** the validator includes SPEC-073 to SPEC-075.
11 changes: 11 additions & 0 deletions .changeset/artifact-moves.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@adobe/design-data-spec": minor
---

Add the artifact-moves chapter: promoting and demoting one artifact between a platform
and the foundation.

- **spec/artifact-moves.md**: what can move, who decides, promotion criteria, the six steps,
the demotion notice period (same as deprecation), and proposed `lifecycle.moves` provenance.
- **Proposed, not implemented**: rule SPEC-077 `artifact-single-owner` for half-finished moves.
- **spec/index.md, spec/manifest.md**: link to the new chapter.
12 changes: 12 additions & 0 deletions .changeset/button-static-color-recipe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@adobe/spectrum-design-data": patch
---

Fix the Button visual recipe for static color black and white.

- **label/icon**: static colors apply to primary and secondary; accent and negative stay white.
- **accent/negative fill**: backgrounds require `style: fill`, so outline no longer gets a fill.
- **focus ring**: static color uses transparent black or white 1000.
- **disabled**: static color uses overlay 100 fill, 300 border and 400 content.
- **hover/down**: static outline background is overlay 100; static border ignores gray hover.
- **static outline border**: primary 800, secondary 300.
24 changes: 24 additions & 0 deletions .changeset/checkbox-relationship-context-prefix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
"@adobe/spectrum-design-data": patch
"@adobe/design-data-spec": minor
"@adobe/design-data-wasm": minor
---

Recipe lints and fixes for checkbox, switch and others; pressed scale includes nested parts.

- **relationships**: strip the stray "S2 " prefix from contexts; add checkbox `Control`,
disabled and error contexts; scope selected switch and radio-button records with
`isSelected: true` (the schema allows boolean option values, the renderer maps them).
- **visuals**: pressed parts scale nested children; checkbox `pressTarget`; `notVisual` option list.
- **validate**: SPEC-066 to SPEC-070 warn on uncovered options and states, token selectors a
relationship covers, literals, deprecated tokens and focus ring names; SPEC-071 is info.
SPEC-072 flags a duplicated relationship whose token has a scale counterpart.
`recipe_lint_baseline` holds each recipe at its current warning count.
- **spec**: authoring conventions in `component-visuals.md`; `notVisual` recipe field.
- **relationships**: `scope.options` pick a default or the most specific override (arrays allowed);
badge colors, padding and fonts bind that way, shrinking its recipe by 1,600 lines.
`scope.options.state` adds states to the bound token.
- **button, action-button**: colors, press perspective, hold-icon inset bind via relationships;
a render snapshot test covers every recipe; 103 duplicate records point at mobile tokens.
- **focus-indicator**: the `focus-ring` anatomy, gap token and recipe parts are now
`focus-indicator` (legacy key `focus-ring-gap` kept).
23 changes: 23 additions & 0 deletions .changeset/component-visual-recipes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
"@adobe/spectrum-design-data": minor
"@adobe/design-data-spec": minor
"@adobe/design-data-wasm": minor
---

Add a draft component visual recipe format for rendering to SVG, PNG, and Figma.

- **spec/component-visuals.md**: draft RFC and schema; `design-data:validate` checks recipes.
- **action-button**: pilot recipe `visuals/action-button.json`; adds `progress`, `isPending`.
- **sdk (core, cli)**: `render` makes SVG; `compile_recipe` pre-binds tokens.
- **sdk/wasm**: `Dataset.renderScene` and `Dataset.renderSvg` render recipes in the browser.
- **button**: `visuals/button.json` recipe (variant, style, state, static color); `down` state.
- **spec and renderers**: container `stroke`, `relativeTo: "height"` radius, pressed scale-down.
- **badge**: `visuals/badge.json` recipe, anatomy; drops the unused `isDisabled` option.
- **renderers and site**: per-corner radius props, font weight names to numbers, label presence.
- **sdk/plugins/site**: `design-data site --out <dir>` writes a static explorer (no WASM).
- **sdk/plugins/figma**: `variable_names` maps tokens to Figma variable names offline.
- **sdk/core**: scene token refs carry alias `chain`; press tokens are tracked.
- **switch**: `visuals/switch.json` recipe, anatomy, `hideLabel`, and 15 color relationships.
- **sdk/core, site**: nested box layout, `around` ring, `pressTarget`, component-scoped sizes.
- **spec rules**: SPEC-060..063 check recipes against components (`validate --visuals-path`).
- **checkbox**: `visuals/checkbox.json` recipe, anatomy, `box`/`dash` terms; `glyph` draws marks.
12 changes: 12 additions & 0 deletions .changeset/figma-export-override-modes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@adobe/design-data-tui": patch
---

Fix `design-data figma export --platform` dropping the other colour-scheme modes of an
overridden token.

- An override record carries `manifest.json` as its file, so the exporter grouped it apart from
its light and dark siblings and let it replace the whole variable.
- Overrides now group with their foundation siblings; the three iOS seafoam tokens keep their
dark value.
- Exports without `--platform` are unchanged.
14 changes: 14 additions & 0 deletions .changeset/flowed-box-paints.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@adobe/design-data-spec": patch
"@adobe/spectrum-design-data": patch
"@adobe/design-data-wasm": patch
---

A box placed directly in a row now paints itself, so checkbox and switch no longer need a
render-only `control` part.

- Renderer and JS runtime read `fill`, `stroke` and `strokeWidth` on a flowed box.
- Checkbox and switch drop `control`. The box and the track carry the size and hold the marks
and the handle. Rendered geometry, colors and press scale are unchanged.
- Relationships that named `control` now name `box` (checkbox) or `track` (switch).
- Checkbox and switch anatomy are now reviewed.
14 changes: 14 additions & 0 deletions .changeset/option-constraints-matrix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@adobe/design-data-wasm": patch
---

The component explorer (`design-data site`) now honors option constraints.

- **Matrix:** combinations excluded by an `error` constraint are not rendered, and rows or columns
left empty are dropped. A note under the grid says what was left out and why, with the fix.
`advisory` combinations render with a footnote saying they have no distinct design.
- **Pickers:** values that lead to an unsupported combination read "(not supported)", and a status
message under the pickers explains the current selection, with one-click fixes.
- **Zoom view:** an unsupported selection shows the explanation instead of a render.
- **sdk/plugins/site:** new `constraints.js` mirrors `sdk/core/src/constraints.rs`; a shared
fixture keeps the Rust and JS evaluations in lockstep.
13 changes: 13 additions & 0 deletions .changeset/option-constraints-rules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@adobe/design-data-spec": minor
"@adobe/design-data-wasm": minor
---

Validate option constraints in the Rust SDK.

- **SPEC-064** (error, Layer 2): every option name and value in a constraint's `when` / `require`
must be declared in the component's `options`. Silent when an option has no `values` list.
- **SPEC-065** (warning, Layer 2): a visual recipe rule or relationship `scope.options` that
matches only combinations excluded by an `error` constraint.
- **sdk/core**: new `constraints` module reads `component.constraints` into a typed model.
- Conformance fixtures for both rules under `conformance/{valid,invalid}`.
11 changes: 11 additions & 0 deletions .changeset/option-constraints.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@adobe/design-data-spec": minor
"@adobe/spectrum-design-data": minor
---

Add `constraints` to the component format: if-then rules that limit valid option combinations.

- **spec/option-constraints.md**: `when` / `require` / `severity` (`error` or `advisory`).
- **component.schema.json**: optional `constraints` array. Layer 1 checks shape only; Layer 2
checks names and values.
- **button, action-button, checkbox**: first constraints, taken from react-spectrum S2.
22 changes: 22 additions & 0 deletions .changeset/platform-override-keeps-fields.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
"@adobe/design-data-spec": patch
"@adobe/design-data-wasm": patch
---

A platform manifest override now keeps every field of the record it replaces.

**Spec:**

- `manifest.md` `overrides` now says what the code already did: the override replaces the
foundation record for that platform's graph (same key and uuid).
- `query` returns one record per token.
- Defines the in-memory markers `overriddenBy` and `overriddenFrom`. Legacy output omits them.

**Core and WASM:**

- An override no longer drops `$schema`, `$valueType`, `lifecycle`, `description` or
`conceptId`. It changes only `value` or `$ref`.
- A replaced record carries `overriddenBy` (`{platform}` or `{manifest}`) and
`overriddenFrom` (the foundation value, kept even after several overrides).
- Output with no platform is unchanged. With the iOS manifest, the three teal overrides
now keep their `$schema`, `uuid` and `private` fields.
23 changes: 23 additions & 0 deletions .changeset/platform-recipe-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
"@adobe/design-data-spec": minor
"@adobe/design-data-tui": patch
"@adobe/design-data-wasm": patch
---

Check that visual recipes still resolve under a platform manifest.

**Spec:**

- New warning SPEC-076: every token or relationship binding a recipe resolves on the foundation
must also resolve once the platform manifest's cascade is applied.
- New conformance fixture `invalid/SPEC-076`.

**CLI:**

- `design-data validate --platform <id> --visuals-path <dir>` runs SPEC-076 and names each binding
the platform drops. It reuses the render scene diagnostics.

**Platforms:**

- The iOS manifest no longer carries an `include` whitelist. It shipped only a few properties,
which dropped the height, padding, font-size and icon-size tokens recipes bind.
22 changes: 22 additions & 0 deletions .changeset/platform-recipes-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
"@adobe/design-data-spec": minor
"@adobe/design-data-tui": patch
"@adobe/design-data-wasm": patch
---

Load platform-owned visual recipes and add `componentAliases`.

**Spec:**

- `manifest.schema.json` accepts `componentAliases` (string to string).
- New error SPEC-081: an alias key must be a foundation component, its target must be declared in
the platform's `extensions/components/`, aliases must not chain or cycle, and a key must not
also be replaced there. New conformance fixture `invalid/SPEC-081`.

**SDK core:**

- A platform's `extensions/visuals/<component>.json` loads into `graph.visuals` with
`layer: Platform` and replaces the foundation recipe of the same name. A bad fragment or a
file name that differs from `component` is an error naming the file.
- `TokenGraph::canonical_component` returns the alias target under the active platform. Render,
site and WASM do not call it yet.
14 changes: 14 additions & 0 deletions .changeset/platform-recipes-spec-text.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@adobe/design-data-spec": minor
---

Spec text for platform-owned visual recipes (planned, not yet enforced).

* `component-visuals.md`: platform recipes in `extensions/visuals/` replace the
foundation recipe whole; SPEC-079 and SPEC-080.
* `manifest.md`: capability-matrix rows, the `extensions/visuals/` entry and the
planned `componentAliases` field (SPEC-081).
* `artifact-moves.md`: a platform recipe moves with its component and alias.
* `rules.yaml`: adds SPEC-079 (warning, an error one minor version later),
SPEC-080 (info) and SPEC-081 (error), all marked planned. SPEC-077 and 078
stay reserved by `artifact-moves.md`.
18 changes: 18 additions & 0 deletions .changeset/render-platform-cascade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
"@adobe/design-data-wasm": minor
"@adobe/design-data-tui": patch
---

Render component visuals through a platform manifest.

- `design-data render` and `design-data site` accept the global `--platform <id>` (or
`DESIGN_DATA_PLATFORM` / `default_platform`) and apply the Foundation to Platform cascade
before building scenes: tokens are filtered and overridden, and extension components,
relationships and tokens are layered in.
- A recipe binding that does not resolve under a platform is reported as
`warning: platform '<id>': ...`. The site lists these in a panel instead of drawing nothing.
- The site writes the platform into `data.json` and names it in the nav heading
("Foundation" when none is selected).
- WASM: `Dataset.applyPlatform(manifest)` applies a manifest with its `extensions` merged
inline, so `renderScene` and `renderSvg` render a platform build.
- With no platform selected, output is unchanged.
12 changes: 12 additions & 0 deletions .changeset/visual-recipe-array-conditions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@adobe/design-data-spec": patch
"@adobe/design-data-wasm": patch
"@adobe/spectrum-design-data": patch
---

Recipe `when.options` conditions now accept an array of values, as the spec already described.

- **sdk/core, site runtime**: an array matches when any value matches and counts as one condition.
- **SPEC-061**: checks each element of an array condition against the option's declared values.
- **spec**: component-visuals states that an array counts as one condition.
- **button**: static color rules for primary and secondary share one entry with `variant: [...]`.
8 changes: 8 additions & 0 deletions .changeset/wasm-visual-compile-solve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@adobe/design-data-wasm": patch
---

Speed up `Dataset.renderScene` and `Dataset.renderSvg` by compiling each recipe once per
component, size and mode and reusing it. Repeated renders are 30 to 55 times faster
(button 6.5 to 0.21 ms, badge 5.0 to 0.11 ms, switch 7.8 to 0.14 ms). Scene and SVG output
are unchanged.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sdk/plugins/site/assets/spectrum-controls.js linguist-generated=true -diff
7 changes: 7 additions & 0 deletions .github/scripts/fixtures/platform-recipes-clean.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"errors": [{ "rule_id": "SPEC-081", "file": "m", "message": "bad alias" }],
"warnings": [
{ "rule_id": "SPEC-080", "file": "x", "message": "replaces" },
{ "rule_id": "SPEC-066", "file": "y", "message": "z" }
]
}
Loading
Loading