Slider
Elige un valor o un rango arrastrando, tocando la pista o usando las teclas, con saltos que se deslizan y una burbuja de valor opcional.
pnpm dlx shadcn@latest add https://hextaui.com/r/slider.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 class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/slider.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
<Slider /> dibuja un thumb por valor, así que un número o un array de un elemento crea un slider simple y dos elementos crean un rango. Hijos como <SliderLabel /> y <SliderValue /> se sitúan en una línea sobre la pista.
Mientras arrastras, el thumb sigue exactamente al puntero. Cuando el valor salta, por un toque en la pista, una tecla o un nuevo valor controlado, el thumb y el relleno se deslizan hasta allí en 180ms en lugar de teletransportarse.
Tamaños
sm, default y lg escalan juntos el thumb y la pista.
Rango
Pasa dos valores para un rango. Da nombre a cada thumb con getAriaLabel y mantenlos separados con minStepsBetweenValues. Con draggableRange, arrastra en cualquier punto entre los thumbs para mover ambos a la vez; un toque ahí sigue moviendo el thumb más cercano.
Burbuja de valor
showValue muestra el valor con formato sobre el thumb mientras se arrastra o tiene el foco del teclado. Úsalo en lugar de una fila de etiqueta, ya que la burbuja sube al espacio sobre la pista.
Pasos y formato
step ajusta el valor, largeStep define el salto de Page Up y Shift + flecha, y format da formato a cada número que el slider muestra o anuncia.
Controlado
onValueChange se dispara en cada movimiento y onValueCommitted una vez al soltar, que es el momento de guardar. Definir el valor desde fuera también se desliza.
Vertical
Con orientation="vertical" el slider llena la altura de su padre, y Up sube el valor.
Con iconos
Coloca iconos junto al slider en una fila flex. El slider ocupa el ancho restante.
Deshabilitado
Todo el slider se atenúa e ignora la entrada del puntero y del teclado.
Etiquetas largas
Las etiquetas largas se ajustan, y el valor se queda al final.
De derecha a izquierda
Dentro de un padre de derecha a izquierda el relleno empieza por la derecha y las flechas lo siguen. Pasa locale para usar los dígitos del lector.
| Key | Acción |
|---|---|
| Tab | Mueve el foco al siguiente thumb. |
| →↑ | Aumenta el valor un paso. → lo disminuye en derecha a izquierda. |
| ←↓ | Disminuye el valor un paso. ← lo aumenta en derecha a izquierda. |
| Shift + ArrowPage UpPage Down | Se mueve según largeStep. |
| Home | Define el mínimo, o el valor del thumb anterior en un rango. |
| End | Define el máximo, o el valor del siguiente thumb en un rango. |
- Cada thumb contiene un
input type="range"nativo, así que es unslidercon su propio valor, mínimo y máximo. <SliderLabel />da nombre a cada thumb. Sin él, elaria-labelde<Slider />se pasa a los thumbs y no al contenedor, de modo que el slider nunca queda sin nombre. En un rango, usagetAriaLabelpara distinguir los thumbs.<SliderValue />y la burbuja de valor no se anuncian en cada cambio; el thumb ya informa de su valor.- Pulsar un thumb no muestra un anillo de foco; las flechas sí. Con movimiento reducido el thumb salta en lugar de deslizarse.
- En pantallas táctiles el área de toque crece hasta al menos 44px sin cambiar el diseño.
Construido sobre el slider de Base UI. Cada parte acepta las props de la primitiva que envuelve.
| Prop | Tipo | Predeterminado |
|---|---|---|
valueEl valor controlado. Un thumb por elemento. | number | number[] | – |
defaultValue | number | number[] | – |
onValueChangeSe dispara en cada cambio mientras se arrastra. | (value, eventDetails) => void | – |
onValueCommittedSe dispara una vez cuando termina un cambio. | (value, eventDetails) => void | – |
min | number | 0 |
max | number | 100 |
step | number | 1 |
largeStep | number | 10 |
minStepsBetweenValues | number | 0 |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
draggableRangeEn un rango, arrastrar entre los thumbs los mueve juntos, manteniendo la separación. | boolean | false |
showValueMuestra el valor sobre el thumb mientras se arrastra o tiene el foco del teclado. | boolean | false |
thumbAlignmentedge mantiene el thumb dentro de la pista en min y max. | "edge" | "center" | "edge-client-only" | "edge" |
thumbCollisionBehavior | "push" | "swap" | "none" | "push" |
format | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
aria-labelDa nombre a los thumbs. | string | – |
getAriaLabelDa nombre a cada thumb de un rango. | (index: number) => string | – |
getAriaValueText | (formattedValue: string, value: number, index: number) => string | – |
name | string | – |
disabled | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="slider" | La raíz. |
data-size | sm, default o lg. |
data-jump | Presente durante 220ms mientras el thumb se desliza a un nuevo valor. |
data-range-dragging | Presente mientras se arrastra todo el rango. |
data-orientation | horizontal o vertical. |
data-dragging | Presente mientras hay un puntero pulsado. |
data-disabled | Presente cuando está deshabilitado. |
data-invalid | Presente cuando no es válido dentro de un Field. |
--slider-thumb | El diámetro del thumb, definido por size. |
--slider-track | El grosor de la pista, definido por size. |
data-slot="slider-control" | El área pulsable alrededor de la pista. |
data-slot="slider-track" | La pista. |
data-slot="slider-range" | El relleno entre el inicio, o el primer thumb, y el último thumb. |
data-slot="slider-thumb" | Cada thumb. data-index indica su posición. |
data-active | En el thumb que tiene el foco o se está arrastrando. |
data-slot="slider-thumb-value" | La burbuja de valor de showValue. |
Da nombre a los thumbs y crece para llenar la fila. Renderiza un <div>.
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="slider-label" | La etiqueta. |
Muestra los valores con formato, unidos con un guion en un rango. Renderiza un <output>.
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenTexto personalizado. | (formattedValues: string[], values: number[]) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <output> |
| Atributo | Descripción |
|---|---|
data-slot="slider-value" | El valor. |
data-orientation | horizontal o vertical. |
data-dragging | Presente mientras hay un puntero pulsado. |
data-disabled | Presente cuando está deshabilitado. |
data-invalid | Presente cuando no es válido dentro de un Field. |
- 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.
Usado en bloques
Bloques que se construyen sobre Slider.
- 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.
- ProfileLa sección Perfil de los ajustes de un producto de IA. Recorta una foto en un círculo, elige un nombre de usuario que se comprueba mientras escribes, confirma un nuevo correo con un código de 6 dígitos, añade enlaces que reconocen el sitio y mira una tarjeta en vivo de cómo te ven los demás.
- SettingsAjustes para un producto de IA, con un diseño como el de Cursor y Claude. Una barra lateral rellena con búsqueda, grupos y enlaces externos, tarjetas de filas con selectores discretos y opciones anidadas, una isla de guardado oscura que sube solo cuando algo cambió, ⌘S para guardar, errores de campo desde tus comprobaciones o tu servidor y estados de carga con la forma del contenido.