import { BoundedNumber } 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 BoundedNumber 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 BoundedNumber up before writing code: `npx -y @elabs-ai/components-cli docs BoundedNumber` 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
With Value
Custom Empty Label
Type Then Clear
Typing a value and clearing it back: focusing hides the label so the field reads as truly empty while editing, and blurring an empty field restores the label (the value round-trips to `null`, never 0 or the max).
Disabled
API
BoundedNumber
| Prop | Type | Description |
|---|---|---|
emptyLabel | ReactNode | Content shown in place of the value when the field is empty (`null`) and not focused — e.g. "No limit" for a capped setting with no cap set. Defaults to "No limit". |
value | number | null | Controlled value. Pass `null` to represent an empty state. |
defaultValue | number | null | Uncontrolled default value. |
onValueChange | (value: number | null) => void | Called when the numeric value changes. |
min | number | Minimum allowed value. |
max | number | Maximum allowed value. |
step | number | Step increment/decrement amount (default 1). |
clamp | boolean | When true (default), the value is clamped to [min, max] on blur. Clamping does NOT happen per-keystroke — only on blur. |
formatOptions | Intl.NumberFormatOptions | Intl.NumberFormat options used to format the displayed value. |
placeholder | string | Placeholder text for the underlying input. |
disabled | boolean | Whether the input is disabled. |
readOnly | boolean | Whether the input is read-only. |
name | string | Name attribute forwarded to the underlying <input>. |
id | string | id attribute forwarded to the underlying <input>. |