Number Field
A numeric input element with increment and decrement buttons, and a scrub area.
View as MarkdownAnatomy
Import the component and assemble its parts:
import { NumberField } from '@base-ui-components/react/number-field';
<NumberField.Root>
  <NumberField.ScrubArea>
    <NumberField.ScrubAreaCursor />
  </NumberField.ScrubArea>
  <NumberField.Group>
    <NumberField.Decrement />
    <NumberField.Input />
    <NumberField.Increment />
  </NumberField.Group>
</NumberField.Root>API reference
Root
Groups all parts of the number field and manages its state.
Renders a <div> element.
namestring
—
namestring
—- Name
 - Description
 Identifies the field when a form is submitted.
- Type
 string | undefined
defaultValuenumber
—
defaultValuenumber
—- Name
 - Description
 The uncontrolled value of the field when it’s initially rendered.
To render a controlled number field, use the
valueprop instead.- Type
 number | undefined
valuenumber | null
—
valuenumber | null
—- Name
 - Description
 The raw numeric value of the field.
- Type
 number | null | undefined
onValueChangefunction
—
onValueChangefunction
—- Name
 - Description
 Callback fired when the number value changes.
- Type
 | (( value: number | null, eventDetails: NumberField.Root.ChangeEventDetails, ) => void) | undefined
onValueCommittedfunction
—
onValueCommittedfunction
—- Name
 - Description
 Callback function that is fired when the value is committed. It runs later than
onValueChange, when:- The input is blurred after typing a value.
 - The pointer is released after scrubbing or pressing the increment/decrement buttons.
 
It runs simultaneously with
onValueChangewhen interacting with the keyboard.Warning: This is a generic event not a change event.
- Type
 | (( value: number | null, eventDetails: NumberField.Root.CommitEventDetails, ) => void) | undefined
localeIntl.LocalesArgument
—
localeIntl.LocalesArgument
—- Name
 - Description
 The locale of the input element. Defaults to the user's runtime locale.
- Type
 Intl.LocalesArgument
snapOnStepboolean
false
snapOnStepboolean
false
- Name
 - Description
 Whether the value should snap to the nearest step when incrementing or decrementing.
- Type
 boolean | undefined- Default
 false
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.Root.State, ) => CSSProperties | undefined) | undefined
stepnumber
1
stepnumber
1
- Name
 - Description
 Amount to increment and decrement with the buttons and arrow keys, or to scrub with pointer movement in the scrub area.
- Type
 number | undefined- Default
 1
smallStepnumber
0.1
smallStepnumber
0.1
- Name
 - Description
 The small step value of the input element when incrementing while the meta key is held. Snaps to multiples of this value.
- Type
 number | undefined- Default
 0.1
largeStepnumber
10
largeStepnumber
10
- Name
 - Description
 The large step value of the input element when incrementing while the shift key is held. Snaps to multiples of this value.
- Type
 number | undefined- Default
 10
minnumber
—
minnumber
—- Name
 - Description
 The minimum value of the input element.
- Type
 number | undefined
maxnumber
—
maxnumber
—- Name
 - Description
 The maximum value of the input element.
- Type
 number | undefined
allowWheelScrubboolean
false
allowWheelScrubboolean
false
- Name
 - Description
 Whether to allow the user to scrub the input value with the mouse wheel while focused and hovering over the input.
- Type
 boolean | undefined- Default
 false
formatIntl.NumberFormatOptions
—
formatIntl.NumberFormatOptions
—- Name
 - Description
 Options to format the input value.
- Type
 Intl.NumberFormatOptions | undefined
disabledboolean
false
disabledboolean
false
- Name
 - Description
 Whether the component should ignore user interaction.
- Type
 boolean | undefined- Default
 false
readOnlyboolean
false
readOnlyboolean
false
- Name
 - Description
 Whether the user should be unable to change the field value.
- Type
 boolean | undefined- Default
 false
requiredboolean
false
requiredboolean
false
- Name
 - Description
 Whether the user must enter a value before submitting a form.
- Type
 boolean | undefined- Default
 false
inputRefRef<HTMLInputElement>
—
inputRefRef<HTMLInputElement>
—- Name
 - Description
 A ref to access the hidden input element.
- Type
 React.Ref<HTMLInputElement> | undefined
