@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,432 @@
1
+ /**
2
+ * @liteforge/calendar - Day View Renderer
3
+ *
4
+ * Day view with optional resource columns (therapists/rooms).
5
+ * Without resources: single day column.
6
+ * With resources: one column per visible resource.
7
+ */
8
+ import { effect } from '@liteforge/core';
9
+ import { getTimeSlots, formatFullDate, isToday, isAllDayEvent, addMinutes, diffInMinutes, } from '../date-utils.js';
10
+ import { calculateOverlaps, getTimedEventsForDay, getEventsForResource, renderTimeColumn, renderTimeSlots, renderEvent, renderAllDayRow, createNowIndicator, getClass, } from './shared.js';
11
+ import { setupSlotSelection } from '../interactions/slot-selection.js';
12
+ export function renderDayView(options) {
13
+ const { date, events, resources, visibleResources, config, locale, classes, eventContent, slotContent, onEventClick, onSlotClick, onSlotSelect, onEventDrop, onEventResize, editable, selectable, } = options;
14
+ const container = document.createElement('div');
15
+ container.className = getClass('root', classes, 'lf-cal-day-view');
16
+ // Header
17
+ const header = document.createElement('div');
18
+ header.className = getClass('header', classes, 'lf-cal-header');
19
+ // Time spacer
20
+ const timeSpacer = document.createElement('div');
21
+ timeSpacer.className = 'lf-cal-header-time-spacer';
22
+ header.appendChild(timeSpacer);
23
+ // Resource/day headers container
24
+ const headersContainer = document.createElement('div');
25
+ headersContainer.style.display = 'flex';
26
+ headersContainer.style.flex = '1';
27
+ header.appendChild(headersContainer);
28
+ container.appendChild(header);
29
+ // All-day row
30
+ let allDayRow = null;
31
+ // Body
32
+ const body = document.createElement('div');
33
+ body.className = getClass('body', classes, 'lf-cal-body');
34
+ let timeColumnEl = null;
35
+ // Grid
36
+ const grid = document.createElement('div');
37
+ grid.className = getClass('grid', classes, 'lf-cal-grid');
38
+ body.appendChild(grid);
39
+ container.appendChild(body);
40
+ // Now indicator reference
41
+ let nowIndicator = null;
42
+ // Slot selection cleanup functions
43
+ let slotSelectionCleanups = [];
44
+ // Day column reference for drag
45
+ let dayColumnRef = null;
46
+ let currentDateRef = new Date();
47
+ // Reactive rendering
48
+ effect(() => {
49
+ const currentDate = date();
50
+ const allEvents = events();
51
+ const allResources = resources();
52
+ const visible = visibleResources();
53
+ // Separate all-day and timed events
54
+ const allDayEvents = allEvents.filter((e) => isAllDayEvent(e));
55
+ const timedEvents = allEvents.filter((e) => !isAllDayEvent(e));
56
+ // Get resources to display
57
+ const displayResources = allResources.length > 0
58
+ ? allResources.filter((r) => visible.includes(r.id))
59
+ : null;
60
+ // Update headers
61
+ headersContainer.innerHTML = '';
62
+ if (displayResources && displayResources.length > 0) {
63
+ // Resource columns
64
+ for (const resource of displayResources) {
65
+ const headerCell = document.createElement('div');
66
+ headerCell.className = getClass('headerCell', classes, 'lf-cal-header-cell');
67
+ headerCell.style.borderLeft = `3px solid ${resource.color ?? '#3b82f6'}`;
68
+ const nameEl = document.createElement('div');
69
+ nameEl.className = 'lf-cal-header-day-name';
70
+ nameEl.textContent = resource.name;
71
+ if (resource.role) {
72
+ const roleEl = document.createElement('div');
73
+ roleEl.style.fontSize = '11px';
74
+ roleEl.style.opacity = '0.7';
75
+ roleEl.textContent = resource.role;
76
+ headerCell.appendChild(nameEl);
77
+ headerCell.appendChild(roleEl);
78
+ }
79
+ else {
80
+ headerCell.appendChild(nameEl);
81
+ }
82
+ headersContainer.appendChild(headerCell);
83
+ }
84
+ }
85
+ else {
86
+ // Single day header
87
+ const headerCell = document.createElement('div');
88
+ let headerClass = getClass('headerCell', classes, 'lf-cal-header-cell');
89
+ if (isToday(currentDate))
90
+ headerClass += ' lf-cal-header-cell--today';
91
+ headerCell.className = headerClass;
92
+ headerCell.textContent = formatFullDate(currentDate, locale);
93
+ headersContainer.appendChild(headerCell);
94
+ }
95
+ // Update all-day row
96
+ if (allDayRow) {
97
+ allDayRow.remove();
98
+ }
99
+ allDayRow = renderAllDayRow({
100
+ days: [currentDate],
101
+ events: allDayEvents,
102
+ classes,
103
+ onEventClick,
104
+ hasTimeColumnSpacer: true,
105
+ });
106
+ container.insertBefore(allDayRow, body);
107
+ // Update time column
108
+ if (timeColumnEl) {
109
+ timeColumnEl.remove();
110
+ }
111
+ timeColumnEl = renderTimeColumn(currentDate, config, locale);
112
+ body.insertBefore(timeColumnEl, grid);
113
+ // Update grid
114
+ grid.innerHTML = '';
115
+ // Clean up old now indicator
116
+ if (nowIndicator?.cleanup) {
117
+ nowIndicator.cleanup();
118
+ }
119
+ nowIndicator = null;
120
+ // Clean up old slot selection handlers
121
+ for (const cleanup of slotSelectionCleanups) {
122
+ cleanup();
123
+ }
124
+ slotSelectionCleanups = [];
125
+ currentDateRef = currentDate;
126
+ if (displayResources && displayResources.length > 0) {
127
+ // Render resource columns
128
+ for (const resource of displayResources) {
129
+ const resourceColumn = document.createElement('div');
130
+ resourceColumn.className = getClass('resourceColumn', classes, 'lf-cal-resource-column');
131
+ // Time slots
132
+ const slotsContainer = renderTimeSlots(currentDate, config, resource);
133
+ resourceColumn.appendChild(slotsContainer);
134
+ // Custom slot content
135
+ if (slotContent) {
136
+ const slots = getTimeSlots(currentDate, config.dayStart, config.dayEnd, config.slotDuration);
137
+ for (let i = 0; i < slots.length; i++) {
138
+ const slot = slots[i];
139
+ if (!slot)
140
+ continue;
141
+ const content = slotContent(slot, resource.id);
142
+ if (content) {
143
+ const slotEl = slotsContainer.children[i];
144
+ if (slotEl) {
145
+ slotEl.innerHTML = '';
146
+ slotEl.appendChild(content);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ // Set up slot selection for this resource
152
+ if (selectable && (onSlotClick ?? onSlotSelect)) {
153
+ const slotState = setupSlotSelection({
154
+ slotsContainer,
155
+ day: currentDate,
156
+ config,
157
+ resourceId: resource.id,
158
+ onSlotClick,
159
+ onSlotSelect,
160
+ });
161
+ slotSelectionCleanups.push(slotState.cleanup);
162
+ }
163
+ // Events for this resource (timed events only)
164
+ const dayEvents = getTimedEventsForDay(timedEvents, currentDate);
165
+ const resourceEvents = getEventsForResource(dayEvents, resource.id);
166
+ const layouts = calculateOverlaps(resourceEvents);
167
+ // Events container
168
+ const eventsContainer = document.createElement('div');
169
+ eventsContainer.style.position = 'absolute';
170
+ eventsContainer.style.top = '0';
171
+ eventsContainer.style.left = '0';
172
+ eventsContainer.style.right = '0';
173
+ eventsContainer.style.bottom = '0';
174
+ eventsContainer.style.pointerEvents = 'none';
175
+ for (const layout of layouts) {
176
+ const eventEl = renderEvent(layout.event, config, layout, eventContent, onEventClick, editable,
177
+ // Drag handler
178
+ editable ? (event, element) => {
179
+ setupEventDragInteraction(event, element, currentDate, resourceColumn, resource.id);
180
+ } : undefined,
181
+ // Resize handler
182
+ editable ? (event, element) => {
183
+ setupEventResizeInteraction(event, element, currentDate, resourceColumn);
184
+ } : undefined);
185
+ eventEl.style.pointerEvents = 'auto';
186
+ if (resource.color) {
187
+ eventEl.style.background = resource.color;
188
+ }
189
+ eventsContainer.appendChild(eventEl);
190
+ }
191
+ resourceColumn.appendChild(eventsContainer);
192
+ // Now indicator (only in first column for today)
193
+ if (resource === displayResources[0] && isToday(currentDate) && config.nowIndicator) {
194
+ nowIndicator = createNowIndicator(config);
195
+ if (nowIndicator) {
196
+ nowIndicator.style.left = '0';
197
+ nowIndicator.style.right = 'auto';
198
+ nowIndicator.style.width = '100%';
199
+ grid.style.position = 'relative';
200
+ // We'll add the indicator to the grid instead
201
+ }
202
+ }
203
+ grid.appendChild(resourceColumn);
204
+ }
205
+ // Add now indicator to span all resource columns
206
+ if (nowIndicator) {
207
+ grid.appendChild(nowIndicator);
208
+ }
209
+ }
210
+ else {
211
+ // Single day column (no resources)
212
+ const dayColumn = document.createElement('div');
213
+ let columnClass = getClass('dayColumn', classes, 'lf-cal-day-column');
214
+ if (isToday(currentDate))
215
+ columnClass += ' lf-cal-day-column--today';
216
+ dayColumn.className = columnClass;
217
+ // Time slots
218
+ const slotsContainer = renderTimeSlots(currentDate, config);
219
+ dayColumn.appendChild(slotsContainer);
220
+ // Custom slot content
221
+ if (slotContent) {
222
+ const slots = getTimeSlots(currentDate, config.dayStart, config.dayEnd, config.slotDuration);
223
+ for (let i = 0; i < slots.length; i++) {
224
+ const slot = slots[i];
225
+ if (!slot)
226
+ continue;
227
+ const content = slotContent(slot);
228
+ if (content) {
229
+ const slotEl = slotsContainer.children[i];
230
+ if (slotEl) {
231
+ slotEl.innerHTML = '';
232
+ slotEl.appendChild(content);
233
+ }
234
+ }
235
+ }
236
+ }
237
+ // Set up slot selection
238
+ if (selectable && (onSlotClick ?? onSlotSelect)) {
239
+ const slotState = setupSlotSelection({
240
+ slotsContainer,
241
+ day: currentDate,
242
+ config,
243
+ onSlotClick,
244
+ onSlotSelect,
245
+ });
246
+ slotSelectionCleanups.push(slotState.cleanup);
247
+ }
248
+ dayColumnRef = dayColumn;
249
+ // Events for this day (timed events only - all-day events are in the all-day row)
250
+ const dayEvents = getTimedEventsForDay(timedEvents, currentDate);
251
+ const layouts = calculateOverlaps(dayEvents);
252
+ // Events container
253
+ const eventsContainer = document.createElement('div');
254
+ eventsContainer.style.position = 'absolute';
255
+ eventsContainer.style.top = '0';
256
+ eventsContainer.style.left = '0';
257
+ eventsContainer.style.right = '0';
258
+ eventsContainer.style.bottom = '0';
259
+ eventsContainer.style.pointerEvents = 'none';
260
+ for (const layout of layouts) {
261
+ const eventEl = renderEvent(layout.event, config, layout, eventContent, onEventClick, editable,
262
+ // Drag handler
263
+ editable ? (event, element) => {
264
+ setupEventDragInteraction(event, element, currentDate, dayColumn, undefined);
265
+ } : undefined,
266
+ // Resize handler
267
+ editable ? (event, element) => {
268
+ setupEventResizeInteraction(event, element, currentDate, dayColumn);
269
+ } : undefined);
270
+ eventEl.style.pointerEvents = 'auto';
271
+ eventsContainer.appendChild(eventEl);
272
+ }
273
+ dayColumn.appendChild(eventsContainer);
274
+ // Now indicator
275
+ if (isToday(currentDate) && config.nowIndicator) {
276
+ nowIndicator = createNowIndicator(config);
277
+ if (nowIndicator) {
278
+ eventsContainer.appendChild(nowIndicator);
279
+ }
280
+ }
281
+ grid.appendChild(dayColumn);
282
+ }
283
+ });
284
+ // ─── Event Drag Interaction ────────────────────────────────
285
+ function setupEventDragInteraction(event, element, _originalDay, _dayColumn, resourceId) {
286
+ let isDragging = false;
287
+ let startX = 0;
288
+ let startY = 0;
289
+ let ghostEl = null;
290
+ const DRAG_THRESHOLD = 5;
291
+ const handlePointerDown = (e) => {
292
+ if (e.button !== 0)
293
+ return;
294
+ if (e.target.classList.contains('lf-cal-event-resize-handle'))
295
+ return;
296
+ startX = e.clientX;
297
+ startY = e.clientY;
298
+ isDragging = false;
299
+ document.addEventListener('pointermove', handlePointerMove);
300
+ document.addEventListener('pointerup', handlePointerUp);
301
+ };
302
+ const handlePointerMove = (e) => {
303
+ const deltaX = Math.abs(e.clientX - startX);
304
+ const deltaY = Math.abs(e.clientY - startY);
305
+ if (!isDragging && deltaX < DRAG_THRESHOLD && deltaY < DRAG_THRESHOLD) {
306
+ return;
307
+ }
308
+ if (!isDragging) {
309
+ isDragging = true;
310
+ element.classList.add('lf-cal-event--dragging');
311
+ // Create ghost
312
+ ghostEl = element.cloneNode(true);
313
+ ghostEl.classList.add('lf-cal-event--ghost');
314
+ ghostEl.style.position = 'fixed';
315
+ ghostEl.style.zIndex = '10000';
316
+ ghostEl.style.width = `${element.offsetWidth}px`;
317
+ ghostEl.style.height = `${element.offsetHeight}px`;
318
+ ghostEl.style.opacity = '0.8';
319
+ ghostEl.style.pointerEvents = 'none';
320
+ document.body.appendChild(ghostEl);
321
+ document.body.style.userSelect = 'none';
322
+ document.body.style.cursor = 'grabbing';
323
+ }
324
+ if (ghostEl) {
325
+ ghostEl.style.left = `${e.clientX - ghostEl.offsetWidth / 2}px`;
326
+ ghostEl.style.top = `${e.clientY - 10}px`;
327
+ }
328
+ };
329
+ const handlePointerUp = (e) => {
330
+ document.removeEventListener('pointermove', handlePointerMove);
331
+ document.removeEventListener('pointerup', handlePointerUp);
332
+ if (!isDragging)
333
+ return;
334
+ element.classList.remove('lf-cal-event--dragging');
335
+ if (ghostEl) {
336
+ ghostEl.remove();
337
+ ghostEl = null;
338
+ }
339
+ document.body.style.userSelect = '';
340
+ document.body.style.cursor = '';
341
+ // Calculate new position
342
+ if (onEventDrop && dayColumnRef) {
343
+ const newStart = calculateTimeFromY(e.clientY, currentDateRef, dayColumnRef);
344
+ const duration = diffInMinutes(event.start, event.end);
345
+ const newEnd = addMinutes(newStart, duration);
346
+ onEventDrop(event, newStart, newEnd, resourceId);
347
+ }
348
+ isDragging = false;
349
+ };
350
+ element.addEventListener('pointerdown', handlePointerDown);
351
+ }
352
+ // ─── Event Resize Interaction ──────────────────────────────
353
+ function setupEventResizeInteraction(event, element, day, _dayColumn) {
354
+ // Find resize handle (created by renderEvent)
355
+ const resizeHandle = element.querySelector('.lf-cal-event-resize-handle');
356
+ if (!resizeHandle) {
357
+ return;
358
+ }
359
+ let isResizing = false;
360
+ const handleResizeDown = (e) => {
361
+ if (e.button !== 0)
362
+ return;
363
+ e.stopPropagation();
364
+ e.preventDefault();
365
+ isResizing = true;
366
+ element.classList.add('lf-cal-event--resizing');
367
+ document.body.style.userSelect = 'none';
368
+ document.body.style.cursor = 'ns-resize';
369
+ document.addEventListener('pointermove', handleResizeMove);
370
+ document.addEventListener('pointerup', handleResizeUp);
371
+ };
372
+ const handleResizeMove = (e) => {
373
+ if (!isResizing || !dayColumnRef)
374
+ return;
375
+ const newEnd = calculateTimeFromY(e.clientY, day, dayColumnRef);
376
+ const minEnd = addMinutes(event.start, config.slotDuration);
377
+ const clampedEnd = newEnd < minEnd ? minEnd : newEnd;
378
+ // Update visual height
379
+ const slotHeight = 40;
380
+ const startMinutes = (event.start.getHours() - config.dayStart) * 60 + event.start.getMinutes();
381
+ const endMinutes = (clampedEnd.getHours() - config.dayStart) * 60 + clampedEnd.getMinutes();
382
+ const durationMinutes = endMinutes - startMinutes;
383
+ const newHeight = (durationMinutes / config.slotDuration) * slotHeight;
384
+ element.style.height = `${Math.max(newHeight, slotHeight / 2)}px`;
385
+ };
386
+ const handleResizeUp = (e) => {
387
+ document.removeEventListener('pointermove', handleResizeMove);
388
+ document.removeEventListener('pointerup', handleResizeUp);
389
+ if (!isResizing || !dayColumnRef)
390
+ return;
391
+ element.classList.remove('lf-cal-event--resizing');
392
+ document.body.style.userSelect = '';
393
+ document.body.style.cursor = '';
394
+ if (onEventResize) {
395
+ const newEnd = calculateTimeFromY(e.clientY, day, dayColumnRef);
396
+ const minEnd = addMinutes(event.start, config.slotDuration);
397
+ const clampedEnd = newEnd < minEnd ? minEnd : newEnd;
398
+ onEventResize(event, clampedEnd);
399
+ }
400
+ isResizing = false;
401
+ };
402
+ resizeHandle.addEventListener('pointerdown', handleResizeDown);
403
+ }
404
+ // ─── Helper Functions ──────────────────────────────────────
405
+ function calculateTimeFromY(y, day, column) {
406
+ const rect = column.getBoundingClientRect();
407
+ const relativeY = y - rect.top;
408
+ const slotHeight = 40;
409
+ const totalSlots = (config.dayEnd - config.dayStart) * (60 / config.slotDuration);
410
+ const slotIndex = Math.floor(relativeY / slotHeight);
411
+ const clampedIndex = Math.max(0, Math.min(slotIndex, totalSlots - 1));
412
+ const minutesFromStart = clampedIndex * config.slotDuration;
413
+ const hours = config.dayStart + Math.floor(minutesFromStart / 60);
414
+ const minutes = minutesFromStart % 60;
415
+ const result = new Date(day);
416
+ result.setHours(hours, minutes, 0, 0);
417
+ return result;
418
+ }
419
+ // Cleanup
420
+ const originalRemove = container.remove.bind(container);
421
+ container.remove = () => {
422
+ if (nowIndicator?.cleanup) {
423
+ nowIndicator.cleanup();
424
+ }
425
+ for (const cleanup of slotSelectionCleanups) {
426
+ cleanup();
427
+ }
428
+ originalRemove();
429
+ };
430
+ return container;
431
+ }
432
+ //# sourceMappingURL=day-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day-view.js","sourceRoot":"","sources":["../../src/views/day-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @liteforge/calendar - Month View Renderer
3
+ */
4
+ import type { CalendarEvent, ResolvedTimeConfig, CalendarClasses } from '../types.js';
5
+ interface MonthViewOptions<T extends CalendarEvent> {
6
+ date: () => Date;
7
+ events: () => T[];
8
+ config: ResolvedTimeConfig;
9
+ locale: string;
10
+ classes: Partial<CalendarClasses>;
11
+ onEventClick: ((event: T) => void) | undefined;
12
+ onSlotClick: ((start: Date, end: Date, resourceId?: string) => void) | undefined;
13
+ selectable: boolean | undefined;
14
+ }
15
+ export declare function renderMonthView<T extends CalendarEvent>(options: MonthViewOptions<T>): HTMLDivElement;
16
+ export {};
17
+ //# sourceMappingURL=month-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"month-view.d.ts","sourceRoot":"","sources":["../../src/views/month-view.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EAChB,MAAM,aAAa,CAAA;AAapB,UAAU,gBAAgB,CAAC,CAAC,SAAS,aAAa;IAChD,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;IACjB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACjC,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAC9C,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAChF,UAAU,EAAE,OAAO,GAAG,SAAS,CAAA;CAChC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,aAAa,EACrD,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,cAAc,CAuJhB"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @liteforge/calendar - Month View Renderer
3
+ */
4
+ import { effect } from '@liteforge/core';
5
+ import { getMonthCalendarDays, isSameMonth, isSameDay, isToday, isWeekend, formatWeekday, } from '../date-utils.js';
6
+ import { getClass } from './shared.js';
7
+ const MAX_VISIBLE_EVENTS = 3;
8
+ export function renderMonthView(options) {
9
+ const { date, events, config, locale, classes, onEventClick, onSlotClick, selectable, } = options;
10
+ const container = document.createElement('div');
11
+ container.className = getClass('root', classes, 'lf-cal-month-view');
12
+ // Weekday headers
13
+ const header = document.createElement('div');
14
+ header.className = 'lf-cal-month-header';
15
+ // Generate weekday names based on weekStart
16
+ const weekdayNames = [];
17
+ const sampleDate = new Date(2024, 0, 1); // A Monday
18
+ for (let i = 0; i < 7; i++) {
19
+ const dayIndex = (config.weekStart + i) % 7;
20
+ // Find a date with this day of week
21
+ const tempDate = new Date(sampleDate);
22
+ tempDate.setDate(tempDate.getDate() + (dayIndex - tempDate.getDay() + 7) % 7);
23
+ weekdayNames.push(formatWeekday(tempDate, locale));
24
+ }
25
+ for (const name of weekdayNames) {
26
+ const cell = document.createElement('div');
27
+ cell.className = 'lf-cal-month-header-cell';
28
+ cell.textContent = name;
29
+ header.appendChild(cell);
30
+ }
31
+ container.appendChild(header);
32
+ // Grid
33
+ const grid = document.createElement('div');
34
+ grid.className = getClass('monthGrid', classes, 'lf-cal-month-grid');
35
+ container.appendChild(grid);
36
+ // Reactive rendering
37
+ effect(() => {
38
+ const currentDate = date();
39
+ const allEvents = events();
40
+ const days = getMonthCalendarDays(currentDate, config.weekStart);
41
+ grid.innerHTML = '';
42
+ for (const day of days) {
43
+ const cell = document.createElement('div');
44
+ let cellClass = getClass('monthCell', classes, 'lf-cal-month-cell');
45
+ if (isToday(day)) {
46
+ cellClass += ' lf-cal-month-cell--today';
47
+ }
48
+ if (!isSameMonth(day, currentDate)) {
49
+ cellClass += ' lf-cal-month-cell--other-month';
50
+ }
51
+ if (isWeekend(day)) {
52
+ cellClass += ' lf-cal-month-cell--weekend';
53
+ }
54
+ cell.className = cellClass;
55
+ // Day number
56
+ const dayNumber = document.createElement('div');
57
+ dayNumber.className = 'lf-cal-month-day-number';
58
+ dayNumber.textContent = String(day.getDate());
59
+ cell.appendChild(dayNumber);
60
+ // Click on cell
61
+ if (selectable && onSlotClick) {
62
+ cell.style.cursor = 'pointer';
63
+ cell.addEventListener('click', (e) => {
64
+ // Don't trigger if clicking on an event
65
+ if (e.target.classList.contains('lf-cal-month-event')) {
66
+ return;
67
+ }
68
+ const start = new Date(day);
69
+ start.setHours(config.dayStart, 0, 0, 0);
70
+ const end = new Date(day);
71
+ end.setHours(config.dayStart + 1, 0, 0, 0);
72
+ onSlotClick(start, end);
73
+ });
74
+ }
75
+ // Events for this day
76
+ const dayEvents = allEvents.filter((event) => {
77
+ const eventStart = new Date(event.start);
78
+ const eventEnd = new Date(event.end);
79
+ // Event spans this day
80
+ return ((isSameDay(eventStart, day) || eventStart < day) &&
81
+ (isSameDay(eventEnd, day) || eventEnd > day));
82
+ });
83
+ // Sort by start time
84
+ dayEvents.sort((a, b) => a.start.getTime() - b.start.getTime());
85
+ // Events container
86
+ const eventsContainer = document.createElement('div');
87
+ eventsContainer.className = 'lf-cal-month-events';
88
+ const visibleEvents = dayEvents.slice(0, MAX_VISIBLE_EVENTS);
89
+ const remainingCount = dayEvents.length - MAX_VISIBLE_EVENTS;
90
+ for (const event of visibleEvents) {
91
+ const eventEl = document.createElement('div');
92
+ eventEl.className = getClass('monthEvent', classes, 'lf-cal-month-event');
93
+ eventEl.textContent = event.title;
94
+ if (event.color) {
95
+ eventEl.style.background = event.color;
96
+ }
97
+ if (onEventClick) {
98
+ eventEl.addEventListener('click', (e) => {
99
+ e.stopPropagation();
100
+ onEventClick(event);
101
+ });
102
+ }
103
+ eventsContainer.appendChild(eventEl);
104
+ }
105
+ if (remainingCount > 0) {
106
+ const more = document.createElement('div');
107
+ more.className = getClass('monthMore', classes, 'lf-cal-month-more');
108
+ more.textContent = `+${remainingCount} more`;
109
+ // Could show popup with all events on click
110
+ more.addEventListener('click', (e) => {
111
+ e.stopPropagation();
112
+ // For now, just log
113
+ console.log(`${remainingCount} more events on ${day.toDateString()}`);
114
+ });
115
+ eventsContainer.appendChild(more);
116
+ }
117
+ cell.appendChild(eventsContainer);
118
+ grid.appendChild(cell);
119
+ }
120
+ });
121
+ return container;
122
+ }
123
+ //# sourceMappingURL=month-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"month-view.js","sourceRoot":"","sources":["../../src/views/month-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @liteforge/calendar - Shared View Utilities
3
+ */
4
+ import type { CalendarEvent, Resource, ResolvedTimeConfig, OverlapLayout, CalendarClasses } from '../types.js';
5
+ export declare function calculateOverlaps<T extends CalendarEvent>(events: T[]): OverlapLayout<T>[];
6
+ export declare function getEventsForDay<T extends CalendarEvent>(events: T[], day: Date, resourceId?: string): T[];
7
+ /**
8
+ * Get only timed (non-all-day) events for a specific day.
9
+ */
10
+ export declare function getTimedEventsForDay<T extends CalendarEvent>(events: T[], day: Date, resourceId?: string): T[];
11
+ /**
12
+ * Get only all-day events for a specific day.
13
+ */
14
+ export declare function getAllDayEventsForDay<T extends CalendarEvent>(events: T[], day: Date, resourceId?: string): T[];
15
+ export declare function getEventsForResource<T extends CalendarEvent>(events: T[], resourceId: string): T[];
16
+ export declare function renderTimeColumn(date: Date, config: ResolvedTimeConfig, locale: string): HTMLDivElement;
17
+ export declare function renderTimeSlots(date: Date, config: ResolvedTimeConfig, resource?: Resource): HTMLDivElement;
18
+ export declare function renderEvent<T extends CalendarEvent>(event: T, config: ResolvedTimeConfig, layout: OverlapLayout<T>, customContent?: (event: T) => Node, onClick?: (event: T) => void, editable?: boolean, onDragStart?: (event: T, element: HTMLElement) => void, onResizeStart?: (event: T, element: HTMLElement) => void): HTMLDivElement;
19
+ export declare function renderAllDayEvent<T extends CalendarEvent>(event: T, onClick?: (event: T) => void): HTMLDivElement;
20
+ export interface AllDayRowOptions<T extends CalendarEvent> {
21
+ days: Date[];
22
+ events: T[];
23
+ classes: Partial<CalendarClasses>;
24
+ onEventClick: ((event: T) => void) | undefined;
25
+ hasTimeColumnSpacer: boolean | undefined;
26
+ }
27
+ export declare function renderAllDayRow<T extends CalendarEvent>(options: AllDayRowOptions<T>): HTMLDivElement;
28
+ export declare function createNowIndicator(config: ResolvedTimeConfig): HTMLDivElement | null;
29
+ export declare function getClass(name: keyof CalendarClasses, classes: Partial<CalendarClasses> | undefined, defaultClass: string): string;
30
+ //# sourceMappingURL=shared.d.ts.map