@voyantjs/ui 0.28.1 → 0.28.3

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 (71) hide show
  1. package/dist/components/async-combobox.d.ts +37 -0
  2. package/dist/components/async-combobox.d.ts.map +1 -0
  3. package/dist/components/async-combobox.js +66 -0
  4. package/dist/components/big-calendar/calendar-view.d.ts +13 -0
  5. package/dist/components/big-calendar/calendar-view.d.ts.map +1 -0
  6. package/dist/components/big-calendar/calendar-view.js +51 -0
  7. package/dist/components/big-calendar/change-badge-variant-input.d.ts +2 -0
  8. package/dist/components/big-calendar/change-badge-variant-input.d.ts.map +1 -0
  9. package/dist/components/big-calendar/change-badge-variant-input.js +8 -0
  10. package/dist/components/big-calendar/context.d.ts +47 -0
  11. package/dist/components/big-calendar/context.d.ts.map +1 -0
  12. package/dist/components/big-calendar/context.js +48 -0
  13. package/dist/components/big-calendar/header/calendar-header.d.ts +12 -0
  14. package/dist/components/big-calendar/header/calendar-header.d.ts.map +1 -0
  15. package/dist/components/big-calendar/header/calendar-header.js +34 -0
  16. package/dist/components/big-calendar/header/date-navigator.d.ts +9 -0
  17. package/dist/components/big-calendar/header/date-navigator.d.ts.map +1 -0
  18. package/dist/components/big-calendar/header/date-navigator.js +17 -0
  19. package/dist/components/big-calendar/header/today-button.d.ts +2 -0
  20. package/dist/components/big-calendar/header/today-button.d.ts.map +1 -0
  21. package/dist/components/big-calendar/header/today-button.js +9 -0
  22. package/dist/components/big-calendar/header/user-select.d.ts +2 -0
  23. package/dist/components/big-calendar/header/user-select.d.ts.map +1 -0
  24. package/dist/components/big-calendar/header/user-select.js +10 -0
  25. package/dist/components/big-calendar/helpers.d.ts +37 -0
  26. package/dist/components/big-calendar/helpers.d.ts.map +1 -0
  27. package/dist/components/big-calendar/helpers.js +217 -0
  28. package/dist/components/big-calendar/index.d.ts +20 -0
  29. package/dist/components/big-calendar/index.d.ts.map +1 -0
  30. package/dist/components/big-calendar/index.js +17 -0
  31. package/dist/components/big-calendar/interfaces.d.ts +21 -0
  32. package/dist/components/big-calendar/interfaces.d.ts.map +1 -0
  33. package/dist/components/big-calendar/interfaces.js +1 -0
  34. package/dist/components/big-calendar/month-view/calendar-month-view.d.ts +10 -0
  35. package/dist/components/big-calendar/month-view/calendar-month-view.d.ts.map +1 -0
  36. package/dist/components/big-calendar/month-view/calendar-month-view.js +13 -0
  37. package/dist/components/big-calendar/month-view/day-cell.d.ts +11 -0
  38. package/dist/components/big-calendar/month-view/day-cell.d.ts.map +1 -0
  39. package/dist/components/big-calendar/month-view/day-cell.js +24 -0
  40. package/dist/components/big-calendar/month-view/event-bullet.d.ts +6 -0
  41. package/dist/components/big-calendar/month-view/event-bullet.d.ts.map +1 -0
  42. package/dist/components/big-calendar/month-view/event-bullet.js +22 -0
  43. package/dist/components/big-calendar/month-view/month-event-badge.d.ts +12 -0
  44. package/dist/components/big-calendar/month-view/month-event-badge.d.ts.map +1 -0
  45. package/dist/components/big-calendar/month-view/month-event-badge.js +64 -0
  46. package/dist/components/big-calendar/types.d.ts +14 -0
  47. package/dist/components/big-calendar/types.d.ts.map +1 -0
  48. package/dist/components/big-calendar/types.js +1 -0
  49. package/dist/components/big-calendar/week-and-day-view/calendar-day-view.d.ts +8 -0
  50. package/dist/components/big-calendar/week-and-day-view/calendar-day-view.d.ts.map +1 -0
  51. package/dist/components/big-calendar/week-and-day-view/calendar-day-view.js +49 -0
  52. package/dist/components/big-calendar/week-and-day-view/calendar-time-line.d.ts +7 -0
  53. package/dist/components/big-calendar/week-and-day-view/calendar-time-line.d.ts.map +1 -0
  54. package/dist/components/big-calendar/week-and-day-view/calendar-time-line.js +21 -0
  55. package/dist/components/big-calendar/week-and-day-view/calendar-week-view.d.ts +8 -0
  56. package/dist/components/big-calendar/week-and-day-view/calendar-week-view.d.ts.map +1 -0
  57. package/dist/components/big-calendar/week-and-day-view/calendar-week-view.js +40 -0
  58. package/dist/components/big-calendar/week-and-day-view/day-view-multi-day-events-row.d.ts +8 -0
  59. package/dist/components/big-calendar/week-and-day-view/day-view-multi-day-events-row.d.ts.map +1 -0
  60. package/dist/components/big-calendar/week-and-day-view/day-view-multi-day-events-row.js +31 -0
  61. package/dist/components/big-calendar/week-and-day-view/event-block.d.ts +8 -0
  62. package/dist/components/big-calendar/week-and-day-view/event-block.d.ts.map +1 -0
  63. package/dist/components/big-calendar/week-and-day-view/event-block.js +38 -0
  64. package/dist/components/big-calendar/week-and-day-view/week-view-multi-day-events-row.d.ts +8 -0
  65. package/dist/components/big-calendar/week-and-day-view/week-view-multi-day-events-row.d.ts.map +1 -0
  66. package/dist/components/big-calendar/week-and-day-view/week-view-multi-day-events-row.js +80 -0
  67. package/dist/components/select.d.ts +2 -2
  68. package/dist/components/select.d.ts.map +1 -1
  69. package/dist/components/select.js +28 -1
  70. package/package.json +10 -5
  71. package/src/styles/globals.css +4 -0
