Compose a WordPress Design System interface
Classify before searching
- State the user-visible behaviour, minimum runtime and package versions,
rendering owner, runtime document, and whether each Design System dependency
is bundled or externalized.
- Inspect the changed surface and its nearest same-surface precedent once.
- Choose the narrowest path:
- Lightweight: keep an existing supported component when behaviour,
styling, and document setup do not change.
- Standard: select or compose a public component or token.
- Deep: handle custom UI, a package migration, or another rendering
document such as an iframe, popup, or portal.
Do not reopen component selection on the lightweight path. Verify the existing
contract, make the narrow change, and stop.
Select for the behaviour
When selection is material, write the required interaction contract before
choosing a component. Follow the maintained recommendation sources and
target-version checks in
Working with WordPress Design System packages,
then verify the selected public API in the deployed runtime or installed
version, as applicable.
Choose the smallest public composition that owns exactly the required
behaviour. Do not turn a trigger into a menu, dialog, or state owner merely
because a nearby precedent does. Stop searching when one recommended option
satisfies the behaviour and setup.
Apply conditional setup
- For custom UI, first establish why public composition is insufficient.
- For a migration, preserve observable interaction, styling, accessibility,
and compatibility.
- For a separate document, read the
cross-package document setup guidance
before editing. Make a short per-document ledger for the packages actually
used: static styles, runtime-injected styles, root theming, and overlays.
Mark each applicable requirement verified or blocked; do not add setup for a
package that does not render there.
For a planning task with no concrete host file or state owner, keep the plan
actionable under explicit assumptions. When the request names a target, inspect
that exact target; do not silently plan against another package or active
equivalent. Treat missing context as a verification gap; block only when it
prevents a safe behaviour or API decision.
Use the linked public documentation for API and setup facts. Do not copy its
component mappings, token inventory, or implementation recipes into this
skill.
Finish
Exercise the changed interaction and run focused checks. Before declaring
completion, recheck the behaviour contract and every rendering document.
Report unresolved setup or parity evidence as blocked rather than silently
omitting it.
If no public API meets the need, document the unmet behaviour and affected
consumers. Route package work to design-system-contribution in a local
Gutenberg checkout; otherwise request an upstream Design System change.
1---2name: design-system-ui-composition3description: Use when building or changing a Gutenberg feature, plugin interface, or standalone application UI with public `@wordpress/components`, `@wordpress/ui`, or `@wordpress/theme` APIs, including when the code does not yet use the Design System; do not use to change package source or depend on package-private implementation details.4---56# Compose a WordPress Design System interface78## Classify before searching9101. State the user-visible behaviour, minimum runtime and package versions,11 rendering owner, runtime document, and whether each Design System dependency12 is bundled or externalized.132. Inspect the changed surface and its nearest same-surface precedent once.143. Choose the narrowest path:15 - **Lightweight:** keep an existing supported component when behaviour,16 styling, and document setup do not change.17 - **Standard:** select or compose a public component or token.18 - **Deep:** handle custom UI, a package migration, or another rendering19 document such as an iframe, popup, or portal.2021Do not reopen component selection on the lightweight path. Verify the existing22contract, make the narrow change, and stop.2324## Select for the behaviour2526When selection is material, write the required interaction contract before27choosing a component. Follow the maintained recommendation sources and28target-version checks in29[Working with WordPress Design System packages](../../../docs/contributors/design/design-system-packages.md#choose-a-recommended-component),30then verify the selected public API in the deployed runtime or installed31version, as applicable.3233Choose the smallest public composition that owns exactly the required34behaviour. Do not turn a trigger into a menu, dialog, or state owner merely35because a nearby precedent does. Stop searching when one recommended option36satisfies the behaviour and setup.3738## Apply conditional setup3940- For custom UI, first establish why public composition is insufficient.41- For a migration, preserve observable interaction, styling, accessibility,42 and compatibility.43- For a separate document, read the44 [cross-package document setup guidance](../../../docs/contributors/design/design-system-packages.md#setup-depends-on-the-document)45 before editing. Make a short per-document ledger for the packages actually46 used: static styles, runtime-injected styles, root theming, and overlays.47 Mark each applicable requirement verified or blocked; do not add setup for a48 package that does not render there.4950For a planning task with no concrete host file or state owner, keep the plan51actionable under explicit assumptions. When the request names a target, inspect52that exact target; do not silently plan against another package or active53equivalent. Treat missing context as a verification gap; block only when it54prevents a safe behaviour or API decision.5556Use the linked public documentation for API and setup facts. Do not copy its57component mappings, token inventory, or implementation recipes into this58skill.5960## Finish6162Exercise the changed interaction and run focused checks. Before declaring63completion, recheck the behaviour contract and every rendering document.64Report unresolved setup or parity evidence as blocked rather than silently65omitting it.6667If no public API meets the need, document the unmet behaviour and affected68consumers. Route package work to `design-system-contribution` in a local69Gutenberg checkout; otherwise request an upstream Design System change.