Fluxo UIFluxo UIv0.4.93

Calendar

A full-featured, plugin-extensible calendar component with 8 view modes, drag-and-drop, custom rendering, and a comprehensive imperative API.

Basic Calendar

A fully interactive calendar with default configuration.

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Basic Usage
import { Calendar } from 'fluxo-ui';
import type { CalendarEntry } from 'fluxo-ui';

const entries: CalendarEntry[] = [
  {
    id: '1',
    title: 'Team Standup',
    start: new Date(2025, 8, 15, 9, 0),
    end: new Date(2025, 8, 15, 9, 30),
    color: '#3b82f6',
  },
  {
    id: '2',
    title: 'Sprint Planning',
    start: new Date(2025, 8, 15, 10, 0),
    end: new Date(2025, 8, 15, 11, 30),
    color: '#8b5cf6',
    editable: true,
  },
];

<Calendar
  entries={entries}
  initialView="timeGridWeek"
  height={600}
  editable
  selectable
  nowIndicator
  showNavigationPicker
/>

View Modes

All 8 built-in view modes. Click buttons to switch.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek

Custom Entry Rendering

Use renderEntry to fully control entry appearance with icons and custom layouts.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
🎉Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
🏠Team Lunch
📥Client Call
🏠Morning Yoga
📥Team Standup
📥Sprint Planning
📥Parallel Meeting A
🏠Lunch Break
Code Review
📥Design Sync
🎉Workshop
View changed to timeGridWeek
Custom Render
<Calendar
  entries={entries}
  renderEntry={(entry, context) => (
    <div style={{ padding: '2px 4px' }}>
      <strong>{entry.title}</strong>
      {!context.isCompact && (
        <div style={{ fontSize: '0.7rem', opacity: 0.8 }}>
          {entry.data?.location}
        </div>
      )}
    </div>
  )}
/>

Time Grid Configuration

Configure slot duration, visible hours, business hours, time format, and more.

Slot:
Format:
Row Banding:
OffOn

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Configuration
<Calendar
  entries={entries}
  slotDuration={15}
  visibleHoursStart={8}
  visibleHoursEnd={20}
  firstDayOfWeek={1}
  timeFormat="24h"
  businessHours={{
    daysOfWeek: [1, 2, 3, 4, 5],
    startTime: '09:00',
    endTime: '17:00',
  }}
  hiddenDays={[0, 6]}
  rowBanding
  nowIndicator
  navLinks
/>

Drag, Drop & Resize

Entries marked as editable can be moved and resized. The fixed entry cannot be moved.

Friday, June 26, 2026

Fri
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
9:00 AMDrag Me!
11:00 AMResize Me!
2:00 PMFixed Entry
View changed to timeGridDay
Event Callbacks
<Calendar
  entries={entries}
  onEntryClick={(entry, event) => {
    console.log('Clicked:', entry.title);
  }}
  onDateSelect={(info, event) => {
    console.log('Selected:', info.start, '-', info.end);
  }}
  onEntryDrop={(info, event) => {
    console.log('Moved:', info.entry.title, 'to', info.newStart);
  }}
  onEntryResize={(info, event) => {
    console.log('Resized:', info.entry.title);
  }}
  onEntryContextMenu={(entry, event) => {
    console.log('Right-click:', entry.title);
  }}
/>

Imperative API

Control the calendar programmatically using a ref.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Imperative API
import { useRef } from 'react';
import { Calendar } from 'fluxo-ui';
import type { CalendarApi } from 'fluxo-ui';

const MyComponent = () => {
  const calendarRef = useRef<CalendarApi>(null);

  return (
    <>
      <button onClick={() => calendarRef.current?.prev()}>
        Previous
      </button>
      <button onClick={() => calendarRef.current?.today()}>
        Today
      </button>
      <button onClick={() => calendarRef.current?.changeView('dayGridMonth')}>
        Month View
      </button>

      <Calendar
        entries={entries}
        apiRef={calendarRef}
      />
    </>
  );
};

Plugin-Based Views

Views are tree-shakeable plugins. Only import what you need — unused views won't be bundled. New views: Year Grid, Agenda, and custom N-day time grids.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Plugin-based view selection
import {
  Calendar,
  timeGridPlugin, monthGridPlugin,
  yearGridPlugin, agendaPlugin,
  timeGridCustomPlugin,
} from 'fluxo-ui';

