@liteforge/calendar 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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -0
  3. package/dist/calendar.d.ts +6 -0
  4. package/dist/calendar.d.ts.map +1 -0
  5. package/dist/calendar.js +318 -0
  6. package/dist/calendar.js.map +1 -0
  7. package/dist/components/toolbar.d.ts +18 -0
  8. package/dist/components/toolbar.d.ts.map +1 -0
  9. package/dist/components/toolbar.js +84 -0
  10. package/dist/components/toolbar.js.map +1 -0
  11. package/dist/date-utils.d.ts +104 -0
  12. package/dist/date-utils.d.ts.map +1 -0
  13. package/dist/date-utils.js +323 -0
  14. package/dist/date-utils.js.map +1 -0
  15. package/dist/index.d.ts +12 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +14 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/interactions/drag-drop.d.ts +30 -0
  20. package/dist/interactions/drag-drop.d.ts.map +1 -0
  21. package/dist/interactions/drag-drop.js +207 -0
  22. package/dist/interactions/drag-drop.js.map +1 -0
  23. package/dist/interactions/index.d.ts +10 -0
  24. package/dist/interactions/index.d.ts.map +1 -0
  25. package/dist/interactions/index.js +7 -0
  26. package/dist/interactions/index.js.map +1 -0
  27. package/dist/interactions/resize.d.ts +25 -0
  28. package/dist/interactions/resize.d.ts.map +1 -0
  29. package/dist/interactions/resize.js +116 -0
  30. package/dist/interactions/resize.js.map +1 -0
  31. package/dist/interactions/slot-selection.d.ts +25 -0
  32. package/dist/interactions/slot-selection.d.ts.map +1 -0
  33. package/dist/interactions/slot-selection.js +151 -0
  34. package/dist/interactions/slot-selection.js.map +1 -0
  35. package/dist/recurring.d.ts +15 -0
  36. package/dist/recurring.d.ts.map +1 -0
  37. package/dist/recurring.js +158 -0
  38. package/dist/recurring.js.map +1 -0
  39. package/dist/styles.d.ts +6 -0
  40. package/dist/styles.d.ts.map +1 -0
  41. package/dist/styles.js +632 -0
  42. package/dist/styles.js.map +1 -0
  43. package/dist/types.d.ts +169 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +5 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/views/agenda-view.d.ts +19 -0
  48. package/dist/views/agenda-view.d.ts.map +1 -0
  49. package/dist/views/agenda-view.js +114 -0
  50. package/dist/views/agenda-view.js.map +1 -0
  51. package/dist/views/day-view.d.ts +30 -0
  52. package/dist/views/day-view.d.ts.map +1 -0
  53. package/dist/views/day-view.js +432 -0
  54. package/dist/views/day-view.js.map +1 -0
  55. package/dist/views/month-view.d.ts +17 -0
  56. package/dist/views/month-view.d.ts.map +1 -0
  57. package/dist/views/month-view.js +123 -0
  58. package/dist/views/month-view.js.map +1 -0
  59. package/dist/views/shared.d.ts +30 -0
  60. package/dist/views/shared.d.ts.map +1 -0
  61. package/dist/views/shared.js +281 -0
  62. package/dist/views/shared.js.map +1 -0
  63. package/dist/views/week-view.d.ts +24 -0
  64. package/dist/views/week-view.d.ts.map +1 -0
  65. package/dist/views/week-view.js +377 -0
  66. package/dist/views/week-view.js.map +1 -0
  67. package/package.json +61 -0
