Switch
Un interruptor de activado/desactivado que puedes tocar, pulsar o arrastrar, con un thumb que se estira bajo tu dedo y un estado pendiente opcional para los guardados.
pnpm dlx shadcn@latest add https://hextaui.com/r/switch.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 @base-ui/react @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/switch.tsx components/ui/spinner.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Al pulsar, el thumb se estira hacia el otro lado antes de saltar con un spring, para que sientas aterrizar la pulsación. También puedes agarrar el thumb y arrastrarlo: pasada la mitad cambia, y si no llega vuelve atrás.
iOS
variant="ios" usa una pista más alta, un thumb en forma de cápsula y verde cuando está activado. Pulsar, arrastrar y guardar funcionan igual.
Guardando
Devuelve una promesa desde onCheckedChange y el switch cambia de inmediato, incluso cuando es controlado. Un spinner aparece en el thumb solo si guardar tarda más de 400ms. Si se rechaza, el switch vuelve atrás y vibra.
Marcas de activado y desactivado
icons añade una marca de verificación y un anillo a la pista, para que el estado no dependa del color.
Tamaños
sm, default y lg.
En un field
Con Field, la etiqueta y la descripción quedan enlazadas al switch.
Deshabilitado y de solo lectura
readOnly mantiene el valor visible y enfocable, pero no lo cambia.
Controlado
Pasa checked y onCheckedChange.
De derecha a izquierda
El thumb empieza a la derecha y se desliza a la izquierda, y el arrastre lo sigue.
| Key | Acción |
|---|---|
| SpaceEnter | Activa o desactiva el switch enfocado. |
- El switch tiene el rol
switchcon el nombre de su etiqueta. Envuélvelo en un<label>o usaField. - Mientras guarda, tiene
aria-busye ignora nuevas pulsaciones. - El área de toque es mayor que el switch, y aún mayor en táctil.
- Con movimiento reducido, el thumb se mueve al instante y nada vibra.
| Prop | Tipo | Predeterminado |
|---|---|---|
checked | boolean | – |
defaultChecked | boolean | false |
onCheckedChangeDevuelve una promesa para mostrar el estado de guardado. Si se rechaza, un switch no controlado vuelve atrás. | (checked, details) => void | Promise | – |
variant | "default" | "ios" | "default" |
size | "sm" | "default" | "lg" | "default" |
iconsMuestra marcas de activado y desactivado en la pista. | boolean | false |
name | string | – |
value | string | – |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descripción |
|---|---|
data-slot="switch" | La pista, con data-size y data-variant. |
data-slot="switch-thumb" | El thumb. |
data-checked / data-unchecked | Si el switch está activado. |
data-dragging | Presente mientras se arrastra el thumb. |
data-pending | Presente mientras una promesa devuelta está pendiente. |
--switch-w / --switch-h / --switch-thumb / --switch-thumb-w | Tamaños de la pista y del thumb, definidos por size. |
- MotionLas curvas de easing, duraciones y la comprobación de movimiento reducido con las que se anima cada componente, además de hooks para transformaciones de tamaño y resaltados deslizantes.
- SpinnerUn indicador de carga con marcas al estilo Apple o un anillo que respira, que puede esperar antes de mostrarse y permanecer el tiempo suficiente para no parpadear.
- 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.
Usado en bloques
Bloques que se construyen sobre Switch.
- Prompt InputUn compositor de chat que empieza como una línea tranquila, crece hasta convertirse en una tarjeta mientras escribes y baja cuando empieza la conversación. Enter envía, de forma segura con entrada en japonés y chino. Pega, suelta o elige archivos con vistas previas, progreso y reintento. @ añade archivos y / ejecuta comandos desde un menú junto al cursor. Un selector de modelo con teclas numéricas, un control deslizante de esfuerzo que cobra vida en Max, un anillo de contexto, dictado con forma de onda en vivo, chips de herramientas, una cola para los mensajes escritos mientras se transmite una respuesta y borradores que sobreviven a una recarga.
- Agent TodosMuestra el plan de un agente mientras trabaja. Cada paso pasa de pendiente a por hacer, en curso y hecho, con tiempos en vivo, fallos y las llamadas a herramientas detrás. Una píldora de estado para sobre el compositor, cambios del plan que puedes ver y un paso de revisión para editar el plan antes de ejecutarlo.
- AppearanceLa sección Apariencia de los ajustes de un producto de IA: tema, acento, tinte de fondo, densidad, fuente del chat, tamaños de texto y opciones de accesibilidad, todo guardado como borrador hasta que se guarda.
- BillingPlan y uso para un producto de IA, al estilo de Cursor, Claude y Vercel. Un medidor de uso dividido por modelo que proyecta el final del ciclo y avisa antes de que se agoten los créditos, un gráfico diario por el que puedes desplazarte, un límite de gasto con alertas que puedes previsualizar en el medidor, cambios de plan con prorrateo exacto, un formulario de tarjeta con validación real y facturas descargables en PDF.