Skip to main content

SpecPlayground

Display

A live spec editor: JSON on the left, what it renders on the right (stacked below 1024 px).

import { SpecPlayground } from "@elabs-ai/components-ui";
Install
npm install @elabs-ai/components-tokens @elabs-ai/components-ui

Skipping the @source line is the most common first failure: Tailwind does not scan node_modules, so every component renders unstyled. The one-time wiring

Prompt for your coding agent

Paste it into Claude Code, Cursor, Codex or any other coding agent. Text in [brackets] is yours to fill in.

Add the brand-ui SpecPlayground component (from @elabs-ai/components-ui) to this project.

1. Read https://elabs-ai.com/llms.txt first: it maps every package and the rules. If you can use MCP servers, connect https://elabs-ai.com/mcp and use its search, docs and tokens tools. If not, run the same lookups in the terminal: `npx -y @elabs-ai/components-cli search "<what you need>"` and `npx -y @elabs-ai/components-cli docs <Component>`.
2. Look SpecPlayground up before writing code: `npx -y @elabs-ai/components-cli docs SpecPlayground` prints its real props, variants, what it pairs with and what to avoid.
3. If @elabs-ai/components-ui is not installed yet: `pnpm add @elabs-ai/components-tokens @elabs-ai/components-ui` (or `npm install @elabs-ai/components-tokens @elabs-ai/components-ui`). If this is the first brand-ui package in the project, wire it once: import `@elabs-ai/components-tokens/styles.css` plus the `themes/light.css` and `themes/dark.css` stylesheets in the CSS entry, add one Tailwind `@source` line per installed @elabs-ai package (Tailwind does not scan node_modules, so without it everything renders unstyled), and wrap the app root in `ThemeProvider` from `@elabs-ai/components-tokens`.
4. Use it here: [the screen or file, and what it should show]
5. Rules: use only @elabs-ai/components-* components and the semantic tokens — no raw colours, no raw font sizes, no arbitrary Tailwind values. Look up each component's real props with the docs tool before you use it; never guess a prop.
6. Done means: the typecheck passes, `npx -y @elabs-ai/components-cli audit src --strict` reports nothing, and you have opened the app and looked at every screen you touched in the light and the dark theme.

Examples

5 live examples

Edit Error Fix

Break the spec, see the validator’s error and the last valid render; fix it again.

Parse Error

Text that is not JSON: a parse-error chip and no render yet.

Invalid

Valid JSON the validator rejects, with nothing valid seen yet.

Load Example

The examples menu replaces the editor text.

API

SpecPlayground

PropTypeDescription
valuestringThe JSON text (controlled).
defaultValuestringInitial JSON text (uncontrolled); also what `Reset` restores. Default: the first example.
onChange(value: string) => voidCalled with the new text on every edit, example load and reset.
validaterequired(json: unknown) => SpecPlaygroundValidation<TSpec>Checks the parsed JSON; the errors shown are exactly the ones it returns.
renderrequired(spec: TSpec) => ReactNodeRenders a validated spec.
examplesreadonly SpecPlaygroundExample[]Entries of the `Load example` menu (the menu is hidden without any).
editorReactNodeThe editor. Bind it to `value`/`onChange` yourself. Default: a `Textarea`, so the playground works without a code editor.
onErrorSelect(error: SpecPlaygroundError, line: number | undefined) => voidCalled when an error is chosen, with the editor line its path resolves to — move a custom editor's caret there. The default textarea handles this itself.
debounceMsnumberMilliseconds between the last edit and validation. Default 250.
labelsPartial<SpecPlaygroundLabels>

Also accepts: Omit< HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" >