A text-input component