NumberInput is Input for numbers. It adds stepper controls and clamps what can be typed, so the value reaching onChange is already a number within range — no parsing, no NaN.
The field follows its value prop after mount, so a number changed somewhere else (an undo, a reset, a drag on a timeline) shows up in it. There is no need to remount it with a key. It does not rewrite what the user is typing: a partial entry such as - or 1. stays as typed until it reads as a number.
size="xxs" draws a 32px field, the height of a size="s" Button. Two steppers stacked in it would get 15px each, so at this size they sit side by side, down then up.
Everything on Input — label, description, error, size, prefix, suffix — works here too.