Tabla incorporada.
Patrón canónico de tabla incorporada para cochid-graphs, mapas, periodismo2 y firmas y documentos.
Verlo por niveles
Primero el componente, después la variación de marca y finalmente su uso dentro de una página.
Ver y copiar el código de este render
<figure class="ui-sample ui-embed" data-embed="table"><div class="ui-data"><table><caption>Desocupación regional</caption><thead><tr><th>Región</th><th>Tasa</th></tr></thead><tbody><tr><td>Valparaíso</td><td>8,1%</td></tr><tr><td>Biobío</td><td>7,6%</td></tr></tbody></table></div><figcaption><span>Fuente: INE · ENE</span><a href="#tabla-completa">Abrir tabla completa</a></figcaption></figure>Variaciones por marca y sitio
Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.
COCHID
Autoridad: core-style/DECISIONES.md M15 y LOGOS-CANONICOS.mdCambia en esta marca
- Cuadrado azul y namebrand de tres líneas
- Azul COCHID en selección, capas y series
Permanece canónico
- Estructura y semántica comunes
- Fuentes, unidades y alternativa tabular
Compañía de Innovación de Santiago
Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.mdCambia en esta marca
- Navegación y contenido propios del servicio
- Acento reservado para acciones y datos
Permanece canónico
- Mark CIS y namebrand de tres líneas
- IBM Plex Sans, foco, espaciado y anatomía
Comparación histórica recuperable
Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.
- Estado actual
- Tabla incorporada no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
- Cambio propuesto
- Publicar en r19 el contrato de Tabla incorporada para Patrón canónico de tabla incorporada para cochid-graphs, mapas, periodismo2 y firmas y documentos.
- Qué ocurre si respondes No
- Tabla incorporada queda fuera de r19 y sus ejemplos siguen sólo como evidencia pendiente de reformulación.
Preparando comparación histórica…
Antes / r19
La comparación convierte una regla abstracta en una diferencia visible y verificable.
- Mantén proporción, título accesible, fuente y vista completa.
- Proporciona consentimiento y fallback cuando depende de terceros.
- No cargues terceros sin política CSP y privacidad.
- No dejes un rectángulo vacío cuando falla el origen.
Responsive
La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.
Cobertura
| Dimensión | Contrato |
|---|---|
| Propietario canónico | Sistema de diseño CIS y servicio productor · core/core-style |
| Consumidores | cochid-graphs, Mapas, Periodismo2 y Firmas y Documentos |
| Dependencias | CSP, sandbox, fallback enlazable |
| Estado | candidato |
Evidencia de adopción
Patrón propuesto. 0 implementaciones observadas en 0 repositorios.
La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.
| Dato | Resultado |
|---|---|
| Clasificación | Patrón propuesto |
| Implementaciones | 0 implementaciones observadas |
| Repositorios | Ningún repositorio observado |
| Snapshot | kit/componentes/componentes-observados.json |
Consumidores observados
El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.
Estados
| Estado requerido |
|---|
| cargando |
| disponible |
| bloqueado |
| error |
| sin JavaScript |
Accesibilidad
- Conserva nombre accesible, orden de lectura y foco visible.
- Funciona a 320 px, con zoom de 200% y texto largo.
- El color nunca es la única señal de estado o acción.
- El contenido esencial permanece disponible sin JavaScript.
Código HTML
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<figure class="ui-sample ui-embed" data-embed="table"><div class="ui-data"><table><caption>Desocupación regional</caption><thead><tr><th>Región</th><th>Tasa</th></tr></thead><tbody><tr><td>Valparaíso</td><td>8,1%</td></tr><tr><td>Biobío</td><td>7,6%</td></tr></tbody></table></div><figcaption><span>Fuente: INE · ENE</span><a href="#tabla-completa">Abrir tabla completa</a></figcaption></figure>Código TAILWIND
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<figure class="ui-sample ui-embed border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-embed="table"><div class="ui-data"><table class="w-full border-collapse text-left"><caption>Desocupación regional</caption><thead><tr><th class="border-b border-slate-300 p-2 align-top">Región</th><th class="border-b border-slate-300 p-2 align-top">Tasa</th></tr></thead><tbody><tr><td class="border-b border-slate-300 p-2 align-top">Valparaíso</td><td class="border-b border-slate-300 p-2 align-top">8,1%</td></tr><tr><td class="border-b border-slate-300 p-2 align-top">Biobío</td><td class="border-b border-slate-300 p-2 align-top">7,6%</td></tr></tbody></table></div><figcaption class="text-sm text-slate-600"><span>Fuente: INE · ENE</span><a class="underline underline-offset-4" href="#tabla-completa">Abrir tabla completa</a></figcaption></figure>Código REACT
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
export interface TableEmbedRow {
/** Primera celda de la fila (región, período, categoría). */
label: string;
/** Una celda por cada columna después de la primera, con el valor ya formateado. */
values: string[];
}
export interface TableEmbedProps {
/** Título de la tabla (`<caption>`); vacío lo oculta. */
caption?: string;
/** Encabezados de columna; el primero corresponde a la primera celda de cada fila. */
columns?: string[];
/** Filas del extracto, con el valor ya formateado; sin filas no se muestra la tabla. */
rows?: TableEmbedRow[];
/** La primera celda de cada fila va como encabezado de fila (`<th>`) en vez de celda de datos; por defecto no. */
rowHeaders?: boolean;
/** Línea de fuente del pie, sin el separador final. */
source?: string;
/** Enlace a la tabla completa en el servicio que la publica; sin él no se muestra el enlace. */
href?: string;
linkLabel?: string;
className?: string;
}
const COLUMNAS = ["Región", "Tasa"];
const FILAS: TableEmbedRow[] = [
{ label: "Valparaíso", values: ["8,1%"] },
{ label: "Biobío", values: ["7,6%"] },
];
/**
* Tabla incorporada: extracto de una tabla publicada por otro servicio, con título, fuente y enlace a la tabla completa.
*
* Muestra pocas filas; el resto se consulta en `href`. Con `rowHeaders`, la primera celda de cada fila se anuncia como encabezado.
*
* @example <TableEmbed caption="Desocupación regional · jul 2026" columns={["Región", "Tasa"]} rows={[{ label: "Valparaíso", values: ["8,4%"] }, { label: "Biobío", values: ["7,6%"] }]} source="Fuente: INE · ENE" href="https://datos.cochid.cl/empleo" />
*/
export function TableEmbed({
caption = "Desocupación regional",
columns = COLUMNAS,
rows = FILAS,
rowHeaders = false,
source = "Fuente: INE · ENE",
href = "#tabla-completa",
linkLabel = "Abrir tabla completa",
className,
}: TableEmbedProps) {
const enlace = linkLabel && href ? <a href={href}>{linkLabel}</a> : null;
return (
<figure className={["ui-embed", className].filter(Boolean).join(" ")} data-embed="table">
{rows.length ? (
<div className="ui-data">
<table>
{caption ? <caption>{caption}</caption> : null}
{columns.length ? (
<thead>
<tr>{columns.map((columna, i) => <th key={i}>{columna}</th>)}</tr>
</thead>
) : null}
<tbody>
{rows.map((fila, i) => (
<tr key={i}>
{rowHeaders ? <th>{fila.label}</th> : <td>{fila.label}</td>}
{fila.values.map((valor, j) => <td key={j}>{valor}</td>)}
</tr>
))}
</tbody>
</table>
</div>
) : null}
{source || enlace ? (
<figcaption>
{source ? <span>{source}</span> : null}
{enlace}
</figcaption>
) : null}
</figure>
);
}