// Only bundle the views you need
const plugins = [
  timeGridPlugin(),        // timeGridWeek + timeGridDay
  monthGridPlugin(),       // dayGridMonth
  yearGridPlugin(),        // yearGrid (12-month overview)
  agendaPlugin({ dayCount: 14 }),  // 2-week agenda
  timeGridCustomPlugin({ dayCount: 3, label: '3 Days' }),
];

<Calendar
  plugins={plugins}
  initialView="timeGridWeek"
  entries={entries}
/>
Restrict toolbar views via headerToolbarViews
// Only show specific views in the toolbar dropdown
<Calendar
  headerToolbarViews={['timeGridWeek', 'dayGridMonth', 'yearGrid']}
  entries={entries}
/>
Create your own custom view plugin
import { createViewPlugin, defineView } from 'fluxo-ui';

// Build your own view
const myView = defineView({
  name: 'myCustomView',
  label: 'My View',
  component: MyViewComponent,  // React component with ViewProps
  getDateRange: (date, firstDayOfWeek) => ({ start, end }),
  getTitle: (range) => 'My Custom Title',
  navigate: (date, dir) =>
    dir === 'prev' ? subDays(date, 7) : addDays(date, 7),
});

const myPlugin = createViewPlugin({
  name: 'my-plugin',
  views: [myView],
});

<Calendar plugins={[myPlugin]} initialView="myCustomView" />

Plugin System

Extend the calendar with custom plugins that add toolbar actions, views, and entry renderers.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Plugin initialized
Plugin System
import { Calendar } from 'fluxo-ui';
import type { CalendarPlugin, CalendarViewDefinition } from 'fluxo-ui';

const myPlugin: CalendarPlugin = {
  name: 'my-custom-plugin',
  views: [myCustomView],
  toolbarActions: [
    {
      id: 'export',
      label: 'Export',
      position: 'end',
      onClick: (api) => {
        const entries = api.getEntries();
        console.log('Exporting', entries.length, 'entries');
      },
    },
  ],
  onInit: (api) => console.log('Plugin initialized'),
};

<Calendar
  entries={entries}
  plugins={[myPlugin]}
/>

External Drag & Drop

Drag items from the sidebar into the calendar to create new entries.

Drag these into calendar

Team Meeting60m
Quick Call30m
Workshop120m
Review Session45m

Friday, June 26, 2026

Fri
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
10:00 AMExisting Meeting
View changed to timeGridDay
External Drag & Drop
<Calendar
  entries={entries}
  editable
  onExternalDrop={(info) => {
    console.log('Dropped at', info.date, 'allDay:', info.allDay);
    // Create new entry from the dropped data
  }}
/>

Date Backgrounds

Highlight specific dates or date ranges with custom background colors. Works across all views.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Date Backgrounds
<Calendar
  entries={entries}
  dateBackgrounds={[
    { date: new Date(2026, 3, 8), color: 'rgba(59, 130, 246, 0.1)' },
    { date: new Date(2026, 3, 10), color: 'rgba(239, 68, 68, 0.1)' },
  ]}
  dateRangeBackgrounds={[
    { start: new Date(2026, 3, 5), end: new Date(2026, 3, 7), color: 'rgba(139, 92, 246, 0.08)' },
  ]}
/>

Custom Toolbar End

Use renderToolbarEnd to compose the right side of the toolbar with your own components alongside the built-in view switcher and plugin actions.

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Custom Toolbar End
import { Calendar, ToolbarEndRenderProps } from 'fluxo-ui';

<Calendar
  entries={entries}
  initialView="timeGridWeek"
  showNavigationPicker
  renderToolbarEnd={({ viewSwitcher, pluginActions }) => (
    <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
      <button onClick={() => alert('Custom action!')}>+ New Event</button>
      {pluginActions}
      {viewSwitcher}
    </div>
  )}
/>

// The renderToolbarEnd callback receives:
// - viewSwitcher: The view mode dropdown (ReactNode)
// - pluginActions: Plugin toolbar actions for the end slot (ReactNode)
// Compose them in any order alongside your own components.

