Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Tabla ordenable.

Patrón canónico de tabla ordenable para cochid, periodismo2, situación y admin.

Verlo por niveles

Primero el componente, después la variación de marca y finalmente su uso dentro de una página.

Nivel 1Componente canónico
Conjuntos de datos publicados
Empleo25 ago 2026
Transporte24 ago 2026
Nivel 2Compañía de Innovación de Santiago · variación
Conjuntos de datos por fecha de actualización
Empleo84225 ago 2026
Transporte12.40824 ago 2026
Presupuesto5.21621 ago 2026
Salud1.93018 ago 2026
Nivel 3Dentro de una página
Sitio · sección
Conjuntos de datos publicados
Empleo25 ago 2026
Transporte24 ago 2026
Ver y copiar el código de este render
HTML del nivel canónico
<div class="ui-sample ui-data"><table><caption>Conjuntos de datos publicados</caption><thead><tr><th scope="col" aria-sort="ascending"><button class="btn btn--quiet" type="button">Nombre ↑</button></th><th scope="col"><button class="btn btn--quiet" type="button">Actualización</button></th></tr></thead><tbody><tr><td>Empleo</td><td>25 ago 2026</td></tr><tr><td>Transporte</td><td>24 ago 2026</td></tr></tbody></table></div>

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.cl

COCHID

Autoridad: core-style/DECISIONES.md M15 y LOGOS-CANONICOS.md
Conjuntos de datos publicados
Empleo25 ago 2026
Transporte24 ago 2026

Cambia 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
innovacionsantiago.cl

Compañía de Innovación de Santiago

Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md
Conjuntos de datos por fecha de actualización
Empleo84225 ago 2026
Transporte12.40824 ago 2026
Presupuesto5.21621 ago 2026
Salud1.93018 ago 2026

Cambia 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 ordenable no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Tabla ordenable para Patrón canónico de tabla ordenable para cochid, periodismo2, situación y admin.
Qué ocurre si respondes No
Tabla ordenable 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.

r19 · correctoContrato canónico renderizado
Conjuntos de datos publicados
Empleo25 ago 2026
Transporte24 ago 2026
  • Incluye fuente, período, unidad y alternativa tabular.
  • Usa escalas comparables y distingue cero de ausencia.
Antes · problema observadoAnti-ejemplo no interactivo
62%CONFIRMADOSin fuente, período ni denominador
  • No encierres una cifra aislada en una tarjeta decorativa.
  • No declares estados o tendencias que no provienen de datos reales.

Responsive

La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.

320 pxMóvil y zoom
Conjuntos de datos publicados
Empleo25 ago 2026
Transporte24 ago 2026
1280 pxEscritorio
Conjuntos de datos por fecha de actualización
Empleo84225 ago 2026
Transporte12.40824 ago 2026
Presupuesto5.21621 ago 2026
Salud1.93018 ago 2026

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS y COCHID · core/core-style
ConsumidoresCOCHID, Periodismo2, Situación y Admin
Dependenciascochid-graphs cuando corresponde
Estadocandidato

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.

DatoResultado
ClasificaciónPatrón propuesto
Implementaciones0 implementaciones observadas
RepositoriosNingún repositorio observado
Snapshotkit/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
con datos
sin datos
cargando
error

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.

Código de referencia
<div class="ui-sample ui-data"><table><caption>Conjuntos de datos publicados</caption><thead><tr><th scope="col" aria-sort="ascending"><button class="btn btn--quiet" type="button">Nombre ↑</button></th><th scope="col"><button class="btn btn--quiet" type="button">Actualización</button></th></tr></thead><tbody><tr><td>Empleo</td><td>25 ago 2026</td></tr><tr><td>Transporte</td><td>24 ago 2026</td></tr></tbody></table></div>

