beautify-event 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,382 @@
1
+ # Beautify Event
2
+
3
+ A beautiful, fully customizable React event calendar component with month, week, day, 2-day, and resource views. Built with Radix UI, Tailwind CSS, and date-fns.
4
+
5
+ ## Features
6
+
7
+ - **Multiple Views**: Month, Week, Day, 2-Day, and Resource views
8
+ - **Responsive**: Mobile-optimized with collapsible month picker and horizontal-scrolling week view
9
+ - **Localization**: Built-in support for English, French, and Arabic (extensible)
10
+ - **Drag & Drop**: Create events by dragging on empty slots; move events by dragging
11
+ - **Current Time Line**: Optional horizontal line showing the current time in day/week views
12
+ - **Customizable**: Custom event renderers, headers, themes, and styling
13
+ - **TypeScript**: Full type definitions included
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install beautify-event
19
+ ```
20
+
21
+ ### Peer Dependencies
22
+
23
+ Beautify Event requires the following peer dependencies. Install them if not already present:
24
+
25
+ ```bash
26
+ npm install react react-dom date-fns
27
+ ```
28
+
29
+ For full styling and component support, you'll also need:
30
+
31
+ - **Tailwind CSS** (v3 or v4)
32
+ - **Radix UI** primitives (or shadcn/ui)
33
+ - **lucide-react** (or ensure icons are available)
34
+
35
+ ## Quick Start
36
+
37
+ ```tsx
38
+ import { EventCalendar } from "beautify-event"
39
+ import type { CalendarEvent } from "beautify-event"
40
+
41
+ const events: CalendarEvent[] = [
42
+ {
43
+ id: "1",
44
+ title: "Team Meeting",
45
+ start: new Date(2026, 2, 10, 9, 0),
46
+ end: new Date(2026, 2, 10, 10, 0),
47
+ color: "#3b82f6",
48
+ },
49
+ ]
50
+
51
+ export default function App() {
52
+ return (
53
+ <div className="h-[600px]">
54
+ <EventCalendar events={events} />
55
+ </div>
56
+ )
57
+ }
58
+ ```
59
+
60
+ ## Usage
61
+
62
+ ### Basic Example
63
+
64
+ ```tsx
65
+ <EventCalendar
66
+ events={events}
67
+ defaultDate={new Date()}
68
+ defaultView="week"
69
+ views={["month", "week", "day"]}
70
+ />
71
+ ```
72
+
73
+ ### Controlled Mode
74
+
75
+ ```tsx
76
+ const [date, setDate] = useState(new Date())
77
+ const [view, setView] = useState<ViewType>("week")
78
+
79
+ <EventCalendar
80
+ events={events}
81
+ date={date}
82
+ view={view}
83
+ onDateChange={setDate}
84
+ onViewChange={setView}
85
+ />
86
+ ```
87
+
88
+ ### With Resources (Rooms, etc.)
89
+
90
+ ```tsx
91
+ const resources: Resource[] = [
92
+ { id: "room-1", name: "Conference Room A", color: "#3b82f6" },
93
+ { id: "room-2", name: "Meeting Room B", color: "#10b981" },
94
+ ]
95
+
96
+ <EventCalendar
97
+ events={events}
98
+ resources={resources}
99
+ views={["month", "week", "day", "resource"]}
100
+ />
101
+ ```
102
+
103
+ ### Event Handlers
104
+
105
+ ```tsx
106
+ <EventCalendar
107
+ events={events}
108
+ onEventClick={(event) => console.log("Clicked:", event)}
109
+ onEventDoubleClick={(event) => openEditModal(event)}
110
+ onSlotClick={(slot) => createEvent(slot)}
111
+ onSlotDoubleClick={(slot) => createEvent(slot)}
112
+ onDayClick={(date) => navigateToDay(date)}
113
+ onDateChange={(date) => setSelectedDate(date)}
114
+ onRangeChange={(range) => fetchEvents(range)}
115
+ />
116
+ ```
117
+
118
+ ### Drag & Drop
119
+
120
+ ```tsx
121
+ <EventCalendar
122
+ events={events}
123
+ enableDragToCreate
124
+ enableDragToMove
125
+ onEventCreate={(slotInfo) => {
126
+ const newEvent = { id: "new-1", title: "New Event", ...slotInfo }
127
+ setEvents((prev) => [...prev, newEvent])
128
+ }}
129
+ onEventMove={({ event, newStart, newEnd }) => {
130
+ setEvents((prev) =>
131
+ prev.map((e) =>
132
+ e.id === event.id ? { ...e, start: newStart, end: newEnd } : e
133
+ )
134
+ )
135
+ }}
136
+ />
137
+ ```
138
+
139
+ ## Calendar Options
140
+
141
+ Pass configuration via `calendarOptions`:
142
+
143
+ | Option | Type | Default | Description |
144
+ |--------|------|---------|-------------|
145
+ | `startHour` | `number` | `0` | Start hour for time series (0-23) |
146
+ | `endHour` | `number` | `24` | End hour (use 24 for full day) |
147
+ | `timeFormat` | `"12h" \| "24h"` | `"12h"` | Hour label format |
148
+ | `weekStartsOn` | `0-6` | `0` | First day of week (0 = Sunday) |
149
+ | `hourHeight` | `number` | `64` | Height of each hour slot in pixels |
150
+ | `timeSeriesMaxHeight` | `number \| string` | `400` | Max height for day/week grid; enables scrolling |
151
+ | `showCurrentTimeLine` | `boolean` | `true` | Show horizontal line at current time |
152
+ | `maxEventsPerDay` | `number` | `3` | Events to show before "+X more" in month view |
153
+ | `defaultEventColor` | `string` | `"#3b82f6"` | Default event color |
154
+ | `defaultResourceColor` | `string` | `"#6366f1"` | Default resource color |
155
+ | `locale` | `string` | `"en-US"` | Locale for formatting |
156
+
157
+ ```tsx
158
+ <EventCalendar
159
+ events={events}
160
+ calendarOptions={{
161
+ startHour: 8,
162
+ endHour: 20,
163
+ timeFormat: "24h",
164
+ weekStartsOn: 1,
165
+ locale: "fr",
166
+ timeSeriesMaxHeight: 500,
167
+ showCurrentTimeLine: true,
168
+ }}
169
+ />
170
+ ```
171
+
172
+ ## Localization
173
+
174
+ Built-in locales: **English** (`en`, `en-US`), **French** (`fr`), **Arabic** (`ar`).
175
+
176
+ ```tsx
177
+ <EventCalendar
178
+ events={events}
179
+ calendarOptions={{ locale: "fr" }}
180
+ />
181
+ ```
182
+
183
+ To integrate with your app's i18n:
184
+
185
+ ```tsx
186
+ // With next-intl
187
+ const locale = useLocale()
188
+
189
+ // With react-i18next
190
+ const { i18n } = useTranslation()
191
+
192
+ <EventCalendar
193
+ events={events}
194
+ calendarOptions={{ locale: i18n.language }}
195
+ />
196
+ ```
197
+
198
+ ## Themes
199
+
200
+ ```tsx
201
+ // Use system/app theme
202
+ <EventCalendar events={events} />
203
+
204
+ // Force light or dark
205
+ <EventCalendar events={events} theme="dark" />
206
+
207
+ // Custom theme variables
208
+ <EventCalendar
209
+ events={events}
210
+ themeVars={{
211
+ "--primary": "#6366f1",
212
+ "--background": "#0f172a",
213
+ "--foreground": "#f8fafc",
214
+ }}
215
+ />
216
+ ```
217
+
218
+ ## Props Reference
219
+
220
+ ### EventCalendar
221
+
222
+ | Prop | Type | Default | Description |
223
+ |------|------|---------|-------------|
224
+ | `events` | `CalendarEvent[]` | **required** | Events to display |
225
+ | `resources` | `Resource[]` | `[]` | Resources for resource view |
226
+ | `date` | `Date` | - | Controlled current date |
227
+ | `defaultDate` | `Date` | `new Date()` | Initial date (uncontrolled) |
228
+ | `view` | `ViewType` | - | Controlled view |
229
+ | `defaultView` | `ViewType` | `"month"` | Initial view (uncontrolled) |
230
+ | `views` | `ViewType[]` | `["month","week","day","resource"]` | Available views |
231
+ | `calendarOptions` | `CalendarOptions` | `{}` | Calendar configuration |
232
+ | `showNavigation` | `boolean` | `true` | Show prev/next buttons |
233
+ | `showViewSwitcher` | `boolean` | `true` | Show view toggle |
234
+ | `showTodayButton` | `boolean` | `true` | Show Today button |
235
+ | `className` | `string` | - | Container class name |
236
+ | `loading` | `boolean` | `false` | Loading state |
237
+ | `theme` | `"light" \| "dark" \| "system"` | `"system"` | Theme mode |
238
+ | `themeVars` | `Record<string, string>` | - | CSS variable overrides |
239
+ | `enableDragToCreate` | `boolean` | `false` | Allow drag to create events |
240
+ | `enableDragToMove` | `boolean` | `false` | Allow drag to move events |
241
+ | `mobileBreakpoint` | `"sm" \| "md" \| "lg"` | `"md"` | Breakpoint for mobile layout |
242
+ | `showMobileMonthPicker` | `boolean` | `true` | Show month picker on mobile |
243
+
244
+ ### CalendarEvent
245
+
246
+ ```ts
247
+ interface CalendarEvent {
248
+ id: string
249
+ title: string
250
+ start: Date
251
+ end: Date
252
+ color?: string
253
+ resourceId?: string
254
+ description?: string
255
+ allDay?: boolean
256
+ }
257
+ ```
258
+
259
+ ### Resource
260
+
261
+ ```ts
262
+ interface Resource {
263
+ id: string
264
+ name: string
265
+ color?: string
266
+ }
267
+ ```
268
+
269
+ ## Custom Renderers
270
+
271
+ ### Custom Event Content
272
+
273
+ ```tsx
274
+ <EventCalendar
275
+ events={events}
276
+ renderEvent={(event, view) => (
277
+ <div className="custom-event">
278
+ <strong>{event.title}</strong>
279
+ {event.description && <p>{event.description}</p>}
280
+ </div>
281
+ )}
282
+ />
283
+ ```
284
+
285
+ ### Custom Header
286
+
287
+ ```tsx
288
+ <EventCalendar
289
+ events={events}
290
+ renderHeader={({ date, view, title, onNavigate, onToday }) => (
291
+ <div className="flex items-center justify-between">
292
+ <h1>{title}</h1>
293
+ <div>
294
+ <button onClick={() => onNavigate("prev")}>Prev</button>
295
+ <button onClick={onToday}>Today</button>
296
+ <button onClick={() => onNavigate("next")}>Next</button>
297
+ </div>
298
+ </div>
299
+ )}
300
+ />
301
+ ```
302
+
303
+ ### Selected Event / Slot UI
304
+
305
+ ```tsx
306
+ <EventCalendar
307
+ events={events}
308
+ renderSelectedEvent={({ event, onClose }) =>
309
+ event && (
310
+ <Sheet open={!!event} onOpenChange={(open) => !open && onClose()}>
311
+ <SheetContent>
312
+ <SheetHeader>
313
+ <SheetTitle>{event.title}</SheetTitle>
314
+ </SheetHeader>
315
+ <p>{event.description}</p>
316
+ </SheetContent>
317
+ </Sheet>
318
+ )
319
+ }
320
+ renderSelectedSlot={({ slot, onClose }) => (
321
+ // Your slot detail UI
322
+ )}
323
+ />
324
+ ```
325
+
326
+ ## Mobile Behavior
327
+
328
+ On viewports below the `mobileBreakpoint`:
329
+
330
+ - Simplified header with week strip
331
+ - Month title with expandable month picker (chevron toggle)
332
+ - Week view shows ~2 days at a time with horizontal scroll
333
+ - Sticky time labels column during horizontal scroll
334
+ - Touch-friendly day selection
335
+
336
+ ## Exports
337
+
338
+ ```ts
339
+ // Components
340
+ export { EventCalendar, EventCalendarThemeProvider, useCalendar }
341
+
342
+ // Types
343
+ export type {
344
+ ViewType,
345
+ TimeFormat,
346
+ CalendarOptions,
347
+ CalendarEvent,
348
+ Resource,
349
+ SlotInfo,
350
+ DateRange,
351
+ EventCalendarProps,
352
+ HeaderRenderProps,
353
+ CalendarConfig,
354
+ CalendarTheme,
355
+ }
356
+
357
+ // Utilities
358
+ export {
359
+ getMonthDays,
360
+ getWeekDays,
361
+ getEventsForDay,
362
+ navigateDate,
363
+ getViewTitle,
364
+ getViewDateRange,
365
+ formatHour,
366
+ formatDate,
367
+ getDateFnsLocale,
368
+ getHoursArray,
369
+ createSlotDate,
370
+ }
371
+ ```
372
+
373
+ ## Requirements
374
+
375
+ - React 18+
376
+ - Tailwind CSS
377
+ - Radix UI (or shadcn/ui components)
378
+ - date-fns
379
+
380
+ ## License
381
+
382
+ MIT
@@ -0,0 +1,217 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React$1 from 'react';
3
+ import { Locale } from 'date-fns';
4
+
5
+ type ViewType = "month" | "week" | "day" | "2day" | "resource";
6
+ type TimeFormat = "12h" | "24h";
7
+ interface CalendarOptions {
8
+ /** Start hour for time series in day/week/resource views (0-23). Default: 0 (12:00 AM) */
9
+ startHour?: number;
10
+ /** End hour for time series (0-24). Use 24 for full day. Default: 24 (11:59 PM) */
11
+ endHour?: number;
12
+ /** Time format for hour labels: "12h" (12 AM/PM) or "24h" (00:00-23:00). Default: "12h" */
13
+ timeFormat?: TimeFormat;
14
+ /** First day of week (0 = Sunday, 1 = Monday, etc.) */
15
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
16
+ /** Height of each hour slot in pixels */
17
+ hourHeight?: number;
18
+ /** Max height for the time series grid (day/week views). Enables scrolling. Default: "400px" */
19
+ timeSeriesMaxHeight?: number | string;
20
+ /** Show a horizontal line at the current time in day/week views. Default: true */
21
+ showCurrentTimeLine?: boolean;
22
+ /** Number of events to show before "+X more" in month view */
23
+ maxEventsPerDay?: number;
24
+ /** Default event color if not specified on event */
25
+ defaultEventColor?: string;
26
+ /** Default resource color if not specified on resource */
27
+ defaultResourceColor?: string;
28
+ /** Locale for date formatting. Built-in: "en", "en-US", "fr", "ar" */
29
+ locale?: string;
30
+ }
31
+ interface Resource {
32
+ id: string;
33
+ name: string;
34
+ color?: string;
35
+ [key: string]: unknown;
36
+ }
37
+ interface CalendarEvent {
38
+ id: string;
39
+ title: string;
40
+ start: Date;
41
+ end: Date;
42
+ color?: string;
43
+ resourceId?: string;
44
+ description?: string;
45
+ allDay?: boolean;
46
+ [key: string]: unknown;
47
+ }
48
+ interface DateRange {
49
+ start: Date;
50
+ end: Date;
51
+ }
52
+ interface SlotInfo {
53
+ start: Date;
54
+ end: Date;
55
+ resourceId?: string;
56
+ }
57
+ interface EventCalendarProps {
58
+ /** Array of events to display */
59
+ events: CalendarEvent[];
60
+ /** Array of resources for resource view */
61
+ resources?: Resource[];
62
+ /** Currently selected date (controlled) */
63
+ date?: Date;
64
+ /** Default date when uncontrolled */
65
+ defaultDate?: Date;
66
+ /** Current view type (controlled) */
67
+ view?: ViewType;
68
+ /** Default view when uncontrolled */
69
+ defaultView?: ViewType;
70
+ /** Available views to show in the header */
71
+ views?: ViewType[];
72
+ /** Calendar configuration options */
73
+ calendarOptions?: CalendarOptions;
74
+ /** Whether to show navigation controls */
75
+ showNavigation?: boolean;
76
+ /** Whether to show view switcher */
77
+ showViewSwitcher?: boolean;
78
+ /** Whether to show today button */
79
+ showTodayButton?: boolean;
80
+ /** Custom class name for the container */
81
+ className?: string;
82
+ /** Loading state */
83
+ loading?: boolean;
84
+ /** Theme: "light" | "dark" | "system". When set, calendar uses its own theme scope. Default: "system" */
85
+ theme?: "light" | "dark" | "system";
86
+ /** Custom theme variables. Override CSS vars: e.g. { "--background": "#fff", "--primary": "#3b82f6" } */
87
+ themeVars?: Record<string, string>;
88
+ /** Enable drag on empty slot to create event. Default: false */
89
+ enableDragToCreate?: boolean;
90
+ /** Enable drag event to move. Default: false */
91
+ enableDragToMove?: boolean;
92
+ /** Breakpoint for mobile layout: "sm" | "md" | "lg". Default: "md" (768px) */
93
+ mobileBreakpoint?: "sm" | "md" | "lg";
94
+ /** Whether to show mini month picker on mobile. Default: true */
95
+ showMobileMonthPicker?: boolean;
96
+ /** Called when an event is clicked */
97
+ onEventClick?: (event: CalendarEvent) => void;
98
+ /** Called when an event is double clicked */
99
+ onEventDoubleClick?: (event: CalendarEvent) => void;
100
+ /** Called when a slot is clicked (for creating new events) */
101
+ onSlotClick?: (slotInfo: SlotInfo) => void;
102
+ /** Called when a slot is double clicked */
103
+ onSlotDoubleClick?: (slotInfo: SlotInfo) => void;
104
+ /** Called when the date changes */
105
+ onDateChange?: (date: Date) => void;
106
+ /** Called when the view changes */
107
+ onViewChange?: (view: ViewType) => void;
108
+ /** Called when navigating (prev/next/today) */
109
+ onNavigate?: (date: Date, action: "prev" | "next" | "today") => void;
110
+ /** Called when visible date range changes */
111
+ onRangeChange?: (range: DateRange) => void;
112
+ /** Called when a day is clicked in month view */
113
+ onDayClick?: (date: Date) => void;
114
+ /** Called when event is created via drag (enableDragToCreate) */
115
+ onEventCreate?: (slotInfo: SlotInfo) => void;
116
+ /** Called when event is moved via drag (enableDragToMove) */
117
+ onEventMove?: (params: {
118
+ event: CalendarEvent;
119
+ newStart: Date;
120
+ newEnd: Date;
121
+ resourceId?: string;
122
+ }) => void;
123
+ /** Custom event renderer */
124
+ renderEvent?: (event: CalendarEvent, view: ViewType) => React.ReactNode;
125
+ /** Custom day cell renderer for month view */
126
+ renderDayCell?: (date: Date, events: CalendarEvent[]) => React.ReactNode;
127
+ /** Custom header renderer */
128
+ renderHeader?: (props: HeaderRenderProps) => React.ReactNode;
129
+ /** Custom resource header renderer */
130
+ renderResourceHeader?: (resource: Resource) => React.ReactNode;
131
+ /** Custom time slot label renderer */
132
+ renderTimeSlot?: (hour: number) => React.ReactNode;
133
+ /** Custom empty state renderer */
134
+ renderEmpty?: () => React.ReactNode;
135
+ /** Render selected event UI (drawer, popover, modal, etc.). Receives event (null when closed) and onClose. */
136
+ renderSelectedEvent?: (props: {
137
+ event: CalendarEvent | null;
138
+ onClose: () => void;
139
+ }) => React.ReactNode;
140
+ /** Render selected slot UI (drawer, popover, modal, etc.). Receives slot (null when closed) and onClose. */
141
+ renderSelectedSlot?: (props: {
142
+ slot: SlotInfo | null;
143
+ onClose: () => void;
144
+ }) => React.ReactNode;
145
+ }
146
+ interface HeaderRenderProps {
147
+ date: Date;
148
+ view: ViewType;
149
+ onNavigate: (direction: "prev" | "next") => void;
150
+ onViewChange: (view: ViewType) => void;
151
+ onToday: () => void;
152
+ title: string;
153
+ views: ViewType[];
154
+ }
155
+ interface CalendarContextValue {
156
+ currentDate: Date;
157
+ view: ViewType;
158
+ events: CalendarEvent[];
159
+ resources: Resource[];
160
+ config: CalendarConfig;
161
+ onEventClick?: (event: CalendarEvent) => void;
162
+ onEventDoubleClick?: (event: CalendarEvent) => void;
163
+ onSlotClick?: (slotInfo: SlotInfo) => void;
164
+ onSlotDoubleClick?: (slotInfo: SlotInfo) => void;
165
+ onDayClick?: (date: Date) => void;
166
+ renderEvent?: (event: CalendarEvent, view: ViewType) => React.ReactNode;
167
+ enableDragToCreate?: boolean;
168
+ enableDragToMove?: boolean;
169
+ onEventCreate?: (slotInfo: SlotInfo) => void;
170
+ onEventMove?: (params: {
171
+ event: CalendarEvent;
172
+ newStart: Date;
173
+ newEnd: Date;
174
+ resourceId?: string;
175
+ }) => void;
176
+ }
177
+ interface CalendarConfig {
178
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
179
+ startHour: number;
180
+ endHour: number;
181
+ hourHeight: number;
182
+ maxEventsPerDay: number;
183
+ timeSeriesMaxHeight?: number | string;
184
+ showCurrentTimeLine?: boolean;
185
+ defaultEventColor: string;
186
+ defaultResourceColor: string;
187
+ locale: string;
188
+ timeFormat: TimeFormat;
189
+ }
190
+
191
+ declare function EventCalendar({ events, resources, date, defaultDate, view, defaultView, views, calendarOptions, showNavigation, showViewSwitcher, showTodayButton, className, loading, theme, themeVars, enableDragToCreate, enableDragToMove, mobileBreakpoint, showMobileMonthPicker, onEventClick, onEventDoubleClick, onSlotClick, onSlotDoubleClick, onDateChange, onViewChange, onNavigate, onRangeChange, onDayClick, onEventCreate, onEventMove, renderEvent, renderDayCell, renderHeader, renderResourceHeader, renderTimeSlot, renderEmpty, renderSelectedEvent, renderSelectedSlot, }: EventCalendarProps): react_jsx_runtime.JSX.Element;
192
+
193
+ type CalendarTheme = "light" | "dark" | "system";
194
+ interface EventCalendarThemeProviderProps {
195
+ theme?: CalendarTheme;
196
+ /** Custom CSS variable overrides. Keys with or without -- prefix work. */
197
+ themeVars?: Record<string, string>;
198
+ children: React$1.ReactNode;
199
+ }
200
+ declare function EventCalendarThemeProvider({ theme, themeVars, children, }: EventCalendarThemeProviderProps): react_jsx_runtime.JSX.Element;
201
+
202
+ declare function useCalendar(): CalendarContextValue;
203
+
204
+ declare function getDateFnsLocale(localeCode: string): Locale;
205
+ /** Format date with locale support */
206
+ declare function formatDate(date: Date, formatStr: string, localeCode?: string): string;
207
+ declare function getMonthDays(date: Date, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date[];
208
+ declare function getWeekDays(date: Date, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): Date[];
209
+ declare function getEventsForDay(events: CalendarEvent[], day: Date): CalendarEvent[];
210
+ declare function navigateDate(date: Date, view: ViewType, direction: "prev" | "next"): Date;
211
+ declare function getViewTitle(date: Date, view: ViewType, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6, localeCode?: string): string;
212
+ declare function getViewDateRange(date: Date, view: ViewType, weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6): DateRange;
213
+ declare function createSlotDate(day: Date, hour: number, minute?: number): Date;
214
+ declare function getHoursArray(startHour?: number, endHour?: number): number[];
215
+ declare function formatHour(hour: number, timeFormat?: TimeFormat, localeCode?: string): string;
216
+
217
+ export { type CalendarConfig, type CalendarEvent, type CalendarOptions, type CalendarTheme, type DateRange, EventCalendar, type EventCalendarProps, EventCalendarThemeProvider, type HeaderRenderProps, type Resource, type SlotInfo, type TimeFormat, type ViewType, createSlotDate, formatDate, formatHour, getDateFnsLocale, getEventsForDay, getHoursArray, getMonthDays, getViewDateRange, getViewTitle, getWeekDays, navigateDate, useCalendar };