jotis.meRegula

Tabs

Pestañas para cambiar entre vistas hermanas dentro de una página.

Cuándo usarlo

Props. items [{id, label, count?}], value / defaultValue, onChange(id), type (underline · button-brand · button-gray · button-border), size (sm · md).

Cuál. underline para secciones de página (es la de por defecto); button-border como control segmentado dentro de una tarjeta; button-brand cuando la navegación es la protagonista.

Teclado. Solo la pestaña activa entra en el orden de Tab; las flechas, Inicio y Fin cambian de pestaña. En underline, la pestaña activa con foco de teclado lleva el subrayado y además el anillo de foco (en la guía el subrayado lo tapaba).

Panel (ampliación sobre la guía). Con children (una función que recibe el id activo), el componente pinta el contenido en un tabpanel enlazado a su pestaña, y en Astro sin directiva el HTML ya trae el panel activo. Sin children, Tabs es solo la lista y el contenido lo pintas tú; en ese caso las pestañas no llevan aria-controls, porque apuntaría a un panel que no existe.

Detalles. El tamaño por defecto es sm (36px); md mide 44px.

Ejemplos

Props

PropTipoPor defectoDescripción
itemsobligatoriaTabItem[]—
valuestring—Pestaña activa (controlado).
defaultValuestring—Pestaña activa al principio (no controlado). Si falta, la primera.
onChange((id: string) => void)—
type"underline" · "button-brand" · "button-gray" · "button-border"underlineunderline para secciones de página; button-border como control segmentado dentro de una tarjeta; button-brand cuando la navegación es la protagonista.
size"sm" · "md"smAlto: sm 36 · md 44.
aria-labelstring—Nombre de la lista de pestañas para lectores de pantalla.
children((id: string) => ReactNode)—Contenido de la pestaña activa (ampliación sobre la guía). Si llega, se pinta en un tabpanel enlazado a su pestaña; si no, el componente es solo la lista y tú pintas el contenido.
classNamestring—

Código

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

export default function Page() {
	return (
		<>
			<Tabs
				aria-label="Secciones"
				items={[
					{ id: "resumen", label: "Resumen" },
					{ id: "movimientos", label: "Movimientos", count: 12 },
				]}
				onChange={cambiarVista}
			/>
		</>
	);
}

onChange y children son funciones y no cruzan de Astro a una isla: envuelve Tabs en un .tsx y úsalo con client:load.