Components

Calendar

Calendar component.

Client Only

Installation

pnpm dlx @docyrus/cli add @docyrus/ui-calendar
Required Packages(8 packages)
pnpm add motion @emotion/is-prop-valid date-fns sonner @hookform/resolvers react-hook-form re-resizable zod
UI Primitives(19 components)
npx shadcn@latest add alert-dialog avatar avatar-group badge button calendar command dialog dropdown-menu form input scroll-area select separator skeleton switch tabs textarea toggle

Usage

import {
  Calendar
} from "@docyrus/ui/components/calendar";
import type {
  CalendarProps,
  CalendarProviderProps,
  TCalendarView,
  TEventColor,
  TTimelineNavigationMode,
  TTimelineView,
  TWeekStartsOn,
  IEvent,
  IUser,
  ICalendarCell,
  CalendarFilterItem,
  TimelineColumn,
  TimelineColumnGroup,
  TimelineRow,
  TimelineSection,
  TimelineVariant
} from "@docyrus/ui/components/calendar";

<Calendar
  variant="default"
  size="sm"
  ref={...}
  events={[]}
  users={[]}
  defaultView="month"
  onCreateEvent={() => {}}
  onEventCreate={() => {}}
  onEventUpdate={() => {}}
  onEventDelete={() => {}}
  onEventClick={() => {}}
  onDaySelect={() => {}}
  onSlotClick={() => {}}
  onVisibleRangeChange={() => {}}
  onEventDrop={() => {}}
  hideAddButton
  hideHeaderAddButton
  hideCellAddButton
  hideUserSelect
  hideSettings
  hideFilter
  addButtonLabel="..."
  hideEventCount
  eventCountLabel="..."
  visibleViews="day"
  filterItems={CalendarFilterItem[]}
  onFilterChange={() => {}}
  renderFilterSelect={() => {}}
  sidebarContent={...}
  renderEventBadge={() => {}}
  searchPlaceholder="..."
  weekStartsOn={...}
  cellMinHeight={...}
  cellMinWidth={...}
  hourSlotHeight={...}
  startHour={0}
  endHour={0}
  disableHoverHighlight
  hoverHighlightClassName="..."
  timelineMaxLanes={0}
  defaultYearTimelineMode="continuous"
  defaultQuarterMode="continuous"
  isRefreshing
/>

Variants

VariantDescription
defaultDefault style
borderedBordered — border-2
compactCompact — text-xs

Sizes

SizeDescription
smSmall — max-w-3xl mx-auto
defaultDefault — max-w-6xl mx-auto
lgLarge

API Reference

PropTypeDefault
variant"default" | "bordered" | "compact""default"
size"sm" | "default" | "lg""default"
refRef<HTMLDivElement>—
eventsArray<IEvent>[]
usersArray<IUser>[]
isLoadingbooleanfalse
defaultViewTCalendarView'month'
onCreateEvent(date: Date) => void—
onEventCreate(event: IEvent) => void—
onEventUpdate(event: IEvent) => void—
onEventDelete(eventId: number) => void—
onEventClick(event: IEvent) => void—
onDaySelect(date: Date) => void—
onSlotClick(start: Date, end: Date) => void—
onVisibleRangeChange(range: { start: Date; end: Date }, view: TCalendarView) => void—
onEventDrop(event: IEvent, newStart: Date, newEnd: Date) => void—
hideAddButtonboolean—
hideHeaderAddButtonboolean—
hideCellAddButtonboolean—
hideUserSelectboolean—
hideSettingsboolean—
hideFilterboolean—
addButtonLabelstring—
hideEventCountboolean—
eventCountLabelstring—
visibleViewsArray<TCalendarView>—
filterItemsArray<CalendarFilterItem>—
onFilterChange(id: string) => void—
renderFilterSelect(context: any) => ReactNode—
sidebarContentReactNode—
renderEventBadge(event: IEvent, defaultBadge: ReactNode) => ReactNode—
searchPlaceholderstring—
weekStartsOnTWeekStartsOn—
cellMinHeightnumber | string—
cellMinWidthnumber | string—
hourSlotHeightnumber | string—
startHournumber—
endHournumber—
disableHoverHighlightboolean—
hoverHighlightClassNamestring—
timelineMaxLanesnumber—
defaultYearTimelineModeTTimelineNavigationMode—
defaultQuarterModeTTimelineNavigationMode—
isRefreshingboolean—
classNamestring—

Components

