vaiperui

componentes / segmented-control

SegmentedControl

Una elección única entre pocas opciones, para alternar entre vistas del mismo contenido.

Cómo usar

Coloca `SegmentedItem`s dentro de un `SegmentedControl`. Es un `radiogroup`: siempre hay un item seleccionado, las flechas mueven y seleccionan (omitiendo los deshabilitados) y `aria-label` es obligatorio. Funciona controlado (`value`) o no (`defaultValue`). Para navegar entre secciones usa `Tabs`.

preview
SegmentedControl.tsx
import { SegmentedControl, SegmentedItem } from "vaiperui";
<SegmentedControl aria-label="Vista" defaultValue="list">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
<SegmentedItem value="map">Mapa</SegmentedItem>
</SegmentedControl>

Colores

preview
primary
success
warning
danger
colores.tsx
<SegmentedControl aria-label="…" defaultValue="list" variantColor="primary">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" variantColor="success">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" variantColor="warning">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" variantColor="danger">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>

Tamaños

preview
sm
md
lg
tamanos.tsx
<SegmentedControl aria-label="…" defaultValue="list" size="sm">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" size="md">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" size="lg">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>

Radio

preview
none
sm
md
lg
full
radio.tsx
<SegmentedControl aria-label="…" defaultValue="list" radius="none">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" radius="sm">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" radius="md">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" radius="lg">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" radius="full">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>

Color personalizado

preview
Naranja
Violeta
color-personalizado.tsx
<SegmentedControl aria-label="…" defaultValue="list" customColor="#f97316">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>
<SegmentedControl aria-label="…" defaultValue="list" customColor="#8b5cf6">
<SegmentedItem value="list">Lista</SegmentedItem>
<SegmentedItem value="grid">Cuadrícula</SegmentedItem>
</SegmentedControl>

Estados

preview
deshabilitado
estados.tsx
<SegmentedControl aria-label="…" disabled>…</SegmentedControl>

Props

PropValoresPredeterminadoDescripción
aria-labelstringobligatorioNombra lo que selecciona el control
valuestringningunoItem seleccionado (controlado)
defaultValuestringningunoItem inicial (no controlado)
onValueChange(value: string) => voidningunoSe llama cuando cambia la selección
disabledbooleanfalseDeshabilita todo el control
variantColor / customColorControlColors | CustomColorneutroColor del texto del item seleccionado; neutro si no se define ninguno
sizesm | md | lgmdTamaño del control y del texto
radiusnone | sm | md | lg | fullmdRedondeo de las esquinas
animationnone | smooth | fast | bouncesmoothTransición entre estados
SegmentedItem: value, disabledstring, booleanningunoEl valor del item; deshabilita solo este item

Accesibilidad

  • El contenedor tiene `role="radiogroup"` y `aria-disabled` cuando todo el control está `disabled`.
  • Cada `SegmentedItem` es un botón con `role="radio"` y `aria-checked`.
  • Roving tabindex: solo el ítem seleccionado entra en el orden de Tab (`tabIndex=0`).
  • Las flechas mueven el foco y seleccionan a la vez, dan la vuelta y omiten ítems deshabilitados.

Teclado

TeclaAcción
TabMueve el foco hacia dentro y fuera del grupo (al ítem seleccionado).
Right / DownSelecciona el siguiente ítem habilitado.
Left / UpSelecciona el ítem anterior habilitado.
Enter / SpaceSelecciona el ítem enfocado (clic nativo del botón).

Ten en cuenta

  • Pasa `aria-label` o `aria-labelledby` en `SegmentedControl`; el componente no da nombre al grupo.
  • Indica `value` o `defaultValue`; sin ítem seleccionado todos tienen `tabIndex=-1` y el grupo no es alcanzable con teclado.
  • Home y End no están implementados.