Open in Chat
Dropdown que passa a query atual para um chat externo. Vem com botões pré-conectados para ChatGPT, Claude, Scira, T3, v0 e Cursor, além de itens genéricos para provedores customizados.
Visão geral
OpenIn permite que os usuários continuem uma conversa no chat externo de sua preferência. É um DropdownMenu que carrega uma única string query no contexto e expõe itens por provedor que renderizam um link <a> rotulado com o ícone da marca correspondente e um ExternalLinkIcon.
O arquivo do componente vem com URL builders para sete provedores (GitHub, Scira, ChatGPT, Claude, T3, v0, Cursor) e exporta componentes React para seis deles. Use-os diretamente via OpenInChatGPT, OpenInClaude, OpenInT3, OpenInScira, OpenInv0 e OpenInCursor - ou componha um OpenInItem genérico para qualquer destino customizado.
Todos os links abrem em uma nova aba com rel="noopener".
Preview
'use client';import { OpenIn, OpenInChatGPT, OpenInClaude, OpenInContent, OpenInCursor, OpenInLabel, OpenInScira, OpenInSeparator, OpenInT3, OpenInTrigger, OpenInv0,} from '@gremorie/rx-ai';export function OpenInPreview() { return ( <div className="flex justify-center"> <OpenIn query="Explain how React Server Components stream HTML to the client."> <OpenInTrigger /> <OpenInContent> <OpenInLabel>Open this prompt in…</OpenInLabel> <OpenInSeparator /> <OpenInChatGPT /> <OpenInClaude /> <OpenInT3 /> <OpenInScira /> <OpenInv0 /> <OpenInCursor /> </OpenInContent> </OpenIn> </div> );}Anatomia
OpenIn
├─ OpenInTrigger botão "Open in…"
└─ OpenInContent menu
├─ OpenInLabel · OpenInSeparator
├─ OpenInItem linha de alvo genérico
└─ presets OpenInChatGPT · OpenInClaude · OpenInCursor · OpenInv0 · OpenInScira · OpenInT3Instalação
bash npx gremorie@latest add rx-open-in-chat bash pnpm dlx gremorie@latest add rx-open-in-chat
bash yarn dlx gremorie@latest add rx-open-in-chat
bash bunx --bun gremorie@latest add rx-open-in-chat
Traz rx-overlays (para o DropdownMenu) e rx-forms (para o Button).
Uso
import {
OpenIn,
OpenInChatGPT,
OpenInClaude,
OpenInContent,
OpenInCursor,
OpenInLabel,
OpenInScira,
OpenInSeparator,
OpenInT3,
OpenInTrigger,
OpenInv0,
} from "@gremorie/rx-ai";
export function Example({ question }) {
return (
<OpenIn query={question}>
<OpenInTrigger />
<OpenInContent>
<OpenInLabel>Continue in</OpenInLabel>
<OpenInSeparator />
<OpenInChatGPT />
<OpenInClaude />
<OpenInT3 />
<OpenInScira />
<OpenInv0 />
<OpenInCursor />
</OpenInContent>
</OpenIn>
);
}A edição Angular deste componente hoje é distribuída a partir do source (veja o workbench para o lado a lado); a entrada no registry vem a seguir.
API
<OpenIn>
| Prop | Type | Default | Description |
|---|---|---|---|
query | string | - | Obrigatório. O texto passado para cada provedor. O ChatGPT o recebe como param prompt, o Claude como q, o Cursor como text, etc. |
Estende todas as props do DropdownMenu. Fornece o OpenInContext com { query } a todos os descendentes.
<OpenInTrigger>
Envolve o DropdownMenuTrigger com asChild. Quando children é omitido, renderiza um Button variant="outline" padrão com o texto "Open in chat" e um ícone chevron-down.
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | default Button | Substitui o trigger inteiro. Passe qualquer elemento clicável. |
<OpenInContent>
DropdownMenuContent fixado em align="start" e w-[240px]. Estende todas as props do DropdownMenuContent.
<OpenInItem> / <OpenInLabel> / <OpenInSeparator>
Wrappers pass-through ao redor de DropdownMenuItem, DropdownMenuLabel e DropdownMenuSeparator. APIs idênticas.
Itens por provedor
Cada um exporta um DropdownMenuItem que renderiza o ícone da marca, o título e o ExternalLinkIcon. Todos aceitam as mesmas props de DropdownMenuItem.
| Component | URL pattern | Query param |
|---|---|---|
<OpenInChatGPT> | https://chatgpt.com/?hints=search&prompt=... | prompt |
<OpenInClaude> | https://claude.ai/new?q=... | q |
<OpenInT3> | https://t3.chat/new?q=... | q |
<OpenInScira> | https://scira.ai/?q=... | q |
<OpenInv0> | https://v0.app?q=... | q |
<OpenInCursor> | https://cursor.com/link/prompt?text=... | text |
O GitHub é configurado internamente (providers.github) mas não há um componente exportado para ele - se você precisar de um item "Open in GitHub", componha-o manualmente com OpenInItem e um <a href> apontando para a URL do seu repo.
Composição
<OpenIn>define a query compartilhada. Coloque-o onde a pergunta está disponível - tipicamente dentro da toolbar de ações de umaMessageou abaixo de uma Conversation.<OpenInTrigger>é a affordance que o usuário clica. Use o Button padrão para o visual padrão "Open in chat", ou passe children para triggers customizados (botões de ícone, links inline).<OpenInContent>guarda os itens do menu. AdicioneOpenInLabeleOpenInSeparatorpara agrupamento visual.- Itens por provedor renderizam em qualquer ordem. Cure a lista para casar com o seu público (devs provavelmente querem Cursor e v0; consumidores provavelmente só ChatGPT e Claude).
Variações
Trigger de ícone inline
Substitua o Button padrão por um trigger de ícone menor que encaixa dentro de uma toolbar de mensagem.
<OpenIn query={question}>
<OpenInTrigger>
<Button variant="ghost" size="icon" aria-label="Open in external chat">
<ExternalLinkIcon className="size-4" />
</Button>
</OpenInTrigger>
<OpenInContent>
<OpenInChatGPT />
<OpenInClaude />
</OpenInContent>
</OpenIn>Lista curada com foco em devs
Lidere com Cursor e v0 para públicos técnicos.
<OpenIn query={prompt}>
<OpenInTrigger />
<OpenInContent>
<OpenInLabel>Continue building</OpenInLabel>
<OpenInSeparator />
<OpenInCursor />
<OpenInv0 />
<OpenInSeparator />
<OpenInLabel>Or chat</OpenInLabel>
<OpenInSeparator />
<OpenInChatGPT />
<OpenInClaude />
</OpenInContent>
</OpenIn>Provedor customizado via OpenInItem
Componha um destino customizado usando o OpenInItem puro.
import { ExternalLinkIcon } from 'lucide-react';
function OpenInPerplexity() {
return (
<OpenInItem asChild>
<a
href={`https://perplexity.ai/?q=${encodeURIComponent(query)}`}
rel="noopener"
target="_blank"
className="flex items-center gap-2"
>
<span className="shrink-0">{/* Perplexity icon */}</span>
<span className="flex-1">Open in Perplexity</span>
<ExternalLinkIcon className="size-4 shrink-0" />
</a>
</OpenInItem>
);
}Acessibilidade
- Teclado:
OpenInTriggeré umDropdownMenuTrigger, então Tab o foca e Enter / Space abre o menu. As setas navegam pelos itens; Enter ativa o link focado. - Sinal de link externo: cada item por provedor renderiza um
ExternalLinkIconpara que os usuários saibam que estão saindo da página. O<a>carregatarget="_blank"erel="noopener". - Ícones: cada SVG de marca tem um elemento
<title>("GitHub", "OpenAI", "Claude", "v0", "Cursor", "Scira AI") para que os leitores de tela anunciem o destino. O T3 recorre aoMessageCircleIcongenérico. - Rótulos do trigger: o trigger padrão diz "Open in chat" mais um chevron. Para triggers só de ícone (veja Variações), forneça
aria-label.
Relacionados
- Conversation - a superfície onde a conversa vive antes de ser passada adiante
- Message - o turno que tipicamente hospeda esta affordance
- Suggestion - a direção inversa: prompts sugeridos para iniciar uma nova conversa