Icon-Only Navigation Picker

With navigationPickerIconOnly, the title remains visible as the header while a compact calendar icon provides quick date navigation.

Jun 21 – 27, 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
all-day
Annual Review Period
Q2 Sprint (10+ days)
12 AM
1 AM
2 AM
3 AM
4 AM
5 AM
6 AM
7 AM
8 AM
9 AM
10 AM
11 AM
12 PM
1 PM
2 PM
3 PM
4 PM
5 PM
6 PM
7 PM
8 PM
9 PM
10 PM
11 PM
12:00 PMTeam Lunch
Client Call
Morning Yoga
Team Standup
10:00 AMSprint Planning
10:00 AMParallel Meeting A
12:00 PMLunch Break
2:00 PMCode Review
Design Sync
10:00 AMWorkshop
View changed to timeGridWeek
Icon-Only Navigation Picker
<Calendar
  entries={entries}
  initialView="timeGridWeek"
  showNavigationPicker
  navigationPickerIconOnly
/>

// With navigationPickerIconOnly:
// - Title text remains visible as the header
// - A small calendar icon appears next to nav buttons
//   to open the date picker popover
// Without navigationPickerIconOnly (default):
// - The date range picker replaces the title,
//   styled as the header text with a picker icon

Compact & Embedded Mode

Use compact mode for embedding in sidebars or dashboards. Hide toolbar sections as needed.

Compact Mode

June 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
Annual Review Period
Team Lunch
Annual Review Period
Client Call
Team Standup
Sprint Planning
Lunch Break
All Day Conference
Team Offsite (3 days)
Annual Review Period
Project Deadline
Team Offsite (3 days)
Annual Review Period
Team Offsite (3 days)
Annual Review Period
Q2 Sprint (10+ days)
Annual Review Period
Q2 Sprint (10+ days)
Multi-day Training
Annual Review Period
Q2 Sprint (10+ days)
Multi-day Training
Q2 Sprint (10+ days)
Multi-day Training
Q2 Sprint (10+ days)
Q2 Sprint (10+ days)
Q2 Sprint (10+ days)
Q2 Sprint (10+ days)
Q2 Sprint (10+ days)
Q2 Sprint (10+ days)
View changed to dayGridMonth

Hidden Toolbar Sections

Jun 21 – 27, 2026

SundayJun 21, 2026
No entries
MondayJun 22, 2026
No entries
TuesdayJun 23, 2026
No entries
WednesdayJun 24, 2026
All day
Annual Review Period
12:00 PM1:30 PM
Team Lunch
ThursdayJun 25, 2026
All day
Annual Review Period
11:00 AM11:45 AM
Client Call
FridayJun 26, 2026
All day
Annual Review Period
All day
Company Holiday
All day
Q2 Sprint (10+ days)
7:00 AM7:45 AM
Morning Yoga
9:00 AM9:30 AM
Team Standup
10:00 AM11:30 AM
Sprint Planning
10:00 AM11:00 AM
Parallel Meeting A
10:15 AM11:15 AM
Parallel Meeting C
10:30 AM11:30 AM
Parallel Meeting B
10:45 AM11:45 AM
Parallel Meeting D
12:00 PM1:00 PM
Lunch Break
2:00 PM3:00 PM
Code Review
3:30 PM4:00 PM
Design Sync
SaturdayJun 27, 2026
All day
Annual Review Period
All day
Q2 Sprint (10+ days)
All day
All Day Conference
All day
Team Offsite (3 days)
10:00 AM12:00 PM
Workshop
View changed to listWeek

Props

entries
CalendarEntry[]"[]"

Array of calendar entries to display

initialView
CalendarViewMode"timeGridWeek"

Starting view mode

initialDate
Date | string"new Date()"

Starting date for navigation

plugins
CalendarPlugin[]"defaultPlugins"

Array of view/feature plugins. When omitted, all built-in views are registered. Pass specific plugins to tree-shake unused views.

headerToolbarViews
string[]

