A flexible, composable attachment component for displaying files, images, videos, audio, and source documents.
The Attachment component provides a unified way to display file attachments
and source documents with multiple layout variants.
See scripts/attachments.tsx for this example.
npx ai-elements@latest add attachments
Display user-uploaded files in chat messages or input areas.
"use client";
import {
Attachment,
AttachmentInfo,
AttachmentPreview,
AttachmentRemove,
Attachments,
} from "@/components/ai-elements/attachments";
import type { FileUIPart } from "ai";
interface MessageProps {
attachments: (FileUIPart & { id: string })[];
onRemove?: (id: string) => void;
}
const MessageAttachments = ({ attachments, onRemove }: MessageProps) => (
<Attachments variant="grid">
{attachments.map((file) => (
<Attachment
key={file.id}
data={file}
onRemove={onRemove
? () => onRemove(file.id)
: undefined}
>
<AttachmentPreview />
<AttachmentRemove />
</Attachment>
))}
</Attachments>
);
export default MessageAttachments;
- Three display variants: grid (thumbnails), inline (badges), and list (rows)
- Supports both FileUIPart and SourceDocumentUIPart from the AI SDK
- Automatic media type detection (image, video, audio, document, source)
- Hover card support for inline previews
- Remove button with customizable callback
- Composable architecture for maximum flexibility
- Accessible with proper ARIA labels
- TypeScript support with exported utility functions
Best for displaying attachments in messages with visual thumbnails.
See scripts/attachments.tsx for this example.
Best for compact badge-style display in input areas with hover previews.
See scripts/attachments-inline.tsx for this example.
Best for file lists with full metadata display.
See scripts/attachments-list.tsx for this example.
Container component that sets the layout variant.
| Prop | Type | Default | Description |
|---|---|---|---|
variant | unknown | - | The display layout variant. |
...props | React.HTMLAttributes<HTMLDivElement> | - | Spread to the underlying div element. |
Individual attachment item wrapper.
| Prop | Type | Default | Description |
|---|---|---|---|
data | unknown | - | The attachment data (FileUIPart or SourceDocumentUIPart with id). |
onRemove | () => void | - | Callback fired when the remove button is clicked. |
...props | React.HTMLAttributes<HTMLDivElement> | - | Spread to the underlying div element. |
Displays the media preview (image, video, or icon).
| Prop | Type | Default | Description |
|---|---|---|---|
fallbackIcon | React.ReactNode | - | Custom icon to display when no preview is available. |
...props | React.HTMLAttributes<HTMLDivElement> | - | Spread to the underlying div element. |
Displays the filename and optional media type.
| Prop | Type | Default | Description |
|---|---|---|---|
showMediaType | boolean | false | Whether to show the media type below the filename. |
...props | React.HTMLAttributes<HTMLDivElement> | - | Spread to the underlying div element. |
Remove button that appears on hover.
| Prop | Type | Default | Description |
|---|---|---|---|
label | string | - | Screen reader label for the button. |
...props | React.ComponentProps<typeof Button> | - | Spread to the underlying Button component. |
Wrapper for hover preview functionality.
| Prop | Type | Default | Description |
|---|---|---|---|
openDelay | number | 0 | Delay in ms before opening the hover card. |
closeDelay | number | 0 | Delay in ms before closing the hover card. |
...props | React.ComponentProps<typeof HoverCard> | - | Spread to the underlying HoverCard component. |
Trigger element for the hover card.
| Prop | Type | Default | Description |
|---|---|---|---|
...props | React.ComponentProps<typeof HoverCardTrigger> | - | Spread to the underlying HoverCardTrigger component. |
Content displayed in the hover card.
| Prop | Type | Default | Description |
|---|---|---|---|
align | unknown | - | Alignment of the hover card content. |
...props | React.ComponentProps<typeof HoverCardContent> | - | Spread to the underlying HoverCardContent component. |
Empty state component when no attachments are present.
| Prop | Type | Default | Description |
|---|---|---|---|
...props | React.HTMLAttributes<HTMLDivElement> | - | Spread to the underlying div element. |
Returns the media category for an attachment.
import { getMediaCategory } from "@/components/ai-elements/attachments";
const category = getMediaCategory(attachment);
// Returns: "image" | "video" | "audio" | "document" | "source" | "unknown"
Returns the display label for an attachment.
import { getAttachmentLabel } from "@/components/ai-elements/attachments";
const label = getAttachmentLabel(attachment);
// Returns filename or fallback like "Image" or "Attachment"