jotis.meRegula

Table

Tabla de datos en tarjeta con cabecera, columnas y pie opcional.

Cuándo usarlo

Props. columns [{key, label, primary, align, render(row)}], rows, title, count, description, actions, footer (p. ej. Pagination), size (md filas de 72px · sm 56px).

Reglas del archivo. Mínima: nada que no sea dato. Una columna principal, la primera, en text-primary medium; el resto en text-tertiary. Las filas se separan con una línea border-secondary. La cabecera de columnas va en bg-secondary, text-xs-semibold, text-quaternary. Las acciones (buscar, exportar, seleccionar) deben verse sin buscarlas. Números a la derecha.

Detalles. Funciona sin JavaScript (Server Component en Next, sin directiva en Astro). La tabla se llama como su título (aria-labelledby). Si es más ancha que su tarjeta, se desplaza en horizontal dentro de una caja que recibe el foco, así que también se recorre con el teclado. Cada fila usa row.id como clave, o su posición si no tiene.

Ejemplos

Movimientos240

Octubre de 2026.

ConceptoFechaEstadoImporte
Alquiler01 octPagado650,00 €
Electricidad05 octPagado48,20 €
Seguro del coche15 octPendiente210,00 €
Gimnasio20 octPendiente35,00 €

Props

PropTipoPor defectoDescripción
columnsobligatoriaTableColumn<R>[]—
rowsobligatoriaR[]—Filas. Si tienen id, se usa como clave.
titleReactNode—Título de la tarjeta; también da nombre a la tabla.
countReactNode—Total junto al título, en un Badge de marca.
descriptionReactNode—
actionsReactNode—Acciones de la cabecera (buscar, exportar): a la vista, sin esconderlas.
footerReactNode—Pie, por ejemplo una Pagination.
size"sm" · "md"mdAlto de fila: md 72px · sm 56px.
classNamestring—

Código

import { Table } from "@jotis-me/react";

export default function Page() {
	return (
		<>
			<Table
				title="Movimientos"
				count="240"
				columns={[
					{ key: "concepto", label: "Concepto", primary: true },
					{ key: "fecha", label: "Fecha" },
					{ key: "importe", label: "Importe", align: "right" },
				]}
				rows={[{ id: "1", concepto: "Alquiler", fecha: "01 oct", importe: "650,00 €" }]}
				footer={<Pagination total={24} />}
			/>
		</>
	);
}