Hecho sobre el UI SDK 0.1.0-beta.2 de Vercel. Su API puede cambiar.
Date input
Un campo de fecha sobre el UI SDK de Vercel que se escribe parte por parte en el orden del idioma, con hora opcional, mínimo y máximo, días no disponibles y un valor ISO.
- Componentes de formulario
- 3 partes
- 10 ejemplos
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-input.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-date-input.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.
Usa un campo de fecha para fechas que se saben de memoria, como un cumpleaños. El valor es una fecha ISO como "2026-11-02", y sigue siendo null hasta que todas las partes tienen algo. Cada parte se llena al escribir y avanza, el día se mantiene dentro de su mes y se puede pegar una fecha completa en cualquier parte. Para elegir en un calendario, usa el Date Picker.
El campo es un grupo, así que nómbralo con aria-labelledby o aria-label. Al hacer clic en cualquier punto de la caja se enfoca la parte más cercana.
DateInput muestra sus partes por sí solo. Añade DateInputSegments tú mismo para poner un icono u otro contenido a su lado.
granularity con "hour", "minute" o "second" añade la hora, y el valor pasa a ser una fecha y hora locales como "2026-11-02T14:30".
Una fecha antes de min o después de max marca el campo como no válido, y su formulario no se envía.
unavailable acepta fechas ISO, rangos { from, to }, días de la semana o una función, y una fecha que coincida no es válida.
locale fija el orden y los separadores. Los dígitos son siempre del 0 al 9 y el calendario siempre gregoriano, así que el valor significa la misma fecha en todas partes.
Un input oculto envía la fecha ISO con name, aquí junto a un Time Input. required impide una fecha vacía o a medio escribir, y restablecer vuelve al valor por defecto.
createDateInputController() fija, vacía o enfoca el campo desde cualquier sitio. Enfoca una parte por su unidad, como "year".
Un campo desactivado se salta al enfocar y no se envía.
Un campo de solo lectura recibe el foco y se envía, pero las teclas y la escritura no lo cambian.
Las partes mantienen el orden del idioma, y las flechas las siguen en pantalla.
| Key | Acción |
|---|---|
| 0–9 | Rellena la parte y pasa a la siguiente. |
| /. | Pasa a la siguiente parte. |
| ↑↓ | Cambia la parte en uno, dando la vuelta. Una parte vacía empieza en hoy. |
| PageUpPageDown | Cambia más: un año en 5, un mes en 3, un día en 7. |
| HomeEnd | Va al primer o último valor de la parte. |
| ←→ | Pasa a la parte anterior o siguiente. |
| Backspace | Borra el último dígito, luego vacía la parte y después retrocede. |
| Enter | Envía el formulario con lo escrito. |
La raíz es un grupo. Cada parte es un spinbutton nombrado por su unidad, como “month”, con su valor y su rango, y una parte vacía se lee como “Empty”. El texto entre partes queda oculto para los lectores de pantalla.
Las partes son inputs reales, así que los móviles muestran un teclado numérico y se puede escribir antes de que se ejecute el script de la página. Crecen a 16px en pantallas táctiles para que los móviles no hagan zoom, y la parte enfocada se resalta en lugar de mostrar un cursor.
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 | string | null | – |
defaultValue | string | null | – |
onValueChangeSe ejecuta cuando todas las partes tienen algo, y con null cuando una se vacía. | (value: string | null, details) => void | – |
granularity | "day" | "hour" | "minute" | "second" | "day" |
hourCyclePor defecto, el reloj del idioma. | 12 | 24 | – |
min | string | – |
max | string | – |
unavailableFechas ISO, rangos { from, to }, { weekday } o una función. | DateMatchers | – |
localePor defecto, el idioma de la página. | string | – |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createDateInputController(). | DateInputController | – |
childrenPor defecto, DateInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="date-input" | Para apuntar al campo de fecha en CSS. |
data-invalid | Presente cuando la fecha está fuera de min y max, no está disponible, o invalid está activo. |
data-empty | Presente mientras todas las partes están vacías. |
data-disabled | Presente cuando está deshabilitado. |
data-readonly | Presente cuando es de solo lectura. |
data-required | Presente cuando es obligatorio. |
Muestra un DateInputSegment por cada parte, en el orden del idioma, con el texto entre ellas.
| Prop | Tipo | Predeterminado |
|---|---|---|
segmentUno de los segments del estado de la raíz. | DateInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="date-input-segment" | Para apuntar a una parte en CSS. |
data-type | year, month, day, hour, minute, second, dayPeriod, o literal para el texto entre partes. |
data-empty | Presente mientras la parte está vacía. |
- 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.