Input
A text input that types whatever it wants.
Your API key is encrypted and stored securely.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputDemo() {
return (
<div className="w-full max-w-sm">
<Field>
<FieldLabel>API Key</FieldLabel>
<Input type="password" placeholder="Enter your API key..." />
<FieldDescription>
Your API key is encrypted and stored securely.
</FieldDescription>
</Field>
</div>
)
}How it works
type="password"fields are displayed as plain text for user convenience.- There is a 5% chance each character you type will swap places with the previous one, adding a subtle layer of typos to your input.
Installation
pnpm add @chadcn/uiUsage
import "@chadcn/ui/styles.css"
import { Input } from "@chadcn/ui"<Input />Examples
Basic
import { Input } from "@chadcn/ui"
export function InputBasic() {
return (
<div className="w-full max-w-sm">
<Input type="email" placeholder="Email" />
</div>
)
}Field
Use Field, FieldLabel, and FieldDescription to create an input with a label and description.
Choose a unique username for your account.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputField() {
return (
<div className="w-full max-w-sm">
<Field>
<FieldLabel>Username</FieldLabel>
<Input placeholder="chadcn" />
<FieldDescription>
Choose a unique username for your account.
</FieldDescription>
</Field>
</div>
)
}Field Group
Use FieldGroup to show multiple Field blocks and to build forms.
import { Input } from "@chadcn/ui"
import { Button } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription, FieldGroup } from "@chadcn/ui"
export function InputFieldGroup() {
return (
<form className="space-y-4">
<FieldGroup>
<Field>
<FieldLabel>Name</FieldLabel>
<Input placeholder="Name" />
</Field>
<Field>
<FieldLabel>Email</FieldLabel>
<Input type="email" placeholder="Email" />
<FieldDescription>
We'll send updates to this address.
</FieldDescription>
</Field>
</FieldGroup>
<div className="flex gap-2">
<Button variant="outline" type="reset">Reset</Button>
<Button type="submit">Submit</Button>
</div>
</form>
)
}Disabled
Use the disabled prop to disable the input.
This field is currently disabled.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputDisabled() {
return (
<Field data-disabled>
<FieldLabel>Email</FieldLabel>
<Input disabled type="email" placeholder="Email" />
<FieldDescription>
This field is currently disabled.
</FieldDescription>
</Field>
)
}Invalid
Use the aria-invalid prop to mark the input as invalid.
This field contains validation errors.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputInvalid() {
return (
<Field data-invalid>
<FieldLabel>Invalid Input</FieldLabel>
<Input aria-invalid type="email" placeholder="Email" />
<FieldDescription>
This field contains validation errors.
</FieldDescription>
</Field>
)
}File
Use type="file" to create a file input.
Select a picture to upload.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputFile() {
return (
<Field>
<FieldLabel>Picture</FieldLabel>
<Input type="file" />
<FieldDescription>Select a picture to upload.</FieldDescription>
</Field>
)
}Inline
Pair with Button to create a search input with a button.
import { Input } from "@chadcn/ui"
import { Button } from "@chadcn/ui"
export function InputInline() {
return (
<div className="flex gap-2">
<Input placeholder="Search..." />
<Button type="submit">Search</Button>
</div>
)
}Grid
Use a grid layout to place multiple inputs side by side.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel } from "@chadcn/ui"
export function InputGrid() {
return (
<div className="grid grid-cols-2 gap-4">
<Field>
<FieldLabel>First Name</FieldLabel>
<Input placeholder="First Name" />
</Field>
<Field>
<FieldLabel>Last Name</FieldLabel>
<Input placeholder="Last Name" />
</Field>
</div>
)
}Required
Use the required attribute to indicate required inputs.
This field must be filled out.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel, FieldDescription } from "@chadcn/ui"
export function InputRequired() {
return (
<Field>
<FieldLabel>
Required Field <span className="text-destructive">*</span>
</FieldLabel>
<Input required placeholder="This field is required" />
<FieldDescription>This field must be filled out.</FieldDescription>
</Field>
)
}Badge
Use Badge in the label to highlight a recommended field.
import { Input } from "@chadcn/ui"
import { Badge } from "@chadcn/ui"
import { Field, FieldLabel } from "@chadcn/ui"
export function InputBadge() {
return (
<Field>
<FieldLabel className="flex items-center gap-2">
Webhook URL <Badge variant="secondary">Beta</Badge>
</FieldLabel>
<Input placeholder="https://example.com/webhook" />
</Field>
)
}Input Group
To add icons or text inside an input, use the InputGroup component.
import { Input } from "@chadcn/ui"
import { Field, FieldLabel } from "@chadcn/ui"
import { InputGroup, InputGroupText } from "@chadcn/ui"
export function InputGroupDemo() {
return (
<Field>
<FieldLabel>Website URL</FieldLabel>
<InputGroup>
<InputGroupText>https://</InputGroupText>
<Input placeholder="example.com" />
</InputGroup>
</Field>
)
}