Skip to main content

NumberField

A number input with increment/decrement buttons, built on Base UI’s NumberField primitive.

Base UI Primitive

Built on @base-ui/react/number-field

Import

import { NumberField } from "@soft-ui/react/number-field"

Usage

import { NumberField } from "@soft-ui/react/number-field"

export default function Example() {
  return (
    <NumberField.Root defaultValue={0} min={0} max={100}>
      <NumberField.Group>
        <NumberField.Decrement />
        <NumberField.Input />
        <NumberField.Increment />
      </NumberField.Group>
    </NumberField.Root>
  )
}

Components

NumberField.Root

size
's' | 'm' | 'l'
default:"'m'"
Control size.
  • s: 32px height
  • m: 36px height
  • l: 40px height
value
number
Controlled value.
defaultValue
number
Uncontrolled default value.
onValueChange
(value: number) => void
Callback fired when value changes.
min
number
Minimum value.
max
number
Maximum value.
step
number
default:"1"
Step increment/decrement amount.
largeStep
number
Step amount for Shift+Arrow keys.
disabled
boolean
Disables the number field.
required
boolean
Makes the field required.
name
string
Name attribute for form submission.
className
string
Additional CSS classes.
unsafeClassName
string
Escape hatch for structural overrides.

NumberField.Group

Container for input and buttons.
focusVisibleOnly
boolean
default:"true"
Only show focus ring on keyboard navigation.
className
string
Additional CSS classes.
unsafeClassName
string
Escape hatch for structural overrides.

NumberField.Input

className
string
Additional CSS classes.

NumberField.Increment

Button to increment value.
children
React.ReactNode
Custom icon. Defaults to plus icon.
className
string
Additional CSS classes.
unsafeClassName
string
Escape hatch for structural overrides.

NumberField.Decrement

Button to decrement value.
children
React.ReactNode
Custom icon. Defaults to minus icon.
className
string
Additional CSS classes.
unsafeClassName
string
Escape hatch for structural overrides.

NumberField.ScrubArea

Makes an element draggable to change value.
className
string
Additional CSS classes.

NumberField.ScrubAreaCursor

Custom cursor for scrub area.
className
string
Additional CSS classes.

Examples

Basic

import { NumberField } from "@soft-ui/react/number-field"

export default function Basic() {
  return (
    <NumberField.Root defaultValue={0} min={0} max={100}>
      <NumberField.Group>
        <NumberField.Decrement />
        <NumberField.Input />
        <NumberField.Increment />
      </NumberField.Group>
    </NumberField.Root>
  )
}

Sizes

import { NumberField } from "@soft-ui/react/number-field"

export default function Sizes() {
  return (
    <div className="flex flex-col gap-4">
      <NumberField.Root size="s" defaultValue={0}>
        <NumberField.Group>
          <NumberField.Decrement />
          <NumberField.Input />
          <NumberField.Increment />
        </NumberField.Group>
      </NumberField.Root>
      <NumberField.Root size="m" defaultValue={0}>
        <NumberField.Group>
          <NumberField.Decrement />
          <NumberField.Input />
          <NumberField.Increment />
        </NumberField.Group>
      </NumberField.Root>
      <NumberField.Root size="l" defaultValue={0}>
        <NumberField.Group>
          <NumberField.Decrement />
          <NumberField.Input />
          <NumberField.Increment />
        </NumberField.Group>
      </NumberField.Root>
    </div>
  )
}

With Constraints

import { NumberField } from "@soft-ui/react/number-field"

export default function WithConstraints() {
  return (
    <NumberField.Root 
      defaultValue={5} 
      min={0} 
      max={10} 
      step={0.5}
    >
      <NumberField.Group>
        <NumberField.Decrement />
        <NumberField.Input />
        <NumberField.Increment />
      </NumberField.Group>
    </NumberField.Root>
  )
}

With Scrub Area

import { NumberField } from "@soft-ui/react/number-field"

export default function WithScrubArea() {
  return (
    <NumberField.Root defaultValue={50}>
      <NumberField.ScrubArea>
        <span>Drag to adjust</span>
      </NumberField.ScrubArea>
      <NumberField.Group>
        <NumberField.Decrement />
        <NumberField.Input />
        <NumberField.Increment />
      </NumberField.Group>
    </NumberField.Root>
  )
}

Build docs developers (and LLMs) love