@@ -0,0 +1,318 @@
1
+ /**
2
+ * @liteforge/calendar - createCalendar Implementation
3
+ */
4
+ import { signal, computed, effect } from '@liteforge/core';
5
+ import { startOfDay, addDays, addWeeks, addMonths, getDayRange, getWeekRange, getMonthRange, } from './date-utils.js';
6
+ import { expandAllRecurring } from './recurring.js';
7
+ import { injectCalendarStyles } from './styles.js';
8
+ import { renderWeekView } from './views/week-view.js';
9
+ import { renderDayView } from './views/day-view.js';
10
+ import { renderMonthView } from './views/month-view.js';
11
+ import { renderAgendaView } from './views/agenda-view.js';
12
+ import { renderToolbar } from './components/toolbar.js';
13
+ // ─── Resolve Time Config ───────────────────────────────────
14
+ function resolveTimeConfig(config) {
15
+ return {
16
+ slotDuration: config?.slotDuration ?? 30,
17
+ dayStart: config?.dayStart ?? 0,
18
+ dayEnd: config?.dayEnd ?? 24,
19
+ weekStart: config?.weekStart ?? 1,
20
+ hiddenDays: config?.hiddenDays ?? [],
21
+ nowIndicator: config?.nowIndicator ?? true,
22
+ };
23
+ }
24
+ // ─── Calculate Date Range ──────────────────────────────────
25
+ function calculateDateRange(date, view, weekStart) {
26
+ switch (view) {
27
+ case 'day':
28
+ return getDayRange(date);
29
+ case 'week':
30
+ return getWeekRange(date, weekStart);
31
+ case 'month': {
32
+ // For month view, we need to include partial weeks
33
+ const monthRange = getMonthRange(date);
34
+ // Extend to full calendar weeks
35
+ const calStart = getWeekRange(monthRange.start, weekStart).start;
36
+ const calEnd = getWeekRange(monthRange.end, weekStart).end;
37
+ return { start: calStart, end: calEnd };
38
+ }
39
+ case 'agenda':
40
+ // Show current month for agenda
41
+ return getMonthRange(date);
42
+ default:
43
+ return getWeekRange(date, weekStart);
44
+ }
45
+ }
46
+ // ─── createCalendar ────────────────────────────────────────
47
+ export function createCalendar(options) {
48
+ const { events: eventsSource, view: initialView = 'week', defaultDate = new Date(), time, resources: resourcesInput = [], editable = false, selectable = false, onEventClick, onEventDrop, onEventResize, onSlotClick, onSlotSelect, onViewChange, onDateChange, eventContent, slotContent, dayHeaderContent, unstyled = false, classes, locale = 'en-US', } = options;
49
+ // Inject styles
50
+ if (!unstyled) {
51
+ injectCalendarStyles();
52
+ }
53
+ // Resolve config
54
+ const config = resolveTimeConfig(time);
55
+ // ─── State ───────────────────────────────────────────────
56
+ const currentDateSignal = signal(startOfDay(defaultDate));
57
+ const currentViewSignal = signal(initialView);
58
+ // Resource visibility
59
+ const resourceVisibility = signal(Object.fromEntries(resourcesInput.map((r) => [r.id, true])));
60
+ // Selection state
61
+ const selectedEventSignal = signal(null);
62
+ const selectedSlotSignal = signal(null);
63
+ // Local events (for addEvent/updateEvent/removeEvent)
64
+ const localEvents = signal([]);
65
+ // ─── Computed ────────────────────────────────────────────
66
+ const dateRangeComputed = computed(() => {
67
+ return calculateDateRange(currentDateSignal(), currentViewSignal(), config.weekStart);
68
+ });
69
+ const resourcesComputed = computed(() => resourcesInput);
70
+ const visibleResourcesComputed = computed(() => {
71
+ const visibility = resourceVisibility();
72
+ return resourcesInput.filter((r) => visibility[r.id] !== false).map((r) => r.id);
73
+ });
74
+ // Combine source events + local events, expand recurring, filter to range and visible resources
75
+ const visibleEvents = computed(() => {
76
+ const range = dateRangeComputed();
77
+ const sourceEvts = eventsSource();
78
+ const localEvts = localEvents();
79
+ const allEvents = [...sourceEvts, ...localEvts];
80
+ // Expand recurring events
81
+ const expanded = expandAllRecurring(allEvents, range.start, range.end);
82
+ // Filter by visible resources - use visibleResourcesComputed to ensure reactivity
83
+ const visibleRes = visibleResourcesComputed();
84
+ const filtered = expanded.filter((event) => {
85
+ // If event has no resourceId, always show it
86
+ if (!event.resourceId)
87
+ return true;
88
+ // Show event only if its resource is visible
89
+ return visibleRes.includes(event.resourceId);
90
+ });
91
+ return filtered;
92
+ });
93
+ // ─── Navigation ──────────────────────────────────────────
94
+ const today = () => {
95
+ currentDateSignal.set(startOfDay(new Date()));
96
+ onDateChange?.(currentDateSignal());
97
+ };
98
+ const next = () => {
99
+ const current = currentDateSignal();
100
+ const view = currentViewSignal();
101
+ let newDate;
102
+ switch (view) {
103
+ case 'day':
104
+ newDate = addDays(current, 1);
105
+ break;
106
+ case 'week':
107
+ newDate = addWeeks(current, 1);
108
+ break;
109
+ case 'month':
110
+ case 'agenda':
111
+ newDate = addMonths(current, 1);
112
+ break;
113
+ default:
114
+ newDate = addWeeks(current, 1);
115
+ }
116
+ currentDateSignal.set(newDate);
117
+ onDateChange?.(newDate);
118
+ };
119
+ const prev = () => {
120
+ const current = currentDateSignal();
121
+ const view = currentViewSignal();
122
+ let newDate;
123
+ switch (view) {
124
+ case 'day':
125
+ newDate = addDays(current, -1);
126
+ break;
127
+ case 'week':
128
+ newDate = addWeeks(current, -1);
129
+ break;
130
+ case 'month':
131
+ case 'agenda':
132
+ newDate = addMonths(current, -1);
133
+ break;
134
+ default:
135
+ newDate = addWeeks(current, -1);
136
+ }
137
+ currentDateSignal.set(newDate);
138
+ onDateChange?.(newDate);
139
+ };
140
+ const goTo = (date) => {
141
+ currentDateSignal.set(startOfDay(date));
142
+ onDateChange?.(currentDateSignal());
143
+ };
144
+ const setView = (view) => {
145
+ currentViewSignal.set(view);
146
+ onViewChange?.(view, dateRangeComputed());
147
+ };
148
+ // ─── Event Management ────────────────────────────────────
149
+ const getEvent = (id) => {
150
+ return visibleEvents().find((e) => e.id === id);
151
+ };
152
+ const addEvent = (event) => {
153
+ localEvents.update((evts) => [...evts, event]);
154
+ };
155
+ const updateEvent = (id, changes) => {
156
+ localEvents.update((evts) => evts.map((e) => (e.id === id ? { ...e, ...changes } : e)));
157
+ };
158
+ const removeEvent = (id) => {
159
+ localEvents.update((evts) => evts.filter((e) => e.id !== id));
160
+ };
161
+ // ─── Resource Management ─────────────────────────────────
162
+ const showResource = (id) => {
163
+ resourceVisibility.update((v) => ({ ...v, [id]: true }));
164
+ };
165
+ const hideResource = (id) => {
166
+ resourceVisibility.update((v) => ({ ...v, [id]: false }));
167
+ };
168
+ const toggleResource = (id) => {
169
+ resourceVisibility.update((v) => ({ ...v, [id]: !v[id] }));
170
+ };
171
+ // ─── Event Handlers for Views ────────────────────────────
172
+ const handleEventClick = (event) => {
173
+ selectedEventSignal.set(event);
174
+ onEventClick?.(event);
175
+ };
176
+ const handleSlotClick = (start, end, resourceId) => {
177
+ selectedSlotSignal.set({ start, end, resourceId });
178
+ onSlotClick?.(start, end, resourceId);
179
+ };
180
+ const handleSlotSelect = (start, end, resourceId) => {
181
+ selectedSlotSignal.set({ start, end, resourceId });
182
+ onSlotSelect?.(start, end, resourceId);
183
+ };
184
+ const handleEventDrop = (event, newStart, newEnd, newResourceId) => {
185
+ onEventDrop?.(event, newStart, newEnd, newResourceId);
186
+ };
187
+ const handleEventResize = (event, newEnd) => {
188
+ onEventResize?.(event, newEnd);
189
+ };
190
+ // ─── Root Component ──────────────────────────────────────
191
+ const Root = () => {
192
+ const container = document.createElement('div');
193
+ container.className = classes?.root ?? 'lf-cal';
194
+ let currentViewEl = null;
195
+ // Reactively render the appropriate view
196
+ effect(() => {
197
+ const view = currentViewSignal();
198
+ // Remove old view
199
+ if (currentViewEl) {
200
+ currentViewEl.remove();
201
+ }
202
+ // Render new view
203
+ switch (view) {
204
+ case 'day':
205
+ currentViewEl = renderDayView({
206
+ date: () => currentDateSignal(),
207
+ events: () => visibleEvents(),
208
+ resources: resourcesComputed,
209
+ visibleResources: visibleResourcesComputed,
210
+ config,
211
+ locale,
212
+ classes: classes ?? {},
213
+ eventContent,
214
+ slotContent,
215
+ dayHeaderContent,
216
+ onEventClick: handleEventClick,
217
+ onSlotClick: selectable ? handleSlotClick : undefined,
218
+ onSlotSelect: selectable ? handleSlotSelect : undefined,
219
+ onEventDrop: editable ? handleEventDrop : undefined,
220
+ onEventResize: editable ? handleEventResize : undefined,
221
+ editable,
222
+ selectable,
223
+ });
224
+ break;
225
+ case 'week':
226
+ currentViewEl = renderWeekView({
227
+ date: () => currentDateSignal(),
228
+ events: () => visibleEvents(),
229
+ config,
230
+ locale,
231
+ classes: classes ?? {},
232
+ eventContent,
233
+ slotContent,
234
+ dayHeaderContent,
235
+ onEventClick: handleEventClick,
236
+ onSlotClick: selectable ? handleSlotClick : undefined,
237
+ onSlotSelect: selectable ? handleSlotSelect : undefined,
238
+ onEventDrop: editable ? handleEventDrop : undefined,
239
+ onEventResize: editable ? handleEventResize : undefined,
240
+ editable,
241
+ selectable,
242
+ });
243
+ break;
244
+ case 'month':
245
+ currentViewEl = renderMonthView({
246
+ date: () => currentDateSignal(),
247
+ events: () => visibleEvents(),
248
+ config,
249
+ locale,
250
+ classes: classes ?? {},
251
+ onEventClick: handleEventClick,
252
+ onSlotClick: selectable ? handleSlotClick : undefined,
253
+ selectable,
254
+ });
255
+ break;
256
+ case 'agenda':
257
+ currentViewEl = renderAgendaView({
258
+ dateRange: dateRangeComputed,
259
+ events: () => visibleEvents(),
260
+ resources: resourcesComputed,
261
+ config,
262
+ locale,
263
+ classes: classes ?? {},
264
+ onEventClick: handleEventClick,
265
+ });
266
+ break;
267
+ }
268
+ if (currentViewEl) {
269
+ container.appendChild(currentViewEl);
270
+ }
271
+ });
272
+ return container;
273
+ };
274
+ // ─── Toolbar Component ───────────────────────────────────
275
+ const Toolbar = () => {
276
+ return renderToolbar({
277
+ currentDate: () => currentDateSignal(),
278
+ currentView: () => currentViewSignal(),
279
+ locale,
280
+ weekStart: config.weekStart,
281
+ classes: classes ?? {},
282
+ onPrev: prev,
283
+ onNext: next,
284
+ onToday: today,
285
+ onViewChange: setView,
286
+ });
287
+ };
288
+ // ─── Return API ──────────────────────────────────────────
289
+ return {
290
+ Root,
291
+ Toolbar,
292
+ // Navigation
293
+ currentDate: () => currentDateSignal(),
294
+ currentView: () => currentViewSignal(),
295
+ dateRange: () => dateRangeComputed(),
296
+ today,
297
+ next,
298
+ prev,
299
+ goTo,
300
+ setView,
301
+ // Events
302
+ events: () => visibleEvents(),
303
+ getEvent,
304
+ addEvent,
305
+ updateEvent,
306
+ removeEvent,
307
+ // Resources
308
+ resources: () => resourcesComputed(),
309
+ visibleResources: () => visibleResourcesComputed(),
310
+ showResource,
311
+ hideResource,
312
+ toggleResource,
313
+ // Selection
314
+ selectedEvent: () => selectedEventSignal(),
315
+ selectedSlot: () => selectedSlotSignal(),
316
+ };
317
+ }
318
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @liteforge/calendar - Toolbar Component
3
+ */
4
+ import type { CalendarView, CalendarClasses } from '../types.js';
5
+ interface ToolbarOptions {
6
+ currentDate: () => Date;
7
+ currentView: () => CalendarView;
8
+ locale: string;
9
+ weekStart: number;
10
+ classes: Partial<CalendarClasses>;
11
+ onPrev: () => void;
12
+ onNext: () => void;
13
+ onToday: () => void;
14
+ onViewChange: (view: CalendarView) => void;
15
+ }
16
+ export declare function renderToolbar(options: ToolbarOptions): HTMLDivElement;
17
+ export {};
18
+ //# sourceMappingURL=toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/components/toolbar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAQhE,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,EAAE,MAAM,YAAY,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;CAC3C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAwGrE"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @liteforge/calendar - Toolbar Component
3
+ */
4
+ import { effect } from '@liteforge/core';
5
+ import { formatFullDate, formatWeekRange, formatMonthYear, } from '../date-utils.js';
6
+ import { getClass } from '../views/shared.js';
7
+ export function renderToolbar(options) {
8
+ const { currentDate, currentView, locale, weekStart, classes, onPrev, onNext, onToday, onViewChange, } = options;
9
+ const toolbar = document.createElement('div');
10
+ toolbar.className = getClass('toolbar', classes, 'lf-cal-toolbar');
11
+ // Navigation
12
+ const nav = document.createElement('div');
13
+ nav.className = getClass('toolbarNav', classes, 'lf-cal-toolbar-nav');
14
+ const prevBtn = document.createElement('button');
15
+ prevBtn.type = 'button';
16
+ prevBtn.textContent = '←';
17
+ prevBtn.title = 'Previous';
18
+ prevBtn.addEventListener('click', onPrev);
19
+ const todayBtn = document.createElement('button');
20
+ todayBtn.type = 'button';
21
+ todayBtn.textContent = 'Today';
22
+ todayBtn.addEventListener('click', onToday);
23
+ const nextBtn = document.createElement('button');
24
+ nextBtn.type = 'button';
25
+ nextBtn.textContent = '→';
26
+ nextBtn.title = 'Next';
27
+ nextBtn.addEventListener('click', onNext);
28
+ nav.appendChild(prevBtn);
29
+ nav.appendChild(todayBtn);
30
+ nav.appendChild(nextBtn);
31
+ toolbar.appendChild(nav);
32
+ // Title
33
+ const title = document.createElement('div');
34
+ title.className = getClass('toolbarTitle', classes, 'lf-cal-toolbar-title');
35
+ // Update title reactively
36
+ effect(() => {
37
+ const date = currentDate();
38
+ const view = currentView();
39
+ switch (view) {
40
+ case 'day':
41
+ title.textContent = formatFullDate(date, locale);
42
+ break;
43
+ case 'week':
44
+ title.textContent = formatWeekRange(date, locale, weekStart);
45
+ break;
46
+ case 'month':
47
+ title.textContent = formatMonthYear(date, locale);
48
+ break;
49
+ case 'agenda':
50
+ title.textContent = formatMonthYear(date, locale);
51
+ break;
52
+ }
53
+ });
54
+ toolbar.appendChild(title);
55
+ // View switcher
56
+ const views = document.createElement('div');
57
+ views.className = getClass('toolbarViews', classes, 'lf-cal-toolbar-views');
58
+ const viewButtons = [
59
+ { view: 'day', label: 'Day' },
60
+ { view: 'week', label: 'Week' },
61
+ { view: 'month', label: 'Month' },
62
+ { view: 'agenda', label: 'Agenda' },
63
+ ];
64
+ const buttonEls = [];
65
+ for (const { view, label } of viewButtons) {
66
+ const btn = document.createElement('button');
67
+ btn.type = 'button';
68
+ btn.textContent = label;
69
+ btn.dataset.view = view;
70
+ btn.addEventListener('click', () => onViewChange(view));
71
+ views.appendChild(btn);
72
+ buttonEls.push(btn);
73
+ }
74
+ // Update active state reactively
75
+ effect(() => {
76
+ const view = currentView();
77
+ for (const btn of buttonEls) {
78
+ btn.classList.toggle('active', btn.dataset.view === view);
79
+ }
80
+ });
81
+ toolbar.appendChild(views);
82
+ return toolbar;
83
+ }
84
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../src/components/toolbar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAc7C,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,MAAM,EACJ,WAAW,EACX,WAAW,EACX,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,YAAY,GACb,GAAG,OAAO,CAAA;IAEX,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAA;IAElE,aAAa;IACb,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACzC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAA;IAErE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChD,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAA;IACvB,OAAO,CAAC,WAAW,GAAG,GAAG,CAAA;IACzB,OAAO,CAAC,KAAK,GAAG,UAAU,CAAA;IAC1B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjD,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAA;IACxB,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAA;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAE3C,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChD,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAA;IACvB,OAAO,CAAC,WAAW,GAAG,GAAG,CAAA;IACzB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEzC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACxB,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACzB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAExB,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAExB,QAAQ;IACR,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAC3C,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAA;IAE3E,0BAA0B;IAC1B,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;QAC1B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;QAE1B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK;gBACR,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBAChD,MAAK;YACP,KAAK,MAAM;gBACT,KAAK,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;gBAC5D,MAAK;YACP,KAAK,OAAO;gBACV,KAAK,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBACjD,MAAK;YACP,KAAK,QAAQ;gBACX,KAAK,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBACjD,MAAK;QACT,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAE1B,gBAAgB;IAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAC3C,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAA;IAE3E,MAAM,WAAW,GAAiD;QAChE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;QAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;QACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;KACpC,CAAA;IAED,MAAM,SAAS,GAAwB,EAAE,CAAA;IAEzC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC5C,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAA;QACnB,GAAG,CAAC,WAAW,GAAG,KAAK,CAAA;QACvB,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;QACvB,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QACvD,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;QAC1B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAE1B,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @liteforge/calendar - Date Utilities
3
+ *
4
+ * All date operations from scratch. NO external dependencies.
5
+ * Uses native Date and Intl.DateTimeFormat.
6
+ * All functions return NEW Date objects - never mutate.
7
+ */
8
+ export declare function startOfDay(date: Date): Date;
9
+ export declare function endOfDay(date: Date): Date;
10
+ export declare function startOfWeek(date: Date, weekStart?: number): Date;
11
+ export declare function endOfWeek(date: Date, weekStart?: number): Date;
12
+ export declare function startOfMonth(date: Date): Date;
13
+ export declare function endOfMonth(date: Date): Date;
14
+ export declare function addDays(date: Date, days: number): Date;
15
+ export declare function addWeeks(date: Date, weeks: number): Date;
16
+ export declare function addMonths(date: Date, months: number): Date;
17
+ export declare function addMinutes(date: Date, minutes: number): Date;
18
+ export declare function addHours(date: Date, hours: number): Date;
19
+ export declare function isSameDay(a: Date, b: Date): boolean;
20
+ export declare function isSameMonth(a: Date, b: Date): boolean;
21
+ export declare function isToday(date: Date): boolean;
22
+ export declare function isWeekend(date: Date): boolean;
23
+ export declare function isWithinRange(date: Date, start: Date, end: Date): boolean;
24
+ export declare function isBefore(a: Date, b: Date): boolean;
25
+ export declare function isAfter(a: Date, b: Date): boolean;
26
+ export declare function getDayOfWeek(date: Date): number;
27
+ export declare function getWeekNumber(date: Date): number;
28
+ export declare function daysInMonth(date: Date): number;
29
+ export declare function diffInMinutes(a: Date, b: Date): number;
30
+ export declare function diffInDays(a: Date, b: Date): number;
31
+ export declare function getSlotsBetween(start: Date, end: Date, slotDuration: number): Date[];
32
+ export declare function getTimeSlots(date: Date, dayStart: number, dayEnd: number, slotDuration: number): Date[];
33
+ export declare function getDaysInRange(start: Date, end: Date): Date[];
34
+ export declare function getWeekDays(date: Date, weekStart: number, hiddenDays?: number[]): Date[];
35
+ export declare function getMonthCalendarDays(date: Date, weekStart: number): Date[];
36
+ export declare function formatTime(date: Date, locale?: string): string;
37
+ export declare function formatDate(date: Date, locale?: string): string;
38
+ export declare function formatDayHeader(date: Date, locale?: string): string;
39
+ export declare function formatWeekday(date: Date, locale?: string): string;
40
+ export declare function formatDayNumber(date: Date): string;
41
+ export declare function formatMonthYear(date: Date, locale?: string): string;
42
+ export declare function formatWeekRange(date: Date, locale?: string, weekStart?: number): string;
43
+ export declare function formatFullDate(date: Date, locale?: string): string;
44
+ export declare function getMinutesSinceDayStart(date: Date, dayStart: number): number;
45
+ export declare function getSlotPosition(date: Date, dayStart: number, slotDuration: number, slotHeight: number): number;
46
+ export declare function getEventHeight(start: Date, end: Date, slotDuration: number, slotHeight: number): number;
47
+ export declare function snapToSlot(date: Date, slotDuration: number): Date;
48
+ export declare function floorToSlot(date: Date, slotDuration: number): Date;
49
+ export declare function getDayRange(date: Date): {
50
+ start: Date;
51
+ end: Date;
52
+ };
53
+ export declare function getWeekRange(date: Date, weekStart: number): {
54
+ start: Date;
55
+ end: Date;
56
+ };
57
+ export declare function getMonthRange(date: Date): {
58
+ start: Date;
59
+ end: Date;
60
+ };
61
+ export declare function eventsOverlap(a: {
62
+ start: Date;
63
+ end: Date;
64
+ }, b: {
65
+ start: Date;
66
+ end: Date;
67
+ }): boolean;
68
+ export declare function isEventInRange(event: {
69
+ start: Date;
70
+ end: Date;
71
+ }, rangeStart: Date, rangeEnd: Date): boolean;
72
+ export declare function isEventOnDay(event: {
73
+ start: Date;
74
+ end: Date;
75
+ }, day: Date): boolean;
76
+ /**
77
+ * Check if an event should be treated as all-day.
78
+ * An event is all-day if:
79
+ * - It has allDay: true, OR
80
+ * - It spans 24 hours or more, OR
81
+ * - start === end (no duration - treat as all-day)
82
+ */
83
+ export declare function isAllDayEvent(event: {
84
+ start: Date;
85
+ end: Date;
86
+ allDay?: boolean;
87
+ }): boolean;
88
+ /**
89
+ * Get the duration of an event with safety guards.
90
+ * If end <= start, returns slotDuration as minimum.
91
+ */
92
+ export declare function getEventDuration(event: {
93
+ start: Date;
94
+ end: Date;
95
+ }, slotDurationMinutes: number): number;
96
+ /**
97
+ * Ensure an event has valid end time.
98
+ * If end <= start, returns start + slotDuration.
99
+ */
100
+ export declare function ensureValidEventEnd(event: {
101
+ start: Date;
102
+ end: Date;
103
+ }, slotDurationMinutes: number): Date;
104
+ //# sourceMappingURL=date-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../src/date-utils.ts"],"names":[],"mappings":"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"}