import { StatePanel } from "@elabs-ai/components-ui";npm install @elabs-ai/components-tokens @elabs-ai/components-uiPrompt 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 StatePanel 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 StatePanel up before writing code: `npx -y @elabs-ai/components-cli docs StatePanel` 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
Error
Error (custom title)
Loading
Loading (large spinner)
Empty (no icon, no actions)
Empty (with illustration)
#24 — the empty state gained a spot illustration slot beside title/description.
Empty (no-access illustration)
Error (with illustration)
#24 P0-2 — the error state carries the same illustration slot as empty.
API
StatePanel
| Prop | Type | Description |
|---|---|---|
kind | "empty" | "error" | "loading" | The visual/semantic kind of state. - `"empty"` — neutral "nothing here yet" (dashed border, surface bg). - `"error"` — recoverable failure (destructive border/bg, alert role). - `"loading"` — in-progress (spinner, status/live-region role). |
title | ReactNode | Heading text. |
description | ReactNode | Supporting description below the title. |
icon | ReactNode | Icon shown above the title, clamped to a uniform 40×40 so mismatched glyphs stay tidy. For `"error"` defaults to a built-in warning triangle. For `"loading"` defaults to an animated spinner. Ignored when `illustration` is also provided — see `illustration`. |
illustration | ReactNode | A larger illustration (one of `@elabs-ai/components-ui`'s shipped `*Illustration` components, or a consumer's own `ReactNode`) shown above the title instead of `icon`. Unlike `icon`, it is **not** clamped to 40×40 — an illustration governs its own size (see each illustration's `size` prop, `rem`-based, ~64px–160px). Takes precedence over `icon` when both are given. |
titleAs | "div" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | Heading level for the panel's title (#328 convention). Set this to the level that correctly follows whatever heading precedes this panel in the document outline — e.g. `"h3"` inside a `ChartCard` whose own title is an `<h2>`. @default "h3" |
loadingLabel | string | Accessible label for the spinner in loading state. @default "Loading…" |
size | "sm" | "md" | "lg" | Spinner size (loading kind only). @default "md" |
actions | ReactNode | Primary / secondary action buttons. |
className | string |