vaiperui

componentes / calendar

Calendar

Calendario de un mes para elegir un día o un intervalo, con navegación completa por teclado.

Cómo usar

La base de `DatePicker` y `DateRangePicker`, que también funciona sola (agendas, filtros, paneles). Los valores son `Date` de JavaScript que representan un día: la hora se ignora. Con `mode="range"`, `value` es un objeto `{ from, to }`: el primer clic define el inicio, el segundo el fin, y un clic antes del inicio o en un intervalo completo empieza de nuevo.

preview
octubre de 2026
lunmarmiéjueviesábdom
octubre de 2026
lunmarmiéjueviesábdom
Calendar.tsx
import { Calendar } from "vaiperui";
const [date, setDate] = useState<Date>();
const [period, setPeriod] = useState<DateRange>({});
<Calendar value={date} onValueChange={setDate} />
<Calendar mode="range" value={period} onValueChange={setPeriod} />

Día único e intervalo

preview
octubre de 2026
lunmarmiéjueviesábdom
single
octubre de 2026
lunmarmiéjueviesábdom
range
modos.tsx
<Calendar defaultValue={new Date(2026, 9, 19)} />
<Calendar mode="range" defaultValue={{ from: new Date(2026, 9, 12), to: new Date(2026, 9, 18) }} />

Colores

preview
octubre de 2026
lunmarmiéjueviesábdom
primary
octubre de 2026
lunmarmiéjueviesábdom
success
octubre de 2026
lunmarmiéjueviesábdom
warning
octubre de 2026
lunmarmiéjueviesábdom
danger
colores.tsx
<Calendar variantColor="primary" defaultValue={date} />
<Calendar variantColor="success" defaultValue={date} />
<Calendar variantColor="warning" defaultValue={date} />
<Calendar variantColor="danger" defaultValue={date} />

Límites

`minDate` y `maxDate` deshabilitan los días fuera y las flechas de mes que llevan allí.

preview
octubre de 2026
lunmarmiéjueviesábdom
min / max
limites.tsx
<Calendar minDate={new Date(2026, 9, 10)} maxDate={new Date(2026, 9, 25)} />

Idioma y primer día de la semana

preview
outubro de 2026
seg.ter.qua.qui.sex.sáb.dom.
pt-BR
octubre de 2026
lunmarmiéjueviesábdom
es-ES
idioma.tsx
<Calendar locale="pt-BR" weekStartsOn={1} />
<Calendar locale="es-ES" weekStartsOn={1} />

Props

PropValoresPredeterminadoDescripción
modesingle | rangesingleUn día o un intervalo. Cambia el tipo de value
value / defaultValueDate | { from?: Date; to?: Date }ningunoSelección, controlada o inicial
onValueChange(date: Date) => void | (range: DateRange) => voidningunoSe llama en cada clic
autoFocusbooleanfalseEnfoca el día al montar; úsalo cuando el calendario se abre dentro de un panel
minDate / maxDateDateningunoPrimer y último día permitidos; el resto y las flechas de mes que llevan fuera quedan deshabilitados
localestring"en-US"Idioma de los nombres de mes/día y formato de la fecha (BCP 47)
weekStartsOn0 – 60Primer día de la semana (0 = domingo)
previousMonthLabel / nextMonthLabelstring"Previous month" / "Next month"Nombres accesibles de los botones de mes
variantColor / customColor / animationprimary | success | warning | danger / CSS color / none | smooth | fast | bounceprimary / smoothColor de la selección y del foco, y velocidad de la transición

Accesibilidad

  • La cuadrícula es una `<table role="grid">` nombrada por el título del mes, con celdas `role="gridcell"` y encabezados de día `<th scope="col">`.
  • Cada día es un `<button>` real, con `aria-label` que contiene la fecha completa (por ejemplo día de la semana, día, mes, año) en el `locale`.
  • Roving tabindex: solo el día enfocado tiene `tabIndex=0`, así que Tab recorre el calendario en una sola parada.
  • Los días seleccionados (y todos los días dentro de un intervalo) reciben `aria-selected` en la celda; hoy recibe `aria-current="date"`.
  • El título del mes es una región `aria-live="polite"`, así que el cambio de mes se anuncia.
  • Los días fuera de `minDate`/`maxDate` son botones `disabled`; los botones anterior/siguiente se deshabilitan cuando el mes quedaría fuera del límite.

Teclado

TeclaAcción
Tab / Shift+TabEntra y sale de la cuadrícula (una parada en el día enfocado); también llega a los botones de mes anterior/siguiente.
Arrow Left / RightMueve el foco un día atrás / adelante.
Arrow Up / DownMueve el foco una semana atrás / adelante.
Home / EndMueve el foco al primer / último día de la semana (según `weekStartsOn`).
Page Up / Page DownMueve el foco un mes atrás / adelante.
Shift + Page Up / Page DownMueve el foco un año atrás / adelante.
Enter / SpaceSelecciona el día enfocado (clic nativo del botón).

Ten en cuenta

  • Pasa `previousMonthLabel` y `nextMonthLabel` traducidos; los valores por defecto están en inglés.
  • Define `locale` con el idioma de la página: controla el título del mes, los nombres de los días y el `aria-label` de cada día.
  • Las teclas que llevan a otro mes cambian el mes mostrado, limitadas a `minDate`/`maxDate`; los botones anterior/siguiente cambian el mes sin mover el foco a un día.