import { GatesBand } from "@elabs-ai/components-marketing";npm install @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-marketingPaste it into Claude Code, Cursor, Codex or any other coding agent. Text in [brackets] is yours to fill in.
Add the brand-ui GatesBand component (from @elabs-ai/components-marketing) 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 GatesBand up before writing code: `npx -y @elabs-ai/components-cli docs GatesBand` prints its real props, variants, what it pairs with and what to avoid. 3. If @elabs-ai/components-marketing is not installed yet: `pnpm add @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-marketing` (or `npm install @elabs-ai/components-tokens @elabs-ai/components-ui @elabs-ai/components-marketing`). 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
Count From Generated
The header count comes from `counts.json.gates`, independent of how many rows are shown.
With Footer
Unknown Category
An unlisted category falls back to its own slug — never invented.
Disclosure Opens
Every group is a native `<details>`/`<summary>` disclosure, closed by default (#587) — the category and its count are always visible; Enter/Space (or a click) reveals its rules, with no JavaScript involved. `flex` on the summary removes the native marker, so a CSS-drawn chevron is the visible cue: it points to the inline end while closed and turns down once open, and the label lifts to `foreground` on hover and while open. Backtick runs in a doc render as real `<code>`, never literal backticks.
API
GatesBand
| Prop | Type | Description |
|---|---|---|
gatesrequired | readonly GatesBandGate[] | Every gate to render, already carrying its real `category` — grouping never re-categorises. |
countrequired | number | The header count. Passed separately from `gates.length` (`counts.json.gates`) so the header can never silently drift if a caller ever filters the list. |
categoryLabels | Record<string, string> | Category slug → display label (e.g. `{ stories: "Stories" }`); an unlisted category falls back to its own slug, never invented. |
formatGroupSummary | (count: number) => string | Formats a group's visible rule count next to its category label. Defaults to `defaultFormatGroupSummary` ("34 rules"). |
labels | Partial<GatesBandLabels> | |
footer | ReactNode | A footnote the host renders under the grid (e.g. a link to `docs/GATES.md` on GitHub) — this component embeds no URL of its own. |
className | string |