CodeBlock
Bloco de código que mostra um trecho com o nome do arquivo, os números de linha e um botão de copiar, para passos de instalação, referências de API e guias de configuração.
import { useState } from "react";
import { Button } from "@camaleo/react";
export function LikeButton() {
const [likes, setLikes] = useState(0);
return <Button onClick={() => setLikes(likes + 1)}>Like · {likes}</Button>;
}Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele é um componente de cliente, por causa do botão de copiar.
import { CodeBlock } from "@camaleo/react";Anatomia
Um cabeçalho com o nome do arquivo, a linguagem e o botão de copiar, e depois um <pre> que rola para o lado quando as linhas são longas. Cada parte tem um data-slot que você pode usar no CSS.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a marca da barra acima.
import { Button } from "@camaleo/react";
export function SaveButton() {
return <Button type="submit">Save changes</Button>;
}import "@camaleo/styles/base.css";
import "@camaleo/styles/editorial.css";Nome do arquivo e linguagem
Quando a pessoa precisa colar o código num arquivo específico, coloque o caminho em filename. O selo de language mostra a sintaxe de relance.
pnpm add @camaleo/react @camaleo/stylesComando de terminal
Desligue os números de linha num comando de uma linha só: não há o que apontar, e o comando se lê como uma peça única.
{
"name": "billing-dashboard",
"private": true,
"dependencies": {
"@camaleo/react": "^0.4.0",
"@camaleo/styles": "^0.4.0"
}
}JSON e outros formatos
O realce embutido colore strings, comentários e palavras-chave de JavaScript. Isso basta para JSON ou um comando de shell. O language também define os comentários: # para Bash, Python ou YAML, // para o resto.
import "@camaleo/styles/base.css";
- import "@camaleo/styles/minimal.css";
+ import "@camaleo/styles/editorial.css";Linhas marcadas
Passe highlight para renderizar cada linha você mesmo, como as linhas de um diff. Mantenha o + e o - no texto, para a mudança não depender da cor.
curl "https://api.example.com/v1/invoices?status=overdue&limit=20" -H "Authorization: Bearer $API_TOKEN"Linhas longas rolam
Linhas longas rolam para o lado em vez de quebrar, então o comando continua copiável como está. Quem usa teclado chega ao código com Tab e rola com as setas.
pnpm add @camaleo/react @camaleo/stylesUm comando por gerenciador de pacotes
Escolha uma aba. As abas mostram um comando por vez e deixam a escolha clara, em vez de quatro blocos empilhados.
pnpm add @camaleo/react @camaleo/stylesNomeie a cópia e anuncie
Diga em copyLabel o que o botão copia, como "Copiar comando de instalação". Depois da cópia, o copiedLabel aparece no botão e o leitor de tela também o anuncia.
Em contexto
Blocos de código costumam ficar num card ou num guia, logo depois da frase que os explica. Estas são peças inteiras de interface que você pode copiar, no estilo que escolheu.
Instale o Camaleo
Rode isto na raiz do projeto. O comando adiciona os componentes e os estilos.
pnpm add @camaleo/react @camaleo/stylesListar faturas
Retorna as 20 faturas mais recentes, da mais nova para a mais antiga.
curl https://api.example.com/v1/invoices \
-H "Authorization: Bearer $API_TOKEN" \
-d limit=20Escolha um estilo
Carregue os estilos base e um estilo, depois envolva o app no StyleProvider.
import "@camaleo/styles/base.css";
import "@camaleo/styles/glass.css";
import { StyleProvider } from "@camaleo/react";
export default function RootLayout({ children }) {
return (
<StyleProvider styleName="glass" mode="system">
{children}
</StyleProvider>
);
}Boas práticas
export const revalidate = 3600;Um caminho como app/blog/page.tsx diz qual arquivo abrir antes de colar.
export const revalidate = 3600;A pessoa precisa adivinhar se a linha vai numa página, num layout ou num arquivo de configuração.
const config: NextConfig = {
// …
images: { formats: ["image/avif", "image/webp"] },
};Corte o resto com um comentário // …. A pessoa vê a mudança na hora e copia menos coisa por engano.
import type { NextConfig } from "next";
const config: NextConfig = {
reactStrictMode: true,
poweredByHeader: false,
trailingSlash: false,
experimental: { typedRoutes: true },
logging: { fetches: { fullUrl: true } },
eslint: { ignoreDuringBuilds: false },
typescript: { ignoreBuildErrors: false },
images: { formats: ["image/avif", "image/webp"] },
redirects: async () => [],
};
export default config;A pessoa precisa caçar a linha certa, e o botão de copiar copia tudo.
Props
# para shell, Python, YAML e parecidas, // para as outras.Os atributos nativos de <div> vão para a raiz. Não há prop para o <pre> nem um callback para a cópia.
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou no próprio bloco.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
Acessibilidade
- O texto do botão de copiar é o nome dele. Com vários blocos na página, faça copyLabel dizer o que ele copia.
- Depois de copiar, o botão mostra copiedLabel por 1,8 segundo, e uma mensagem de status anuncia a cópia. Se a área de transferência estiver bloqueada, nada muda e o código continua selecionável.
- Os números de linha têm aria-hidden, então o leitor de tela lê o código sem eles.
- Código mais largo que o bloco vira uma área de rolagem (role="region") com o nome do arquivo, da linguagem ou "Código" (do MessagesProvider), para quem usa teclado poder rolar.