Input & TextArea

Single-line and multi-line text inputs with web-first API

Input and TextArea use web-standard form APIs and translate them to React Native behavior on iOS and Android.

Installation

Input is already installed in tamagui, or you can install it independently:

yarn add @tamagui/input

Usage

A single-line text input:

import { Input } from 'tamagui'
export default () => <Input placeholder="Enter text..." size="md" />

For multi-line text input, use TextArea:

import { TextArea } from 'tamagui'
export default () => <TextArea placeholder="Enter long text..." rows={4} />

Web-first API

The v2 Input uses standard HTML input attributes.

Input types

Use the standard HTML type attribute. On native, these automatically map to the appropriate keyboard and behavior:

// Password input
<Input type="password" />
// Email input (shows email keyboard on native)
<Input type="email" />
// Phone number (shows phone pad on native)
<Input type="tel" />
// Number input (shows numeric keyboard on native)
<Input type="number" />
// URL input
<Input type="url" />
// Search input
<Input type="search" />

Cross-platform mapping:

Web typeNative behavior
passwordsecureTextEntry={true}
emailkeyboardType="email-address"
telkeyboardType="phone-pad"
numberkeyboardType="numeric"
urlkeyboardType="url"
searchinputMode="search"
Web type
password
Native behavior
secureTextEntry={true}
Web type
email
Native behavior
keyboardType="email-address"
Web type
tel
Native behavior
keyboardType="phone-pad"
Web type
number
Native behavior
keyboardType="numeric"
Web type
url
Native behavior
keyboardType="url"
Web type
search
Native behavior
inputMode="search"

Enter key behavior

Use enterKeyHint to control the enter/return key label on virtual keyboards:

<Input enterKeyHint="search" />
<Input enterKeyHint="send" />
<Input enterKeyHint="done" />
<Input enterKeyHint="go" />
<Input enterKeyHint="next" />

On native, this automatically maps to returnKeyType.

Form attributes

Standard HTML form attributes work:

<Input name="email" placeholder="Enter email" required maxLength={100} minLength={3} pattern="[a-z@.]+" autoComplete="email" autoFocus readOnly={false} disabled={false} />

Events

Use standard web events:

<Input onChange={(e) => console.log(e.target.value)} onFocus={(e) => console.log('focused')} onBlur={(e) => console.log('blurred')} onKeyDown={(e) => { if (e.key === 'Enter') { // handle enter } }} />

For convenience, onChangeText is still supported but deprecated:

// Deprecated - use onChange instead
<Input onChangeText={(text) => setText(text)} />
// Preferred
<Input onChange={(e) => setText(e.target.value)} />

Submit handling

To handle form submission on enter:

<Input onSubmitEditing={(e) => { console.log('Submitted:', e.nativeEvent.text) }} />

Styling

Input accepts all Tamagui style props and supports the size prop for consistent scaling:

<Input size="md" borderWidth={2} borderColor="border-color hover:border-color-hover focus:border-color-focus" borderRadius="4" backgroundColor="background" color="color" placeholderTextColor="placeholder-color" selectionColor="accent-color" />

Native-only props

Some props only apply on native platforms and have no web equivalent:

keyboardAppearance (iOS): Controls the keyboard color scheme on iOS:

<Input keyboardAppearance="dark" />
<Input keyboardAppearance="light" />
<Input keyboardAppearance="default" />

textContentType (iOS): Provides hints for iOS autofill:

<Input textContentType="emailAddress" />
<Input textContentType="password" />
<Input textContentType="newPassword" />
<Input textContentType="oneTimeCode" />
<Input textContentType="telephoneNumber" />
<Input textContentType="username" />

For web autofill, use the standard autoComplete attribute instead.

Cross-platform text behavior

These props work on both web and native with automatic value conversion:

autoCorrect

Controls automatic spelling correction:

// Boolean values (work everywhere)
<Input autoCorrect={false} />
<Input autoCorrect={true} />
// String values (web-style, converted on native)
<Input autoCorrect="off" />
<Input autoCorrect="on" />

autoCapitalize

Controls automatic text capitalization. Native values provide more granular control:

// Native-style values (recommended - work everywhere)
<Input autoCapitalize="none" /> // No capitalization
<Input autoCapitalize="sentences" /> // Capitalize first letter of sentences
<Input autoCapitalize="words" /> // Capitalize first letter of each word
<Input autoCapitalize="characters" /> // Capitalize all characters
// Web-style values (mapped on native)
<Input autoCapitalize="off" /> // Maps to "none" on native
<Input autoCapitalize="on" /> // Maps to "sentences" on native

Migration from v1

If you’re migrating from v1 Input, here are the key changes:

v1 (React Native style)v2 (Web style)
secureTextEntrytype="password"
keyboardType="email-address"type="email"
keyboardType="phone-pad"type="tel"
keyboardType="numeric"type="number"
keyboardType="url"type="url"
returnKeyType="search"enterKeyHint="search"
editable={false}readOnly or disabled
onChangeTextonChange
multilineUse TextArea or rows > 1
numberOfLinesrows
v1 (React Native style)
secureTextEntry
v2 (Web style)
type="password"
v1 (React Native style)
keyboardType="email-address"
v2 (Web style)
type="email"
v1 (React Native style)
keyboardType="phone-pad"
v2 (Web style)
type="tel"
v1 (React Native style)
keyboardType="numeric"
v2 (Web style)
type="number"
v1 (React Native style)
keyboardType="url"
v2 (Web style)
type="url"
v1 (React Native style)
returnKeyType="search"
v2 (Web style)
enterKeyHint="search"
v1 (React Native style)
editable={false}
v2 (Web style)
readOnly or disabled
v1 (React Native style)
onChangeText
v2 (Web style)
onChange
v1 (React Native style)
multiline
v2 (Web style)
Use TextArea or rows > 1
v1 (React Native style)
numberOfLines
v2 (Web style)
rows

The v1 props still work but are deprecated. We recommend updating to the web-standard props for better cross-platform consistency.

API reference

Input props

Accepts all HTML <input> attributes plus Tamagui style props.

Props

  • size

    'xs' | 'sm' | 'md' | 'lg' | 'xl' | SizeTokens

    Scale the input size consistently.

  • type

    "text" | "password" | "email" | "tel" | "number" | "url" | "search"

    HTML input type. Automatically maps to native keyboard types.

  • enterKeyHint

    "enter" | "done" | "go" | "next" | "previous" | "search" | "send"

    Hint for the enter key label. Maps to returnKeyType on native.

  • placeholderTextColor

    ColorTokens

    Color of placeholder text. Accepts Tamagui color tokens.

  • selectionColor

    ColorTokens

    Color of text selection. Accepts Tamagui color tokens.

  • onSubmitEditing

    (e: { nativeEvent: { text: string } }) => void

    Called when enter/return is pressed.

  • keyboardAppearance

    "default" | "light" | "dark"

    iOS only. Controls keyboard color scheme.

  • textContentType

    string

    iOS only. Hints for autofill. Use autoComplete for web.

  • TextArea props

    Accepts all Input props plus:

    Props

  • rows

    number

    Number of visible text lines.