vaiperui

componentes / time-picker

TimePicker

Campo que abre columnas de hora y minuto para elegir una hora del día.

Cómo usar

El valor es una cadena `"HH:mm"` en 24h (`"14:30"`), también con `hour12`, que solo cambia cómo se muestra y añade una columna AM/PM. El panel queda abierto mientras eliges: elige la hora, luego el minuto, y cierra con `Esc` o haciendo clic fuera. `minuteStep` limita los minutos (p. ej. 15).

preview
TimePicker.tsx
import { TimePicker } from "vaiperui";
const [time, setTime] = useState("14:30");
<TimePicker label="Hora" value={time} onValueChange={setTime} />
<TimePicker label="Hora" hour12 minuteStep={15} />

24h y 12h

preview
24h
12h
formato-hora.tsx
<TimePicker defaultValue="14:30" />
<TimePicker hour12 defaultValue="14:30" />

Paso de los minutos

preview
15
30
paso-minutos.tsx
<TimePicker minuteStep={15} />
<TimePicker minuteStep={30} />

Tamaños

preview
sm
md
lg
tamanos.tsx
<TimePicker size="sm" />
<TimePicker size="md" />
<TimePicker size="lg" />

Estados

preview
Detalle extra
ayuda
Esto es obligatorio
error
deshabilitado
solo lectura
estados.tsx
<TimePicker label="..." helperText="..." />
<TimePicker label="..." errorMessage="..." />
<TimePicker label="..." disabled />
<TimePicker label="..." readOnly />

Props

PropValoresPredeterminadoDescripción
value / defaultValuestringningunoHora del día como "HH:mm" (24h), controlada o inicial
onValueChange(time: string) => voidningunoSe llama con "HH:mm" cuando cambia la hora, el minuto o el período
hour12booleanfalse12h con una columna AM/PM
minuteStepnumber1Granularidad de la columna de minutos
labels{ hours, minutes, period, am, pm }ningunoTextos de las columnas de hora
label / helperTextstringningunoEtiqueta sobre el campo y texto de ayuda debajo
errorMessagestringningunoTexto de error; su sola presencia fuerza el estado de error
namestringningunoNombre del campo del formulario
disabled / readOnlybooleanfalseNo abre el panel; readOnly aún muestra el valor
variantring | outlineringEstilo de foco, igual que Input
size / radiussm | md | lg / none | sm | md | lg | fullmd / mdAltura del campo y redondeo de las esquinas
aria-labelstringningunoNombre accesible cuando no hay etiqueta
panelLabelstringningunoNombre accesible del panel abierto

Accesibilidad

  • El disparador es un `<button>` con `aria-haspopup="dialog"` y `aria-expanded` que refleja el estado del panel.
  • El `label` se enlaza con `htmlFor`; sin `label`, el disparador usa `aria-label`.
  • `errorMessage` define `aria-invalid` y `aria-describedby` apuntando al mensaje; sin error, `helperText` se enlaza con `aria-describedby`.
  • El panel es un `role="dialog"` nombrado por `panelLabel`, renderizado en un portal en `document.body`.
  • `disabled` deshabilita el botón; `readOnly` mantiene el foco posible, pero el panel nunca se abre.
  • Horas, minutos y (con `hour12`) AM/PM son columnas, cada una un `role="group"` nombrado por `labels.hours`, `labels.minutes` y `labels.period`.
  • Cada opción es un `<button>` con `aria-pressed` en la seleccionada; la opción seleccionada se desplaza a la vista al abrir el panel.

Teclado

TeclaAcción
Enter / SpaceAbre o cierra el panel desde el disparador.
Arrow Up / DownDentro de una columna, mueve el foco a la opción anterior / siguiente.
TabSe mueve entre las opciones del panel (cada opción es una parada de Tab).
Enter / SpaceElige la opción enfocada; el panel sigue abierto.
EscCierra el panel y devuelve el foco al disparador.

Ten en cuenta

  • El foco no pasa al panel al abrir y el panel sigue abierto tras elegir: ciérralo con Esc o haciendo clic fuera.
  • Hacer clic fuera cierra el panel sin devolver el foco; solo Esc restaura el foco en el disparador.
  • La hora solo se elige en las columnas (sin escribir; solo los minutos listados por `minuteStep`). Pasa `labels` y `panelLabel` traducidos; los valores por defecto están en inglés.