Sources
Painel recolhível de "fontes usadas" para respostas RAG, com um trigger mostrando a contagem e uma lista de links Source.
Visão geral
Sources é o painel global de citações de um turno do assistant. Onde InlineCitation anexa uma citação a uma frase específica, Sources lista cada documento em que a resposta se apoiou, recolhido por padrão com um resumo de contagem ("Used 4 sources").
Use sob a resposta do assistant (tipicamente dentro de MessageContent depois de MessageResponse) para fluxos de RAG, busca na web e embasamento em documentos.
Preview
'use client';import { Source, Sources, SourcesContent, SourcesTrigger,} from '@gremorie/rx-ai';export function SourcesPreview() { return ( <Sources> <SourcesTrigger count={3} /> <SourcesContent> <Source href="#" title="Registry README"> Registry README </Source> <Source href="#" title="Migration guide"> Migration guide </Source> <Source href="#" title="v2.0 release notes"> v2.0 release notes </Source> </SourcesContent> </Sources> );}Anatomia
Sources
├─ SourcesTrigger toggle "Used N sources"
└─ SourcesContent
└─ Source um link citado por fonteInstalação
bash npx gremorie@latest add rx-sources bash pnpm dlx gremorie@latest add rx-sources bash yarn dlx gremorie@latest add rx-sources bash bunx --bun gremorie@latest add rx-sources Uso
import { Sources, SourcesTrigger, SourcesContent, Source } from "@gremorie/rx-ai";
export function Example({ sources }) {
return (
<Sources>
<SourcesTrigger count={sources.length} />
<SourcesContent>
{sources.map((s) => (
<Source key={s.url} href={s.url} title={s.title} />
))}
</SourcesContent>
</Sources>
);
}import { Component, input } from "@angular/core";
import {
Sources,
SourcesTrigger,
SourcesContent,
Source,
} from "@gremorie/ng-ai";
@Component({
selector: "app-example",
standalone: true,
imports: [Sources, SourcesTrigger, SourcesContent, Source],
template: ` <sources>
<sources-trigger [count]="sources().length" />
<sources-content>
@for (s of sources(); track s.url) {
<source [href]="s.url" [title]="s.title" />
}
</sources-content>
</sources>
`,
})
export class ExampleComponent {
readonly sources = input<Array<{ url: string; title: string }>>([]);
}
API
<Sources>
Envolve Collapsible. Estende ComponentProps<"div">. Aplica not-prose, cor accent, texto menor.
<SourcesTrigger>
| Prop | Type | Default | Description |
|---|---|---|---|
count | number | - | Obrigatório. Usado no label padrão ("Used N sources"). |
children | ReactNode | - | Opcional. Substitui completamente o label + chevron padrão. |
Estende ComponentProps<typeof CollapsibleTrigger>.
<SourcesContent>
Corpo recolhível com animação de slide-in / fade-in.
Estende ComponentProps<typeof CollapsibleContent>.
<Source>
| Prop | Type | Default | Description |
|---|---|---|---|
href | string | - | Obrigatório. URL da fonte. Abre em uma nova aba com rel="noreferrer". |
title | string | - | Título da fonte (renderizado ao lado do ícone de livro por padrão). |
children | ReactNode | - | Opcional. Substitui completamente o ícone + título padrão (use para favicons customizados, trechos, etc). |
Renderiza como <a>.
Composição
<Sources>detém o estado do collapsible.<SourcesTrigger>é o toggle ("Used 4 sources" + chevron).<SourcesContent>é o corpo expandido.<Source>é uma citação. Empilhe quantas forem necessárias.
Variações
Lista padrão
O caso de 90%: ícone de livro + título, abre externamente.
<Sources>
<SourcesTrigger count={sources.length} />
<SourcesContent>
{sources.map((s) => (
<Source key={s.url} href={s.url} title={s.title} />
))}
</SourcesContent>
</Sources>Fonte customizada com favicon
Substitua o conteúdo padrão por Source para mostrar o favicon do site e o hostname.
<Source href={s.url}>
<img
src={`https://www.google.com/s2/favicons?domain=${new URL(s.url).hostname}`}
alt=""
className="size-4"
/>
<span className="block font-medium">{new URL(s.url).hostname}</span>
</Source>Texto de trigger customizado
Substitua o label de contagem por texto customizado (localização, badges de modo, etc.).
<SourcesTrigger count={sources.length}>
<p className="font-medium">{sources.length} fontes referenciadas</p>
<ChevronDownIcon className="h-4 w-4" />
</SourcesTrigger>Acessibilidade
- Teclado: o trigger é um
CollapsibleTrigger, alternando com Enter / Space. - ARIA: o Radix Collapsible conecta
aria-expanded/aria-controls.Sourceé um<a>de verdade, então anuncia como um link. - Leitores de tela: links externos abrem com
target="_blank" rel="noreferrer". Mantenhatitlepreenchido para que o texto do link seja significativo (não apenas "clique aqui"). - Movimento reduzido: animações de abrir / fechar são orientadas por data-state e respeitam
prefers-reduced-motion.
Relacionados
- InlineCitation - citações no nível de frase dentro da resposta
- Message - turno do assistant que tipicamente hospeda o painel de sources
- Chain of Thought - hits de busca por passo durante o reasoning