Date picker
Un botón que abre un calendario en un popover, o en una hoja inferior en móviles, para fechas únicas y rangos.
pnpm dlx shadcn@latest add https://hextaui.com/r/date-picker.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 cn react-day-pickerCopia y pega el siguiente código en tu proyecto.
components/ui/date-picker.tsx components/ui/calendar.tsx components/ui/popover.tsx components/ui/sheet.tsx components/ui/button.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
En pantallas de menos de 640px el calendario se abre en una hoja inferior en lugar de un popover, para que los días sigan siendo lo bastante grandes para tocarlos.
Controlado
Pasa value y onValueChange. Los valores borrados son null. El calendario siempre se abre en el mes de la fecha seleccionada, y elegir un día lo cierra y devuelve el foco al botón.
Rango
<DateRangePicker /> muestra dos meses en pantallas más grandes. El primer clic siempre inicia un rango nuevo, aunque ya haya uno definido, y el segundo clic lo termina en cualquier orden y cierra el selector.
Días deshabilitados
Pasa cualquier matcher de react-day-picker como calendarProps.disabled. Aquí solo se pueden elegir días laborables futuros.
Desplegables de mes y año
Para fechas lejanas como un cumpleaños, define captionLayout: "dropdown" con un startMonth y un endMonth. Etiqueta el trigger con un <label /> que apunte a su id.
En un formulario
Con name, una sola fecha se envía como 2026-10-14 y un rango como 2026-10-20/2026-10-24. Los selectores vacíos envían una cadena vacía.
Deshabilitado
Un trigger deshabilitado puede seguir mostrando un valor.
Contenedor estrecho
El trigger nunca crece más allá de su contenedor. Las etiquetas largas se truncan en lugar de ajustarse.
Dentro de una hoja
El selector se apila sobre el sheet, y Escape cierra solo el selector.
De derecha a izquierda
Pasa locale para la etiqueta del trigger y un locale de react-day-picker con dir: "rtl" en calendarProps para el calendario. Las teclas de flecha siguen la dirección.
| Key | Acción |
|---|---|
| EnterSpace | En el trigger, abre el selector y da foco al día seleccionado, o a hoy. En un día, lo selecciona. |
| ←→ | Pasa al día anterior o siguiente. |
| ↑↓ | Pasa al mismo día de la semana anterior o siguiente. |
| Page UpPage Down | Pasa al mes anterior o siguiente. |
| ShiftPage Up | Pasa al año anterior. Shift Page Down pasa al siguiente. |
| HomeEnd | Pasa al inicio o al final de la semana. |
| Esc | Cierra el selector y devuelve el foco al trigger. |
- El popover se etiqueta con
title, y la hoja inferior lo muestra como encabezado. Tradúcelo junto conplaceholder. - El trigger no tiene una etiqueta visible propia. Combínalo con un
<label />o pasaaria-label. - El teclado omite los días deshabilitados y se anuncian como no disponibles.
Ambos selectores comparten las props de abajo y renderizan un trigger <Button /> con un <Calendar /> en un popover o una hoja inferior.
| Prop | Tipo | Predeterminado |
|---|---|---|
value | Date | null | – |
defaultValue | Date | null | null |
onValueChange | (value: Date | null) => void | – |
placeholder | string | "Pick a date" |
titleNombre accesible del popover, encabezado del sheet. | string | "Select a date" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeDa formato a la etiqueta del trigger con Intl.DateTimeFormat. Pasa un locale de react-day-picker en calendarProps para traducir también el calendario. | string | "en-US" |
clearableAñade un botón Clear bajo el calendario una vez que hay un valor. | boolean | false |
clearLabel | string | "Clear" |
nameRenderiza un input oculto para que el valor se envíe con su formulario. | string | – |
calendarPropsSe pasa al calendario, excepto mode, selected, onSelect, required, numberOfMonths y autoFocus. Úsalo para días deshabilitados, captionLayout, startMonth, endMonth, locale y dir. | CalendarProps | – |
variantEl trigger es un Button y también acepta sus otras props. | Button variant | "outline" |
disabled | boolean | false |
classNameSe aplica al trigger, que es w-60 por defecto. | string | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
value | { from: Date; to?: Date } | null | – |
defaultValue | { from: Date; to?: Date } | null | null |
onValueChangeSe llama una vez que se elige el segundo día. | (value: DateRange | null) => void | – |
placeholder | string | "Pick a date range" |
title | string | "Select dates" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeDa formato a la etiqueta del trigger con Intl.DateTimeFormat. Pasa un locale de react-day-picker en calendarProps para traducir también el calendario. | string | "en-US" |
clearableAñade un botón Clear bajo el calendario una vez que hay un valor. | boolean | false |
clearLabel | string | "Clear" |
nameRenderiza un input oculto para que el valor se envíe con su formulario. | string | – |
calendarPropsSe pasa al calendario, excepto mode, selected, onSelect, required, numberOfMonths y autoFocus. Úsalo para días deshabilitados, captionLayout, startMonth, endMonth, locale y dir. | CalendarProps | – |
variantEl trigger es un Button y también acepta sus otras props. | Button variant | "outline" |
disabled | boolean | false |
classNameSe aplica al trigger, que es w-60 por defecto. | string | – |
| Atributo | Descripción |
|---|---|
data-slot="date-picker-trigger" | El botón trigger. |
data-empty | Presente en el trigger mientras no hay valor. Muestra el placeholder en texto atenuado. |
data-popup-open | Presente en el trigger mientras el selector está abierto. |
data-slot="date-picker-content" | Envuelve el calendario en el popover o el sheet. |
data-slot="date-picker-clear" | El botón Clear. |
- ButtonBotones en todas las variantes y tamaños, con un flujo integrado de carga, éxito y error que omite el spinner en las peticiones rápidas.
- 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.
- PopoverUn panel flotante anclado a un trigger que se redimensiona suavemente con su contenido y sigue la dirección del trigger.
- SheetUn panel que se desliza desde cualquier borde, con deslizamiento para descartar, bloqueo de scroll y anidamiento apilado.
- 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.
Usado en bloques
Bloques que se construyen sobre Date picker.