trud-calendar-core 0.1.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.
@@ -0,0 +1,471 @@
1
+ /** ISO 8601 date string (YYYY-MM-DD) */
2
+ type DateString = string;
3
+ /** ISO 8601 datetime string (YYYY-MM-DDTHH:mm:ss) */
4
+ type DateTimeString = string;
5
+ /** Calendar view types */
6
+ type CalendarView = "month" | "week" | "day" | "agenda";
7
+ type RecurrenceFrequency = "daily" | "weekly" | "monthly" | "yearly";
8
+ type RecurrenceDay = "MO" | "TU" | "WE" | "TH" | "FR" | "SA" | "SU";
9
+ interface RecurrenceRule {
10
+ /** Frequency of recurrence */
11
+ freq: RecurrenceFrequency;
12
+ /** Interval between occurrences (default 1) */
13
+ interval?: number;
14
+ /** Max number of occurrences */
15
+ count?: number;
16
+ /** End date (inclusive) */
17
+ until?: DateString;
18
+ /** Days of the week (for weekly/monthly) */
19
+ byDay?: RecurrenceDay[];
20
+ /** Days of the month (for monthly, 1-31) */
21
+ byMonthDay?: number[];
22
+ /** Position within the month (e.g. 1 = first, -1 = last, for "first Monday") */
23
+ bySetPos?: number;
24
+ }
25
+ /** A calendar event */
26
+ interface CalendarEvent {
27
+ /** Unique identifier */
28
+ id: string;
29
+ /** Event title */
30
+ title: string;
31
+ /** Start date/time as ISO 8601 string */
32
+ start: DateTimeString;
33
+ /** End date/time as ISO 8601 string */
34
+ end: DateTimeString;
35
+ /** Whether this is an all-day event */
36
+ allDay?: boolean;
37
+ /** Event color (CSS color value) */
38
+ color?: string;
39
+ /** Recurrence rule */
40
+ recurrence?: RecurrenceRule;
41
+ /** Dates excluded from recurrence (YYYY-MM-DD) */
42
+ exDates?: DateString[];
43
+ /** ID of the parent recurring event (set on expanded instances) */
44
+ recurringEventId?: string;
45
+ /** Original date of this recurring instance (YYYY-MM-DD) */
46
+ originalDate?: DateString;
47
+ /** Arbitrary metadata */
48
+ [key: string]: unknown;
49
+ }
50
+ /** Positioned event for rendering in a time grid */
51
+ interface PositionedEvent {
52
+ event: CalendarEvent;
53
+ /** Column index (0-based) within overlap group */
54
+ column: number;
55
+ /** Total number of columns in the overlap group */
56
+ totalColumns: number;
57
+ /** Top position as percentage of day (0-100) */
58
+ top: number;
59
+ /** Height as percentage of day */
60
+ height: number;
61
+ /** Whether this is the first segment of a multi-day timed event */
62
+ isSegmentStart?: boolean;
63
+ /** Whether this is the last segment of a multi-day timed event */
64
+ isSegmentEnd?: boolean;
65
+ }
66
+ /** A segment of a multi-day timed event for week/day view rendering */
67
+ interface TimedEventSegment {
68
+ event: CalendarEvent;
69
+ /** The date this segment falls on */
70
+ day: DateString;
71
+ /** Start fractional hour for this segment */
72
+ startHour: number;
73
+ /** End fractional hour for this segment */
74
+ endHour: number;
75
+ /** Whether this is the first day of the event */
76
+ isStart: boolean;
77
+ /** Whether this is the last day of the event */
78
+ isEnd: boolean;
79
+ }
80
+ /** A segment of a multi-day event clipped to a single day */
81
+ interface EventSegment {
82
+ event: CalendarEvent;
83
+ /** The date this segment falls on */
84
+ date: DateString;
85
+ /** Whether this is the first day of the event */
86
+ isStart: boolean;
87
+ /** Whether this is the last day of the event */
88
+ isEnd: boolean;
89
+ }
90
+ type ComponentType<P = any> = (props: P) => any;
91
+ /** Slot component overrides */
92
+ interface CalendarSlots {
93
+ toolbar?: ComponentType<ToolbarSlotProps>;
94
+ event?: ComponentType<EventSlotProps>;
95
+ dayCell?: ComponentType<DayCellSlotProps>;
96
+ timeEvent?: ComponentType<TimeEventSlotProps>;
97
+ allDayEvent?: ComponentType<AllDayEventSlotProps>;
98
+ popover?: ComponentType<PopoverSlotProps>;
99
+ agendaEvent?: ComponentType<AgendaEventSlotProps>;
100
+ }
101
+ interface ToolbarSlotProps {
102
+ currentDate: DateString;
103
+ view: CalendarView;
104
+ onPrev: () => void;
105
+ onNext: () => void;
106
+ onToday: () => void;
107
+ onViewChange: (view: CalendarView) => void;
108
+ formattedDate: string;
109
+ }
110
+ interface EventSlotProps {
111
+ event: CalendarEvent;
112
+ }
113
+ interface DayCellSlotProps {
114
+ date: DateString;
115
+ isToday: boolean;
116
+ isCurrentMonth: boolean;
117
+ events: CalendarEvent[];
118
+ }
119
+ interface TimeEventSlotProps {
120
+ event: CalendarEvent;
121
+ positioned: PositionedEvent;
122
+ }
123
+ interface AllDayEventSlotProps {
124
+ event: CalendarEvent;
125
+ segment: EventSegment;
126
+ }
127
+ interface PopoverSlotProps {
128
+ event: CalendarEvent;
129
+ onClose: () => void;
130
+ }
131
+ interface AgendaEventSlotProps {
132
+ event: CalendarEvent;
133
+ }
134
+ /** UI label strings — provide your own for i18n */
135
+ interface CalendarLabels {
136
+ today: string;
137
+ month: string;
138
+ week: string;
139
+ day: string;
140
+ agenda: string;
141
+ allDay: string;
142
+ noEvents: string;
143
+ more: (count: number) => string;
144
+ }
145
+ /** Locale configuration */
146
+ interface CalendarLocale {
147
+ /** BCP 47 locale string (e.g., "en-US", "es-ES") */
148
+ locale: string;
149
+ /** First day of week: 0 = Sunday, 1 = Monday */
150
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
151
+ /** UI labels for buttons, views, etc. */
152
+ labels?: Partial<CalendarLabels>;
153
+ }
154
+ /** Calendar configuration */
155
+ interface CalendarConfig {
156
+ /** Events to display */
157
+ events: CalendarEvent[];
158
+ /** Initial or controlled date */
159
+ date?: DateString;
160
+ /** Initial or controlled view */
161
+ view?: CalendarView;
162
+ /** Default view when uncontrolled */
163
+ defaultView?: CalendarView;
164
+ /** Default date when uncontrolled */
165
+ defaultDate?: DateString;
166
+ /** Locale settings */
167
+ locale?: Partial<CalendarLocale>;
168
+ /** Slot overrides */
169
+ slots?: Partial<CalendarSlots>;
170
+ /** Callback when an event is clicked */
171
+ onEventClick?: (event: CalendarEvent) => void;
172
+ /** Callback when an empty slot is clicked */
173
+ onSlotClick?: (date: DateTimeString) => void;
174
+ /** Callback when date changes */
175
+ onDateChange?: (date: DateString) => void;
176
+ /** Callback when view changes */
177
+ onViewChange?: (view: CalendarView) => void;
178
+ /** Hour the time grid starts (0-23), default 0 */
179
+ dayStartHour?: number;
180
+ /** Hour the time grid ends (0-24), default 24 */
181
+ dayEndHour?: number;
182
+ /** Callback when an event is dropped on a new time slot (drag & drop) */
183
+ onEventDrop?: (event: CalendarEvent, newStart: DateTimeString, newEnd: DateTimeString) => void;
184
+ /** Callback when an event is resized (drag bottom edge) */
185
+ onEventResize?: (event: CalendarEvent, newStart: DateTimeString, newEnd: DateTimeString) => void;
186
+ /** Callback when a time range is selected by dragging on empty slots */
187
+ onSlotSelect?: (start: DateTimeString, end: DateTimeString) => void;
188
+ /** Enable drag and drop */
189
+ enableDnD?: boolean;
190
+ /** Enable multi-select events (Ctrl+click, Shift+click, Ctrl+A) */
191
+ enableMultiSelect?: boolean;
192
+ /** Callback when selected events are deleted (Delete/Backspace key) */
193
+ onEventsDelete?: (events: CalendarEvent[]) => void;
194
+ /** Enable virtual scrolling for time grid events (opt-in, default false) */
195
+ enableVirtualization?: boolean;
196
+ }
197
+ /** Calendar state */
198
+ interface CalendarState {
199
+ currentDate: DateString;
200
+ view: CalendarView;
201
+ }
202
+ /** Calendar action types */
203
+ type CalendarAction = {
204
+ type: "NAVIGATE_PREV";
205
+ } | {
206
+ type: "NAVIGATE_NEXT";
207
+ } | {
208
+ type: "NAVIGATE_TODAY";
209
+ } | {
210
+ type: "SET_DATE";
211
+ payload: DateString;
212
+ } | {
213
+ type: "SET_VIEW";
214
+ payload: CalendarView;
215
+ };
216
+
217
+ declare const DEFAULT_LABELS: CalendarLabels;
218
+ declare const DEFAULT_LOCALE: CalendarLocale;
219
+ declare const DEFAULT_VIEW: CalendarView;
220
+ declare const HOURS_IN_DAY = 24;
221
+ declare const MINUTES_IN_HOUR = 60;
222
+ declare const MINUTES_IN_DAY: number;
223
+ declare const VIEWS: CalendarView[];
224
+ declare const DEFAULT_DAY_START_HOUR = 0;
225
+ declare const DEFAULT_DAY_END_HOUR = 24;
226
+
227
+ /** Parse an ISO string into a Date object (local time) */
228
+ declare function parseDate(iso: DateString | DateTimeString): Date;
229
+ /** Format a Date object as YYYY-MM-DD */
230
+ declare function toDateString(date: Date): DateString;
231
+ /** Format a Date object as ISO datetime string */
232
+ declare function toDateTimeString(date: Date): DateTimeString;
233
+ /** Add N days to a date string, returns a DateString */
234
+ declare function addDays(date: DateString | DateTimeString, days: number): DateString;
235
+ /** Add N months to a date string */
236
+ declare function addMonths(date: DateString, months: number): DateString;
237
+ /** Add N weeks to a date string */
238
+ declare function addWeeks(date: DateString, weeks: number): DateString;
239
+ /** Get the start of the week for a given date */
240
+ declare function startOfWeek(date: DateString, weekStartsOn?: number): DateString;
241
+ /** Get the start of the month */
242
+ declare function startOfMonth(date: DateString): DateString;
243
+ /** Get the end of the month */
244
+ declare function endOfMonth(date: DateString): DateString;
245
+ /** Check if two date strings represent the same day */
246
+ declare function isSameDay(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean;
247
+ /** Check if two date strings are in the same month */
248
+ declare function isSameMonth(a: DateString, b: DateString): boolean;
249
+ /** Check if a date is today */
250
+ declare function isToday(date: DateString): boolean;
251
+ /** Check if date a is before date b */
252
+ declare function isBefore(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean;
253
+ /** Check if date a is after date b */
254
+ declare function isAfter(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean;
255
+ /** Check if two date ranges overlap */
256
+ declare function rangesOverlap(startA: DateTimeString, endA: DateTimeString, startB: DateTimeString, endB: DateTimeString): boolean;
257
+ /** Check if a date falls within a range (inclusive start, exclusive end) */
258
+ declare function dateInRange(date: DateString, rangeStart: DateString, rangeEnd: DateString): boolean;
259
+ /** Get the number of days between two dates */
260
+ declare function daysBetween(a: DateString, b: DateString): number;
261
+ /** Generate an array of DateStrings from start to end (inclusive) */
262
+ declare function eachDayOfRange(start: DateString, end: DateString): DateString[];
263
+ /** Get the array of 7 day headers for a given week start */
264
+ declare function getWeekDays(weekStart: DateString): DateString[];
265
+ /** Get the visible date range for the month view (includes padding days) */
266
+ declare function getMonthViewRange(date: DateString, weekStartsOn?: number): {
267
+ start: DateString;
268
+ end: DateString;
269
+ };
270
+ /** Get the visible date range for the week view */
271
+ declare function getWeekViewRange(date: DateString, weekStartsOn?: number): {
272
+ start: DateString;
273
+ end: DateString;
274
+ };
275
+ /** Get the visible date range for a given view */
276
+ declare function getVisibleRange(date: DateString, view: "month" | "week" | "day" | "agenda", weekStartsOn?: number): {
277
+ start: DateString;
278
+ end: DateString;
279
+ };
280
+ /** Get the fractional hour from a datetime string (e.g., "2024-01-01T14:30:00" -> 14.5) */
281
+ declare function getTimeOfDay(datetime: DateTimeString): number;
282
+ /** Get the duration in hours between two datetime strings */
283
+ declare function getDurationHours(start: DateTimeString, end: DateTimeString): number;
284
+ /** Generate time slot labels for a day (e.g., ["12 AM", "1 AM", ...]) */
285
+ declare function getHourLabels(startHour?: number, endHour?: number, locale?: string): string[];
286
+
287
+ /** Format a date for the toolbar title based on view */
288
+ declare function formatToolbarTitle(date: DateString, view: CalendarView, locale?: string): string;
289
+ /** Format a date as a short weekday name (Mon, Tue, ...) */
290
+ declare function formatWeekdayShort(date: DateString, locale?: string): string;
291
+ /** Format a date as a narrow weekday name (M, T, ...) */
292
+ declare function formatWeekdayNarrow(date: DateString, locale?: string): string;
293
+ /** Format a day number */
294
+ declare function formatDayNumber(date: DateString, locale?: string): string;
295
+ /** Format a time (e.g., "2:30 PM") */
296
+ declare function formatTime(datetime: DateTimeString, locale?: string): string;
297
+ /** Format a time range */
298
+ declare function formatTimeRange(start: DateTimeString, end: DateTimeString, locale?: string): string;
299
+ /** Format a full date for agenda view */
300
+ declare function formatAgendaDate(date: DateString, locale?: string): string;
301
+ /** Format month + day for column headers */
302
+ declare function formatMonthDay(date: DateString, locale?: string): string;
303
+
304
+ declare function createInitialState(date?: string, view?: CalendarView): CalendarState;
305
+ declare function calendarReducer(state: CalendarState, action: CalendarAction): CalendarState;
306
+
307
+ /** Sort events by start time, then by duration (longest first) */
308
+ declare function sortEvents(events: CalendarEvent[]): CalendarEvent[];
309
+ /** Filter events that fall within a date range */
310
+ declare function filterEventsInRange(events: CalendarEvent[], rangeStart: DateString, rangeEnd: DateString): CalendarEvent[];
311
+ /** Get events for a specific day */
312
+ declare function getEventsForDay(events: CalendarEvent[], date: DateString): CalendarEvent[];
313
+ /** Check if an event spans multiple days */
314
+ declare function isMultiDayEvent(event: CalendarEvent): boolean;
315
+ /** Separate events into all-day and timed categories */
316
+ declare function partitionEvents(events: CalendarEvent[]): {
317
+ allDay: CalendarEvent[];
318
+ timed: CalendarEvent[];
319
+ };
320
+ /** Break a multi-day event into per-day segments */
321
+ declare function segmentMultiDayEvent(event: CalendarEvent, rangeStart: DateString, rangeEnd: DateString): EventSegment[];
322
+ /** Get all event segments for a month view */
323
+ declare function getEventSegments(events: CalendarEvent[], rangeStart: DateString, rangeEnd: DateString): EventSegment[];
324
+ /**
325
+ * Segment a timed multi-day event into per-day segments for week/day view.
326
+ * Each segment has startHour/endHour appropriate for that day:
327
+ * - First day: event start time → dayEndHour
328
+ * - Middle days: dayStartHour → dayEndHour
329
+ * - Last day: dayStartHour → event end time
330
+ */
331
+ declare function segmentTimedMultiDayEvent(event: CalendarEvent, days: DateString[], dayStartHour: number, dayEndHour: number): TimedEventSegment[];
332
+ interface OverlapGroup {
333
+ events: CalendarEvent[];
334
+ }
335
+ /** Build overlap groups using a sweep-line approach */
336
+ declare function buildOverlapGroups(events: CalendarEvent[]): OverlapGroup[];
337
+ /** Assign columns to events within an overlap group (greedy leftmost available) */
338
+ declare function assignColumns(group: OverlapGroup): {
339
+ event: CalendarEvent;
340
+ column: number;
341
+ totalColumns: number;
342
+ }[];
343
+ /** Compute positioned events for a single day in a time grid */
344
+ declare function computeTimePositions(events: CalendarEvent[], dayStartHour?: number, dayEndHour?: number): PositionedEvent[];
345
+ /** Group events by date for agenda view */
346
+ declare function groupEventsByDate(events: CalendarEvent[], rangeStart: DateString, rangeEnd: DateString): Map<DateString, CalendarEvent[]>;
347
+
348
+ /**
349
+ * Snap a fractional hour to the nearest increment.
350
+ * @param fractionalHour e.g. 9.73
351
+ * @param minutes snap increment in minutes (default 15)
352
+ * @returns snapped fractional hour e.g. 9.75
353
+ */
354
+ declare function snapToIncrement(fractionalHour: number, minutes?: number): number;
355
+ /**
356
+ * Convert a fractional hour on a given day to a DateTimeString.
357
+ * @param day date string (YYYY-MM-DD)
358
+ * @param fractionalHour e.g. 14.5 → "14:30:00"
359
+ */
360
+ declare function fractionalHourToDateTime(day: DateString, fractionalHour: number): DateTimeString;
361
+ /**
362
+ * Convert a mouse Y position relative to a column element to a fractional hour.
363
+ * @param clientY mouse clientY
364
+ * @param columnRect bounding rect of the day column
365
+ * @param dayStart start hour of the grid (e.g. 0)
366
+ * @param dayEnd end hour of the grid (e.g. 24)
367
+ * @returns fractional hour (e.g. 14.5)
368
+ */
369
+ declare function yPositionToFractionalHour(clientY: number, columnRect: DOMRect, dayStart: number, dayEnd: number): number;
370
+ /**
371
+ * Normalize a range so start <= end (swap if dragged upward).
372
+ */
373
+ declare function normalizeRange(a: number, b: number): {
374
+ start: number;
375
+ end: number;
376
+ };
377
+ /**
378
+ * Compute new start/end DateTimeStrings from a drop/resize based on mouse Y.
379
+ * Extracted from WeekView's drop handler for shared use.
380
+ */
381
+ declare function computeDropPosition(day: DateString, clientY: number, columnRect: DOMRect, dayStartHour: number, dayEndHour: number, durationMs: number): {
382
+ newStart: DateTimeString;
383
+ newEnd: DateTimeString;
384
+ };
385
+
386
+ /**
387
+ * Generate occurrence dates for a recurrence rule within a visible range.
388
+ * Returns an array of DateStrings where the event occurs.
389
+ */
390
+ declare function generateOccurrences(rule: RecurrenceRule, eventStartDate: DateString, rangeStart: DateString, rangeEnd: DateString, exDates?: DateString[]): DateString[];
391
+ /**
392
+ * Expand recurring events into individual instances within a visible range.
393
+ * Non-recurring events pass through unchanged.
394
+ * Instance IDs follow the pattern: `${parentId}::${YYYY-MM-DD}`
395
+ */
396
+ declare function expandRecurringEvents(events: CalendarEvent[], rangeStart: DateString, rangeEnd: DateString): CalendarEvent[];
397
+ /**
398
+ * Parse an RFC 5545 RRULE string into a RecurrenceRule.
399
+ * Supports: FREQ, INTERVAL, COUNT, UNTIL, BYDAY, BYMONTHDAY, BYSETPOS
400
+ * @example parseRRule("FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR")
401
+ */
402
+ declare function parseRRule(rruleString: string): RecurrenceRule;
403
+ /**
404
+ * Serialize a RecurrenceRule to an RFC 5545 RRULE string.
405
+ * @example toRRuleString({freq: "weekly", byDay: ["MO", "WE", "FR"]})
406
+ * // → "FREQ=WEEKLY;BYDAY=MO,WE,FR"
407
+ */
408
+ declare function toRRuleString(rule: RecurrenceRule): string;
409
+
410
+ interface VirtualRange {
411
+ startHour: number;
412
+ endHour: number;
413
+ }
414
+ /**
415
+ * Filter positioned events to only those visible in the viewport.
416
+ * Includes events within the viewport plus an overscan buffer.
417
+ *
418
+ * @param positioned - Events with top/height as percentages (0-100)
419
+ * @param viewportTop - Top edge of viewport as percentage (0-100)
420
+ * @param viewportBottom - Bottom edge of viewport as percentage (0-100)
421
+ * @param overscan - Extra percentage to render above/below (default 10)
422
+ */
423
+ declare function filterVisibleEvents(positioned: PositionedEvent[], viewportTop: number, viewportBottom: number, overscan?: number): PositionedEvent[];
424
+ /**
425
+ * Convert scroll position to viewport range in hours.
426
+ *
427
+ * @param scrollTop - Current scrollTop of the container
428
+ * @param containerHeight - Visible height of the scroll container
429
+ * @param totalHeight - Total scrollable height (scrollHeight)
430
+ * @param dayStartHour - First hour of the day grid
431
+ * @param dayEndHour - Last hour of the day grid
432
+ */
433
+ declare function scrollToViewportRange(scrollTop: number, containerHeight: number, totalHeight: number, dayStartHour: number, dayEndHour: number): VirtualRange;
434
+
435
+ /** Immutable undo/redo stack */
436
+ interface UndoStack<T> {
437
+ past: T[];
438
+ present: T;
439
+ future: T[];
440
+ }
441
+ /**
442
+ * Create a new undo stack with an initial present state.
443
+ */
444
+ declare function createUndoStack<T>(initial: T): UndoStack<T>;
445
+ /**
446
+ * Push a new state onto the stack.
447
+ * - Moves current present to past
448
+ * - Clears future (branching erases redo history)
449
+ * - Caps past at `maxHistory` entries
450
+ */
451
+ declare function pushState<T>(stack: UndoStack<T>, state: T, maxHistory?: number): UndoStack<T>;
452
+ /**
453
+ * Undo: move present to future, restore most recent past as present.
454
+ * Returns the same stack if there is nothing to undo.
455
+ */
456
+ declare function undo<T>(stack: UndoStack<T>): UndoStack<T>;
457
+ /**
458
+ * Redo: move present to past, restore most recent future as present.
459
+ * Returns the same stack if there is nothing to redo.
460
+ */
461
+ declare function redo<T>(stack: UndoStack<T>): UndoStack<T>;
462
+ /**
463
+ * Whether the stack has past entries to undo.
464
+ */
465
+ declare function canUndo<T>(stack: UndoStack<T>): boolean;
466
+ /**
467
+ * Whether the stack has future entries to redo.
468
+ */
469
+ declare function canRedo<T>(stack: UndoStack<T>): boolean;
470
+
471
+ export { type AgendaEventSlotProps, type AllDayEventSlotProps, type CalendarAction, type CalendarConfig, type CalendarEvent, type CalendarLabels, type CalendarLocale, type CalendarSlots, type CalendarState, type CalendarView, DEFAULT_DAY_END_HOUR, DEFAULT_DAY_START_HOUR, DEFAULT_LABELS, DEFAULT_LOCALE, DEFAULT_VIEW, type DateString, type DateTimeString, type DayCellSlotProps, type EventSegment, type EventSlotProps, HOURS_IN_DAY, MINUTES_IN_DAY, MINUTES_IN_HOUR, type PopoverSlotProps, type PositionedEvent, type RecurrenceDay, type RecurrenceFrequency, type RecurrenceRule, type TimeEventSlotProps, type TimedEventSegment, type ToolbarSlotProps, type UndoStack, VIEWS, type VirtualRange, addDays, addMonths, addWeeks, assignColumns, buildOverlapGroups, calendarReducer, canRedo, canUndo, computeDropPosition, computeTimePositions, createInitialState, createUndoStack, dateInRange, daysBetween, eachDayOfRange, endOfMonth, expandRecurringEvents, filterEventsInRange, filterVisibleEvents, formatAgendaDate, formatDayNumber, formatMonthDay, formatTime, formatTimeRange, formatToolbarTitle, formatWeekdayNarrow, formatWeekdayShort, fractionalHourToDateTime, generateOccurrences, getDurationHours, getEventSegments, getEventsForDay, getHourLabels, getMonthViewRange, getTimeOfDay, getVisibleRange, getWeekDays, getWeekViewRange, groupEventsByDate, isAfter, isBefore, isMultiDayEvent, isSameDay, isSameMonth, isToday, normalizeRange, parseDate, parseRRule, partitionEvents, pushState, rangesOverlap, redo, scrollToViewportRange, segmentMultiDayEvent, segmentTimedMultiDayEvent, snapToIncrement, sortEvents, startOfMonth, startOfWeek, toDateString, toDateTimeString, toRRuleString, undo, yPositionToFractionalHour };