idstring
—
idstring
—- Name
 - Description
 The id of the input element.
- Type
 string | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | ((state: NumberField.Root.State) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.Root.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
ScrubArea
An interactive area where the user can click and drag to change the field value.
Renders a <span> element.
direction'horizontal' | 'vertical'
'horizontal'
direction'horizontal' | 'vertical'
'horizontal'
- Name
 - Description
 Cursor movement direction in the scrub area.
- Type
 'horizontal' | 'vertical' | undefined- Default
 'horizontal'
pixelSensitivitynumber
2
pixelSensitivitynumber
2
- Name
 - Description
 Determines how many pixels the cursor must move before the value changes. A higher value will make scrubbing less sensitive.
- Type
 number | undefined- Default
 2
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.ScrubArea.State, ) => CSSProperties | undefined) | undefined
teleportDistancenumber
—
teleportDistancenumber
—- Name
 - Description
 If specified, determines the distance that the cursor may move from the center of the scrub area before it will loop back around.
- Type
 number | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | (( state: NumberField.ScrubArea.State, ) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.ScrubArea.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
ScrubAreaCursor
A custom element to display instead of the native cursor while using the scrub area.
Renders a <span> element.
This component uses the Pointer Lock API, which may prompt the browser to display a related notification. It is disabled in Safari to avoid a layout shift that this notification causes there.
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.ScrubAreaCursor.State, ) => CSSProperties | undefined) | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | (( state: NumberField.ScrubAreaCursor.State, ) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.ScrubAreaCursor.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
Group
Groups the input with the increment and decrement buttons.
Renders a <div> element.
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.Group.State, ) => CSSProperties | undefined) | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | ((state: NumberField.Group.State) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.Group.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
Decrement
A stepper button that decreases the field value when clicked.
Renders an <button> element.
nativeButtonboolean
true
nativeButtonboolean
true
- Name
 - Description
 Whether the component renders a native
<button>element when replacing it via therenderprop. Set tofalseif the rendered element is not a button (e.g.<div>).- Type
 boolean | undefined- Default
 true
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.Decrement.State, ) => CSSProperties | undefined) | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | (( state: NumberField.Decrement.State, ) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.Decrement.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
Input
The native input control in the number field.
Renders an <input> element.
aria-roledescriptionstring
'Number field'
aria-roledescriptionstring
'Number field'
- Description
 A string value that provides a user-friendly name for the role of the input.
- Type
 string | undefined- Default
 'Number field'
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.Input.State, ) => CSSProperties | undefined) | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | ((state: NumberField.Input.State) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.Input.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.
Increment
A stepper button that increases the field value when clicked.
Renders an <button> element.
nativeButtonboolean
true
nativeButtonboolean
true
- Name
 - Description
 Whether the component renders a native
<button>element when replacing it via therenderprop. Set tofalseif the rendered element is not a button (e.g.<div>).- Type
 boolean | undefined- Default
 true
styleReact.CSSProperties | function
—
styleReact.CSSProperties | function
—- Name
 - Type
 | React.CSSProperties | (( state: NumberField.Increment.State, ) => CSSProperties | undefined) | undefined
classNamestring | function
—
classNamestring | function
—- Name
 - Description
 CSS class applied to the element, or a function that returns a class based on the component’s state.
- Type
 | string | (( state: NumberField.Increment.State, ) => string | undefined)
renderReactElement | function
—
renderReactElement | function
—- Name
 - Description
 Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
Accepts a
ReactElementor a function that returns the element to render.- Type
 | ReactElement | (( props: HTMLProps, state: NumberField.Increment.State, ) => ReactElement)
data-disabled
Present when the number field is disabled.
data-readonly
Present when the number field is readonly.
data-required
Present when the number field is required.
data-valid
Present when the number field is in valid state (when wrapped in Field.Root).
data-invalid
Present when the number field is in invalid state (when wrapped in Field.Root).
data-dirty
Present when the number field's value has changed (when wrapped in Field.Root).
data-touched
Present when the number field has been touched (when wrapped in Field.Root).
data-filled
Present when the number field is filled (when wrapped in Field.Root).
data-focused
Present when the number field is focused (when wrapped in Field.Root).
data-scrubbing
Present while scrubbing.