Guia de Uso da API com Claude Code
Aprenda sobre o guia de uso da API com o Claude Code. Dicas práticas e exemplos de código incluídos.
Melhorando a Experiência do Usuário com a Clipboard API
Copiar código com um clique, colar rich text - a Clipboard API melhora significativamente a usabilidade de aplicações web. Com o Claude Code, você pode construir rapidamente implementações que consideram compatibilidade entre navegadores e segurança.
Botão de Cópia para Blocos de Código
> Adicione um botão de cópia aos blocos de código.
> Exiba feedback "Copiado" após o clique.
// components/CopyButton.tsx
import { useState, useCallback } from 'react';
interface CopyButtonProps {
text: string;
}
export function CopyButton({ text }: CopyButtonProps) {
const [copied, setCopied] = useState(false);
const handleCopy = useCallback(async () => {
try {
await navigator.clipboard.writeText(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
} catch (err) {
// Fallback
fallbackCopy(text);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
}, [text]);
return (
<button
onClick={handleCopy}
className="absolute right-2 top-2 rounded bg-gray-700 px-2 py-1 text-xs text-white
transition-colors hover:bg-gray-600"
aria-label={copied ? 'Copiado' : 'Copiar código'}
>
{copied ? '✓ Copiado' : 'Copiar'}
</button>
);
}
function fallbackCopy(text: string): void {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
Cópia de Rich Text
// utils/clipboard.ts
export async function copyRichText(html: string, plainText: string): Promise<void> {
if (!navigator.clipboard?.write) {
fallbackCopy(plainText);
return;
}
const htmlBlob = new Blob([html], { type: 'text/html' });
const textBlob = new Blob([plainText], { type: 'text/plain' });
const item = new ClipboardItem({
'text/html': htmlBlob,
'text/plain': textBlob,
});
await navigator.clipboard.write([item]);
}
// Exemplo de uso: cópia de dados de tabela
async function copyTableAsHtml(data: string[][]) {
const html = `<table>${data.map(row =>
`<tr>${row.map(cell => `<td>${cell}</td>`).join('')}</tr>`
).join('')}</table>`;
const text = data.map(row => row.join('\t')).join('\n');
await copyRichText(html, text);
}
Leitura do Clipboard
// Processamento de imagem ao colar
async function handlePaste(e: ClipboardEvent): Promise<void> {
const items = e.clipboardData?.items;
if (!items) return;
for (const item of items) {
if (item.type.startsWith('image/')) {
e.preventDefault();
const blob = item.getAsFile();
if (blob) {
const url = URL.createObjectURL(blob);
insertImage(url);
}
}
}
}
// Verificação de permissão com Permissions API
async function checkClipboardPermission(): Promise<boolean> {
try {
const result = await navigator.permissions.query({
name: 'clipboard-read' as PermissionName,
});
return result.state === 'granted' || result.state === 'prompt';
} catch {
return false;
}
}
Funcionalidade de Copiar URL para Compartilhamento
function ShareUrl({ url, title }: { url: string; title: string }) {
const [copied, setCopied] = useState(false);
const handleCopy = async () => {
await navigator.clipboard.writeText(url);
setCopied(true);
setTimeout(() => setCopied(false), 3000);
};
return (
<div className="flex items-center gap-2 rounded-lg border p-3">
<input
type="text"
value={url}
readOnly
className="flex-1 bg-transparent text-sm outline-none"
/>
<button
onClick={handleCopy}
className="rounded bg-blue-600 px-3 py-1 text-sm text-white hover:bg-blue-700"
>
{copied ? 'Copiado!' : 'Copiar URL'}
</button>
</div>
);
}
Considerações de Segurança
// Colagem com sanitização
function sanitizePastedContent(html: string): string {
const div = document.createElement('div');
div.innerHTML = html;
// Remover tags de script
div.querySelectorAll('script, iframe, object, embed').forEach(el => el.remove());
// Remover atributos de event handler
div.querySelectorAll('*').forEach(el => {
Array.from(el.attributes)
.filter(attr => attr.name.startsWith('on'))
.forEach(attr => el.removeAttribute(attr.name));
});
return div.innerHTML;
}
Resumo
Utilizar a Clipboard API pode melhorar significativamente a UX de funcionalidades como cópia de blocos de código e compartilhamento. Com o Claude Code, é possível criar implementações robustas que incluem processamento de fallback e medidas de segurança. Combinando com a Web Share API, você pode oferecer funcionalidades de compartilhamento ainda mais flexíveis. Não se esqueça de considerar também a otimização de performance. Para especificações detalhadas, consulte o MDN Web Docs.
Related Posts
10 Dicas para Triplicar Sua Produtividade com o Claude Code
Descubra 10 dicas práticas para aproveitar melhor o Claude Code. De estratégias de prompt a atalhos de workflow, essas técnicas vão aumentar sua eficiência a partir de hoje.
Otimização de Canvas/WebGL com Claude Code
Aprenda sobre otimização de Canvas/WebGL usando o Claude Code. Dicas práticas e exemplos de código incluídos.
Markdown Implementation with Claude Code
Aprenda sobre markdown implementation usando o Claude Code. Dicas praticas e exemplos de codigo incluidos.