# AI Chat interface with file and context attachments

> AI Chat interface with file and context attachments

A shadcn/ui block from the [@reui](https://reui.io) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/reui/c-input-group-19).

- Page, with a live preview: https://shadcn.exchange/r/reui/c-input-group-19
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/reui/c-input-group-19-light-c4ccf36561026901.png
- Registry item: https://reui.io/r/new-york-v4/c-input-group-19.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://reui.io/r/new-york-v4/c-input-group-19.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- Registry items: `dropdown-menu`, `field`, `input-group`

## Files

### `c-input-group-19.tsx`

```tsx
"use client"

import { useState } from "react"

import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { Field } from "@/components/ui/field"
import {
  InputGroup,
  InputGroupAddon,
  InputGroupButton,
  InputGroupTextarea,
} from "@/components/ui/input-group"
import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder"

export function Pattern() {
  const [model, setModel] = useState("GPT-4o")

  return (
    <Field className="max-w-xs">
      <InputGroup className="bg-background">
        <InputGroupAddon align="block-start" className="gap-2 px-3 pt-3">
          <InputGroupButton variant="outline" size="icon-xs">
            <IconPlaceholder
              lucide="AtSignIcon"
              tabler="IconAt"
              hugeicons="AtIcon"
              phosphor="AtIcon"
              remixicon="RiAtLine"
              className="size-3.5"
            />
          </InputGroupButton>
          <InputGroupButton variant="outline">
            <IconPlaceholder
              lucide="PaperclipIcon"
              tabler="IconPaperclip"
              hugeicons="Attachment02Icon"
              phosphor="PaperclipIcon"
              remixicon="RiAttachment2"
              className="size-3.5 not-only:rotate-45"
            />
            1
          </InputGroupButton>
          <InputGroupButton variant="outline">
            <IconPlaceholder
              lucide="FileTextIcon"
              tabler="IconFileText"
              hugeicons="File02Icon"
              phosphor="FileTextIcon"
              remixicon="RiFileTextLine"
              className="size-3.5 not-only:rotate-45"
            />
            1 Tab
          </InputGroupButton>
        </InputGroupAddon>

        <InputGroupTextarea
          placeholder="Plan, search, build anything"
          className="min-h-24 border-none py-4 shadow-none focus-visible:ring-0"
        />

        <InputGroupAddon align="block-end" className="px-3 pb-3">
          <DropdownMenu>
            <DropdownMenuTrigger
              render={<InputGroupButton variant="secondary" size="sm" />}
            >
              {model}
              <IconPlaceholder
                lucide="ChevronDownIcon"
                tabler="IconChevronDown"
                hugeicons="ArrowDown01Icon"
                phosphor="CaretDownIcon"
                remixicon="RiArrowDownSLine"
              />
            </DropdownMenuTrigger>
            <DropdownMenuContent align="start">
              <DropdownMenuItem onClick={() => setModel("GPT-4o")}>
                GPT-4o
              </DropdownMenuItem>
              <DropdownMenuItem onClick={() => setModel("Claude 3.5 Sonnet")}>
                Claude 3.5 Sonnet
              </DropdownMenuItem>
            </DropdownMenuContent>
          </DropdownMenu>

          <div className="ml-auto flex items-center gap-2">
            <InputGroupButton variant="secondary" size="icon-sm">
              <IconPlaceholder
                lucide="ImageIcon"
                tabler="IconPhoto"
                hugeicons="ImageIcon"
                phosphor="ImageIcon"
                remixicon="RiImageLine"
                className="text-muted-foreground"
              />
            </InputGroupButton>
            <InputGroupButton variant="default" size="icon-sm">
              <IconPlaceholder
                lucide="CornerDownLeftIcon"
                tabler="IconCornerDownLeft"
                hugeicons="ArrowMoveDownLeftIcon"
                phosphor="ArrowBendDownLeftIcon"
                remixicon="RiCornerDownLeftLine"
              />
            </InputGroupButton>
          </div>
        </InputGroupAddon>
      </InputGroup>
    </Field>
  )
}
```
