Demo
Usage
Import the TextAreaField component and styles and provide a label for accessibility/usability.
import { TextAreaField } from '@aws-amplify/ui-react';
export const DefaultTextAreaExample = () => {
return (
<TextAreaField label="Comments" defaultValue="Amplify UI is awesome!" />
);
};
Accessibility
The form primitives are accessible by default. A matching label HTML element will be connected to the form control -- simply provide a label prop with a string or ReactNode. If no id is provided, one will be automatically generated and connected to both label and form control elements.
Resizeable
For a resizeable multiline field, use resize prop. Common values are horizontal, vertical, both. See MDN resize docs for supported values.
Please enter a USPS validated address
import { TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaResizableExample = () => {
return (
<TextAreaField
label="Address"
placeholder="1234 Main St."
descriptiveText="Please enter a USPS validated address"
resize="vertical"
/>
);
};
Size
To change the general size, use the size prop. Available options are small, none (default), and large.
import { Flex, TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaSizeExample = () => {
return (
<Flex direction="column" gap="1.5rem">
<TextAreaField
label="Small"
size="small"
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
/>
<TextAreaField
label="Default"
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
/>
<TextAreaField
label="Large"
size="large"
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
/>
</Flex>
);
};
Rows
To change the number of rows of text displayed, use the rows prop with desired number.
import { TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaRowsExample = () => {
return (
<TextAreaField
label="6 rows"
rows={6}
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
/>
);
};
Maximum length
To enforce a maximum length of multiline text, use the maxLength prop.
import { TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaMaxLengthExample = () => {
return (
<TextAreaField
label="Maximum length of 100 characters"
defaultValue="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut laboree"
maxLength={100}
/>
);
};
Autoresize
You can add autoResize to have the textarea component resize based on the content in the input.
Note: this only works with a controlled TextAreaField
import * as React from 'react';
import { TextAreaField } from '@aws-amplify/ui-react';
export const AutoresizeTextareaExample = () => {
const [value, setValue] = React.useState('');
return (
<TextAreaField
autoResize
label="Comments"
value={value}
onChange={(e) => {
setValue(e.target.value);
}}
/>
);
};
Variations
There are two variation styles available: default and quiet.
import { TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaFieldVariationExample = () => {
return (
<>
<TextAreaField label="Default" />
<TextAreaField label="Quiet" variation="quiet" />
</>
);
};
Descriptive text
To provide additional descriptive text of requirements of the field, use the descriptiveText field:
Please enter a USPS validated address
import { Text, TextAreaField, View } from '@aws-amplify/ui-react';
export const TextAreaFieldDescriptiveExample = () => {
return (
<View width="100%">
<TextAreaField
label="Address"
descriptiveText={
<Text
as="span"
fontStyle="italic"
fontSize="var(--amplify-font-sizes-small)"
>
Please enter a USPS validated address
</Text>
}
/>
</View>
);
};
States
The available TextAreaField 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, TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaFieldStatesExample = () => {
return (
<Flex direction="column" gap="1rem">
<TextAreaField
label="Disabled"
defaultValue="Disabled"
isDisabled={true}
/>
<TextAreaField
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, TextAreaField } from '@aws-amplify/ui-react';
export const DefaultRequiredTextAreaFieldExample = () => {
return (
<Flex as="form" direction="column">
<TextAreaField label="Essay question #1" 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, TextAreaField } from '@aws-amplify/ui-react';
export const RequiredTextAreaFieldExample = () => {
return (
<Flex as="form" direction="column">
<TextAreaField
label={
<Text>
Essay Question #1
<Text
as="span"
fontSize="var(--amplify-font-sizes-small)"
color="var(--amplify-colors-font-error)"
>
{' '}
(required)
</Text>
</Text>
}
isRequired={true}
/>
<TextAreaField
label="Essay Question #1"
descriptiveText={
<Text
as="span"
fontSize="var(--amplify-font-sizes-small)"
color="var(--amplify-colors-font-error)"
fontStyle="italic"
>
Required
</Text>
}
isRequired={true}
/>
<Button type="submit">Submit</Button>
</Flex>
);
};
Validation error styling
Use the hasError and errorMessage fields to mark a TextAreaField with a validation error.
import { Flex, TextAreaField } from '@aws-amplify/ui-react';
export const TextAreaFieldValidationErrorExample = () => {
return (
<Flex gap="1rem" direction="column">
<TextAreaField
label="Comments"
hasError={true}
errorMessage="Please enter a comment"
/>
</Flex>
);
};
CSS Styling
Theme
You can customize the appearance of all TextAreaField components in your application with a Theme.
TextAreaField Theme Source
import { TextAreaField, ThemeProvider, Theme } from '@aws-amplify/ui-react';
const theme: Theme = {
name: 'textareafield-theme',
tokens: {
components: {
textareafield: {
color: { value: '{colors.blue.90}' },
_focus: {
borderColor: { value: '{colors.blue.40}' },
},
},
},
},
};
export const TextAreaFieldThemeExample = () => (
<ThemeProvider theme={theme} colorMode="light">
<TextAreaField label="Name" defaultValue="Default Value" />
</ThemeProvider>
);
Target classes
| Class | Description |
|---|---|
amplify-textarea | Class applied to the text area |
amplify-textareafield | Top level element that wraps the TextAreaField primitive |
--amplify-components-textareafield-border-color--amplify-components-textareafield-color--amplify-components-textareafield-focus-border-color
Global styling
To override styling on all TextAreaField primitives, you can set the Amplify CSS variables with the built-in .amplify-textareafield class.
/* styles.css */
.amplify-textareafield {
--amplify-components-fieldcontrol-border-color: rebeccapurple;
}
Local styling
To override styling on a specific TextAreaField, you can use a class selector or style props.
Using a class selector:
/* styles.css */
.custom-textareafield-class .amplify-textarea {
border-radius: 0;
}
Using style props:
All style props will be applied to the Flex wrapper of the TextAreaField. To style the textarea of the TextAreaField, you can pass a inputStyles prop with the style props you want to apply to the input.
import { Text, TextAreaField, useTheme } from '@aws-amplify/ui-react';
export const TextAreaFieldStylePropsExample = () => {
const { tokens } = useTheme();
return (
<>
<TextAreaField
label={
<Text
fontWeight={tokens.fontWeights.bold}
fontSize={tokens.fontSizes.xl}
>
Address:
</Text>
}
padding="xl"
border={`1px solid ${tokens.colors.primary[60]}`}
/>
<TextAreaField
label="Special Field"
inputStyles={{
backgroundColor: 'primary.10',
border: `1px solid ${tokens.colors.primary[60]}`,
}}
/>
</>
);
};