Demo
Usage
Import the TextField
component and styles and provide a label
for accessibility/usability.
import { TextField } from '@aws-amplify/ui-react';
export const DefaultTextFieldExample = () => <TextField label="Name" />;
Accessibility / Label behavior
import { Button, Flex, TextField } from '@aws-amplify/ui-react';
export const TextFieldAccessibilityExample = () => {
return (
<Flex>
<TextField label="Search" labelHidden={true} />
<Button>Search</Button>
</Flex>
);
};
Sizes
TextField sizes are designed to match styling of other field components such as Buttons. There are three sizes: small, (default), and large.
import { Flex, TextField } from '@aws-amplify/ui-react';
export const TextFieldSizeExample = () => {
return (
<Flex direction="column">
<TextField label="Small" size="small" width="50%" />
<TextField label="Default" width="75%" />
<TextField label="Large" size="large" width="100%" />
</Flex>
);
};
Variations
There are two variation styles available: default and quiet
.
import { TextField } from '@aws-amplify/ui-react';
export const TextFieldVariationExample = () => {
return (
<>
<TextField label="Default" />
<TextField label="Quiet" variation="quiet" />
</>
);
};
Outer components
Compose field components such as Button
and Select
at the start or end of an TextField input using the outerStartComponent
or outerEndComponent
props.
import { Button, Flex, TextField } from '@aws-amplify/ui-react';
export const TextFieldOuterComponentsExample = () => (
<Flex gap="1rem" direction="column">
<TextField label="Start" outerStartComponent={<Button>Start</Button>} />
<TextField
label="Start and End"
outerStartComponent={<Button>Start</Button>}
outerEndComponent={<Button>End</Button>}
/>
<TextField label="End" outerEndComponent={<Button>End</Button>} />
<TextField
label="Multiple End"
outerEndComponent={
<>
<Button>End</Button>
<Button>End</Button>
</>
}
/>
<TextField
label="Multiple Start"
outerStartComponent={
<>
<Button>Start</Button>
<Button>Start</Button>
</>
}
/>
</Flex>
);
Inner components (icons)
Compose FieldGroupIcon
or FieldGroupIconButton
components inside TextField input using innerStartComponent and innerEndComponent.
To create an interactive icon button, use the FieldGroupIconButton
component. To add an icon that's not interactive, use FieldGroupIcon
component.
Note: When clicked, FieldGroupIcon
will focus the field, whereas the FieldGroupIconButton
will trigger its onClick
event.
import {
Flex,
FieldGroupIcon,
FieldGroupIconButton,
TextField,
} from '@aws-amplify/ui-react';
import { MdInfo, MdSearch } from 'react-icons/md';
export const TextFieldInnerComponentsExample = () => (
<Flex gap="1rem" direction="column">
<TextField
label="Start and End"
innerStartComponent={
<FieldGroupIcon ariaLabel="">
{/** Accessibility tip: pass empty ariaLabel for decorative icons. */}
<MdInfo />
</FieldGroupIcon>
}
innerEndComponent={
<FieldGroupIconButton
ariaLabel="Search"
variation="link"
onClick={() => alert('😎')}
>
<MdSearch />
</FieldGroupIconButton>
}
/>
</Flex>
);
You can also both inner and outer components together
import {
Button,
Flex,
FieldGroupIcon,
FieldGroupIconButton,
TextField,
} from '@aws-amplify/ui-react';
import { MdInfo, MdSearch } from 'react-icons/md';
export const TextFieldOuterAndInnerComponentsExample = () => (
<Flex gap="1rem" direction="column">
<TextField
label="Start and End inner and outer components"
outerStartComponent={<Button>Start</Button>}
outerEndComponent={<Button>End</Button>}
innerStartComponent={
<FieldGroupIcon ariaLabel="">
{/** Accessibility tip: pass empty ariaLabel for decorative icons. */}
<MdInfo />
</FieldGroupIcon>
}
innerEndComponent={
<FieldGroupIconButton
ariaLabel="Search"
variation="link"
onClick={() => alert('😎')}
>
<MdSearch />
</FieldGroupIconButton>
}
/>
</Flex>
);
Descriptive text
To provide additional descriptive text of requirements of the field, use the descriptiveText
field:
Password length must be greater than 8 characters
import { Text, TextField, View } from '@aws-amplify/ui-react';
export const TextFieldDescriptiveTextExample = () => {
return (
<View width="100%">
<TextField
type="password"
label="Password"
descriptiveText={
<Text
as="span"
color="purple.60"
fontStyle="italic"
fontSize="0.8rem"
>
Password length must be greater than 8 characters
</Text>
}
/>
</View>
);
};
States
The available TextField states include isDisabled
and isReadOnly
. A disabled field will be not be focusable not mutable and will not be submitted with form data. A readonly field cannot be edited by the user.
import { Flex, TextField } from '@aws-amplify/ui-react';
export const TextFieldStatesExample = () => {
return (
<Flex direction="column" gap="1rem">
<TextField label="Disabled" defaultValue="Disabled" isDisabled={true} />
<TextField
label="Readonly"
defaultValue="You can't edit me!"
isReadOnly={true}
/>
</Flex>
);
};
Required fields
Use the isRequired
prop to specify a required field.
import { Button, Flex, TextField } from '@aws-amplify/ui-react';
export const DefaultRequiredTextFieldExample = () => {
return (
<Flex as="form" direction="column" width="20rem">
<TextField label="Email" type="email" isRequired={true} />
<Button type="submit">Submit</Button>
</Flex>
);
};
There is no default styling for required fields. Customize the label
or descriptiveText
to instruct the form user of the required field.
import { Button, Flex, Text, TextField } from '@aws-amplify/ui-react';
export const RequiredTextFieldExample = () => {
return (
<Flex as="form" direction="column" width="20rem">
<TextField
label={
<Text>
Email
<Text as="span" fontSize="0.8rem" color="red">
{' '}
(required)
</Text>
</Text>
}
type="email"
isRequired={true}
/>
<TextField
label="Password"
type="password"
descriptiveText={
<Text as="span" fontSize="0.8rem" color="red" fontStyle="italic">
Required
</Text>
}
isRequired={true}
/>
<Button type="submit">Submit</Button>
</Flex>
);
};
Validation error styling
Use the hasError
and errorMessage
props to mark a TextField as having a validation error.
import { TextField } from '@aws-amplify/ui-react';
import * as React from 'react';
export const TextFieldValidationErrorExample = () => {
const [hasError, setHasError] = React.useState(true);
const validateUsername = (e) => {
const containsDigit = /\d/.test(e.currentTarget.value);
setHasError(!containsDigit);
};
return (
<TextField
label="Username"
hasError={hasError}
errorMessage="Username must include at least one digit"
onChange={validateUsername}
/>
);
};
Event handlers
TextField provides several event handlers: onSelect
, onInput
, onChange
, onCopy
, onPaste
, and onCut
. Open the console to interact with the demo below.
import { TextField } from '@aws-amplify/ui-react';
export const TextFieldEventHandlersExample = () => (
<TextField
label="Event handlers"
onSelect={(e) => console.info('onSelect fired:', e.currentTarget.value)}
onInput={(e) => console.info('onInput fired:', e.currentTarget.value)}
onChange={(e) => console.info('onChange fired:', e.currentTarget.value)}
onCopy={(e) => console.info('onCopy fired:', e.currentTarget.value)}
onPaste={(e) => console.info('onPaste fired:', e.currentTarget.value)}
onCut={(e) => console.info('onCut fired:', e.currentTarget.value)}
/>
);
Standard HTML attributes
The TextField
will accept any of the standard HTML attributes that a <input>
element accepts.
Standard <input>
attributes can be found in the MDN Documentation
<TextField
label="Name"
placeholder="Galadriel"
name="name"
/>
CSS Styling
Theme
You can customize the appearance of all TextField components in your application with a Theme.
TextField Theme Source
import { TextField, ThemeProvider, Theme } from '@aws-amplify/ui-react';
const theme: Theme = {
name: 'textfield-theme',
tokens: {
components: {
textfield: {
color: { value: '{colors.blue.90}' },
_focus: {
borderColor: { value: '{colors.blue.40}' },
},
},
},
},
};
export const TextFieldThemeExample = () => (
<ThemeProvider theme={theme} colorMode="light">
<TextField label="Name" />
</ThemeProvider>
);
Target classes
Class | Description |
---|---|
amplify-textfield | Top level element that wraps the TextField primitive |
--amplify-components-textfield-border-color
--amplify-components-textfield-color
--amplify-components-textfield-focus-border-color
--amplify-components-textfield-font-size
Global styling
To override styling on all TextField primitives, you can set the Amplify CSS variables with the built-in .amplify-textfield
class.
/* styles.css */
.amplify-textfield {
--amplify-components-fieldcontrol-border-color: rebeccapurple;
}
Local styling
To override styling on a specific TextField, you can use a class selector or style props.
Using a class selector:
/* styles.css */
.custom-textfield-class .amplify-input {
border-radius: 0;
}
Using style props:
All style props will be applied to the Flex
wrapper of the TextField
. To style the input
of the TextField
, you can pass a inputStyles
prop with the style props you want to apply to the input.
import { Text, TextField, useTheme } from '@aws-amplify/ui-react';
export const TextFieldStylePropsExample = () => {
const { tokens } = useTheme();
return (
<>
<TextField
label={
<Text
fontWeight={tokens.fontWeights.bold}
fontSize={tokens.fontSizes.xl}
>
Name:
</Text>
}
padding="xl"
border={`1px solid ${tokens.colors.primary[60]}`}
/>
<TextField
label="Special Field"
inputStyles={{
backgroundColor: 'primary.10',
border: `1px solid ${tokens.colors.primary[60]}`,
}}
/>
</>
);
};