Hecho sobre el UI SDK 0.1.0-beta.2 de Vercel. Su API puede cambiar.
Time input
Un campo de hora sobre el UI SDK de Vercel que se escribe parte por parte, en reloj de 12 o 24 horas con segundos opcionales, mínimo y máximo, y un valor de 24 horas para formularios.
- Componentes de formulario
- 3 partes
- 10 ejemplos
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-time-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-time-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.
El valor es una hora de 24 horas como "14:30", igual que la de un input de hora nativo, sea cual sea el reloj que muestre el campo. Sigue siendo null hasta que todas las partes tienen algo. Cada parte es un input pequeño: escribe dígitos y avanza, o pulsa A o P para la mitad del día.
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.
TimeInput muestra sus partes por sí solo. Añade TimeInputSegments tú mismo para poner un icono u otro contenido a su lado.
El campo muestra el reloj del idioma. hourCycle elige 12 o 24 horas, y granularity añade segundos o muestra solo la hora. Todos envían valores de 24 horas.
Una hora antes de min o después de max marca el campo como no válido, y su formulario no se envía.
invalid marca el campo para comprobaciones propias, como una hora de fin anterior al inicio.
locale fija el orden, los separadores y los nombres de la mitad del día. Sin él, el campo sigue el idioma de la página cuando es interactivo.
Un input oculto envía la hora con name. required impide una hora vacía o a medio escribir, y restablecer vuelve al valor por defecto.
createTimeInputController() fija, vacía o enfoca el campo desde cualquier sitio. Enfoca una parte por su unidad, como "minute".
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. |
| ↑↓ | Cambia la parte en uno, dando la vuelta. Una parte vacía empieza en la hora actual. |
| PageUpPageDown | Cambia más, por ejemplo 15 minutos. |
| 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. |
| AP | Elige AM o PM en un reloj de 12 horas. |
| Enter | Envía el formulario con lo escrito. |
La raíz es un grupo. Cada parte es un spinbutton nombrado por su unidad, como “hour”, 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 | – |
hourCyclePor defecto, el reloj del idioma. | 12 | 24 | – |
granularity | "hour" | "minute" | "second" | "minute" |
min | string | – |
max | string | – |
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 createTimeInputController(). | TimeInputController | – |
childrenPor defecto, TimeInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="time-input" | Para apuntar al campo de hora en CSS. |
data-invalid | Presente cuando la hora está fuera de min y max, o cuando 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 TimeInputSegment 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. | TimeInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="time-input-segment" | Para apuntar a una parte en CSS. |
data-type | 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.