Syed Hasnain

Attachments

AI chats 22

About

File and image attachments with progress, failure recovery, metadata, and removal actions.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds Attachments to your project and fits it to your theme.

Code

How Attachments is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

import { useState } from 'react'
import Attachments, { AttachmentItem } from '@/components/ui/attachments'

function AttachmentVariantPreview({
  variant,
  showAll = false,
}: {
  variant: 'default' | 'uploading' | 'failed'
  showAll?: boolean
}) {
  const [items, setItems] = useState<AttachmentItem[]>(() => {
    const examples: AttachmentItem[] = [
      { id: 'design', kind: 'image', name: 'component-layout.png', size: '2.4 MB', progress: 72 },
      { id: 'spec', kind: 'pdf', name: 'agent-spec.pdf', size: '1.8 MB', progress: 45 },
      { id: 'notes', kind: 'document', name: 'project-notes.docx', size: '340 KB', progress: 88 },
      { id: 'trace', kind: 'file', name: 'trace.json', size: '24 KB', progress: 28 },
    ]
    return showAll ? examples : [examples[1]]
  })
  return (
    <div className={showAll ? 'w-full max-w-xl' : 'w-full max-w-sm'}>
      <Attachments
        className={showAll ? undefined : 'sm:grid-cols-1'}
        variant={variant}
        items={items}
        onRemove={(id) => setItems((current) => current.filter((item) => item.id !== id))}
        onRetry={(id) =>
          setItems((current) =>
            current.map((item) =>
              item.id === id ? { ...item, status: 'uploading', progress: 0 } : item,
            ),
          )
        }
      />
    </div>
  )
}

export default function Demo() {
  return <AttachmentVariantPreview variant="default" showAll />
}

Dependencies

More by Syed Hasnain

View all
  • Color Picker

    Color Picker

    110
  • Cost Meter

    Cost Meter

    34
  • Message Scroller

    Message Scroller

    28
  • Background Inbox

    Background Inbox

    26
  • Quota Banner

    Quota Banner

    25
  • Commit

    Commit

    22
  • Image Generation Loader

    Image Generation Loader

    19
  • Approval Card

    Approval Card

    18

More in AI chats

View all
  • AI Actions

    AI Actions

    326
  • Agent Chat

    Agent Chat

    18
  • Message Thread

    Message Thread

    45
  • Environment Variables

    Environment Variables

    14
  • System Message

    System Message

    58
  • AI Diff

    AI Diff

    74
  • Message With Header And Delivery Status

    Message With Header And Delivery Status

    41
  • AI Task List

    AI Task List

    167

Explore more

Part of Pasta UI — browse the full library on 21st.dev.