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.
- package/LICENSE +21 -0
- package/dist/index.cjs +912 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +471 -0
- package/dist/index.d.ts +471 -0
- package/dist/index.js +838 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants/index.ts","../src/utils/date.ts","../src/utils/format.ts","../src/state/reducer.ts","../src/utils/events.ts","../src/utils/time.ts","../src/utils/recurrence.ts","../src/utils/virtualize.ts","../src/utils/undo.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CalendarLabels, CalendarLocale, CalendarView } from \"../types\";\n\nexport const DEFAULT_LABELS: CalendarLabels = {\n today: \"Today\",\n month: \"Month\",\n week: \"Week\",\n day: \"Day\",\n agenda: \"Agenda\",\n allDay: \"all-day\",\n noEvents: \"No events in this period\",\n more: (n: number) => `+${n} more`,\n};\n\nexport const DEFAULT_LOCALE: CalendarLocale = {\n locale: \"en-US\",\n weekStartsOn: 0,\n};\n\nexport const DEFAULT_VIEW: CalendarView = \"month\";\n\nexport const HOURS_IN_DAY = 24;\nexport const MINUTES_IN_HOUR = 60;\nexport const MINUTES_IN_DAY = HOURS_IN_DAY * MINUTES_IN_HOUR;\n\nexport const VIEWS: CalendarView[] = [\"month\", \"week\", \"day\", \"agenda\"];\n\nexport const DEFAULT_DAY_START_HOUR = 0;\nexport const DEFAULT_DAY_END_HOUR = 24;\n","import type { DateString, DateTimeString } from \"../types\";\n\n// ── Parsing helpers ──────────────────────────────────────────────\n\n/** Parse an ISO string into a Date object (local time) */\nexport function parseDate(iso: DateString | DateTimeString): Date {\n // For date-only strings (YYYY-MM-DD), parse as local time\n if (iso.length === 10) {\n const [y, m, d] = iso.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n }\n return new Date(iso);\n}\n\n/** Format a Date object as YYYY-MM-DD */\nexport function toDateString(date: Date): DateString {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n}\n\n/** Format a Date object as ISO datetime string */\nexport function toDateTimeString(date: Date): DateTimeString {\n const ds = toDateString(date);\n const h = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n const s = String(date.getSeconds()).padStart(2, \"0\");\n return `${ds}T${h}:${min}:${s}`;\n}\n\n// ── Date arithmetic ──────────────────────────────────────────────\n\n/** Add N days to a date string, returns a DateString */\nexport function addDays(date: DateString | DateTimeString, days: number): DateString {\n const d = parseDate(date);\n d.setDate(d.getDate() + days);\n return toDateString(d);\n}\n\n/** Add N months to a date string */\nexport function addMonths(date: DateString, months: number): DateString {\n const d = parseDate(date);\n d.setMonth(d.getMonth() + months);\n return toDateString(d);\n}\n\n/** Add N weeks to a date string */\nexport function addWeeks(date: DateString, weeks: number): DateString {\n return addDays(date, weeks * 7);\n}\n\n// ── Start-of helpers ─────────────────────────────────────────────\n\n/** Get the start of the week for a given date */\nexport function startOfWeek(date: DateString, weekStartsOn: number = 0): DateString {\n const d = parseDate(date);\n const day = d.getDay();\n const diff = (day - weekStartsOn + 7) % 7;\n d.setDate(d.getDate() - diff);\n return toDateString(d);\n}\n\n/** Get the start of the month */\nexport function startOfMonth(date: DateString): DateString {\n const d = parseDate(date);\n return toDateString(new Date(d.getFullYear(), d.getMonth(), 1));\n}\n\n/** Get the end of the month */\nexport function endOfMonth(date: DateString): DateString {\n const d = parseDate(date);\n return toDateString(new Date(d.getFullYear(), d.getMonth() + 1, 0));\n}\n\n// ── Comparison helpers ───────────────────────────────────────────\n\n/** Check if two date strings represent the same day */\nexport function isSameDay(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean {\n return a.slice(0, 10) === b.slice(0, 10);\n}\n\n/** Check if two date strings are in the same month */\nexport function isSameMonth(a: DateString, b: DateString): boolean {\n return a.slice(0, 7) === b.slice(0, 7);\n}\n\n/** Check if a date is today */\nexport function isToday(date: DateString): boolean {\n return date.slice(0, 10) === toDateString(new Date());\n}\n\n/** Check if date a is before date b */\nexport function isBefore(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean {\n return a < b;\n}\n\n/** Check if date a is after date b */\nexport function isAfter(a: DateString | DateTimeString, b: DateString | DateTimeString): boolean {\n return a > b;\n}\n\n// ── Range helpers ────────────────────────────────────────────────\n\n/** Check if two date ranges overlap */\nexport function rangesOverlap(\n startA: DateTimeString,\n endA: DateTimeString,\n startB: DateTimeString,\n endB: DateTimeString,\n): boolean {\n return startA < endB && startB < endA;\n}\n\n/** Check if a date falls within a range (inclusive start, exclusive end) */\nexport function dateInRange(\n date: DateString,\n rangeStart: DateString,\n rangeEnd: DateString,\n): boolean {\n const d = date.slice(0, 10);\n return d >= rangeStart.slice(0, 10) && d <= rangeEnd.slice(0, 10);\n}\n\n/** Get the number of days between two dates */\nexport function daysBetween(a: DateString, b: DateString): number {\n const dateA = parseDate(a);\n const dateB = parseDate(b);\n const diffMs = dateB.getTime() - dateA.getTime();\n return Math.round(diffMs / (1000 * 60 * 60 * 24));\n}\n\n/** Generate an array of DateStrings from start to end (inclusive) */\nexport function eachDayOfRange(start: DateString, end: DateString): DateString[] {\n const days: DateString[] = [];\n let current = start;\n while (current <= end) {\n days.push(current);\n current = addDays(current, 1);\n }\n return days;\n}\n\n/** Get the array of 7 day headers for a given week start */\nexport function getWeekDays(weekStart: DateString): DateString[] {\n return Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));\n}\n\n// ── View range helpers ───────────────────────────────────────────\n\n/** Get the visible date range for the month view (includes padding days) */\nexport function getMonthViewRange(\n date: DateString,\n weekStartsOn: number = 0,\n): { start: DateString; end: DateString } {\n const monthStart = startOfMonth(date);\n const monthEnd = endOfMonth(date);\n const start = startOfWeek(monthStart, weekStartsOn);\n // Always show 6 weeks for consistent height\n const end = addDays(start, 41);\n return { start, end: end > monthEnd ? end : addDays(start, 41) };\n}\n\n/** Get the visible date range for the week view */\nexport function getWeekViewRange(\n date: DateString,\n weekStartsOn: number = 0,\n): { start: DateString; end: DateString } {\n const start = startOfWeek(date, weekStartsOn);\n const end = addDays(start, 6);\n return { start, end };\n}\n\n/** Get the visible date range for a given view */\nexport function getVisibleRange(\n date: DateString,\n view: \"month\" | \"week\" | \"day\" | \"agenda\",\n weekStartsOn: number = 0,\n): { start: DateString; end: DateString } {\n switch (view) {\n case \"month\":\n return getMonthViewRange(date, weekStartsOn);\n case \"week\":\n return getWeekViewRange(date, weekStartsOn);\n case \"day\":\n return { start: date, end: date };\n case \"agenda\":\n return { start: date, end: addDays(date, 30) };\n }\n}\n\n// ── Time helpers ─────────────────────────────────────────────────\n\n/** Get the fractional hour from a datetime string (e.g., \"2024-01-01T14:30:00\" -> 14.5) */\nexport function getTimeOfDay(datetime: DateTimeString): number {\n const d = parseDate(datetime);\n return d.getHours() + d.getMinutes() / 60;\n}\n\n/** Get the duration in hours between two datetime strings */\nexport function getDurationHours(start: DateTimeString, end: DateTimeString): number {\n const startDate = parseDate(start);\n const endDate = parseDate(end);\n return (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60);\n}\n\n/** Generate time slot labels for a day (e.g., [\"12 AM\", \"1 AM\", ...]) */\nexport function getHourLabels(\n startHour: number = 0,\n endHour: number = 24,\n locale: string = \"en-US\",\n): string[] {\n const formatter = new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n hour12: true,\n });\n const labels: string[] = [];\n const base = new Date(2024, 0, 1);\n for (let h = startHour; h < endHour; h++) {\n base.setHours(h, 0, 0, 0);\n labels.push(formatter.format(base));\n }\n return labels;\n}\n","import type { DateString, DateTimeString, CalendarView } from \"../types\";\nimport { parseDate } from \"./date\";\n\n// ── Memoized Intl formatters ─────────────────────────────────────\n\nconst formatterCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getFormatter(\n locale: string,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat {\n const key = `${locale}:${JSON.stringify(options)}`;\n let fmt = formatterCache.get(key);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat(locale, options);\n formatterCache.set(key, fmt);\n }\n return fmt;\n}\n\n// ── Public formatting functions ──────────────────────────────────\n\n/** Format a date for the toolbar title based on view */\nexport function formatToolbarTitle(\n date: DateString,\n view: CalendarView,\n locale: string = \"en-US\",\n): string {\n const d = parseDate(date);\n switch (view) {\n case \"month\":\n return getFormatter(locale, { month: \"long\", year: \"numeric\" }).format(d);\n case \"week\": {\n const weekFmt = getFormatter(locale, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n return weekFmt.format(d);\n }\n case \"day\":\n return getFormatter(locale, {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(d);\n case \"agenda\":\n return getFormatter(locale, { month: \"long\", year: \"numeric\" }).format(d);\n }\n}\n\n/** Format a date as a short weekday name (Mon, Tue, ...) */\nexport function formatWeekdayShort(date: DateString, locale: string = \"en-US\"): string {\n return getFormatter(locale, { weekday: \"short\" }).format(parseDate(date));\n}\n\n/** Format a date as a narrow weekday name (M, T, ...) */\nexport function formatWeekdayNarrow(date: DateString, locale: string = \"en-US\"): string {\n return getFormatter(locale, { weekday: \"narrow\" }).format(parseDate(date));\n}\n\n/** Format a day number */\nexport function formatDayNumber(date: DateString, locale: string = \"en-US\"): string {\n return getFormatter(locale, { day: \"numeric\" }).format(parseDate(date));\n}\n\n/** Format a time (e.g., \"2:30 PM\") */\nexport function formatTime(datetime: DateTimeString, locale: string = \"en-US\"): string {\n return getFormatter(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(parseDate(datetime));\n}\n\n/** Format a time range */\nexport function formatTimeRange(\n start: DateTimeString,\n end: DateTimeString,\n locale: string = \"en-US\",\n): string {\n return `${formatTime(start, locale)} – ${formatTime(end, locale)}`;\n}\n\n/** Format a full date for agenda view */\nexport function formatAgendaDate(date: DateString, locale: string = \"en-US\"): string {\n return getFormatter(locale, {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n }).format(parseDate(date));\n}\n\n/** Format month + day for column headers */\nexport function formatMonthDay(date: DateString, locale: string = \"en-US\"): string {\n return getFormatter(locale, {\n month: \"short\",\n day: \"numeric\",\n }).format(parseDate(date));\n}\n","import type { CalendarState, CalendarAction, CalendarView } from \"../types\";\nimport { addMonths, addWeeks, addDays, toDateString } from \"../utils/date\";\n\nexport function createInitialState(\n date?: string,\n view?: CalendarView,\n): CalendarState {\n return {\n currentDate: date ?? toDateString(new Date()),\n view: view ?? \"month\",\n };\n}\n\nfunction navigateByView(date: string, view: CalendarView, direction: 1 | -1): string {\n switch (view) {\n case \"month\":\n return addMonths(date, direction);\n case \"week\":\n return addWeeks(date, direction);\n case \"day\":\n return addDays(date, direction);\n case \"agenda\":\n return addMonths(date, direction);\n }\n}\n\nexport function calendarReducer(\n state: CalendarState,\n action: CalendarAction,\n): CalendarState {\n switch (action.type) {\n case \"NAVIGATE_PREV\":\n return {\n ...state,\n currentDate: navigateByView(state.currentDate, state.view, -1),\n };\n case \"NAVIGATE_NEXT\":\n return {\n ...state,\n currentDate: navigateByView(state.currentDate, state.view, 1),\n };\n case \"NAVIGATE_TODAY\":\n return {\n ...state,\n currentDate: toDateString(new Date()),\n };\n case \"SET_DATE\":\n return {\n ...state,\n currentDate: action.payload,\n };\n case \"SET_VIEW\":\n return {\n ...state,\n view: action.payload,\n };\n }\n}\n","import type {\n CalendarEvent,\n DateString,\n EventSegment,\n PositionedEvent,\n TimedEventSegment,\n} from \"../types\";\nimport {\n parseDate,\n eachDayOfRange,\n isSameDay,\n getTimeOfDay,\n rangesOverlap,\n} from \"./date\";\n\n// ── Sorting ──────────────────────────────────────────────────────\n\n/** Sort events by start time, then by duration (longest first) */\nexport function sortEvents(events: CalendarEvent[]): CalendarEvent[] {\n return [...events].sort((a, b) => {\n const startCmp = a.start.localeCompare(b.start);\n if (startCmp !== 0) return startCmp;\n // Longer events first (so they visually span properly)\n const durA = parseDate(a.end).getTime() - parseDate(a.start).getTime();\n const durB = parseDate(b.end).getTime() - parseDate(b.start).getTime();\n return durB - durA;\n });\n}\n\n// ── Filtering ────────────────────────────────────────────────────\n\n/** Filter events that fall within a date range */\nexport function filterEventsInRange(\n events: CalendarEvent[],\n rangeStart: DateString,\n rangeEnd: DateString,\n): CalendarEvent[] {\n const start = rangeStart + \"T00:00:00\";\n const end = rangeEnd + \"T23:59:59\";\n return events.filter((e) => rangesOverlap(e.start, e.end, start, end));\n}\n\n/** Get events for a specific day */\nexport function getEventsForDay(\n events: CalendarEvent[],\n date: DateString,\n): CalendarEvent[] {\n return filterEventsInRange(events, date, date);\n}\n\n/** Check if an event spans multiple days */\nexport function isMultiDayEvent(event: CalendarEvent): boolean {\n return !isSameDay(event.start, event.end) || !!event.allDay;\n}\n\n/** Separate events into all-day and timed categories */\nexport function partitionEvents(\n events: CalendarEvent[],\n): { allDay: CalendarEvent[]; timed: CalendarEvent[] } {\n const allDay: CalendarEvent[] = [];\n const timed: CalendarEvent[] = [];\n for (const event of events) {\n if (event.allDay || isMultiDayEvent(event)) {\n allDay.push(event);\n } else {\n timed.push(event);\n }\n }\n return { allDay, timed };\n}\n\n// ── Multi-day segmentation ───────────────────────────────────────\n\n/** Break a multi-day event into per-day segments */\nexport function segmentMultiDayEvent(\n event: CalendarEvent,\n rangeStart: DateString,\n rangeEnd: DateString,\n): EventSegment[] {\n const eventStartDate = event.start.slice(0, 10) as DateString;\n const eventEndDate = event.end.slice(0, 10) as DateString;\n\n // Clip to visible range\n const segStart = eventStartDate > rangeStart ? eventStartDate : rangeStart;\n const segEnd = eventEndDate < rangeEnd ? eventEndDate : rangeEnd;\n\n return eachDayOfRange(segStart, segEnd).map((date) => ({\n event,\n date,\n isStart: date === eventStartDate,\n isEnd: date === eventEndDate,\n }));\n}\n\n/** Get all event segments for a month view */\nexport function getEventSegments(\n events: CalendarEvent[],\n rangeStart: DateString,\n rangeEnd: DateString,\n): EventSegment[] {\n const allDayEvents = events.filter((e) => e.allDay || isMultiDayEvent(e));\n const segments: EventSegment[] = [];\n for (const event of allDayEvents) {\n segments.push(...segmentMultiDayEvent(event, rangeStart, rangeEnd));\n }\n return segments;\n}\n\n// ── Timed multi-day segmentation ─────────────────────────────────\n\n/**\n * Segment a timed multi-day event into per-day segments for week/day view.\n * Each segment has startHour/endHour appropriate for that day:\n * - First day: event start time → dayEndHour\n * - Middle days: dayStartHour → dayEndHour\n * - Last day: dayStartHour → event end time\n */\nexport function segmentTimedMultiDayEvent(\n event: CalendarEvent,\n days: DateString[],\n dayStartHour: number,\n dayEndHour: number,\n): TimedEventSegment[] {\n const eventStartDate = event.start.slice(0, 10) as DateString;\n const eventEndDate = event.end.slice(0, 10) as DateString;\n const eventStartHour = getTimeOfDay(event.start);\n const eventEndHour = getTimeOfDay(event.end);\n\n const segments: TimedEventSegment[] = [];\n\n for (const day of days) {\n if (day < eventStartDate || day > eventEndDate) continue;\n\n const isStart = day === eventStartDate;\n const isEnd = day === eventEndDate;\n\n let startHour: number;\n let endHour: number;\n\n if (isStart && isEnd) {\n // Single day — shouldn't normally reach here for multi-day events\n startHour = eventStartHour;\n endHour = eventEndHour;\n } else if (isStart) {\n startHour = eventStartHour;\n endHour = dayEndHour;\n } else if (isEnd) {\n startHour = dayStartHour;\n endHour = eventEndHour;\n } else {\n // Middle day — full day\n startHour = dayStartHour;\n endHour = dayEndHour;\n }\n\n segments.push({ event, day, startHour, endHour, isStart, isEnd });\n }\n\n return segments;\n}\n\n// ── Layout Algorithm: Column-Packing ─────────────────────────────\n\ninterface OverlapGroup {\n events: CalendarEvent[];\n}\n\n/** Build overlap groups using a sweep-line approach */\nexport function buildOverlapGroups(events: CalendarEvent[]): OverlapGroup[] {\n if (events.length === 0) return [];\n\n const sorted = sortEvents(events);\n const groups: OverlapGroup[] = [];\n let currentGroup: CalendarEvent[] = [sorted[0]];\n let groupEnd = sorted[0].end;\n\n for (let i = 1; i < sorted.length; i++) {\n const event = sorted[i];\n if (event.start < groupEnd) {\n // Overlaps with current group\n currentGroup.push(event);\n if (event.end > groupEnd) {\n groupEnd = event.end;\n }\n } else {\n // Start a new group\n groups.push({ events: currentGroup });\n currentGroup = [event];\n groupEnd = event.end;\n }\n }\n groups.push({ events: currentGroup });\n\n return groups;\n}\n\n/** Assign columns to events within an overlap group (greedy leftmost available) */\nexport function assignColumns(\n group: OverlapGroup,\n): { event: CalendarEvent; column: number; totalColumns: number }[] {\n const sorted = sortEvents(group.events);\n const columns: CalendarEvent[][] = [];\n\n const result: { event: CalendarEvent; column: number }[] = [];\n\n for (const event of sorted) {\n let placed = false;\n for (let col = 0; col < columns.length; col++) {\n const lastInCol = columns[col][columns[col].length - 1];\n if (lastInCol.end <= event.start) {\n columns[col].push(event);\n result.push({ event, column: col });\n placed = true;\n break;\n }\n }\n if (!placed) {\n columns.push([event]);\n result.push({ event, column: columns.length - 1 });\n }\n }\n\n const totalColumns = columns.length;\n return result.map((r) => ({ ...r, totalColumns }));\n}\n\n/** Compute positioned events for a single day in a time grid */\nexport function computeTimePositions(\n events: CalendarEvent[],\n dayStartHour: number = 0,\n dayEndHour: number = 24,\n): PositionedEvent[] {\n const totalHours = dayEndHour - dayStartHour;\n const groups = buildOverlapGroups(events);\n const positioned: PositionedEvent[] = [];\n\n for (const group of groups) {\n const columns = assignColumns(group);\n for (const { event, column, totalColumns } of columns) {\n const startTime = Math.max(getTimeOfDay(event.start), dayStartHour);\n const endTime = Math.min(getTimeOfDay(event.end), dayEndHour);\n const top = ((startTime - dayStartHour) / totalHours) * 100;\n const height = Math.max(((endTime - startTime) / totalHours) * 100, 1); // min 1% height\n\n positioned.push({\n event,\n column,\n totalColumns,\n top,\n height,\n });\n }\n }\n\n return positioned;\n}\n\n/** Group events by date for agenda view */\nexport function groupEventsByDate(\n events: CalendarEvent[],\n rangeStart: DateString,\n rangeEnd: DateString,\n): Map<DateString, CalendarEvent[]> {\n const filtered = filterEventsInRange(events, rangeStart, rangeEnd);\n const sorted = sortEvents(filtered);\n const groups = new Map<DateString, CalendarEvent[]>();\n\n for (const event of sorted) {\n const date = event.start.slice(0, 10) as DateString;\n const existing = groups.get(date);\n if (existing) {\n existing.push(event);\n } else {\n groups.set(date, [event]);\n }\n }\n\n return groups;\n}\n","import type { DateString, DateTimeString } from \"../types\";\nimport { toDateString } from \"./date\";\n\n/**\n * Snap a fractional hour to the nearest increment.\n * @param fractionalHour e.g. 9.73\n * @param minutes snap increment in minutes (default 15)\n * @returns snapped fractional hour e.g. 9.75\n */\nexport function snapToIncrement(fractionalHour: number, minutes: number = 15): number {\n const totalMinutes = fractionalHour * 60;\n const snapped = Math.round(totalMinutes / minutes) * minutes;\n return snapped / 60;\n}\n\n/**\n * Convert a fractional hour on a given day to a DateTimeString.\n * @param day date string (YYYY-MM-DD)\n * @param fractionalHour e.g. 14.5 → \"14:30:00\"\n */\nexport function fractionalHourToDateTime(day: DateString, fractionalHour: number): DateTimeString {\n const totalMinutes = Math.round(fractionalHour * 60);\n const hours = Math.floor(totalMinutes / 60);\n const mins = totalMinutes % 60;\n const hh = String(Math.max(0, Math.min(23, hours))).padStart(2, \"0\");\n const mm = String(mins).padStart(2, \"0\");\n return `${day}T${hh}:${mm}:00`;\n}\n\n/**\n * Convert a mouse Y position relative to a column element to a fractional hour.\n * @param clientY mouse clientY\n * @param columnRect bounding rect of the day column\n * @param dayStart start hour of the grid (e.g. 0)\n * @param dayEnd end hour of the grid (e.g. 24)\n * @returns fractional hour (e.g. 14.5)\n */\nexport function yPositionToFractionalHour(\n clientY: number,\n columnRect: DOMRect,\n dayStart: number,\n dayEnd: number,\n): number {\n const relativeY = clientY - columnRect.top;\n const totalHeight = columnRect.height;\n const totalHours = dayEnd - dayStart;\n const hoursFromTop = (relativeY / totalHeight) * totalHours;\n return dayStart + hoursFromTop;\n}\n\n/**\n * Normalize a range so start <= end (swap if dragged upward).\n */\nexport function normalizeRange(\n a: number,\n b: number,\n): { start: number; end: number } {\n return a <= b ? { start: a, end: b } : { start: b, end: a };\n}\n\n/**\n * Compute new start/end DateTimeStrings from a drop/resize based on mouse Y.\n * Extracted from WeekView's drop handler for shared use.\n */\nexport function computeDropPosition(\n day: DateString,\n clientY: number,\n columnRect: DOMRect,\n dayStartHour: number,\n dayEndHour: number,\n durationMs: number,\n): { newStart: DateTimeString; newEnd: DateTimeString } {\n const fractionalHour = yPositionToFractionalHour(clientY, columnRect, dayStartHour, dayEndHour);\n const snapped = snapToIncrement(fractionalHour, 15);\n const clamped = Math.max(dayStartHour, Math.min(dayEndHour - (durationMs / 3600000), snapped));\n\n const newStart = fractionalHourToDateTime(day, clamped);\n const newStartMs = new Date(newStart).getTime();\n const newEndDate = new Date(newStartMs + durationMs);\n\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const endDay = toDateString(newEndDate);\n const newEnd = `${endDay}T${pad(newEndDate.getHours())}:${pad(newEndDate.getMinutes())}:${pad(newEndDate.getSeconds())}`;\n\n return { newStart, newEnd };\n}\n","import type {\n CalendarEvent,\n DateString,\n RecurrenceRule,\n RecurrenceDay,\n RecurrenceFrequency,\n} from \"../types\";\nimport { parseDate, toDateString } from \"./date\";\n\n// ── Day mapping ─────────────────────────────────────────────────\n\nconst DAY_MAP: Record<RecurrenceDay, number> = {\n SU: 0, MO: 1, TU: 2, WE: 3, TH: 4, FR: 5, SA: 6,\n};\n\n// DAY_REVERSE is used internally for future weekday name generation if needed\n// Keeping as a comment for reference:\n// const DAY_REVERSE = { 0: \"SU\", 1: \"MO\", 2: \"TU\", 3: \"WE\", 4: \"TH\", 5: \"FR\", 6: \"SA\" };\n\n// ── Generate occurrences ────────────────────────────────────────\n\n/** Max occurrences to generate for \"forever\" rules (safety limit) */\nconst MAX_OCCURRENCES = 730; // ~2 years of daily events\n\n/**\n * Generate occurrence dates for a recurrence rule within a visible range.\n * Returns an array of DateStrings where the event occurs.\n */\nexport function generateOccurrences(\n rule: RecurrenceRule,\n eventStartDate: DateString,\n rangeStart: DateString,\n rangeEnd: DateString,\n exDates: DateString[] = [],\n): DateString[] {\n const results: DateString[] = [];\n const exSet = new Set(exDates);\n\n const interval = rule.interval ?? 1;\n const start = parseDate(eventStartDate);\n const rEnd = parseDate(rangeEnd);\n const rStart = parseDate(rangeStart);\n\n // Until date: stop after this date\n const untilDate = rule.until ? parseDate(rule.until) : null;\n\n const maxCount = rule.count ?? MAX_OCCURRENCES;\n\n switch (rule.freq) {\n case \"daily\":\n generateDaily(start, interval, rStart, rEnd, untilDate, maxCount, exSet, results);\n break;\n case \"weekly\":\n generateWeekly(start, interval, rule.byDay, rStart, rEnd, untilDate, maxCount, exSet, results);\n break;\n case \"monthly\":\n generateMonthly(start, interval, rule, rStart, rEnd, untilDate, maxCount, exSet, results);\n break;\n case \"yearly\":\n generateYearly(start, interval, rStart, rEnd, untilDate, maxCount, exSet, results);\n break;\n }\n\n return results;\n}\n\nfunction generateDaily(\n start: Date,\n interval: number,\n rangeStart: Date,\n rangeEnd: Date,\n until: Date | null,\n maxCount: number,\n exSet: Set<string>,\n results: DateString[],\n) {\n const cursor = new Date(start);\n let count = 0;\n\n // Skip ahead to near rangeStart if we're far behind (performance optimization)\n if (cursor < rangeStart && maxCount === MAX_OCCURRENCES) {\n const daysDiff = Math.floor((rangeStart.getTime() - cursor.getTime()) / (1000 * 60 * 60 * 24));\n const stepsToSkip = Math.floor(daysDiff / interval);\n if (stepsToSkip > 0) {\n cursor.setDate(cursor.getDate() + stepsToSkip * interval);\n // Step back one interval to be safe\n cursor.setDate(cursor.getDate() - interval);\n }\n }\n\n while (count < maxCount) {\n if (until && cursor > until) break;\n if (cursor > rangeEnd) break;\n\n const ds = toDateString(cursor);\n if (cursor >= rangeStart && !exSet.has(ds)) {\n results.push(ds);\n }\n\n count++;\n cursor.setDate(cursor.getDate() + interval);\n }\n}\n\nfunction generateWeekly(\n start: Date,\n interval: number,\n byDay: RecurrenceDay[] | undefined,\n rangeStart: Date,\n rangeEnd: Date,\n until: Date | null,\n maxCount: number,\n exSet: Set<string>,\n results: DateString[],\n) {\n // If no byDay, use the day of the week of the start date\n const targetDays = byDay\n ? byDay.map((d) => DAY_MAP[d]).sort((a, b) => a - b)\n : [start.getDay()];\n\n // Start at the beginning of the event's week\n const cursor = new Date(start);\n cursor.setDate(cursor.getDate() - cursor.getDay()); // Go to Sunday of start week\n\n // Skip ahead to near rangeStart if we're far behind (performance optimization)\n if (cursor < rangeStart && maxCount === MAX_OCCURRENCES) {\n const daysDiff = Math.floor((rangeStart.getTime() - cursor.getTime()) / (1000 * 60 * 60 * 24));\n const weeksToSkip = Math.floor(daysDiff / (7 * interval));\n if (weeksToSkip > 1) {\n cursor.setDate(cursor.getDate() + (weeksToSkip - 1) * 7 * interval);\n }\n }\n\n let count = 0;\n\n while (count < maxCount) {\n if (until && cursor > until) break;\n if (cursor > rangeEnd && results.length > 0) break;\n // Safety: don't iterate forever past range\n if (cursor.getTime() > rangeEnd.getTime() + 7 * 24 * 60 * 60 * 1000) break;\n\n // Check if this is a valid week (respects interval)\n const weekStart = new Date(cursor);\n\n for (const dayNum of targetDays) {\n const candidate = new Date(weekStart);\n candidate.setDate(weekStart.getDate() + dayNum);\n\n if (candidate < start) continue;\n if (until && candidate > until) break;\n if (count >= maxCount) break;\n\n const ds = toDateString(candidate);\n if (candidate >= rangeStart && candidate <= rangeEnd && !exSet.has(ds)) {\n results.push(ds);\n }\n\n count++;\n }\n\n // Advance by interval weeks\n cursor.setDate(cursor.getDate() + 7 * interval);\n }\n}\n\nfunction generateMonthly(\n start: Date,\n interval: number,\n rule: RecurrenceRule,\n rangeStart: Date,\n rangeEnd: Date,\n until: Date | null,\n maxCount: number,\n exSet: Set<string>,\n results: DateString[],\n) {\n const cursor = new Date(start.getFullYear(), start.getMonth(), 1);\n let count = 0;\n\n // Skip ahead to near rangeStart if we're far behind (performance optimization)\n if (cursor < rangeStart && maxCount === MAX_OCCURRENCES) {\n const monthsDiff = (rangeStart.getFullYear() - cursor.getFullYear()) * 12 +\n (rangeStart.getMonth() - cursor.getMonth());\n const monthsToSkip = Math.floor(monthsDiff / interval);\n if (monthsToSkip > 1) {\n cursor.setMonth(cursor.getMonth() + (monthsToSkip - 1) * interval);\n }\n }\n\n while (count < maxCount) {\n if (until && cursor > until) break;\n if (cursor.getTime() > rangeEnd.getTime() + 31 * 24 * 60 * 60 * 1000) break;\n\n const candidates: Date[] = [];\n\n if (rule.byDay && rule.bySetPos !== undefined) {\n // \"Nth weekday of month\" — e.g., first Monday, last Friday\n for (const dayStr of rule.byDay) {\n const dayNum = DAY_MAP[dayStr];\n const found = getNthWeekdayOfMonth(cursor.getFullYear(), cursor.getMonth(), dayNum, rule.bySetPos);\n if (found) candidates.push(found);\n }\n } else if (rule.byMonthDay && rule.byMonthDay.length > 0) {\n // Specific day(s) of month\n for (const md of rule.byMonthDay) {\n const daysInMonth = new Date(cursor.getFullYear(), cursor.getMonth() + 1, 0).getDate();\n if (md <= daysInMonth) {\n candidates.push(new Date(cursor.getFullYear(), cursor.getMonth(), md));\n }\n }\n } else {\n // Same day of month as start date\n const daysInMonth = new Date(cursor.getFullYear(), cursor.getMonth() + 1, 0).getDate();\n const dayOfMonth = Math.min(start.getDate(), daysInMonth);\n candidates.push(new Date(cursor.getFullYear(), cursor.getMonth(), dayOfMonth));\n }\n\n for (const candidate of candidates) {\n if (candidate < start) continue;\n if (until && candidate > until) break;\n if (count >= maxCount) break;\n\n const ds = toDateString(candidate);\n if (candidate >= rangeStart && candidate <= rangeEnd && !exSet.has(ds)) {\n results.push(ds);\n }\n\n count++;\n }\n\n // Advance by interval months\n cursor.setMonth(cursor.getMonth() + interval);\n }\n}\n\nfunction generateYearly(\n start: Date,\n interval: number,\n rangeStart: Date,\n rangeEnd: Date,\n until: Date | null,\n maxCount: number,\n exSet: Set<string>,\n results: DateString[],\n) {\n const cursor = new Date(start);\n let count = 0;\n\n while (count < maxCount) {\n if (until && cursor > until) break;\n if (cursor > rangeEnd) break;\n\n const ds = toDateString(cursor);\n if (cursor >= rangeStart && !exSet.has(ds)) {\n results.push(ds);\n }\n\n count++;\n cursor.setFullYear(cursor.getFullYear() + interval);\n\n // Handle Feb 29 → Feb 28 for non-leap years\n if (start.getMonth() === 1 && start.getDate() === 29) {\n const daysInFeb = new Date(cursor.getFullYear(), 2, 0).getDate();\n cursor.setMonth(1, Math.min(29, daysInFeb));\n }\n }\n}\n\nfunction getNthWeekdayOfMonth(\n year: number,\n month: number,\n dayOfWeek: number,\n n: number,\n): Date | null {\n if (n > 0) {\n // Find the nth occurrence\n const first = new Date(year, month, 1);\n const firstDayOfWeek = first.getDay();\n let dayOfMonth = 1 + ((dayOfWeek - firstDayOfWeek + 7) % 7) + (n - 1) * 7;\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n if (dayOfMonth > daysInMonth) return null;\n return new Date(year, month, dayOfMonth);\n } else if (n === -1) {\n // Last occurrence\n const last = new Date(year, month + 1, 0);\n const lastDayOfWeek = last.getDay();\n const diff = (lastDayOfWeek - dayOfWeek + 7) % 7;\n return new Date(year, month, last.getDate() - diff);\n }\n return null;\n}\n\n// ── Expand recurring events ─────────────────────────────────────\n\n/**\n * Expand recurring events into individual instances within a visible range.\n * Non-recurring events pass through unchanged.\n * Instance IDs follow the pattern: `${parentId}::${YYYY-MM-DD}`\n */\nexport function expandRecurringEvents(\n events: CalendarEvent[],\n rangeStart: DateString,\n rangeEnd: DateString,\n): CalendarEvent[] {\n const result: CalendarEvent[] = [];\n\n for (const event of events) {\n // Skip instances that were already expanded (shouldn't happen, but be safe)\n if (event.recurringEventId) {\n result.push(event);\n continue;\n }\n\n if (!event.recurrence) {\n result.push(event);\n continue;\n }\n\n const eventStartDate = event.start.slice(0, 10);\n const eventStartTime = event.start.length > 10 ? event.start.slice(10) : \"T00:00:00\";\n const eventEndTime = event.end.length > 10 ? event.end.slice(10) : \"T23:59:00\";\n\n // Calculate duration in days (for multi-day recurring — rare but possible)\n const startD = parseDate(event.start);\n const endD = parseDate(event.end);\n const durationDays = Math.floor((endD.getTime() - startD.getTime()) / (1000 * 60 * 60 * 24));\n\n const occurrences = generateOccurrences(\n event.recurrence,\n eventStartDate,\n rangeStart,\n rangeEnd,\n event.exDates,\n );\n\n for (const occ of occurrences) {\n const instanceId = `${event.id}::${occ}`;\n let instanceEnd = `${occ}${eventEndTime}`;\n\n // If the original event spanned multiple days, offset the end\n if (durationDays > 0) {\n const occDate = parseDate(occ);\n occDate.setDate(occDate.getDate() + durationDays);\n instanceEnd = `${toDateString(occDate)}${eventEndTime}`;\n }\n\n result.push({\n ...event,\n id: instanceId,\n start: `${occ}${eventStartTime}`,\n end: instanceEnd,\n recurringEventId: event.id,\n originalDate: occ,\n // Don't carry over recurrence to instances\n recurrence: undefined,\n exDates: undefined,\n });\n }\n }\n\n return result;\n}\n\n// ── RFC 5545 parsing / serialization ────────────────────────────\n\nconst FREQ_MAP: Record<string, RecurrenceFrequency> = {\n DAILY: \"daily\",\n WEEKLY: \"weekly\",\n MONTHLY: \"monthly\",\n YEARLY: \"yearly\",\n};\n\nconst FREQ_REVERSE: Record<RecurrenceFrequency, string> = {\n daily: \"DAILY\",\n weekly: \"WEEKLY\",\n monthly: \"MONTHLY\",\n yearly: \"YEARLY\",\n};\n\n/**\n * Parse an RFC 5545 RRULE string into a RecurrenceRule.\n * Supports: FREQ, INTERVAL, COUNT, UNTIL, BYDAY, BYMONTHDAY, BYSETPOS\n * @example parseRRule(\"FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR\")\n */\nexport function parseRRule(rruleString: string): RecurrenceRule {\n const str = rruleString.replace(/^RRULE:/, \"\");\n const parts = str.split(\";\");\n const rule: RecurrenceRule = { freq: \"daily\" };\n\n for (const part of parts) {\n const [key, value] = part.split(\"=\");\n switch (key) {\n case \"FREQ\":\n rule.freq = FREQ_MAP[value] ?? \"daily\";\n break;\n case \"INTERVAL\":\n rule.interval = parseInt(value, 10);\n break;\n case \"COUNT\":\n rule.count = parseInt(value, 10);\n break;\n case \"UNTIL\": {\n // UNTIL=20260315 or UNTIL=20260315T120000Z\n const dateStr = value.replace(/[TZ]/g, \"\").slice(0, 8);\n rule.until = `${dateStr.slice(0, 4)}-${dateStr.slice(4, 6)}-${dateStr.slice(6, 8)}`;\n break;\n }\n case \"BYDAY\":\n rule.byDay = value.split(\",\").map((d) => {\n // Strip numeric prefix if present (e.g., \"1MO\" → \"MO\")\n return d.replace(/^-?\\d+/, \"\") as RecurrenceDay;\n });\n break;\n case \"BYMONTHDAY\":\n rule.byMonthDay = value.split(\",\").map(Number);\n break;\n case \"BYSETPOS\":\n rule.bySetPos = parseInt(value, 10);\n break;\n }\n }\n\n return rule;\n}\n\n/**\n * Serialize a RecurrenceRule to an RFC 5545 RRULE string.\n * @example toRRuleString({freq: \"weekly\", byDay: [\"MO\", \"WE\", \"FR\"]})\n * // → \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"\n */\nexport function toRRuleString(rule: RecurrenceRule): string {\n const parts: string[] = [];\n\n parts.push(`FREQ=${FREQ_REVERSE[rule.freq]}`);\n\n if (rule.interval && rule.interval > 1) {\n parts.push(`INTERVAL=${rule.interval}`);\n }\n if (rule.count) {\n parts.push(`COUNT=${rule.count}`);\n }\n if (rule.until) {\n parts.push(`UNTIL=${rule.until.replace(/-/g, \"\")}`);\n }\n if (rule.byDay && rule.byDay.length > 0) {\n parts.push(`BYDAY=${rule.byDay.join(\",\")}`);\n }\n if (rule.byMonthDay && rule.byMonthDay.length > 0) {\n parts.push(`BYMONTHDAY=${rule.byMonthDay.join(\",\")}`);\n }\n if (rule.bySetPos !== undefined) {\n parts.push(`BYSETPOS=${rule.bySetPos}`);\n }\n\n return parts.join(\";\");\n}\n","import type { PositionedEvent } from \"../types\";\n\nexport interface VirtualRange {\n startHour: number;\n endHour: number;\n}\n\n/**\n * Filter positioned events to only those visible in the viewport.\n * Includes events within the viewport plus an overscan buffer.\n *\n * @param positioned - Events with top/height as percentages (0-100)\n * @param viewportTop - Top edge of viewport as percentage (0-100)\n * @param viewportBottom - Bottom edge of viewport as percentage (0-100)\n * @param overscan - Extra percentage to render above/below (default 10)\n */\nexport function filterVisibleEvents(\n positioned: PositionedEvent[],\n viewportTop: number,\n viewportBottom: number,\n overscan: number = 10,\n): PositionedEvent[] {\n const top = viewportTop - overscan;\n const bottom = viewportBottom + overscan;\n\n return positioned.filter(\n (p) => p.top + p.height > top && p.top < bottom,\n );\n}\n\n/**\n * Convert scroll position to viewport range in hours.\n *\n * @param scrollTop - Current scrollTop of the container\n * @param containerHeight - Visible height of the scroll container\n * @param totalHeight - Total scrollable height (scrollHeight)\n * @param dayStartHour - First hour of the day grid\n * @param dayEndHour - Last hour of the day grid\n */\nexport function scrollToViewportRange(\n scrollTop: number,\n containerHeight: number,\n totalHeight: number,\n dayStartHour: number,\n dayEndHour: number,\n): VirtualRange {\n if (totalHeight <= 0) {\n return { startHour: dayStartHour, endHour: dayEndHour };\n }\n\n const totalHours = dayEndHour - dayStartHour;\n const topFraction = scrollTop / totalHeight;\n const bottomFraction = (scrollTop + containerHeight) / totalHeight;\n\n return {\n startHour: dayStartHour + topFraction * totalHours,\n endHour: dayStartHour + bottomFraction * totalHours,\n };\n}\n","/** Maximum number of undo entries (default) */\nconst DEFAULT_MAX_HISTORY = 30;\n\n/** Immutable undo/redo stack */\nexport interface UndoStack<T> {\n past: T[];\n present: T;\n future: T[];\n}\n\n/**\n * Create a new undo stack with an initial present state.\n */\nexport function createUndoStack<T>(initial: T): UndoStack<T> {\n return {\n past: [],\n present: initial,\n future: [],\n };\n}\n\n/**\n * Push a new state onto the stack.\n * - Moves current present to past\n * - Clears future (branching erases redo history)\n * - Caps past at `maxHistory` entries\n */\nexport function pushState<T>(\n stack: UndoStack<T>,\n state: T,\n maxHistory: number = DEFAULT_MAX_HISTORY,\n): UndoStack<T> {\n const past = [...stack.past, stack.present];\n return {\n past: past.length > maxHistory ? past.slice(past.length - maxHistory) : past,\n present: state,\n future: [],\n };\n}\n\n/**\n * Undo: move present to future, restore most recent past as present.\n * Returns the same stack if there is nothing to undo.\n */\nexport function undo<T>(stack: UndoStack<T>): UndoStack<T> {\n if (stack.past.length === 0) {\n return stack;\n }\n\n const previous = stack.past[stack.past.length - 1];\n const newPast = stack.past.slice(0, -1);\n\n return {\n past: newPast,\n present: previous,\n future: [stack.present, ...stack.future],\n };\n}\n\n/**\n * Redo: move present to past, restore most recent future as present.\n * Returns the same stack if there is nothing to redo.\n */\nexport function redo<T>(stack: UndoStack<T>): UndoStack<T> {\n if (stack.future.length === 0) {\n return stack;\n }\n\n const next = stack.future[0];\n const newFuture = stack.future.slice(1);\n\n return {\n past: [...stack.past, stack.present],\n present: next,\n future: newFuture,\n };\n}\n\n/**\n * Whether the stack has past entries to undo.\n */\nexport function canUndo<T>(stack: UndoStack<T>): boolean {\n return stack.past.length > 0;\n}\n\n/**\n * Whether the stack has future entries to redo.\n */\nexport function canRedo<T>(stack: UndoStack<T>): boolean {\n return stack.future.length > 0;\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -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 };
|