ComponentDescription
CalendarPublic export
CalendarBodyInternal — calendar-body.tsx
CalendarSidebarInternal — calendar-sidebar.tsx
CalendarProviderInternal — contexts/calendar-context.tsx
DndProviderInternal — contexts/dnd-context.tsx
AddEditEventDialogInternal — dialogs/add-edit-event-dialog.tsx
EventDetailsDialogInternal — dialogs/event-details-dialog.tsx
EventListDialogInternal — dialogs/events-list-dialog.tsx
DraggableEventInternal — dnd/draggable-event.tsx
DroppableAreaInternal — dnd/droppable-area.tsx
ResizableEventInternal — dnd/resizable-event.tsx
CalendarHeaderInternal — header/calendar-header.tsx
DateNavigatorInternal — header/date-navigator.tsx
TodayButtonInternal — header/today-button.tsx
UserSelectInternal — header/user-select.tsx
SettingsInternal — settings/settings.tsx
CalendarHeaderSkeletonInternal — skeletons/calendar-header-skeleton.tsx
CalendarSkeletonInternal — skeletons/calendar-skeleton.tsx
DayViewSkeletonInternal — skeletons/day-view-skeleton.tsx
MonthViewSkeletonInternal — skeletons/month-view-skeleton.tsx
WeekViewSkeletonInternal — skeletons/week-view-skeleton.tsx
YearViewSkeletonInternal — skeletons/year-view-skeleton.tsx

Type Exports

TypeDescription
CalendarProps—
CalendarProviderProps—
TCalendarView—
TEventColor—
TTimelineNavigationMode—
TTimelineView—
TWeekStartsOn—
IEvent—
IUser—
ICalendarCell—
CalendarFilterItem—
TimelineColumn—
TimelineColumnGroup—
TimelineRow—
TimelineSection—
TimelineVariant—

Type Reference

CalendarProps

FieldTypeDescription
refRef<HTMLDivElement>—
eventsArray<IEvent>—
usersArray<IUser>—
isLoadingboolean—
defaultViewTCalendarView—
variant'default' | 'bordered' | 'compact'—
size'sm' | 'default' | 'lg'—
onCreateEvent(date: Date) => void—
onEventCreate(event: IEvent) => void—
onEventUpdate(event: IEvent) => void—
onEventDelete(eventId: number) => void—
onEventClick(event: IEvent) => void—
onDaySelect(date: Date) => void—
onSlotClick(start: Date, end: Date) => void—
onVisibleRangeChange(range: { start: Date; end: Date }, view: TCalendarView) => void—
onEventDrop(event: IEvent, newStart: Date, newEnd: Date) => void—
hideAddButtonboolean—
hideHeaderAddButtonboolean—
hideCellAddButtonboolean—
hideUserSelectboolean—
hideSettingsboolean—
hideFilterboolean—
addButtonLabelstring—
hideEventCountboolean—
eventCountLabelstring—
visibleViewsArray<TCalendarView>—
filterItemsArray<CalendarFilterItem>—
onFilterChange(id: string) => void—
renderFilterSelect(context: any) => ReactNode—
sidebarContentReactNode—
renderEventBadge(event: IEvent, defaultBadge: ReactNode) => ReactNode—
searchPlaceholderstring—
weekStartsOnTWeekStartsOn—
cellMinHeightnumber | string—
cellMinWidthnumber | string—
hourSlotHeightnumber | string—
startHournumber—
endHournumber—
disableHoverHighlightboolean—
hoverHighlightClassNamestring—
timelineMaxLanesnumber—
defaultYearTimelineModeTTimelineNavigationMode—
defaultQuarterModeTTimelineNavigationMode—
isRefreshingboolean—

TCalendarView

"day" | "week" | "month" | "year" | "agenda" | "year-timeline" | "quarter" | "13weeks"

TEventColor

"blue" | "green" | "red" | "yellow" | "purple" | "orange"

TTimelineNavigationMode

"continuous" | "single"

TTimelineView

"year-timeline" | "quarter" | "13weeks"

IEvent

FieldTypeDescription
idnumber—
startDatestring—
endDatestring—
titlestring—
colorTEventColor—
descriptionstring—
userIUser—

IUser

FieldTypeDescription
idstring—
namestring—
picturePathstring | null—

ICalendarCell

FieldTypeDescription
daynumber—
currentMonthboolean—
dateDate—

CalendarFilterItem

FieldTypeDescription
idstring—
labelstring—
imagestring | null—

TimelineColumn

FieldTypeDescription
keystring—
labelstring—
startDate—
endDate—
containsTodayboolean—
weekendboolean—
monthStartboolean—

TimelineColumnGroup

FieldTypeDescription
keystring—
labelstring—
weightnumber—
columnsArray<TimelineColumn>—

TimelineRow

FieldTypeDescription
keystring—
labelstring—
subLabelstring—
startDate—
endDate—
groupsArray<TimelineColumnGroup>—
scaleArray<TimelineScaleSegment>—
granularityTimelineGranularity—
containsTodayboolean—

TimelineSection

FieldTypeDescription
keystring—
labelstring—
subLabelstring—
startDate—
endDate—
variantTimelineVariant—
rowsArray<TimelineRow>—
perRowHeaderboolean—
sharedHeaderArray<string>—

TimelineVariant

"year" | "quarter" | "weeks"

On this page