Core · Mostrar contenido
Código
Muestra código dentro de una frase o en un bloque con colores de sintaxis en todos los modos.
Ejemplo
Bloques de código en los tres modos, todos con la misma paleta.
.panel {
padding: var(--luz-space-md);
color: var(--luz-text-primary);
background: var(--luz-surface);
}
<button
class="luz-btn luz-btn--primary"
type="button">
Save changes
</button>
import { MidiPlayer }
from "@luz-ds/core/midi";
const player = await MidiPlayer.load(url);
player.play();
Inline code looks like var(--luz-text-primary) inside a sentence.
Syntax colours in the three modes
LUZ's own scheme: keywords stay ink and bold, colour goes to what the author wrote (names, properties, values), comments step back in italic. No red, because red means error.
Each colour keeps 4.5:1 or more on the block, 7:1 or more in high contrast.
| Token | Class | What it marks |
|---|---|---|
--luz-code-comment | .tok-comment | Comments in every language. Muted and italic. |
--luz-code-keyword | .tok-keyword | JavaScript and shell keywords, CSS at-rules and !important, the HTML doctype. Ink and bold, no colour. |
--luz-code-name | .tok-name | HTML tags, CSS selectors and functions, JavaScript function and class names, shell commands. |
--luz-code-property | .tok-property | HTML attributes, CSS properties and custom properties, JSON keys, shell flags and variables. |
--luz-code-string | .tok-string | Quoted strings in every language, HTML attribute values. |
--luz-code-literal | .tok-literal | Numbers and units, hex colours, true, false, null, HTML entities. |
Light
/* Wide cards */
@media (min-width: 48rem) {
.card::after {
content: "new";
inset: 0 auto auto 50%;
color: var(--ink, #036);
}
}
<!doctype html>
<!-- Primary action -->
<button type="submit" disabled>
Save & close
</button>
// Play a track
const player = await
MidiPlayer.load("a.mid");
if (player) player.play(0, true);
{
"name": "@luz-ds/core",
"private": false,
"size": 7.02
}
# Build and test
pnpm core:build
npx playwright test \
--project=chromium $CI
Dark
/* Wide cards */
@media (min-width: 48rem) {
.card::after {
content: "new";
inset: 0 auto auto 50%;
color: var(--ink, #036);
}
}
<!doctype html>
<!-- Primary action -->
<button type="submit" disabled>
Save & close
</button>
// Play a track
const player = await
MidiPlayer.load("a.mid");
if (player) player.play(0, true);
{
"name": "@luz-ds/core",
"private": false,
"size": 7.02
}
# Build and test
pnpm core:build
npx playwright test \
--project=chromium $CI
High contrast
/* Wide cards */
@media (min-width: 48rem) {
.card::after {
content: "new";
inset: 0 auto auto 50%;
color: var(--ink, #036);
}
}
<!doctype html>
<!-- Primary action -->
<button type="submit" disabled>
Save & close
</button>
// Play a track
const player = await
MidiPlayer.load("a.mid");
if (player) player.play(0, true);
{
"name": "@luz-ds/core",
"private": false,
"size": 7.02
}
# Build and test
pnpm core:build
npx playwright test \
--project=chromium $CI
Problemas conocidos
El resaltador usa un conjunto de patrones, no un analizador: las etiquetas JSX, el contenido de los elementos style y script de HTML y los valores de atributos sin comillas se muestran sin formato. Los colores son decorativos: la tecnología de asistencia lee el código de la misma forma.
Código
Copiar el marcado
Un pre sin clase no necesita ninguna: tipografía monoespaciada, una superficie atenuada y un borde.
<pre><code>npm install @luz-ds/core</code></pre>
.luz-code-block añade la insignia del lenguaje y los colores del resaltado. Con la clase:
<pre class="luz-code-block" data-lang="css" tabindex="0" role="region" aria-label="Panel styles"><code>.panel {
color: var(--luz-text-primary);
}</code></pre>
<p>Set the colour with <code class="luz-code-inline">--luz-text-primary</code>.</p>
import { initHighlight } from "@luz-ds/core/highlight";
initHighlight();
Variantes y opciones
Dos clases y el idioma en un atributo.
| Clase o atributo | Efecto |
|---|---|
.luz-code-block | Un bloque sobre una superficie atenuada, con fuente mono y desplazamiento horizontal si una línea es larga |
.luz-code-inline | Código dentro de una frase, con el color de código |
data-lang | El idioma: html, css, js, jsx, json, bash, sh o shell. Se muestra como una etiqueta en una línea propia encima del código, en el borde final. Cualquier otro valor se muestra sin resaltarlo |
Cómo funciona
Un <pre> con un <code> dentro, al que da estilo components/code.css. El resaltado es opcional y lo proporciona highlight.js.
highlightBlock(pre)colorea un bloque: envuelve el código con seis clases.tok-*, una por cada token--luz-code-*.initHighlight()lo hace con cadapre.luz-code-block, añade unaria-labela los bloques que no tengan ninguno («Ejemplo de CSS») y añade un botón para copiar en cada bloque. Core no asigna una posición a ese botón: colócalo con tu propio CSS o llama solo ahighlightBlock().luz.jsejecutainitHighlight().- En colores forzados, todos los colores pasan a ser el color de texto del sistema; las palabras clave en negrita y los comentarios en cursiva se mantienen.
Sin JavaScript
El bloque es texto normal y legible de un solo color. Solo se pierden los colores.
Teclado y ARIA
Un bloque puede ser más ancho que la pantalla, así que debe recibir el foco: con Tab se llega a él y las teclas de flecha permiten desplazarse.
- Usa
tabindex="0",role="region"y unaria-labelque identifique el código, para que la parada de foco tenga un nombre. - El código en línea no necesita nada.
El contraste y el foco están en la pestaña Diseño.
Diseño
Cuándo usarlo
Usa un bloque de código para mostrar código o resultados del terminal que el lector pueda consultar o copiar, y código en línea para nombres dentro de una frase.
Cuándo no usarlo
No uses un bloque de código para un archivo largo ni para texto que no sea código.
- Para enlazar a un archivo completo, enlaza al archivo original.
- Para indicar una tecla que debe pulsar el lector, usa
<kbd>.
Qué hacer y qué no
Cómo escribir el contenido
Muestra código que funcione al pegarlo.
- Identifica cada bloque en su
aria-label: indica qué código contiene, no «Código». - Define
data-lang; usatextpara los resultados que no sean código. - Procura que las líneas sean cortas: una línea larga obliga al lector a desplazarse horizontalmente.
Contraste y foco
El código y los colores de sintaxis aparecen sobre una superficie atenuada. En alto contraste, todos los colores de sintaxis alcanzan 7:1.
| Parte | Color sobre el fondo | Claro | Oscuro | Alto contraste | Mínimo |
|---|---|---|---|---|---|
Código | --luz-text-primary on --luz-surface-muted | 15.8:1 | 15.1:1 | 20.1:1 | 4.5:1 |
Comentario | --luz-code-comment on --luz-surface-muted | 5.0:1 | 8.5:1 | 8.7:1 | 4.5:1 |
Palabra clave | --luz-code-keyword on --luz-surface-muted | 15.8:1 | 15.1:1 | 20.1:1 | 4.5:1 |
Nombre | --luz-code-name on --luz-surface-muted | 8.8:1 | 12.0:1 | 13.5:1 | 4.5:1 |
Propiedad | --luz-code-property on --luz-surface-muted | 5.6:1 | 8.1:1 | 9.7:1 | 4.5:1 |
Cadena | --luz-code-string on --luz-surface-muted | 8.2:1 | 9.0:1 | 8.3:1 | 4.5:1 |
Literal | --luz-code-literal on --luz-surface-muted | 6.7:1 | 8.4:1 | 11.1:1 | 4.5:1 |
Etiqueta del idioma | --luz-text-secondary on --luz-surface-muted | 6.2:1 | 7.5:1 | 18.4:1 | 4.5:1 |
Código en línea | --luz-color-code on --luz-surface-muted | 5.3:1 | 8.1:1 | 9.0:1 | 4.5:1 |
Medido a partir de los valores de los tokens de cada modo y redondeado hacia abajo. El mínimo requerido es el de WCAG 2.2 AA: 4,5:1 para texto y 3:1 para anillos de foco, bordes e iconos.
- Foco: core no dibuja su propio anillo en un bloque desplazable (
tabindex="0"): se muestra el del navegador. Esta documentación añade el anillo de LUZ enreference.css; haz lo mismo si tus bloques se desplazan. - No depende solo del color: las palabras clave están en negrita y los comentarios en cursiva, por lo que la sintaxis sigue siendo legible sin los colores.
Tokens que usa
Los 21 tokens que lee components/code.css, agrupados por familia. Cada familia enlaza a su página, donde aparecen los valores de todos los modos. En Figma son variables con los mismos nombres: consulta Tokens en Figma.
- Color
--luz-code-comment,--luz-code-keyword,--luz-code-literal,--luz-code-name,--luz-code-property,--luz-code-string,--luz-color-code,--luz-divider,--luz-surface-muted,--luz-text-primary,--luz-text-secondary- Spacing and sizing
--luz-space-2xs,--luz-space-3xs,--luz-space-md,--luz-space-sm- Typography
--luz-font-mono,--luz-text-sm,--luz-text-xs- Radius
--luz-radius-md,--luz-radius-sm- Motion
--luz-duration-base
El teclado y ARIA están en la pestaña Código.