CalendarView
Calendario mensual con eventos en cada día, cabecera con fecha de hoy y navegación.
Cuándo usarlo
Props. events [{date, title, time, color (colores de Badge)}], today, month, maxEvents (3; el resto como "N más…"), onSelectDate(date), subtitle, actions.
Visual. Celdas de 112px con borde border-secondary; días de otro mes en bg-secondary; hoy en círculo bg-brand-solid. Eventos como chips utility (-50 fondo, -200 borde, -700 texto).
Límites. Solo vista de mes. Las vistas de semana y día del archivo no están: si una app las necesita, se añaden.
Accesibilidad. Es una tabla de verdad: cabeceras Lu…Do y una fila por semana (en la guía era una rejilla sin filas, que no es ARIA válido). Cada día lleva su fecha completa para lectores de pantalla ("jueves, 29 de octubre, hoy"). Con onSelectDate, el número de cada día es un botón (teclado) y la celda entera responde al clic. Al cambiar de mes se anuncia el nuevo.
Detalles. El "hoy" sale de la prop today (por defecto, la fecha actual); fíjala si el servidor y el navegador pueden estar en días distintos.
Contraste de "N más…". En la guía va en utility-neutral-500, que en oscuro no llega a 4,5:1 (3,8:1 sobre los días de otro mes). Aquí va en text-quaternary: el mismo gris en claro y más claro en oscuro (7,7:1).
Ejemplos
Octubre 2026
Pagos y recordatorios
| Lu | Ma | Mi | Ju | Vi | Sá | Do |
|---|---|---|---|---|---|---|
lunes, 28 de septiembre | martes, 29 de septiembre | miércoles, 30 de septiembre | jueves, 1 de octubre Alquiler650 € | viernes, 2 de octubre | sábado, 3 de octubre | domingo, 4 de octubre |
lunes, 5 de octubre Electricidad | martes, 6 de octubre | miércoles, 7 de octubre | jueves, 8 de octubre | viernes, 9 de octubre | sábado, 10 de octubre | domingo, 11 de octubre |
lunes, 12 de octubre | martes, 13 de octubre | miércoles, 14 de octubre | jueves, 15 de octubre Seguro coche Gimnasio Netflix 1 más… | viernes, 16 de octubre | sábado, 17 de octubre | domingo, 18 de octubre |
lunes, 19 de octubre | martes, 20 de octubre | miércoles, 21 de octubre | jueves, 22 de octubre | viernes, 23 de octubre | sábado, 24 de octubre | domingo, 25 de octubre |
lunes, 26 de octubre | martes, 27 de octubre | miércoles, 28 de octubre | jueves, 29 de octubre, hoy Revisión semanal18:00 | viernes, 30 de octubre | sábado, 31 de octubre | domingo, 1 de noviembre |
Props
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
events | CalendarEvent[] | [] | |
today | Date | — | El día que se marca como hoy (por defecto, la fecha del sistema). |
month | Date | — | Mes que se ve al principio. Por defecto, el de today. |
maxEvents | number | 3 | Eventos por día; el resto se resume como "N más…". |
onSelectDate | ((date: Date) => void) | — | Al pulsar un día (con ratón, o con teclado sobre su número). |
subtitle | ReactNode | — | |
actions | ReactNode | — | Acciones a la derecha de la cabecera, como "Nuevo evento". |
className | string | — |
Código
import { CalendarView } from "@jotis-me/react";
export default function Page() {
return (
<>
<CalendarView
events={[{ date: new Date(2026, 9, 29), title: "Pago del alquiler", color: "brand" }]}
onSelectDate={(fecha) => abrirDia(fecha)}
/>
</>
);
}---
import { CalendarView } from "@jotis-me/react";
---
<CalendarView client:load
events={[{ date: new Date(2026, 9, 29), title: "Pago del alquiler", color: "brand" }]}
onSelectDate={(fecha) => abrirDia(fecha)}
/>Sin directiva pinta el mes sin JavaScript. Cambiar de mes y onSelectDate necesitan una isla .tsx con client:load.