Sources

PreviousNext

Display sources and citations used by the AI in a collapsible format.

import {
  Source,
  Sources,
  SourcesContent,
  SourcesTrigger,
} from "@/components/ai-elements/sources"

export function SourcesDemo() {
  const sources = [
    {
      id: "1",
      title: "React Documentation",
      href: "https://react.dev",
    },
    {
      id: "2",
      title: "MDN Web Docs",
      href: "https://developer.mozilla.org",
    },
    {
      id: "3",
      title: "TypeScript Handbook",
      href: "https://www.typescriptlang.org/docs",
    },
  ]

  return (
    <div className="w-full max-w-2xl">
      <Sources>
        <SourcesTrigger count={sources.length} />
        <SourcesContent>
          {sources.map((source) => (
            <Source key={source.id} href={source.href} title={source.title} />
          ))}
        </SourcesContent>
      </Sources>
    </div>
  )
}

Installation

pnpm dlx shadcn@latest add sources

Usage

import {
  Sources,
  SourcesTrigger,
  SourcesContent,
  Source,
} from "@/components/ai-elements/sources"
<Sources>
  <SourcesTrigger count={3} />
  <SourcesContent>
    <Source href="https://example.com" title="Example Source" />
    <Source href="https://example.org" title="Another Source" />
  </SourcesContent>
</Sources>

Examples

Default

import {
  Source,
  Sources,
  SourcesContent,
  SourcesTrigger,
} from "@/components/ai-elements/sources"

export function SourcesDemo() {
  const sources = [
    {
      id: "1",
      title: "React Documentation",
      href: "https://react.dev",
    },
    {
      id: "2",
      title: "MDN Web Docs",
      href: "https://developer.mozilla.org",
    },
    {
      id: "3",
      title: "TypeScript Handbook",
      href: "https://www.typescriptlang.org/docs",
    },
  ]

  return (
    <div className="w-full max-w-2xl">
      <Sources>
        <SourcesTrigger count={sources.length} />
        <SourcesContent>
          {sources.map((source) => (
            <Source key={source.id} href={source.href} title={source.title} />
          ))}
        </SourcesContent>
      </Sources>
    </div>
  )
}
const sources = [
  { id: "1", title: "React Documentation", href: "https://react.dev" },
  { id: "2", title: "MDN Web Docs", href: "https://developer.mozilla.org" },
  { id: "3", title: "TypeScript Handbook", href: "https://www.typescriptlang.org/docs" },
]
 
export default function Example() {
  return (
    <Sources>
      <SourcesTrigger count={sources.length} />
      <SourcesContent>
        {sources.map((source) => (
          <Source key={source.id} href={source.href} title={source.title} />
        ))}
      </SourcesContent>
    </Sources>
  )
}

API Reference

Sources

Container for sources.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

SourcesTrigger

Trigger button to expand sources.

PropTypeDefaultDescription
countnumber-Number of sources
childrenReactNode-Custom trigger content
classNamestring-Custom CSS classes

SourcesContent

Container for source list.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

Source

Individual source link.

PropTypeDefaultDescription
hrefstring-Source URL
titlestring-Source title
childrenReactNode-Custom content
classNamestring-Custom CSS classes