Stepper
Atom
Increment, decrement, or type a number in a bounded range. A − button, an editable numeric center field, and a + button, controlled by value and clamped to min / max by step. This is the ± numeric control (the iOS UIStepper idiom); for a multi-step progress indicator see Steps.
Playground
Every control sets a real prop of StepperProps. The JSX below updates as you go.
Web
iOS
Android
JSX · StepperProps
Variants
6 examples from src/atoms/stepper/stepper.md, each rendered live from its own JSX.
Sizes
States
Hover, focus and press are pinned so they can be compared side by side; the rest are real props.
Anatomy
1
Decrement
2
Value
3
Increment
4
Label
Dimmed parts appear only in some states or variants.
Props
16 props on StepperProps, grouped as they are declared in source. Required props are marked *.
Accessibility and keyboard
Keyboard
ArrowUp
Increments
ArrowDown
Decrements
Home
End
Minimum · maximum
Semantics
Roles
button
States
disabled
ARIA on web
aria-describedby
aria-disabled
aria-label
aria-labelledby
aria-required
Below the platform minimum, the touch area grows to 44 pt on iOS and 48 dp on Android without moving the layout.
From the docs
Pass label to title the control from above, description for a secondary line under it, and required to mark it: the label takes a decorative destructive star, and a screen reader hears the control as required, from aria-required on the web's numeric field and from its name ("Quantity, required") on iOS and Android.
Platform skins
The playground's props on each platform: same tree, native shapes, type and touch sizes.
Usage
On the web the control is one 40 px box (32 small, 48 large) at the control corner with square ± cells and the value in the mono face; on iOS the capsule [ − | + ] pill with the value to its left; on Android Material 3's outlined circular icon buttons around the value.
Tokens
Read from the playground render. Values follow the scheme and the ion hue.
--fd
--fm
--ft
--ln2
--sf2
--tx2