TextInput
A single line of text, with a real terminal cursor.
import { TextInput } from '@textui/widgets';
<TextInput label="Name" value="" onChange={(value) => console.log(value)} />
Props
| Prop | Type | Default | |
| — | — | — | — |
| value | string | required | |
| onChange | (value: string) => void | | |
| onSubmit | (value: string) => void | | |
| placeholder | string | | |
| label | string | | |
| hideLabel | boolean | | Keep the label as the field’s name but do not draw it inside the field - for a form or a dialog that already shows it beside or above the input. |
| mask | string | | Replace every character, for secrets. |
| maxLength | number | | Stop accepting input past this many characters. |
| autoFocus | boolean | | |
| search | boolean | | Draw a search glyph before the field. |
| focusId | string | | A stable focus id, so a command can send the reader here by name. Without one a control’s id is derived from its instance, which nothing outside the render can know - so “focus the filter” has nothing to name and the key that would do it cannot be written. |
| onEdge | (edge: 'start' \| 'end') => void | | The caret tried to leave the field. A single-line input answers left and right itself right up to the ends, so a caller that wants those keys past the ends cannot have them from a key handler - the field takes the key and reports nothing. This is how it reports: the palette drills into a command’s choices on right, and the path picker goes up a folder on left. TextArea has had this from the start; the two controls disagreeing is what left both of those keys silently doing nothing. |
Plus everything on BoxProps.
Role: textbox.
It publishes a real cursor position when the terminal has a cursor, so the caret is where typing lands rather than a drawn approximation. That means counting the label and any glyph before it, and scrolling the value sideways to keep the caret in view on a field narrower than its contents.
hideLabel keeps the label as the field’s accessible name without drawing it, for a form or a dialog that already shows it.
focusId is worth setting. Without one the focus id is derived from the instance, which nothing outside the render can know - so a command meaning “focus the filter” has nothing to name.
See also
- Editing keys and selection - the keys, the selection and the clipboard
- The clipboard - copy and paste belong to the terminal
- TextArea - more than one line
- SearchBox - the same field with a glyph and a count
- Field - label, hint and validation around it