Hecho sobre el UI SDK 0.1.0-beta.2 de Vercel. Su API puede cambiar.
Segmented control
Un control segmentado sobre el UI SDK de Vercel con indicador deslizante, tres tamaños, elementos solo con icono, ancho completo, diseño vertical y teclado de grupo de radios.
- Componentes de formulario
- 2 partes
- 10 ejemplos
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-segmented-control.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 cnCopia y pega el siguiente código en tu proyecto.
components/ui/ui-sdk-segmented-control.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
UI SDK añade un poco de CSS propio en una capa de cascada llamada ui-sdk. Declara esa capa al principio de tu hoja de estilos global, encima del import de Tailwind, para que tus clases ganen.
Un control segmentado cambia entre unas pocas vistas o ajustes. Funciona como un grupo de radios, con un valor y una sola parada de tabulación, y el indicador tras el elemento marcado se desliza a la nueva elección. Nómbralo con aria-label o aria-labelledby. UI SDK lo marca como experimental en 0.1.0-beta.2.
El control dibuja su propio indicador, así que solo añades elementos.
size es sm, default o lg. Los elementos crecen en pantallas táctiles.
Un elemento que solo tiene un icono se vuelve cuadrado. Nómbralo con aria-label.
Da al control w-full y los elementos se reparten su ancho.
orientation="vertical" apila los elementos. Las flechas de ambos ejes siguen moviéndose entre ellos.
disabled en el control lo desactiva entero y no envía nada. En un elemento, las flechas lo saltan.
Pasa value y actualízalo en onValueChange. Un controlador de createSegmentedControlController() marca un elemento desde cualquier sitio.
Cada elemento contiene un radio nativo oculto, así que name envía el valor marcado, required espera una elección y restablecer vuelve al valor por defecto.
Un control de solo lectura mantiene su valor y se sigue enviando. Las flechas mueven el foco sin marcar nada.
Los elementos van desde la derecha, y el indicador los sigue.
| Key | Acción |
|---|---|
| Tab | Entra en el control, en el elemento marcado o en el primero activo. |
| ←→↑↓ | Pasan al elemento siguiente o anterior y lo marcan, saltando los desactivados. Dan la vuelta salvo que loop sea false. |
| Space | Marca el elemento enfocado. |
| Enter | Envía su formulario. |
El control es un grupo de radios y cada elemento un radio, así que los lectores de pantalla anuncian la elección y su posición. El indicador es decorativo y los lectores de pantalla lo omiten.
El indicador solo se desliza cuando la página es interactiva, así que nunca se anima al cargar, y no se desliza en absoluto con movimiento reducido. En colores forzados, el elemento marcado conserva un borde visible.
Cada parte envuelve la parte de UI SDK del mismo nombre y acepta todas sus props, incluidas render y un className que puede ser una función del estado de la parte.
| Prop | Tipo | Predeterminado |
|---|---|---|
value | T | null | – |
defaultValue | T | null | – |
onValueChange | (value: T | null, details) => void | – |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
loop | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createSegmentedControlController(). | SegmentedControlController | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="segmented-control" | Para apuntar al control segmentado en CSS. |
data-size | El tamaño: sm, default o lg. |
data-orientation | horizontal o vertical. |
data-disabled | Presente cuando está deshabilitado. |
data-readonly | Presente cuando es de solo lectura. |
data-required | Presente cuando es obligatorio. |
| Prop | Tipo | Predeterminado |
|---|---|---|
value | string | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="segmented-control-item" | Para apuntar a un elemento en CSS. |
data-checked | Presente en el elemento marcado. |
data-unchecked | Presente en los demás elementos. |
data-icon-only | Presente cuando el elemento solo tiene un icono. |
data-disabled | Presente cuando está deshabilitado. |
- CalendarUna cuadrícula de fechas para selección única, de rango y múltiple, con meses deslizantes, vistas previas de rango y días de tamaño táctil.
- CheckboxUna casilla de verificación cuya marca se dibuja, con padres indeterminados, grupos y etiquetas que comparten su hover.
- ComboboxUn select filtrable con chips, grupos y resultados asíncronos, en un popup que cambia de tamaño mientras escribes.
- Date pickerUn botón que abre un calendario en un popover, o en una hoja inferior en móviles, para fechas únicas y rangos.
- FieldEtiquetas, descripciones y errores conectados a su control, con estados de validación y diseños para formularios.
- InputUn campo de texto con tres tamaños, estados inválido y de solo lectura, estilos de validación nativos y una fuente táctil de 16px para que los móviles nunca hagan zoom.