Código TAILWIND

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<div class="ui-sample ui-data border border-slate-300 bg-white p-4 text-slate-950"><table class="w-full border-collapse text-left"><caption>Conjuntos de datos publicados</caption><thead><tr><th class="border-b border-slate-300 p-2 align-top" scope="col" aria-sort="ascending"><button class="btn btn--quiet border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="button">Nombre ↑</button></th><th class="border-b border-slate-300 p-2 align-top" scope="col"><button class="btn btn--quiet border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="button">Actualización</button></th></tr></thead><tbody><tr><td class="border-b border-slate-300 p-2 align-top">Empleo</td><td class="border-b border-slate-300 p-2 align-top">25 ago 2026</td></tr><tr><td class="border-b border-slate-300 p-2 align-top">Transporte</td><td class="border-b border-slate-300 p-2 align-top">24 ago 2026</td></tr></tbody></table></div>

Código REACT

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
import type { MouseEventHandler } from "react";

export interface SortableTableColumn {
  /** Encabezado de la columna; si está ordenada, se le agrega la flecha del sentido. */
  label: string;
  /** Columna de cifras con alineación derecha y dígitos tabulares. */
  numeric?: boolean;
  /** Sentido del orden actual; sólo una columna lo lleva a la vez (`aria-sort`). */
  sort?: "ascending" | "descending";
  /** Se llama al pulsar el encabezado para ordenar por esta columna. */
  onClick?: MouseEventHandler<HTMLButtonElement>;
}

export interface SortableTableRow {
  /** Celdas de la fila, en el orden de las columnas. */
  values: string[];
}

export interface SortableTableProps {
  /** Título de la tabla (`<caption>`). */
  caption?: string;
  columns?: SortableTableColumn[];
  /** Filas ya ordenadas según la columna que lleva `sort`. */
  rows?: SortableTableRow[];
  className?: string;
}

const FLECHAS = { ascending: "↑", descending: "↓" } as const;

const COLUMNS: SortableTableColumn[] = [{ label: "Nombre", sort: "ascending" }, { label: "Actualización" }];

const ROWS: SortableTableRow[] = [
  { values: ["Empleo", "25 ago 2026"] },
  { values: ["Transporte", "24 ago 2026"] },
];

/**
 * Tabla cuyos encabezados son botones para pedir un orden; se usa en listados que se revisan por nombre, fecha o cifra.
 *
 * El componente no ordena: el `onClick` de cada columna avisa qué orden se pidió, las filas llegan ya ordenadas y la columna activa lleva `sort`, que se anuncia con `aria-sort`. Cada encabezado es un botón terciario (`btn btn--quiet`).
 *
 * @example <SortableTable columns={[{ label: "Nombre", sort: "descending", onClick: ordenarPorNombre }, { label: "Actualización", onClick: ordenarPorFecha }]} rows={[{ values: ["Transporte", "25 ago 2026"] }, { values: ["Empleo", "24 ago 2026"] }]} />
 */
export function SortableTable({ caption = "Conjuntos de datos publicados", columns = COLUMNS, rows = ROWS, className }: SortableTableProps) {
  if (!columns.length && !rows.length) return null;
  return (
    <div className={["ui-data", className].filter(Boolean).join(" ")}>
      <table>
        {caption ? <caption>{caption}</caption> : null}
        {columns.length ? (
          <thead>
            <tr>
              {columns.map((column, i) => (
                <th scope="col" aria-sort={column.sort} data-numeric={column.numeric || undefined} key={`${column.label}-${i}`}>
                  <button className="btn btn--quiet" type="button" onClick={column.onClick}>
                    {column.sort ? `${column.label} ${FLECHAS[column.sort]}` : column.label}
                  </button>
                </th>
              ))}
            </tr>
          </thead>
        ) : null}
        {rows.length ? (
          <tbody>
            {rows.map((row, i) => (
              <tr key={i}>
                {row.values.map((value, j) => (
                  <td data-numeric={columns[j]?.numeric || undefined} key={j}>{value}</td>
                ))}
              </tr>
            ))}
          </tbody>
        ) : null}
      </table>
    </div>
  );
}