@@ -0,0 +1,217 @@
1
+ import { addDays, addMonths, addWeeks, addYears, differenceInDays, differenceInMinutes, eachDayOfInterval, endOfMonth, endOfWeek, endOfYear, format, isSameDay, isSameMonth, isSameWeek, isSameYear, isWithinInterval, parseISO, startOfDay, startOfMonth, startOfWeek, startOfYear, subDays, subMonths, subWeeks, subYears, } from "date-fns";
2
+ // ================ Header helpers ================ //
3
+ export function rangeText(view, date) {
4
+ const formatString = "MMM d, yyyy";
5
+ let start;
6
+ let end;
7
+ switch (view) {
8
+ case "agenda":
9
+ start = startOfMonth(date);
10
+ end = endOfMonth(date);
11
+ break;
12
+ case "year":
13
+ start = startOfYear(date);
14
+ end = endOfYear(date);
15
+ break;
16
+ case "month":
17
+ start = startOfMonth(date);
18
+ end = endOfMonth(date);
19
+ break;
20
+ case "week":
21
+ start = startOfWeek(date);
22
+ end = endOfWeek(date);
23
+ break;
24
+ case "day":
25
+ return format(date, formatString);
26
+ default:
27
+ return "";
28
+ }
29
+ return `${format(start, formatString)} - ${format(end, formatString)}`;
30
+ }
31
+ export function navigateDate(date, view, direction) {
32
+ const operations = {
33
+ agenda: direction === "next" ? addMonths : subMonths,
34
+ year: direction === "next" ? addYears : subYears,
35
+ month: direction === "next" ? addMonths : subMonths,
36
+ week: direction === "next" ? addWeeks : subWeeks,
37
+ day: direction === "next" ? addDays : subDays,
38
+ };
39
+ return operations[view](date, 1);
40
+ }
41
+ export function getEventsCount(events, date, view) {
42
+ const compareFns = {
43
+ agenda: isSameMonth,
44
+ year: isSameYear,
45
+ day: isSameDay,
46
+ week: isSameWeek,
47
+ month: isSameMonth,
48
+ };
49
+ return events.filter((event) => compareFns[view](new Date(event.startDate), date)).length;
50
+ }
51
+ // ================ Week and day view helpers ================ //
52
+ export function getCurrentEvents(events) {
53
+ const now = new Date();
54
+ return (events.filter((event) => isWithinInterval(now, {
55
+ start: parseISO(event.startDate),
56
+ end: parseISO(event.endDate),
57
+ })) || null);
58
+ }
59
+ export function groupEvents(dayEvents) {
60
+ const sortedEvents = [...dayEvents].sort((a, b) => parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime());
61
+ const groups = [];
62
+ for (const event of sortedEvents) {
63
+ const eventStart = parseISO(event.startDate);
64
+ let placed = false;
65
+ for (const group of groups) {
66
+ const lastEventInGroup = group[group.length - 1];
67
+ if (!lastEventInGroup)
68
+ continue;
69
+ const lastEventEnd = parseISO(lastEventInGroup.endDate);
70
+ if (eventStart >= lastEventEnd) {
71
+ group.push(event);
72
+ placed = true;
73
+ break;
74
+ }
75
+ }
76
+ if (!placed)
77
+ groups.push([event]);
78
+ }
79
+ return groups;
80
+ }
81
+ export function getEventBlockStyle(event, day, groupIndex, groupSize, visibleHoursRange) {
82
+ const startDate = parseISO(event.startDate);
83
+ const dayStart = new Date(day).setHours(0, 0, 0, 0);
84
+ const dayStartDate = new Date(dayStart);
85
+ const eventStart = startDate < dayStartDate ? dayStartDate : startDate;
86
+ const startMinutes = differenceInMinutes(eventStart, dayStartDate);
87
+ let top;
88
+ if (visibleHoursRange) {
89
+ const visibleStartMinutes = visibleHoursRange.from * 60;
90
+ const visibleEndMinutes = visibleHoursRange.to * 60;
91
+ const visibleRangeMinutes = visibleEndMinutes - visibleStartMinutes;
92
+ top = ((startMinutes - visibleStartMinutes) / visibleRangeMinutes) * 100;
93
+ }
94
+ else {
95
+ top = (startMinutes / 1440) * 100;
96
+ }
97
+ const width = 100 / groupSize;
98
+ const left = groupIndex * width;
99
+ return { top: `${top}%`, width: `${width}%`, left: `${left}%` };
100
+ }
101
+ export function isWorkingHour(day, hour, workingHours) {
102
+ const dayIndex = day.getDay();
103
+ const dayHours = workingHours[dayIndex];
104
+ if (!dayHours)
105
+ return false;
106
+ return hour >= dayHours.from && hour < dayHours.to;
107
+ }
108
+ export function getVisibleHours(visibleHours, singleDayEvents) {
109
+ let earliestEventHour = visibleHours.from;
110
+ let latestEventHour = visibleHours.to;
111
+ singleDayEvents.forEach((event) => {
112
+ const startHour = parseISO(event.startDate).getHours();
113
+ const endTime = parseISO(event.endDate);
114
+ const endHour = endTime.getHours() + (endTime.getMinutes() > 0 ? 1 : 0);
115
+ if (startHour < earliestEventHour)
116
+ earliestEventHour = startHour;
117
+ if (endHour > latestEventHour)
118
+ latestEventHour = endHour;
119
+ });
120
+ latestEventHour = Math.min(latestEventHour, 24);
121
+ const hours = Array.from({ length: latestEventHour - earliestEventHour }, (_, i) => i + earliestEventHour);
122
+ return { hours, earliestEventHour, latestEventHour };
123
+ }
124
+ // ================ Month view helpers ================ //
125
+ export function getCalendarCells(selectedDate) {
126
+ const currentYear = selectedDate.getFullYear();
127
+ const currentMonth = selectedDate.getMonth();
128
+ const getDaysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();
129
+ const getFirstDayOfMonth = (year, month) => new Date(year, month, 1).getDay();
130
+ const daysInMonth = getDaysInMonth(currentYear, currentMonth);
131
+ const firstDayOfMonth = getFirstDayOfMonth(currentYear, currentMonth);
132
+ const daysInPrevMonth = getDaysInMonth(currentYear, currentMonth - 1);
133
+ const totalDays = firstDayOfMonth + daysInMonth;
134
+ const prevMonthCells = Array.from({ length: firstDayOfMonth }, (_, i) => ({
135
+ day: daysInPrevMonth - firstDayOfMonth + i + 1,
136
+ currentMonth: false,
137
+ date: new Date(currentYear, currentMonth - 1, daysInPrevMonth - firstDayOfMonth + i + 1),
138
+ }));
139
+ const currentMonthCells = Array.from({ length: daysInMonth }, (_, i) => ({
140
+ day: i + 1,
141
+ currentMonth: true,
142
+ date: new Date(currentYear, currentMonth, i + 1),
143
+ }));
144
+ const nextMonthCells = Array.from({ length: (7 - (totalDays % 7)) % 7 }, (_, i) => ({
145
+ day: i + 1,
146
+ currentMonth: false,
147
+ date: new Date(currentYear, currentMonth + 1, i + 1),
148
+ }));
149
+ return [...prevMonthCells, ...currentMonthCells, ...nextMonthCells];
150
+ }
151
+ export function calculateMonthEventPositions(multiDayEvents, singleDayEvents, selectedDate) {
152
+ const monthStart = startOfMonth(selectedDate);
153
+ const monthEnd = endOfMonth(selectedDate);
154
+ const eventPositions = {};
155
+ const occupiedPositions = {};
156
+ eachDayOfInterval({ start: monthStart, end: monthEnd }).forEach((day) => {
157
+ occupiedPositions[day.toISOString()] = [false, false, false];
158
+ });
159
+ const sortedEvents = [
160
+ ...[...multiDayEvents].sort((a, b) => {
161
+ const aDuration = differenceInDays(parseISO(a.endDate), parseISO(a.startDate));
162
+ const bDuration = differenceInDays(parseISO(b.endDate), parseISO(b.startDate));
163
+ return (bDuration - aDuration || parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime());
164
+ }),
165
+ ...[...singleDayEvents].sort((a, b) => parseISO(a.startDate).getTime() - parseISO(b.startDate).getTime()),
166
+ ];
167
+ sortedEvents.forEach((event) => {
168
+ const eventStart = parseISO(event.startDate);
169
+ const eventEnd = parseISO(event.endDate);
170
+ const eventDays = eachDayOfInterval({
171
+ start: eventStart < monthStart ? monthStart : eventStart,
172
+ end: eventEnd > monthEnd ? monthEnd : eventEnd,
173
+ });
174
+ let position = -1;
175
+ for (let i = 0; i < 3; i++) {
176
+ if (eventDays.every((day) => {
177
+ const dayPositions = occupiedPositions[startOfDay(day).toISOString()];
178
+ return dayPositions && !dayPositions[i];
179
+ })) {
180
+ position = i;
181
+ break;
182
+ }
183
+ }
184
+ if (position !== -1) {
185
+ eventDays.forEach((day) => {
186
+ const dayKey = startOfDay(day).toISOString();
187
+ const slot = occupiedPositions[dayKey];
188
+ if (slot)
189
+ slot[position] = true;
190
+ });
191
+ eventPositions[event.id] = position;
192
+ }
193
+ });
194
+ return eventPositions;
195
+ }
196
+ export function getMonthCellEvents(date, events, eventPositions) {
197
+ const eventsForDate = events.filter((event) => {
198
+ const eventStart = parseISO(event.startDate);
199
+ const eventEnd = parseISO(event.endDate);
200
+ return ((date >= eventStart && date <= eventEnd) ||
201
+ isSameDay(date, eventStart) ||
202
+ isSameDay(date, eventEnd));
203
+ });
204
+ return eventsForDate
205
+ .map((event) => ({
206
+ ...event,
207
+ position: eventPositions[event.id] ?? -1,
208
+ isMultiDay: event.startDate !== event.endDate,
209
+ }))
210
+ .sort((a, b) => {
211
+ if (a.isMultiDay && !b.isMultiDay)
212
+ return -1;
213
+ if (!a.isMultiDay && b.isMultiDay)
214
+ return 1;
215
+ return a.position - b.position;
216
+ });
217
+ }
@@ -0,0 +1,20 @@
1
+ export { CalendarView } from "./calendar-view.js";
2
+ export { ChangeBadgeVariantInput } from "./change-badge-variant-input.js";
3
+ export { CalendarProvider, useCalendar } from "./context.js";
4
+ export { CalendarHeader } from "./header/calendar-header.js";
5
+ export { DateNavigator } from "./header/date-navigator.js";
6
+ export { TodayButton } from "./header/today-button.js";
7
+ export { UserSelect } from "./header/user-select.js";
8
+ export type { ICalendarCell, IEvent, IUser } from "./interfaces.js";
9
+ export { CalendarMonthView } from "./month-view/calendar-month-view.js";
10
+ export { DayCell } from "./month-view/day-cell.js";
11
+ export { EventBullet } from "./month-view/event-bullet.js";
12
+ export { MonthEventBadge } from "./month-view/month-event-badge.js";
13
+ export type { TBadgeVariant, TCalendarView, TEventColor, TVisibleHours, TWorkingHours, } from "./types.js";
14
+ export { CalendarDayView } from "./week-and-day-view/calendar-day-view.js";
15
+ export { CalendarTimeline } from "./week-and-day-view/calendar-time-line.js";
16
+ export { CalendarWeekView } from "./week-and-day-view/calendar-week-view.js";
17
+ export { DayViewMultiDayEventsRow } from "./week-and-day-view/day-view-multi-day-events-row.js";
18
+ export { EventBlock } from "./week-and-day-view/event-block.js";
19
+ export { WeekViewMultiDayEventsRow } from "./week-and-day-view/week-view-multi-day-events-row.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/big-calendar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACnE,YAAY,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAA"}
@@ -0,0 +1,17 @@
1
+ export { CalendarView } from "./calendar-view.js";
2
+ export { ChangeBadgeVariantInput } from "./change-badge-variant-input.js";
3
+ export { CalendarProvider, useCalendar } from "./context.js";
4
+ export { CalendarHeader } from "./header/calendar-header.js";
5
+ export { DateNavigator } from "./header/date-navigator.js";
6
+ export { TodayButton } from "./header/today-button.js";
7
+ export { UserSelect } from "./header/user-select.js";
8
+ export { CalendarMonthView } from "./month-view/calendar-month-view.js";
9
+ export { DayCell } from "./month-view/day-cell.js";
10
+ export { EventBullet } from "./month-view/event-bullet.js";
11
+ export { MonthEventBadge } from "./month-view/month-event-badge.js";
12
+ export { CalendarDayView } from "./week-and-day-view/calendar-day-view.js";
13
+ export { CalendarTimeline } from "./week-and-day-view/calendar-time-line.js";
14
+ export { CalendarWeekView } from "./week-and-day-view/calendar-week-view.js";
15
+ export { DayViewMultiDayEventsRow } from "./week-and-day-view/day-view-multi-day-events-row.js";
16
+ export { EventBlock } from "./week-and-day-view/event-block.js";
17
+ export { WeekViewMultiDayEventsRow } from "./week-and-day-view/week-view-multi-day-events-row.js";
@@ -0,0 +1,21 @@
1
+ import type { TEventColor } from "./types.js";
2
+ export interface IUser {
3
+ id: string;
4
+ name: string;
5
+ picturePath?: string | null;
6
+ }
7
+ export interface IEvent {
8
+ id: string;
9
+ startDate: string;
10
+ endDate: string;
11
+ title: string;
12
+ description?: string;
13
+ color: TEventColor;
14
+ user?: IUser;
15
+ }
16
+ export interface ICalendarCell {
17
+ day: number;
18
+ currentMonth: boolean;
19
+ date: Date;
20
+ }
21
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/components/big-calendar/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,CAAC,EAAE,KAAK,CAAA;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,OAAO,CAAA;IACrB,IAAI,EAAE,IAAI,CAAA;CACX"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { IEvent } from "../interfaces.js";
2
+ interface IProps {
3
+ singleDayEvents: IEvent[];
4
+ multiDayEvents: IEvent[];
5
+ /** Optional callback when a day cell number is clicked. */
6
+ onDayClick?: (date: Date) => void;
7
+ }
8
+ export declare function CalendarMonthView({ singleDayEvents, multiDayEvents, onDayClick }: IProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=calendar-month-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-month-view.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/month-view/calendar-month-view.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,UAAU,MAAM;IACd,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;CAClC;AAID,wBAAgB,iBAAiB,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,MAAM,2CAmCxF"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useCalendar } from "../context.js";
4
+ import { calculateMonthEventPositions, getCalendarCells } from "../helpers.js";
5
+ import { DayCell } from "./day-cell.js";
6
+ const WEEK_DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
7
+ export function CalendarMonthView({ singleDayEvents, multiDayEvents, onDayClick }) {
8
+ const { selectedDate } = useCalendar();
9
+ const allEvents = [...multiDayEvents, ...singleDayEvents];
10
+ const cells = React.useMemo(() => getCalendarCells(selectedDate), [selectedDate]);
11
+ const eventPositions = React.useMemo(() => calculateMonthEventPositions(multiDayEvents, singleDayEvents, selectedDate), [multiDayEvents, singleDayEvents, selectedDate]);
12
+ return (_jsxs("div", { children: [_jsx("div", { className: "grid grid-cols-7 divide-x", children: WEEK_DAYS.map((day) => (_jsx("div", { className: "flex items-center justify-center py-2", children: _jsx("span", { className: "text-xs font-medium text-muted-foreground", children: day }) }, day))) }), _jsx("div", { className: "grid grid-cols-7 overflow-hidden", children: cells.map((cell) => (_jsx(DayCell, { cell: cell, events: allEvents, eventPositions: eventPositions, onDayClick: onDayClick }, cell.date.toISOString()))) })] }));
13
+ }
@@ -0,0 +1,11 @@
1
+ import type { ICalendarCell, IEvent } from "../interfaces.js";
2
+ interface IProps {
3
+ cell: ICalendarCell;
4
+ events: IEvent[];
5
+ eventPositions: Record<string, number>;
6
+ /** Optional override; defaults to selecting the date and switching to day view if onJumpToDay supplied. */
7
+ onDayClick?: (date: Date) => void;
8
+ }
9
+ export declare function DayCell({ cell, events, eventPositions, onDayClick }: IProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=day-cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day-cell.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/month-view/day-cell.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAI7D,UAAU,MAAM;IACd,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;CAClC;AAID,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,MAAM,2CA8E3E"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isToday, startOfDay } from "date-fns";
3
+ import * as React from "react";
4
+ import { cn } from "../../../lib/utils.js";
5
+ import { useCalendar } from "../context.js";
6
+ import { getMonthCellEvents } from "../helpers.js";
7
+ import { EventBullet } from "./event-bullet.js";
8
+ import { MonthEventBadge } from "./month-event-badge.js";
9
+ const MAX_VISIBLE_EVENTS = 3;
10
+ export function DayCell({ cell, events, eventPositions, onDayClick }) {
11
+ const { setSelectedDate } = useCalendar();
12
+ const { day, currentMonth, date } = cell;
13
+ const cellEvents = React.useMemo(() => getMonthCellEvents(date, events, eventPositions), [date, events, eventPositions]);
14
+ const isSunday = date.getDay() === 0;
15
+ const handleClick = () => {
16
+ setSelectedDate(date);
17
+ onDayClick?.(date);
18
+ };
19
+ return (_jsxs("div", { className: cn("flex h-full flex-col gap-1 border-l border-t py-1.5 lg:pb-2 lg:pt-1", isSunday && "border-l-0"), children: [_jsx("button", { type: "button", onClick: handleClick, className: cn("flex size-6 translate-x-1 items-center justify-center rounded-full text-xs font-semibold hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring lg:px-2", !currentMonth && "opacity-20", isToday(date) && "bg-primary font-bold text-primary-foreground hover:bg-primary"), children: day }), _jsx("div", { className: cn("flex h-6 gap-1 px-2 lg:h-[94px] lg:flex-col lg:gap-2 lg:px-0", !currentMonth && "opacity-50"), children: [0, 1, 2].map((position) => {
20
+ const event = cellEvents.find((e) => e.position === position);
21
+ const eventKey = event ? `event-${event.id}-${position}` : `empty-${position}`;
22
+ return (_jsx("div", { className: "lg:flex-1", children: event ? (_jsxs(_Fragment, { children: [_jsx(EventBullet, { className: "lg:hidden", color: event.color }), _jsx(MonthEventBadge, { className: "hidden lg:flex", event: event, cellDate: startOfDay(date) })] })) : null }, eventKey));
23
+ }) }), cellEvents.length > MAX_VISIBLE_EVENTS ? (_jsxs("p", { className: cn("h-4.5 px-1.5 text-xs font-semibold text-muted-foreground", !currentMonth && "opacity-50"), children: [_jsxs("span", { className: "sm:hidden", children: ["+", cellEvents.length - MAX_VISIBLE_EVENTS] }), _jsxs("span", { className: "hidden sm:inline", children: [" ", cellEvents.length - MAX_VISIBLE_EVENTS, " more..."] })] })) : null] }));
24
+ }
@@ -0,0 +1,6 @@
1
+ import type { TEventColor } from "../types.js";
2
+ export declare function EventBullet({ color, className }: {
3
+ color: TEventColor;
4
+ className?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=event-bullet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bullet.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/month-view/event-bullet.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAmB9C,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAE3F"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../../../lib/utils.js";
4
+ const eventBulletVariants = cva("size-2 rounded-full", {
5
+ variants: {
6
+ color: {
7
+ blue: "bg-blue-600 dark:bg-blue-500",
8
+ green: "bg-green-600 dark:bg-green-500",
9
+ red: "bg-red-600 dark:bg-red-500",
10
+ yellow: "bg-yellow-600 dark:bg-yellow-500",
11
+ purple: "bg-purple-600 dark:bg-purple-500",
12
+ gray: "bg-neutral-600 dark:bg-neutral-500",
13
+ orange: "bg-orange-600 dark:bg-orange-500",
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ color: "blue",
18
+ },
19
+ });
20
+ export function EventBullet({ color, className }) {
21
+ return _jsx("div", { className: cn(eventBulletVariants({ color, className })) });
22
+ }
@@ -0,0 +1,12 @@
1
+ import type { IEvent } from "../interfaces.js";
2
+ interface IProps {
3
+ event: IEvent;
4
+ cellDate: Date;
5
+ eventCurrentDay?: number;
6
+ eventTotalDays?: number;
7
+ className?: string;
8
+ position?: "first" | "middle" | "last" | "none";
9
+ }
10
+ export declare function MonthEventBadge({ event, cellDate, eventCurrentDay, eventTotalDays, className, position: propPosition, }: IProps): import("react/jsx-runtime").JSX.Element | null;
11
+ export {};
12
+ //# sourceMappingURL=month-event-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"month-event-badge.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/month-view/month-event-badge.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAuC9C,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;CAChD;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,eAAe,EACf,cAAc,EACd,SAAS,EACT,QAAQ,EAAE,YAAY,GACvB,EAAE,MAAM,kDA8DR"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { endOfDay, format, isSameDay, parseISO, startOfDay } from "date-fns";
4
+ import { cn } from "../../../lib/utils.js";
5
+ import { useCalendar } from "../context.js";
6
+ const eventBadgeVariants = cva("mx-1 flex size-auto h-6.5 select-none items-center justify-between gap-1.5 truncate whitespace-nowrap rounded-md border px-2 text-xs focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", {
7
+ variants: {
8
+ color: {
9
+ blue: "border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-300 [&_.event-dot]:fill-blue-600",
10
+ green: "border-green-200 bg-green-50 text-green-700 dark:border-green-800 dark:bg-green-950 dark:text-green-300 [&_.event-dot]:fill-green-600",
11
+ red: "border-red-200 bg-red-50 text-red-700 dark:border-red-800 dark:bg-red-950 dark:text-red-300 [&_.event-dot]:fill-red-600",
12
+ yellow: "border-yellow-200 bg-yellow-50 text-yellow-700 dark:border-yellow-800 dark:bg-yellow-950 dark:text-yellow-300 [&_.event-dot]:fill-yellow-600",
13
+ purple: "border-purple-200 bg-purple-50 text-purple-700 dark:border-purple-800 dark:bg-purple-950 dark:text-purple-300 [&_.event-dot]:fill-purple-600",
14
+ orange: "border-orange-200 bg-orange-50 text-orange-700 dark:border-orange-800 dark:bg-orange-950 dark:text-orange-300 [&_.event-dot]:fill-orange-600",
15
+ gray: "border-neutral-200 bg-neutral-50 text-neutral-900 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-300 [&_.event-dot]:fill-neutral-600",
16
+ "blue-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-blue-600",
17
+ "green-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-green-600",
18
+ "red-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-red-600",
19
+ "yellow-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-yellow-600",
20
+ "purple-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-purple-600",
21
+ "orange-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-orange-600",
22
+ "gray-dot": "bg-neutral-50 dark:bg-neutral-900 [&_.event-dot]:fill-neutral-600",
23
+ },
24
+ multiDayPosition: {
25
+ first: "relative z-10 mr-0 w-[calc(100%_-_3px)] rounded-r-none border-r-0 [&>span]:mr-2.5",
26
+ middle: "relative z-10 mx-0 w-[calc(100%_+_1px)] rounded-none border-x-0",
27
+ last: "ml-0 rounded-l-none border-l-0",
28
+ none: "",
29
+ },
30
+ },
31
+ defaultVariants: {
32
+ color: "blue-dot",
33
+ },
34
+ });
35
+ export function MonthEventBadge({ event, cellDate, eventCurrentDay, eventTotalDays, className, position: propPosition, }) {
36
+ const { badgeVariant, onEventClick } = useCalendar();
37
+ const itemStart = startOfDay(parseISO(event.startDate));
38
+ const itemEnd = endOfDay(parseISO(event.endDate));
39
+ if (cellDate < itemStart || cellDate > itemEnd)
40
+ return null;
41
+ let position;
42
+ if (propPosition) {
43
+ position = propPosition;
44
+ }
45
+ else if (eventCurrentDay && eventTotalDays) {
46
+ position = "none";
47
+ }
48
+ else if (isSameDay(itemStart, itemEnd)) {
49
+ position = "none";
50
+ }
51
+ else if (isSameDay(cellDate, itemStart)) {
52
+ position = "first";
53
+ }
54
+ else if (isSameDay(cellDate, itemEnd)) {
55
+ position = "last";
56
+ }
57
+ else {
58
+ position = "middle";
59
+ }
60
+ const renderBadgeText = ["first", "none"].includes(position);
61
+ const color = (badgeVariant === "dot" ? `${event.color}-dot` : event.color);
62
+ const eventBadgeClasses = cn(eventBadgeVariants({ color, multiDayPosition: position, className }));
63
+ return (_jsxs("button", { type: "button", className: eventBadgeClasses, onClick: () => onEventClick?.(event), children: [_jsxs("div", { className: "flex items-center gap-1.5 truncate", children: [!["middle", "last"].includes(position) && ["mixed", "dot"].includes(badgeVariant) ? (_jsx("svg", { "aria-hidden": "true", width: "8", height: "8", viewBox: "0 0 8 8", className: "event-dot shrink-0", children: _jsx("circle", { cx: "4", cy: "4", r: "4" }) })) : null, renderBadgeText ? (_jsxs("p", { className: "flex-1 truncate font-semibold", children: [eventCurrentDay ? (_jsxs("span", { className: "text-xs", children: ["Day ", eventCurrentDay, " of ", eventTotalDays, " \u2022", " "] })) : null, event.title] })) : null] }), renderBadgeText ? _jsx("span", { children: format(parseISO(event.startDate), "h:mm a") }) : null] }));
64
+ }
@@ -0,0 +1,14 @@
1
+ export type TCalendarView = "day" | "week" | "month" | "year" | "agenda";
2
+ export type TEventColor = "blue" | "green" | "red" | "yellow" | "purple" | "orange" | "gray";
3
+ export type TBadgeVariant = "dot" | "colored" | "mixed";
4
+ export type TWorkingHours = {
5
+ [key: number]: {
6
+ from: number;
7
+ to: number;
8
+ };
9
+ };
10
+ export type TVisibleHours = {
11
+ from: number;
12
+ to: number;
13
+ };
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/big-calendar/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;AACxE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;AAC5F,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;AACvD,MAAM,MAAM,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAC3E,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { IEvent } from "../interfaces.js";
2
+ interface IProps {
3
+ singleDayEvents: IEvent[];
4
+ multiDayEvents: IEvent[];
5
+ }
6
+ export declare function CalendarDayView({ singleDayEvents, multiDayEvents }: IProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=calendar-day-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-day-view.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/week-and-day-view/calendar-day-view.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAK9C,UAAU,MAAM;IACd,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,wBAAgB,eAAe,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,MAAM,2CAkN1E"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { areIntervalsOverlapping, format, parseISO } from "date-fns";
3
+ import { Calendar as CalendarIcon, Clock, Plus, User } from "lucide-react";
4
+ import { cn } from "../../../lib/utils.js";
5
+ import { Button } from "../../button.js";
6
+ import { ScrollArea } from "../../scroll-area.js";
7
+ import { useCalendar } from "../context.js";
8
+ import { getCurrentEvents, getEventBlockStyle, getVisibleHours, groupEvents, isWorkingHour, } from "../helpers.js";
9
+ import { CalendarTimeline } from "./calendar-time-line.js";
10
+ import { DayViewMultiDayEventsRow } from "./day-view-multi-day-events-row.js";
11
+ import { EventBlock } from "./event-block.js";
12
+ export function CalendarDayView({ singleDayEvents, multiDayEvents }) {
13
+ const { selectedDate, users, visibleHours, workingHours, onAddEvent } = useCalendar();
14
+ const { hours, earliestEventHour, latestEventHour } = getVisibleHours(visibleHours, singleDayEvents);
15
+ const currentEvents = getCurrentEvents(singleDayEvents);
16
+ const dayEvents = singleDayEvents.filter((event) => {
17
+ const eventDate = parseISO(event.startDate);
18
+ return (eventDate.getDate() === selectedDate.getDate() &&
19
+ eventDate.getMonth() === selectedDate.getMonth() &&
20
+ eventDate.getFullYear() === selectedDate.getFullYear());
21
+ });
22
+ const groupedEvents = groupEvents(dayEvents);
23
+ return (_jsxs("div", { className: "flex", children: [_jsxs("div", { className: "flex flex-1 flex-col", children: [_jsxs("div", { children: [_jsx(DayViewMultiDayEventsRow, { selectedDate: selectedDate, multiDayEvents: multiDayEvents }), _jsxs("div", { className: "relative z-20 flex border-b", children: [_jsx("div", { className: "w-18" }), _jsxs("span", { className: "flex-1 border-l py-2 text-center text-xs font-medium text-muted-foreground", children: [format(selectedDate, "EE"), " ", _jsx("span", { className: "font-semibold text-foreground", children: format(selectedDate, "d") })] })] })] }), _jsx(ScrollArea, { className: "h-[800px]", children: _jsxs("div", { className: "flex", children: [_jsx("div", { className: "relative w-18", children: hours.map((hour, index) => (_jsx("div", { className: "relative", style: { height: "96px" }, children: _jsx("div", { className: "absolute -top-3 right-2 flex h-6 items-center", children: index !== 0 ? (_jsx("span", { className: "text-xs text-muted-foreground", children: format(new Date().setHours(hour, 0, 0, 0), "hh a") })) : null }) }, hour))) }), _jsxs("div", { className: "relative flex-1 border-l", children: [_jsxs("div", { className: "relative", children: [hours.map((hour, index) => {
24
+ const isDisabled = !isWorkingHour(selectedDate, hour, workingHours);
25
+ return (_jsxs("div", { className: cn("relative", isDisabled && "bg-calendar-disabled-hour"), style: { height: "96px" }, children: [index !== 0 ? (_jsx("div", { className: "pointer-events-none absolute inset-x-0 top-0 border-b" })) : null, [0, 15, 30, 45].map((minute, slot) => (_jsx("button", { type: "button", onClick: () => onAddEvent?.({
26
+ date: selectedDate,
27
+ hour,
28
+ minute,
29
+ }), disabled: !onAddEvent, className: cn("absolute inset-x-0 h-[24px] cursor-pointer transition-colors hover:bg-accent disabled:cursor-default disabled:hover:bg-transparent"), style: { top: slot * 24 }, "aria-label": `Add event at ${hour}:${String(minute).padStart(2, "0")}` }, minute))), _jsx("div", { className: "pointer-events-none absolute inset-x-0 top-1/2 border-b border-dashed" })] }, hour));
30
+ }), groupedEvents.map((group, groupIndex) => group.map((event) => {
31
+ let style = getEventBlockStyle(event, selectedDate, groupIndex, groupedEvents.length, { from: earliestEventHour, to: latestEventHour });
32
+ const hasOverlap = groupedEvents.some((otherGroup, otherIndex) => otherIndex !== groupIndex &&
33
+ otherGroup.some((otherEvent) => areIntervalsOverlapping({
34
+ start: parseISO(event.startDate),
35
+ end: parseISO(event.endDate),
36
+ }, {
37
+ start: parseISO(otherEvent.startDate),
38
+ end: parseISO(otherEvent.endDate),
39
+ })));
40
+ if (!hasOverlap)
41
+ style = { ...style, width: "100%", left: "0%" };
42
+ return (_jsx("div", { className: "absolute p-1", style: style, children: _jsx(EventBlock, { event: event }) }, event.id));
43
+ }))] }), _jsx(CalendarTimeline, { firstVisibleHour: earliestEventHour, lastVisibleHour: latestEventHour })] })] }) })] }), _jsxs("div", { className: "hidden w-64 divide-y border-l md:block", children: [_jsx("div", { className: "p-4", children: onAddEvent ? (_jsxs(Button, { variant: "outline", size: "sm", className: "w-full", onClick: () => onAddEvent({ date: selectedDate }), children: [_jsx(Plus, {}), "Add event"] })) : null }), _jsxs("div", { className: "flex-1 space-y-3", children: [currentEvents.length > 0 ? (_jsxs("div", { className: "flex items-start gap-2 px-4 pt-4", children: [_jsxs("span", { className: "relative mt-[5px] flex size-2.5", children: [_jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-green-400 opacity-75" }), _jsx("span", { className: "relative inline-flex size-2.5 rounded-full bg-green-600" })] }), _jsx("p", { className: "text-sm font-semibold text-foreground", children: "Happening now" })] })) : (_jsx("p", { className: "p-4 text-center text-sm italic text-muted-foreground", children: "No events at the moment" })), currentEvents.length > 0 ? (_jsx(ScrollArea, { className: "h-[422px] px-4", children: _jsx("div", { className: "space-y-6 pb-4", children: currentEvents.map((event) => {
44
+ const eventUser = event.user
45
+ ? users.find((user) => user.id === event.user?.id)
46
+ : undefined;
47
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "line-clamp-2 text-sm font-semibold", children: event.title }), eventUser ? (_jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground", children: [_jsx(User, { className: "size-3.5" }), _jsx("span", { className: "text-sm", children: eventUser.name })] })) : null, _jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground", children: [_jsx(CalendarIcon, { className: "size-3.5" }), _jsx("span", { className: "text-sm", children: format(new Date(), "MMM d, yyyy") })] }), _jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground", children: [_jsx(Clock, { className: "size-3.5" }), _jsxs("span", { className: "text-sm", children: [format(parseISO(event.startDate), "h:mm a"), " -", " ", format(parseISO(event.endDate), "h:mm a")] })] })] }, event.id));
48
+ }) }) })) : null] })] })] }));
49
+ }
@@ -0,0 +1,7 @@
1
+ interface IProps {
2
+ firstVisibleHour: number;
3
+ lastVisibleHour: number;
4
+ }
5
+ export declare function CalendarTimeline({ firstVisibleHour, lastVisibleHour }: IProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=calendar-time-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-time-line.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/week-and-day-view/calendar-time-line.tsx"],"names":[],"mappings":"AAGA,UAAU,MAAM;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,EAAE,MAAM,kDA+B7E"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { format } from "date-fns";
3
+ import * as React from "react";
4
+ export function CalendarTimeline({ firstVisibleHour, lastVisibleHour }) {
5
+ const [currentTime, setCurrentTime] = React.useState(() => new Date());
6
+ React.useEffect(() => {
7
+ const timer = setInterval(() => setCurrentTime(new Date()), 60 * 1000);
8
+ return () => clearInterval(timer);
9
+ }, []);
10
+ const getCurrentTimePosition = () => {
11
+ const minutes = currentTime.getHours() * 60 + currentTime.getMinutes();
12
+ const visibleStartMinutes = firstVisibleHour * 60;
13
+ const visibleEndMinutes = lastVisibleHour * 60;
14
+ const visibleRangeMinutes = visibleEndMinutes - visibleStartMinutes;
15
+ return ((minutes - visibleStartMinutes) / visibleRangeMinutes) * 100;
16
+ };
17
+ const currentHour = currentTime.getHours();
18
+ if (currentHour < firstVisibleHour || currentHour >= lastVisibleHour)
19
+ return null;
20
+ return (_jsxs("div", { className: "pointer-events-none absolute inset-x-0 z-50 border-t border-primary", style: { top: `${getCurrentTimePosition()}%` }, children: [_jsx("div", { className: "absolute left-0 top-0 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary" }), _jsx("div", { className: "absolute -left-18 flex w-16 -translate-y-1/2 justify-end bg-background pr-1 text-xs font-medium text-primary", children: format(currentTime, "h:mm a") })] }));
21
+ }
@@ -0,0 +1,8 @@
1
+ import type { IEvent } from "../interfaces.js";
2
+ interface IProps {
3
+ singleDayEvents: IEvent[];
4
+ multiDayEvents: IEvent[];
5
+ }
6
+ export declare function CalendarWeekView({ singleDayEvents, multiDayEvents }: IProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=calendar-week-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view.d.ts","sourceRoot":"","sources":["../../../../src/components/big-calendar/week-and-day-view/calendar-week-view.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAK9C,UAAU,MAAM;IACd,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,MAAM,2CAqJ3E"}