Calendar
Full-featured calendar with FullCalendar — event management, multiple views, and drag-and-drop scheduling.
Read this when adding calendar features to your app.
Useful for scheduling, bookings, or event management.
Why FullCalendar
FullCalendar is the most complete calendar library. It handles complex scheduling scenarios that simple date pickers can't — multiple views, recurring events, drag-and-drop, and time zone support.
The React version integrates naturally with your app. You pass events as props, handle interactions with callbacks, and customize rendering with React components.
Key Features
What FullCalendar provides:
Multiple Views
Month, week, day, list. Switch between views for different scheduling needs.
Time Slots
Hourly scheduling. Time grid views for appointments and meetings.
Drag & Drop
Move and resize. Drag events to reschedule, resize to change duration.
Event Display
Rich events. Colors, icons, custom rendering, and event grouping.
Catalyst Integration
Catalyst includes a calendar example:
app/(examples)/examples/calendar/Full calendar example with events and interactions
Quick Start
Basic calendar
"use client"
import FullCalendar from "@fullcalendar/react"
import dayGridPlugin from "@fullcalendar/daygrid"
const events = [
{ title: "Team Meeting", date: "2024-01-15" },
{ title: "Project Review", date: "2024-01-16" },
]
export function Calendar() {
return (
<FullCalendar
plugins={[dayGridPlugin]}
initialView="dayGridMonth"
events={events}
/>
)
}Interactive calendar with time slots
import FullCalendar from "@fullcalendar/react"
import dayGridPlugin from "@fullcalendar/daygrid"
import timeGridPlugin from "@fullcalendar/timegrid"
import interactionPlugin from "@fullcalendar/interaction"
export function SchedulingCalendar() {
const handleDateClick = (info) => {
// Create new event at clicked time
console.log("Clicked:", info.dateStr)
}
const handleEventClick = (info) => {
// Open event details
console.log("Event:", info.event.title)
}
const handleEventDrop = (info) => {
// Event was dragged to new time
console.log("Moved to:", info.event.start)
}
return (
<FullCalendar
plugins={[dayGridPlugin, timeGridPlugin, interactionPlugin]}
initialView="timeGridWeek"
headerToolbar={{
left: "prev,next today",
center: "title",
right: "dayGridMonth,timeGridWeek,timeGridDay",
}}
events={events}
editable={true}
selectable={true}
dateClick={handleDateClick}
eventClick={handleEventClick}
eventDrop={handleEventDrop}
/>
)
}Included Plugins
Catalyst includes these FullCalendar plugins:
@fullcalendar/daygridMonth and day grid views
@fullcalendar/timegridWeek and day time slot views
@fullcalendar/interactionDrag, drop, and click interactions
Styling
Customize FullCalendar to match your theme:
/* In your CSS */
.fc {
/* Use your theme colors */
--fc-border-color: var(--color-border);
--fc-button-bg-color: var(--color-primary);
--fc-button-border-color: var(--color-primary);
--fc-today-bg-color: oklch(from var(--color-primary) l c h / 0.1);
}
.fc-event {
/* Event styling */
background: var(--color-primary);
border: none;
border-radius: 4px;
}Tips
Use "use client". FullCalendar requires browser APIs and must be a client component.
Import only needed plugins. Each plugin adds to bundle size — only include what you use.
Handle loading state. If fetching events async, show a loading indicator or skeleton.
Test mobile. FullCalendar is responsive but may need configuration for mobile views.
Learn More
For AI Agents
Key rules:
- Calendar must be a client component ("use client")
- Import plugins individually — don't import all at once
- Use interactionPlugin for drag/drop and click handling
- Events prop accepts array of event objects
- See
/examples/calendarfor usage patterns