Number Field
A numeric input with increment and decrement buttons.
import { Label } from '@/components/ui/label';
import { NumberField, NumberFieldGroup } from '@/components/ui/number-field';
export default function NumberFieldDemo() {
return (
<NumberField defaultValue={5} min={0} max={100}>
<Label>
Quantity
<NumberFieldGroup />
</Label>
</NumberField>
);
}
Install
npx shadcn@latest add @madeui/number-field
Usage
import { NumberField, NumberFieldGroup } from '@/components/ui/number-field';
Composition
<NumberField defaultValue={5} min={0} max={100}>
<NumberFieldGroup />
</NumberField>
NumberFieldGroup renders decrement / input / increment by default; pass children to compose them yourself (NumberFieldDecrement, NumberFieldInput, NumberFieldIncrement).
Min, max, and step
import { Label } from '@/components/ui/label';
import { NumberField, NumberFieldGroup } from '@/components/ui/number-field';
export default function NumberFieldMinMaxStep() {
return (
<NumberField defaultValue={20} min={0} max={100} step={5}>
<Label>
Volume
<NumberFieldGroup />
</Label>
</NumberField>
);
}
Formatted
Pass format (Intl.NumberFormatOptions) to display the value as currency, a percentage, or any other Intl.NumberFormat style.
import { Label } from '@/components/ui/label';
import { NumberField, NumberFieldGroup } from '@/components/ui/number-field';
export default function NumberFieldFormatted() {
return (
<NumberField
defaultValue={49.99}
min={0}
step={1}
format={{ style: 'currency', currency: 'USD' }}
>
<Label>
Price
<NumberFieldGroup />
</Label>
</NumberField>
);
}
API reference
Built on Base UI Number Field. All props are forwarded to the Base UI Root (value, min, max, step, format, snapOnStep, …); see the Base UI Number Field API reference. NumberFieldScrubArea / NumberFieldScrubAreaCursor are re-exported unstyled for pointer-scrubbing labels. Every part accepts a style prop (StyleXStyles, merged last).