Code Block
Un bloque de código con botón de copiar, números de línea opcionales y un pliegue para snippets largos. Sin highlighter atado.
import { CodeBlock } from '@/components/ui/code-block';
export function Snippet() {
return (
<CodeBlock code={source} language="tsx">
<CodeBlock.CopyButton />
<CodeBlock.Content />
</CodeBlock>
);
}
Instalación
pnpm dlx nachui add code-blockAnatomía
El código entra como string en la raíz y todas las partes lo leen de ahí. No hay encabezado: el botón de copiar flota arriba a la derecha y aparece al pasar el mouse, así que el bloque es solo el código.
Composición
Usá la siguiente composición para construir un
CodeBlock:Plegar código largo
Con
collapsible el contenido se corta en maxLines. CodeBlock.Expand renderiza el botón, y solo cuando hay algo que mostrar.export const steps = [
{ id: 1, label: 'Step 1', done: true },
{ id: 2, label: 'Step 2', done: true },
{ id: 3, label: 'Step 3', done: true },
{ id: 4, label: 'Step 4', done: true },
{ id: 5, label: 'Step 5', done: true },
{ id: 6, label: 'Step 6', done: true },
{ id: 7, label: 'Step 7', done: true },
Resaltado de sintaxis
No trae ninguno, a propósito: un highlighter es la única dependencia que duplicaría el tamaño de este archivo. Pasá
renderLine y devolvé lo que te dé tu highlighter por cada línea, tokens de Shiki incluidos.Referencia de API
CodeBlock
| Prop | Type | Default | Description |
|---|---|---|---|
code | string | - | El código a mostrar y copiar |
language | string | - | Va en data-language y como language-* en el code |
showLineNumbers | boolean | false | Agrega un margen con números de línea |
collapsible | boolean | false | Corta el contenido en maxLines hasta expandir |
maxLines | number | 20 | Líneas visibles mientras está plegado |
renderLine | (line: string, index: number) => ReactNode | - | Renderiza cada línea, para enchufar un highlighter |
className | string | - | Clases CSS adicionales |
CodeBlock.CopyButton
| Prop | Type | Default | Description |
|---|---|---|---|
copyLabel | string | 'Copy code' | Nombre accesible en reposo |
copiedLabel | string | 'Copied' | Nombre accesible durante 1,5 s después de copiar |
onCopied | (code: string) => void | - | Se llama después de escribir al portapapeles |
className | string | - | Clases CSS adicionales |
CodeBlock.Content
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Clases CSS adicionales |
CodeBlock.Expand
| Prop | Type | Default | Description |
|---|---|---|---|
expandLabel | (hidden: number) => string | Show {n} more lines | Etiqueta mientras está plegado |
collapseLabel | string | 'Show less' | Etiqueta mientras está expandido |
className | string | - | Clases CSS adicionales |
¿Encontraste algo que mejorar?
¿Notaste un error, tipografía o detalle faltante en esta página? Ayúdanos a mejorar la documentación abriendo un issue en GitHub.