# TextField **Category**: react **URL**: https://www.heroui.com/docs/react/components/text-field **Source**: https://raw.githubusercontent.com/heroui-inc/heroui/refs/heads/v3/apps/docs/content/docs/react/components/(forms)/text-field.mdx > Composition-friendly text fields with labels, descriptions, and inline validation *** ## Import ```tsx import { TextField } from '@heroui/react'; ``` ### Usage ```tsx import {Input, Label, TextField} from "@heroui/react"; export function Basic() { return ( ); } ``` ### Anatomy ```tsx import {TextField, Label, Input, Description, FieldError} from '@heroui/react'; export default () => ( ) ``` > **TextField** combines label, input, description, and error into a single accessible component. For standalone inputs, use **[Input](/docs/components/input)** or **[TextArea](/docs/components/textarea)**. ### With Description ```tsx import {Description, Input, Label, TextField} from "@heroui/react"; export function WithDescription() { return ( Choose a unique username for your account ); } ``` ### Required Field ```tsx import {Description, Input, Label, TextField} from "@heroui/react"; export function Required() { return ( This field is required ); } ``` ### Validation Use `isInvalid` together with `FieldError` to surface validation messages. ```tsx "use client"; import {Description, FieldError, Input, Label, TextArea, TextField} from "@heroui/react"; import React from "react"; export function Validation() { const [username, setUsername] = React.useState(""); const [bio, setBio] = React.useState(""); const isUsernameInvalid = username.length > 0 && username.length < 3; const isBioInvalid = bio.length > 0 && bio.length < 20; return (
{isUsernameInvalid ? ( Username must be at least 3 characters. ) : ( Choose a unique username for your profile. )}