Skip to content

InputNumber

Numeric input field with increment/decrement controls and value constraints.

import { InputNumber } from 'asterui'

Basic Input Number

Simple number input with increment/decrement controls.

import { InputNumber } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(0);
  
  return (
      <InputNumber value={value} onChange={setValue} />
    )
}

export default App

Min/Max Limits

Number input with minimum and maximum value constraints.

Value: 5 (min: 0, max: 10)
import { InputNumber, Space } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(5);
  
  return (
      <Space direction="vertical" size="sm">
        <InputNumber
          value={value}
          onChange={setValue}
          min={0}
          max={10}
        />
        <div className="text-sm text-base-content/70">
          Value: {value} (min: 0, max: 10)
        </div>
      </Space>
    )
}

export default App

Custom Step

Number input with custom increment/decrement step value.

Step: 5
import { InputNumber, Space } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(0);
  
  return (
      <Space direction="vertical" size="sm">
        <InputNumber
          value={value}
          onChange={setValue}
          step={5}
        />
        <div className="text-sm text-base-content/70">
          Step: 5
        </div>
      </Space>
    )
}

export default App

Decimal Precision

Number input with decimal precision control.

Precision: 2 decimal places
import { InputNumber, Space } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(0);
  
  return (
      <Space direction="vertical" size="sm">
        <InputNumber
          value={value}
          onChange={setValue}
          step={0.1}
          precision={2}
        />
        <div className="text-sm text-base-content/70">
          Precision: 2 decimal places
        </div>
      </Space>
    )
}

export default App

Sizes

Five sizes: xs, sm, md, lg, and xl.

import { InputNumber, Space } from 'asterui'
import { useState } from 'react'

function App() {
  const [value1, setValue1] = useState(0);
  const [value2, setValue2] = useState(0);
  const [value3, setValue3] = useState(0);
  const [value4, setValue4] = useState(0);
  const [value5, setValue5] = useState(0);
  
  return (
      <Space direction="vertical" size="sm">
        <InputNumber size="xs" value={value1} onChange={setValue1} />
        <InputNumber size="sm" value={value2} onChange={setValue2} />
        <InputNumber size="md" value={value3} onChange={setValue3} />
        <InputNumber size="lg" value={value4} onChange={setValue4} />
        <InputNumber size="xl" value={value5} onChange={setValue5} />
      </Space>
    )
}

export default App

Without Controls

Number input without increment/decrement buttons.

import { InputNumber } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(0);
  
  return (
      <InputNumber
        value={value}
        onChange={setValue}
        controls={false}
      />
    )
}

export default App

Disabled

Disabled input number state.

import { InputNumber, Space } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState(42);
  
  return (
      <Space direction="vertical" size="sm">
        <InputNumber value={value} onChange={setValue} />
        <InputNumber value={42} onChange={() => {}} disabled />
      </Space>
    )
}

export default App
PropertyDescriptionTypeDefault
valueCurrent number value (controlled)number-
defaultValueInitial value (uncontrolled)number-
onChangeCallback when value changes(value: number | null) => void-
minMinimum valuenumber-Infinity
maxMaximum valuenumberInfinity
stepValue increment/decrement stepnumber1
precisionDecimal precision for displaynumber-
formatterFormat display value(value: number | undefined) => string-
parserParse display value to number(displayValue: string) => number-
controlsShow increment/decrement buttonsbooleantrue
disabledDisabled statebooleanfalse
sizeInput size'xs' | 'sm' | 'md' | 'lg' | 'xl'-
blockFull width inputbooleanfalse
data-testidTest ID prefix for child elementsstring-
classNameAdditional CSS classesstring-
  • Uses role="spinbutton" with inputMode="decimal" for proper semantics
  • Exposes aria-valuemin, aria-valuemax, and aria-valuenow for screen readers
  • Increment/decrement buttons have aria-label for screen reader users
  • Disabled state is properly announced to screen readers
  • Focus states are clearly visible for keyboard navigation
  • Arrow keys can be used to increment/decrement values