Ark Logo

Number Input

A field that allows user input of numeric values.

Anatomy

To set up the number input correctly, you'll need to understand its anatomy and how we name its parts.

Each part includes a data-part attribute to help identify them in the DOM.

Examples

Learn how to use the NumberInput component in your project. Let's take a look at the most basic example:

import { NumberInput } from '@ark-ui/react'

export const Basic = () => (
  <NumberInput.Root>
    <NumberInput.Label>Label</NumberInput.Label>
    <NumberInput.Input />
    <NumberInput.Control>
      <NumberInput.DecrementTrigger>-1</NumberInput.DecrementTrigger>
      <NumberInput.IncrementTrigger>+1</NumberInput.IncrementTrigger>
    </NumberInput.Control>
  </NumberInput.Root>
)

Setting a minimum and maximum value

Pass the min prop or max prop to set an upper and lower limit for the input. By default, the input will restrict the value to stay within the specified range.

Example not found

Adjusting the precision of the value

In some cases, you might need the value to be rounded to specific decimal points. Set the formatOptions and provide Intl.NumberFormatOptions such as maximumFractionDigits or minimumFractionDigits.

Example not found

Scrubbing the input value

The NumberInput supports the scrubber interaction pattern. To use this pattern, render the NumberInput.Scrubber component. It uses the Pointer lock API and tracks the pointer movement. It also renders a virtual cursor which mimics the real cursor's pointer.

import { NumberInput } from '@ark-ui/react'

export const Scrubber = () => (
  <NumberInput.Root>
    <NumberInput.Scrubber />
    <NumberInput.Label>Label</NumberInput.Label>
    <NumberInput.Input />
    <NumberInput.Control>
      <NumberInput.DecrementTrigger>-1</NumberInput.DecrementTrigger>
      <NumberInput.IncrementTrigger>+1</NumberInput.IncrementTrigger>
    </NumberInput.Control>
  </NumberInput.Root>
)

Using the mouse wheel to change value

The NumberInput exposes a way to increment/decrement the value using the mouse wheel event. To activate this, set the allowMouseWheel prop to true.

Example not found

Clamp value when user blurs the input

In most cases, users can type custom values in the input field. If the typed value is greater than the max, the value is reset to max when the user blur out of the input.

To disable this behavior, pass clampValueOnBlur and set to false.

Example not found

Usage within forms

To use the number input within forms, set the name prop.

Example not found

Format and parse value

To apply custom formatting to the input's value, set the formatOptions and provide Intl.NumberFormatOptions such as style and currency.

import { NumberInput } from '@ark-ui/react'

export const Formatted = () => (
  <NumberInput.Root
    formatOptions={{
      style: 'currency',
      currency: 'USD',
    }}
  >
    <NumberInput.Scrubber />
    <NumberInput.Label>Label</NumberInput.Label>
    <NumberInput.Input />
    <NumberInput.Control>
      <NumberInput.DecrementTrigger>-1</NumberInput.DecrementTrigger>
      <NumberInput.IncrementTrigger>+1</NumberInput.IncrementTrigger>
    </NumberInput.Control>
  </NumberInput.Root>
)

API Reference

Root

PropDefaultType
allowMouseWheel
boolean

Whether to allow mouse wheel to change the value

allowOverflowtrue
boolean

Whether to allow the value overflow the min/max range

asChild
boolean

Render as a different element type.

clampValueOnBlurtrue
boolean

Whether to clamp the value when the input loses focus (blur)

defaultValue
string

The initial value of the number input when it is first rendered. Use when you do not need to control the state of the number input.

disabled
boolean

Whether the number input is disabled.

focusInputOnChangetrue
boolean

Whether to focus input when the value changes

form
string

The associate form of the input element.

formatOptions
NumberFormatOptions

The options to pass to the `Intl.NumberFormat` constructor

id
string

The unique identifier of the machine.

ids
Partial<{ root: string label: string input: string incrementTrigger: string decrementTrigger: string scrubber: string }>

The ids of the elements in the number input. Useful for composition.

inputMode'decimal'
InputMode

Hints at the type of data that might be entered by the user. It also determines the type of keyboard shown to the user on mobile devices

invalid
boolean

Whether the number input value is invalid.

locale'en-US'
string

The current locale. Based on the BCP 47 definition.

max
number

The maximum value of the number input

min
number

The minimum value of the number input

name
string

The name attribute of the number input. Useful for form submission.

onFocusChange
(details: FocusChangeDetails) => void

Function invoked when the number input is focused

onValueChange
(details: ValueChangeDetails) => void

Function invoked when the value changes

onValueInvalid
(details: ValueInvalidDetails) => void

Function invoked when the value overflows or underflows the min/max range

pattern'[0-9]*(.[0-9]+)?'
string

The pattern used to check the <input> element's value against

readOnly
boolean

Whether the number input is readonly

spinOnPress
boolean

Whether to spin the value when the increment/decrement button is pressed

step
number

The amount to increment or decrement the value by

translations
IntlTranslations

Specifies the localized strings that identifies the accessibility elements and their states

value
string

The value of the input

Control

PropDefaultType
asChild
boolean

Render as a different element type.

DecrementTrigger

PropDefaultType
asChild
boolean

Render as a different element type.

IncrementTrigger

PropDefaultType
asChild
boolean

Render as a different element type.

Input

PropDefaultType
asChild
boolean

Render as a different element type.

Label

PropDefaultType
asChild
boolean

Render as a different element type.

Scrubber

PropDefaultType
asChild
boolean

Render as a different element type.

Previous

Menu