• Blog
  • Docs
  • Pricing
  • We’re hiring!
Log inSign up
drewmcdonald

drewmcdonald

promptCompare

Public
Like
promptCompare
Home
Code
11
.claude
3
.playwright-mcp
1
backend
3
docs
5
frontend
4
shared
1
.gitignore
.mcp.json
.vtignore
CLAUDE.md
deno.json
Environment variables
2
Branches
1
Pull requests
Remixes
History
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
.claude
/
skills
/
ai-elements
/
references
/
attachments.md
Code
/
.claude
/
skills
/
ai-elements
/
references
/
attachments.md
Search
…
Viewing readonly version of main branch: v172
View latest version
attachments.md

Attachments

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.

Installation

npx ai-elements@latest add attachments

Usage with AI SDK

Display user-uploaded files in chat messages or input areas.

Create val
"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;

Features

  • 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

Examples

Grid Variant

Best for displaying attachments in messages with visual thumbnails.

See scripts/attachments.tsx for this example.

Inline Variant

Best for compact badge-style display in input areas with hover previews.

See scripts/attachments-inline.tsx for this example.

List Variant

Best for file lists with full metadata display.

See scripts/attachments-list.tsx for this example.

Props

<Attachments />

Container component that sets the layout variant.

PropTypeDefaultDescription
variantunknown-The display layout variant.
...propsReact.HTMLAttributes<HTMLDivElement>-Spread to the underlying div element.

<Attachment />

Individual attachment item wrapper.

PropTypeDefaultDescription
dataunknown-The attachment data (FileUIPart or SourceDocumentUIPart with id).
onRemove() => void-Callback fired when the remove button is clicked.
...propsReact.HTMLAttributes<HTMLDivElement>-Spread to the underlying div element.

<AttachmentPreview />

Displays the media preview (image, video, or icon).

PropTypeDefaultDescription
fallbackIconReact.ReactNode-Custom icon to display when no preview is available.
...propsReact.HTMLAttributes<HTMLDivElement>-Spread to the underlying div element.

<AttachmentInfo />

Displays the filename and optional media type.

PropTypeDefaultDescription
showMediaTypebooleanfalseWhether to show the media type below the filename.
...propsReact.HTMLAttributes<HTMLDivElement>-Spread to the underlying div element.

<AttachmentRemove />

Remove button that appears on hover.

PropTypeDefaultDescription
labelstring-Screen reader label for the button.
...propsReact.ComponentProps<typeof Button>-Spread to the underlying Button component.

<AttachmentHoverCard />

Wrapper for hover preview functionality.

PropTypeDefaultDescription
openDelaynumber0Delay in ms before opening the hover card.
closeDelaynumber0Delay in ms before closing the hover card.
...propsReact.ComponentProps<typeof HoverCard>-Spread to the underlying HoverCard component.

<AttachmentHoverCardTrigger />

Trigger element for the hover card.

PropTypeDefaultDescription
...propsReact.ComponentProps<typeof HoverCardTrigger>-Spread to the underlying HoverCardTrigger component.

<AttachmentHoverCardContent />

Content displayed in the hover card.

PropTypeDefaultDescription
alignunknown-Alignment of the hover card content.
...propsReact.ComponentProps<typeof HoverCardContent>-Spread to the underlying HoverCardContent component.

<AttachmentEmpty />

Empty state component when no attachments are present.

PropTypeDefaultDescription
...propsReact.HTMLAttributes<HTMLDivElement>-Spread to the underlying div element.

Utility Functions

getMediaCategory(data)

Returns the media category for an attachment.

Create val
import { getMediaCategory } from "@/components/ai-elements/attachments"; const category = getMediaCategory(attachment); // Returns: "image" | "video" | "audio" | "document" | "source" | "unknown"

getAttachmentLabel(data)

Returns the display label for an attachment.

Create val
import { getAttachmentLabel } from "@/components/ai-elements/attachments"; const label = getAttachmentLabel(attachment); // Returns filename or fallback like "Image" or "Attachment"
FeaturesVersion controlCode intelligenceCLIMCP
Use cases
TeamsAI agentsSlackGTM
DocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareers
We’re hiring!
Brandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Open Source Pledge
Terms of usePrivacy policyAbuse contact
© 2026 Val Town, Inc.