Restrict which view modes appear in the toolbar dropdown. Array of view name strings (e.g. [\"timeGridWeek\", \"dayGridMonth\"]). When omitted, all registered views are shown.

slotDuration
number"30"

Time grid slot interval in minutes

visibleHoursStart
number"0"

First visible hour (0-23)

visibleHoursEnd
number"24"

Last visible hour (1-24)

businessHours
BusinessHours"Mon-Fri 9-17"

Working days and hours config

firstDayOfWeek
number"0"

Week start day (0=Sun, 1=Mon)

hiddenDays
number[]"[]"

Days to hide from views

timeFormat
'12h' | '24h'"12h"

Time display format

editable
boolean"false"

Global drag/drop/resize default

selectable
boolean"true"

Enable time range selection

creatable
boolean"false"

Enable entry creation via drag (time grid) or double-click (month/day grid). Fires onEntryCreate callback.

slotHeight
number"24"

Height in pixels of each time slot in time grid views. Lower values make the grid more compact.

onEntryCreate
(info: EntryCreateInfo) => void

Called when a new entry is created via drag or double-click. Receives { start, end, allDay, view }.

eventMinDuration
number"0"

Minimum entry duration in minutes when creating/resizing (0 = no limit).

eventMaxDuration
number"0"

Maximum entry duration in minutes when creating/resizing (0 = no limit).

eventDefaultDuration
number"60"

Default duration in minutes for entries created via click (not drag).

eventDurationEditable
boolean"true"

Whether entries can be resized. Separate from editable (move).

eventStartEditable
boolean"true"

Whether entries can be moved. Separate from editable (resize).

eventOverlap
boolean"true"

Whether dragged/resized entries can overlap existing entries.

eventClassNames
(entry) => string | string[]

Dynamic CSS class names per entry for conditional styling.

eventConstraint
(info) => boolean

Restrict event drag/resize to specific time ranges (e.g., only within business hours).

eventDataTransform
(entry) => CalendarEntry

Transform function applied to all entry data before rendering.

entryOrder
(a, b) => number

Custom sort function for ordering overlapping entries.

selectMinDistance
number"0"

Min drag distance in pixels before selection starts.

selectOverlap
boolean"true"

Whether selections can overlap existing entries.

selectAllow
(info) => boolean

Conditionally prevent selection of certain time ranges.

selectMirror
boolean"false"

Show a mirror entry during drag-to-create instead of selection highlight.

eventAllow
(info) => boolean

Conditionally prevent entry drop/resize at certain times.

scrollTime
string"08:00"

Initial scroll position for time grid views (HH:MM format).

longPressDelay
number"1000"

Milliseconds to hold before touch becomes drag on mobile.

moreLinkClick
'popover' | 'day' | callback"popover"

Behavior when +N more is clicked in month view.

weekNumberClick
(weekNum, date, event) => void

Callback when a week number is clicked.

dayHeaderClick
(date, event) => void

Callback when a day column header is clicked in time grid.

dateAlignment
number"0"

Navigate by N days instead of view-width (0 = use view default).

allDaySlotMaxHeight
number"0"

Max height in px for the all-day row (0 = unlimited).

dayMinWidth
number"0"

Min column width in px for day columns in time grid (0 = auto).

dayMinHeight
number"0"

Min height in px for day cells in month view (0 = auto).

slotLabelInterval
number"0"

Interval in minutes at which slot labels appear in the time gutter. 0 (default) = label only at the start of each hour. Must be a positive divisor of 60 (e.g. 15, 30) when set. Use slotDuration to label every slot or 2*slotDuration for every other slot.

loading
boolean"false"

Show a loading indicator overlay on the calendar.

stickyHeaderDates
boolean"true"

Keep day/date headers sticky when scrolling the time grid.

weekText
string"''"

Prefix for week numbers display.

fixedWeekCount
boolean"true"

Always show 6 weeks in month grid.

expandRows
boolean"false"

Expand month grid rows to fill available space.

multiMonthCount
number"3"

Number of months to display in multi-month view.

nowIndicatorInterval
number"60000"

Update frequency in ms for the now indicator line.

dayPopoverFormat
string"'EEEE, MMMM d'"

Date format in overflow popover header.

allDayText
string"'all-day'"

Label text for the all-day row in time grid and overflow popover.

displayEventTime
boolean"true"

Whether to show the start time on entries in the default entry renderer.

nowIndicator
boolean"true"

Show current time line

navLinks
boolean"true"

Date headers as navigation links

compact
boolean"false"

Compact/embedded mode

rowBanding
boolean"false"

Alternate row colors on time grid

showNavigationPicker
boolean"false"

Show a DateRangePicker in the toolbar for quick date navigation. Auto-selects week/month/day mode based on current view.

navigationPickerIconOnly
boolean"false"

When true, shows only a calendar icon for the navigation picker (title remains visible). When false (default), the picker replaces the title with header-styled text.

renderToolbarEnd
(components) => ReactNode

Custom render for the toolbar end section. Receives { viewSwitcher, pluginActions } as ReactNodes to compose alongside custom components.

dateBackgrounds
DateBackground[]

Highlight specific dates with background colors. Array of {date, color}.

dateRangeBackgrounds
DateRangeBackground[]

Highlight date ranges with background colors. Array of {start, end, color}.

loadingRanges
DateLoadingRange[]

Show shimmer loaders for dates being loaded. Array of {start, end}.

hideEmptyDays
boolean"false"

List view only: when true, days that contain no entries are filtered out so users only see days with data. When all days in the range are empty, the empty state is rendered instead.

emptyMessage
ReactNode"'No entries to display'"

Message shown when the entire list view has zero entries for the visible range. Pass a string or any ReactNode for richer content.

emptyDayMessage
ReactNode"'No entries'"

Inline message inside a day group when that day is empty. Only shown when hideEmptyDays is false.

renderEmpty
(info: { dateRange }) => ReactNode

Render-prop for a fully custom empty state. When provided, overrides the default icon + emptyMessage.

showAllDayRow
'auto' | 'always'"auto"

Time grid all-day row visibility. 'auto' (default) hides the row when there are no all-day entries. 'always' keeps the row visible so the gutter label and day slots remain available as drop targets / visual anchors.

titleFormat
string

Custom date-fns format string for the toolbar title.

dayHeaderFormat
string"d"

Format for day numbers in headers.

weekDayHeaderFormat
string"EEE"

Format for weekday names in headers.

dayHeaderLayout
'stacked' | 'inline'"stacked"

Layout for time-grid day headers. 'stacked' shows weekday on top and large day-number below (modern, spacious). 'inline' shows them on a single compact line — when dayHeaderFormat is provided it is used verbatim (e.g. 'EEE, dd/MM' → 'Sun, 17/05'); otherwise weekday + day-number are joined.

onExternalDrop
(info, event) => void

Called when an external item is dropped onto the calendar.

height
string | number"100%"

Calendar container height

renderEntry
(entry, context) => ReactNode

Custom entry template

renderToolbar
(defaults, api) => ReactNode

Custom toolbar rendering

onEntryClick
(entry, event) => void

Entry click callback

onDateSelect
(info, event) => void

Time range selection callback

onEntryDrop
(info, event) => void

Drag-drop callback

onEntryResize
(info, event) => void

Resize callback

onViewChange
(view) => void

View mode change callback

onDateRangeChange
(range) => void

Date range change callback

onTitleChange
(title: string) => void

Fires whenever the toolbar title changes (e.g. after navigation or a view change). Useful when the built-in toolbar is hidden (hideToolbar) and the host wants to render the title in its own header bar.

apiRef
RefObject<CalendarApi>

Ref for imperative API access

Features

13+ View Modes

Month, week, day, year, agenda, N-day, list, multi-month, scroll — all as tree-shakeable plugins

Plugin Architecture

Tree-shakeable view plugins, custom views via defineView/createViewPlugin, toolbar actions, entry renderers

Drag & Drop

Move and resize entries with snap-to-grid and modifier key support

Custom Rendering

Full control over entry appearance via render callbacks

Theming

Automatic support for all brand themes and dark mode via CSS variables

Business Hours

Visual distinction between work and non-work hours

Now Indicator

Real-time current time line on time grid views

Imperative API

Programmatic navigation, view switching, and entry access via ref

Keyboard Accessible

ARIA labels, focus management, and keyboard navigation

All-Day Entries

Dedicated all-day row in time grid views

Responsive

Mobile-friendly with adaptive layouts and touch support

Configurable Grid

Slot duration, visible hours, first day of week, hidden days