TagInput holds an array rather than a string. Each entry renders as a chip that can be removed on its own, and typing a new one appends to the array.
Leave out value and the input keeps its own list, starting from defaultValue. onChange still receives every new array.
size="xxs" starts the field at 32px, the height of a size="s" Button. It grows as chips are added, like every size.
The tags are a list, each with a remove button named after its tag. Backspace in an empty field removes the last tag, and a polite live region says which; after a remove button is used, focus goes back to the field. labels translates the button names and the announcement.
Everything on Input — label, description, error, size, prefix, suffix — works here too.