calendarkit-pro 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/index.d.mts +75 -44
- package/dist/index.d.ts +75 -44
- package/dist/index.js +765 -508
- package/dist/index.mjs +709 -437
- package/package.json +29 -6
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,44 +1,64 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
2
30
|
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var rrule = require('rrule');
|
|
31
|
+
// src/index.tsx
|
|
32
|
+
var index_exports = {};
|
|
33
|
+
__export(index_exports, {
|
|
34
|
+
Scheduler: () => Scheduler,
|
|
35
|
+
cn: () => cn
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(index_exports);
|
|
38
|
+
var import_react19 = __toESM(require("react"));
|
|
39
|
+
var import_core3 = require("@dnd-kit/core");
|
|
40
|
+
var import_modifiers = require("@dnd-kit/modifiers");
|
|
41
|
+
var import_framer_motion4 = require("framer-motion");
|
|
15
42
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (e) {
|
|
20
|
-
Object.keys(e).forEach(function (k) {
|
|
21
|
-
if (k !== 'default') {
|
|
22
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
23
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
24
|
-
enumerable: true,
|
|
25
|
-
get: function () { return e[k]; }
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
n.default = e;
|
|
31
|
-
return Object.freeze(n);
|
|
32
|
-
}
|
|
43
|
+
// src/components/CalendarHeader.tsx
|
|
44
|
+
var import_react = __toESM(require("react"));
|
|
45
|
+
var import_date_fns = require("date-fns");
|
|
33
46
|
|
|
34
|
-
|
|
47
|
+
// src/components/ui/button.tsx
|
|
48
|
+
var React = __toESM(require("react"));
|
|
49
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
35
50
|
|
|
51
|
+
// src/utils.ts
|
|
52
|
+
var import_clsx = require("clsx");
|
|
53
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
36
54
|
function cn(...inputs) {
|
|
37
|
-
return
|
|
55
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
38
56
|
}
|
|
57
|
+
var isEventDragDisabled = (event) => event?.draggable === false;
|
|
58
|
+
var isEventResizeDisabled = (event) => event?.resizable === false || event?.resizable === void 0 && isEventDragDisabled(event);
|
|
39
59
|
|
|
40
60
|
// src/components/ui/button.tsx
|
|
41
|
-
var buttonVariants =
|
|
61
|
+
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
42
62
|
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
43
63
|
{
|
|
44
64
|
variants: {
|
|
@@ -63,10 +83,10 @@ var buttonVariants = classVarianceAuthority.cva(
|
|
|
63
83
|
}
|
|
64
84
|
}
|
|
65
85
|
);
|
|
66
|
-
var Button =
|
|
67
|
-
({ className, variant, size,
|
|
86
|
+
var Button = React.forwardRef(
|
|
87
|
+
({ className, variant, size, ...props }, ref) => {
|
|
68
88
|
const Comp = "button";
|
|
69
|
-
return /* @__PURE__ */
|
|
89
|
+
return /* @__PURE__ */ React.createElement(
|
|
70
90
|
Comp,
|
|
71
91
|
{
|
|
72
92
|
className: cn(buttonVariants({ variant, size, className })),
|
|
@@ -77,6 +97,9 @@ var Button = React15__namespace.forwardRef(
|
|
|
77
97
|
}
|
|
78
98
|
);
|
|
79
99
|
Button.displayName = "Button";
|
|
100
|
+
|
|
101
|
+
// src/components/CalendarHeader.tsx
|
|
102
|
+
var import_lucide_react = require("lucide-react");
|
|
80
103
|
var CalendarHeader = ({
|
|
81
104
|
currentDate,
|
|
82
105
|
onPrev,
|
|
@@ -94,12 +117,12 @@ var CalendarHeader = ({
|
|
|
94
117
|
locale
|
|
95
118
|
}) => {
|
|
96
119
|
const viewConfig = [
|
|
97
|
-
{ key: "month", icon:
|
|
98
|
-
{ key: "week", icon:
|
|
99
|
-
{ key: "day", icon:
|
|
100
|
-
{ key: "agenda", icon:
|
|
120
|
+
{ key: "month", icon: import_lucide_react.CalendarDays },
|
|
121
|
+
{ key: "week", icon: import_lucide_react.CalendarRange },
|
|
122
|
+
{ key: "day", icon: import_lucide_react.Calendar },
|
|
123
|
+
{ key: "agenda", icon: import_lucide_react.ListTodo }
|
|
101
124
|
];
|
|
102
|
-
return /* @__PURE__ */
|
|
125
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col md:flex-row items-center justify-between px-3 md:px-5 py-3 border-b-[0px] border-border/50 bg-gradient-to-r from-background via-background to-muted/20 gap-3 md:gap-0 min-h-[64px]" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 w-full md:w-auto justify-between md:justify-start" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 md:gap-3" }, /* @__PURE__ */ import_react.default.createElement(
|
|
103
126
|
Button,
|
|
104
127
|
{
|
|
105
128
|
variant: "ghost",
|
|
@@ -107,8 +130,8 @@ var CalendarHeader = ({
|
|
|
107
130
|
className: "text-muted-foreground hover:text-foreground hover:bg-accent/80 rounded-xl h-10 w-10 hidden md:inline-flex transition-all duration-200",
|
|
108
131
|
onClick: onMenuClick
|
|
109
132
|
},
|
|
110
|
-
/* @__PURE__ */
|
|
111
|
-
), /* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ import_react.default.createElement(import_lucide_react.Menu, { className: "h-5 w-5" })
|
|
134
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
112
135
|
Button,
|
|
113
136
|
{
|
|
114
137
|
variant: "outline",
|
|
@@ -116,7 +139,7 @@ var CalendarHeader = ({
|
|
|
116
139
|
className: "h-9 px-5 rounded-xl text-sm font-medium hidden sm:inline-flex border-[0.5px] border-border/60 hover:border-primary/40 hover:bg-primary/5 hover:text-primary transition-all duration-200"
|
|
117
140
|
},
|
|
118
141
|
translations.today
|
|
119
|
-
), /* @__PURE__ */
|
|
142
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center bg-muted/40 rounded-xl p-0.5" }, /* @__PURE__ */ import_react.default.createElement(
|
|
120
143
|
Button,
|
|
121
144
|
{
|
|
122
145
|
variant: "ghost",
|
|
@@ -124,8 +147,8 @@ var CalendarHeader = ({
|
|
|
124
147
|
onClick: onPrev,
|
|
125
148
|
className: "rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200"
|
|
126
149
|
},
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
), /* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronLeft, { className: "h-4 w-4 text-muted-foreground" })
|
|
151
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
129
152
|
Button,
|
|
130
153
|
{
|
|
131
154
|
variant: "ghost",
|
|
@@ -133,8 +156,8 @@ var CalendarHeader = ({
|
|
|
133
156
|
onClick: onNext,
|
|
134
157
|
className: "rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200"
|
|
135
158
|
},
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
)), /* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronRight, { className: "h-4 w-4 text-muted-foreground" })
|
|
160
|
+
)), /* @__PURE__ */ import_react.default.createElement("div", { className: "ml-2 md:ml-4" }, /* @__PURE__ */ import_react.default.createElement("h2", { className: "text-lg md:text-xl font-semibold text-foreground whitespace-nowrap capitalize tracking-tight" }, (0, import_date_fns.format)(currentDate, "MMMM yyyy", { locale }))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-2 md:gap-3 w-full md:w-auto justify-end" }, onLanguageChange && language && /* @__PURE__ */ import_react.default.createElement(
|
|
138
161
|
Button,
|
|
139
162
|
{
|
|
140
163
|
variant: "ghost",
|
|
@@ -143,7 +166,7 @@ var CalendarHeader = ({
|
|
|
143
166
|
className: "h-9 px-3 rounded-xl text-xs font-semibold text-muted-foreground hover:text-foreground hover:bg-accent/80 transition-all duration-200 uppercase tracking-wider"
|
|
144
167
|
},
|
|
145
168
|
language
|
|
146
|
-
), onThemeToggle && /* @__PURE__ */
|
|
169
|
+
), onThemeToggle && /* @__PURE__ */ import_react.default.createElement(
|
|
147
170
|
Button,
|
|
148
171
|
{
|
|
149
172
|
variant: "ghost",
|
|
@@ -151,8 +174,8 @@ var CalendarHeader = ({
|
|
|
151
174
|
className: "rounded-xl h-9 w-9 hover:bg-accent/80 transition-all duration-200",
|
|
152
175
|
onClick: onThemeToggle
|
|
153
176
|
},
|
|
154
|
-
isDarkMode ? /* @__PURE__ */
|
|
155
|
-
), !hideViewSwitcher && /* @__PURE__ */
|
|
177
|
+
isDarkMode ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Sun, { className: "h-4 w-4 text-amber-500" }) : /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Moon, { className: "h-4 w-4 text-muted-foreground" })
|
|
178
|
+
), !hideViewSwitcher && /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center bg-muted/50 backdrop-blur-sm rounded-xl p-1" }, viewConfig.map(({ key, icon: Icon }) => /* @__PURE__ */ import_react.default.createElement(
|
|
156
179
|
Button,
|
|
157
180
|
{
|
|
158
181
|
key,
|
|
@@ -164,40 +187,63 @@ var CalendarHeader = ({
|
|
|
164
187
|
view === key ? "bg-background shadow-sm text-foreground font-medium border-[0.5px] border-border/50" : "text-muted-foreground hover:text-foreground hover:bg-background/50"
|
|
165
188
|
)
|
|
166
189
|
},
|
|
167
|
-
/* @__PURE__ */
|
|
168
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ import_react.default.createElement(Icon, { className: "h-3.5 w-3.5" }),
|
|
191
|
+
/* @__PURE__ */ import_react.default.createElement("span", { className: "hidden sm:inline" }, translations[key])
|
|
169
192
|
)))));
|
|
170
193
|
};
|
|
194
|
+
|
|
195
|
+
// src/components/Sidebar.tsx
|
|
196
|
+
var import_react3 = __toESM(require("react"));
|
|
197
|
+
var import_lucide_react3 = require("lucide-react");
|
|
198
|
+
|
|
199
|
+
// src/components/MiniCalendar.tsx
|
|
200
|
+
var import_react2 = __toESM(require("react"));
|
|
201
|
+
var import_date_fns3 = require("date-fns");
|
|
202
|
+
|
|
203
|
+
// src/lib/date.ts
|
|
204
|
+
var import_date_fns2 = require("date-fns");
|
|
171
205
|
var getMonthGrid = (date, weekStartOn = 0) => {
|
|
172
|
-
const monthStart =
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return dateFns.eachDayOfInterval({
|
|
177
|
-
start: startDate,
|
|
178
|
-
end: endDate
|
|
206
|
+
const monthStart = (0, import_date_fns2.startOfMonth)(date);
|
|
207
|
+
return (0, import_date_fns2.eachDayOfInterval)({
|
|
208
|
+
start: (0, import_date_fns2.startOfWeek)(monthStart, { weekStartsOn: weekStartOn }),
|
|
209
|
+
end: (0, import_date_fns2.endOfWeek)((0, import_date_fns2.endOfMonth)(monthStart), { weekStartsOn: weekStartOn })
|
|
179
210
|
});
|
|
180
211
|
};
|
|
212
|
+
var uses24HourClock = (locale) => {
|
|
213
|
+
if (!locale) return false;
|
|
214
|
+
return !/[ap]\.?m/i.test((0, import_date_fns2.format)(new Date(2e3, 0, 1, 13, 0), "p", { locale }));
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// src/components/MiniCalendar.tsx
|
|
218
|
+
var import_lucide_react2 = require("lucide-react");
|
|
181
219
|
var MiniCalendar = ({
|
|
182
220
|
currentDate,
|
|
183
221
|
onDateChange,
|
|
184
222
|
onViewChange,
|
|
185
|
-
className
|
|
223
|
+
className,
|
|
224
|
+
locale
|
|
186
225
|
}) => {
|
|
187
|
-
const [viewDate, setViewDate] =
|
|
188
|
-
|
|
226
|
+
const [viewDate, setViewDate] = import_react2.default.useState(currentDate);
|
|
227
|
+
import_react2.default.useEffect(() => {
|
|
189
228
|
setViewDate(currentDate);
|
|
190
229
|
}, [currentDate]);
|
|
191
|
-
const
|
|
192
|
-
const
|
|
230
|
+
const weekStartsOn = locale?.options?.weekStartsOn ?? 0;
|
|
231
|
+
const days = import_react2.default.useMemo(
|
|
232
|
+
() => getMonthGrid(viewDate, weekStartsOn),
|
|
233
|
+
[viewDate, weekStartsOn]
|
|
234
|
+
);
|
|
235
|
+
const weekDays = locale?.localize ? [0, 1, 2, 3, 4, 5, 6].map((d) => {
|
|
236
|
+
const dayIndex = (d + weekStartsOn) % 7;
|
|
237
|
+
return locale.localize.day(dayIndex, { width: "narrow" });
|
|
238
|
+
}) : ["S", "M", "T", "W", "T", "F", "S"];
|
|
193
239
|
const handlePrev = () => {
|
|
194
|
-
const newDate =
|
|
240
|
+
const newDate = (0, import_date_fns3.subMonths)(viewDate, 1);
|
|
195
241
|
setViewDate(newDate);
|
|
196
242
|
onDateChange(newDate);
|
|
197
243
|
if (onViewChange) onViewChange("month");
|
|
198
244
|
};
|
|
199
245
|
const handleNext = () => {
|
|
200
|
-
const newDate =
|
|
246
|
+
const newDate = (0, import_date_fns3.addMonths)(viewDate, 1);
|
|
201
247
|
setViewDate(newDate);
|
|
202
248
|
onDateChange(newDate);
|
|
203
249
|
if (onViewChange) onViewChange("month");
|
|
@@ -206,7 +252,7 @@ var MiniCalendar = ({
|
|
|
206
252
|
onDateChange(day);
|
|
207
253
|
if (onViewChange) onViewChange("day");
|
|
208
254
|
};
|
|
209
|
-
return /* @__PURE__ */
|
|
255
|
+
return /* @__PURE__ */ import_react2.default.createElement("div", { className: cn("px-4 w-[260px]", className) }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex items-center justify-between mb-4" }, /* @__PURE__ */ import_react2.default.createElement("span", { className: "text-sm font-semibold text-foreground capitalize" }, (0, import_date_fns3.format)(viewDate, "MMMM yyyy", { locale })), /* @__PURE__ */ import_react2.default.createElement("div", { className: "flex items-center bg-muted/40 rounded-lg p-0.5" }, /* @__PURE__ */ import_react2.default.createElement(
|
|
210
256
|
Button,
|
|
211
257
|
{
|
|
212
258
|
variant: "ghost",
|
|
@@ -215,8 +261,8 @@ var MiniCalendar = ({
|
|
|
215
261
|
onClick: handlePrev,
|
|
216
262
|
"aria-label": "Previous month"
|
|
217
263
|
},
|
|
218
|
-
/* @__PURE__ */
|
|
219
|
-
), /* @__PURE__ */
|
|
264
|
+
/* @__PURE__ */ import_react2.default.createElement(import_lucide_react2.ChevronLeft, { className: "h-4 w-4" })
|
|
265
|
+
), /* @__PURE__ */ import_react2.default.createElement(
|
|
220
266
|
Button,
|
|
221
267
|
{
|
|
222
268
|
variant: "ghost",
|
|
@@ -225,12 +271,12 @@ var MiniCalendar = ({
|
|
|
225
271
|
onClick: handleNext,
|
|
226
272
|
"aria-label": "Next month"
|
|
227
273
|
},
|
|
228
|
-
/* @__PURE__ */
|
|
229
|
-
))), /* @__PURE__ */
|
|
230
|
-
const isSelected =
|
|
231
|
-
const isCurrentMonth =
|
|
232
|
-
const isTodayDate =
|
|
233
|
-
return /* @__PURE__ */
|
|
274
|
+
/* @__PURE__ */ import_react2.default.createElement(import_lucide_react2.ChevronRight, { className: "h-4 w-4" })
|
|
275
|
+
))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "grid grid-cols-7 gap-y-2 text-center mb-2" }, weekDays.map((day, i) => /* @__PURE__ */ import_react2.default.createElement("div", { key: `${day}-${i}`, className: "text-[10px] text-muted-foreground/70 font-semibold uppercase" }, day))), /* @__PURE__ */ import_react2.default.createElement("div", { className: "grid grid-cols-7 gap-y-1 text-center" }, days.map((day) => {
|
|
276
|
+
const isSelected = (0, import_date_fns3.isSameDay)(day, currentDate);
|
|
277
|
+
const isCurrentMonth = (0, import_date_fns3.isSameMonth)(day, viewDate);
|
|
278
|
+
const isTodayDate = (0, import_date_fns3.isToday)(day);
|
|
279
|
+
return /* @__PURE__ */ import_react2.default.createElement(
|
|
234
280
|
"button",
|
|
235
281
|
{
|
|
236
282
|
key: day.toISOString(),
|
|
@@ -243,10 +289,14 @@ var MiniCalendar = ({
|
|
|
243
289
|
!isSelected && isTodayDate && "bg-primary/10 text-primary ring-1 ring-primary/30"
|
|
244
290
|
)
|
|
245
291
|
},
|
|
246
|
-
|
|
292
|
+
(0, import_date_fns3.format)(day, "d")
|
|
247
293
|
);
|
|
248
294
|
})));
|
|
249
295
|
};
|
|
296
|
+
|
|
297
|
+
// src/components/Sidebar.tsx
|
|
298
|
+
var import_date_fns_tz = require("date-fns-tz");
|
|
299
|
+
var import_date_fns4 = require("date-fns");
|
|
250
300
|
var Sidebar = ({
|
|
251
301
|
currentDate,
|
|
252
302
|
onDateChange,
|
|
@@ -258,13 +308,14 @@ var Sidebar = ({
|
|
|
258
308
|
readOnly,
|
|
259
309
|
calendars,
|
|
260
310
|
onCalendarToggle,
|
|
261
|
-
translations
|
|
311
|
+
translations,
|
|
312
|
+
locale
|
|
262
313
|
}) => {
|
|
263
|
-
const [calendarsOpen, setCalendarsOpen] =
|
|
264
|
-
const [timezoneOpen, setTimezoneOpen] =
|
|
265
|
-
const [now, setNow] =
|
|
266
|
-
const [hasMounted, setHasMounted] =
|
|
267
|
-
|
|
314
|
+
const [calendarsOpen, setCalendarsOpen] = (0, import_react3.useState)(true);
|
|
315
|
+
const [timezoneOpen, setTimezoneOpen] = (0, import_react3.useState)(false);
|
|
316
|
+
const [now, setNow] = (0, import_react3.useState)(null);
|
|
317
|
+
const [hasMounted, setHasMounted] = (0, import_react3.useState)(false);
|
|
318
|
+
(0, import_react3.useEffect)(() => {
|
|
268
319
|
setHasMounted(true);
|
|
269
320
|
setNow(/* @__PURE__ */ new Date());
|
|
270
321
|
const timer = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
@@ -280,12 +331,12 @@ var Sidebar = ({
|
|
|
280
331
|
if (!tz || !now) return "LOC";
|
|
281
332
|
try {
|
|
282
333
|
return new Intl.DateTimeFormat("en-US", { timeZone: tz, timeZoneName: "short" }).formatToParts(now).find((part) => part.type === "timeZoneName")?.value || "";
|
|
283
|
-
} catch
|
|
334
|
+
} catch {
|
|
284
335
|
return "";
|
|
285
336
|
}
|
|
286
337
|
};
|
|
287
338
|
const timezones = [
|
|
288
|
-
{ value: "", label: "Local Time", acronym: "LOC" },
|
|
339
|
+
{ value: "", label: translations?.localTime || "Local Time", acronym: "LOC" },
|
|
289
340
|
{ value: "UTC", label: "UTC", acronym: "UTC" },
|
|
290
341
|
{ value: "America/New_York", label: "New York", acronym: "EST" },
|
|
291
342
|
{ value: "America/Chicago", label: "Chicago", acronym: "CST" },
|
|
@@ -301,56 +352,56 @@ var Sidebar = ({
|
|
|
301
352
|
];
|
|
302
353
|
const formatTzLabel = (tz, showTime = true) => {
|
|
303
354
|
if (!hasMounted || !now || !showTime) {
|
|
304
|
-
return /* @__PURE__ */
|
|
355
|
+
return /* @__PURE__ */ import_react3.default.createElement("span", null, tz.label);
|
|
305
356
|
}
|
|
306
357
|
let time = "";
|
|
307
358
|
let acronym = tz.acronym;
|
|
308
359
|
try {
|
|
309
360
|
if (!tz.value) {
|
|
310
|
-
time =
|
|
361
|
+
time = (0, import_date_fns4.format)(now, "HH:mm");
|
|
311
362
|
try {
|
|
312
363
|
acronym = new Intl.DateTimeFormat("en-US", { timeZoneName: "short" }).formatToParts(now).find((part) => part.type === "timeZoneName")?.value || "LOC";
|
|
313
|
-
} catch
|
|
364
|
+
} catch {
|
|
314
365
|
}
|
|
315
366
|
} else {
|
|
316
|
-
const zDate =
|
|
317
|
-
time =
|
|
367
|
+
const zDate = (0, import_date_fns_tz.toZonedTime)(now, tz.value);
|
|
368
|
+
time = (0, import_date_fns4.format)(zDate, "HH:mm");
|
|
318
369
|
const dynAcronym = getAcronym(tz.value);
|
|
319
370
|
if (dynAcronym && !dynAcronym.includes("GMT") && !dynAcronym.includes("Time")) {
|
|
320
371
|
acronym = dynAcronym;
|
|
321
372
|
}
|
|
322
373
|
}
|
|
323
|
-
} catch
|
|
324
|
-
return /* @__PURE__ */
|
|
374
|
+
} catch {
|
|
375
|
+
return /* @__PURE__ */ import_react3.default.createElement("span", null, tz.label);
|
|
325
376
|
}
|
|
326
|
-
return /* @__PURE__ */
|
|
377
|
+
return /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex justify-between w-full" }, /* @__PURE__ */ import_react3.default.createElement("span", null, tz.label), /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-muted-foreground ml-2 tabular-nums" }, time, " ", /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-xs opacity-75" }, "(", acronym, ")")));
|
|
327
378
|
};
|
|
328
379
|
const selectedTzObj = timezones.find((t) => t.value === (timezone || ""));
|
|
329
380
|
const selectedTimezoneLabel = selectedTzObj ? formatTzLabel(selectedTzObj) : translations?.localTime || "Local Time";
|
|
330
|
-
return /* @__PURE__ */
|
|
381
|
+
return /* @__PURE__ */ import_react3.default.createElement("div", { className: cn("flex flex-col w-[260px] overflow-x-hidden h-full bg-gradient-to-b scrollbar-hide from-background via-background to-muted/10 pt-4 pb-4 overflow-y-auto hidden lg:flex", className) }, !readOnly && /* @__PURE__ */ import_react3.default.createElement("div", { className: "px-4 mb-6" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
331
382
|
Button,
|
|
332
383
|
{
|
|
333
384
|
className: "w-full rounded-2xl shadow-lg bg-primary text-primary-foreground hover:bg-primary/90 h-12 gap-3 justify-center transition-all duration-300 hover:shadow-xl hover:shadow-primary/20 hover:scale-[1.02] active:scale-[0.98] font-semibold",
|
|
334
385
|
onClick: onEventCreate
|
|
335
386
|
},
|
|
336
|
-
/* @__PURE__ */
|
|
337
|
-
/* @__PURE__ */
|
|
338
|
-
)), /* @__PURE__ */
|
|
387
|
+
/* @__PURE__ */ import_react3.default.createElement(import_lucide_react3.Plus, { className: "w-5 h-5" }),
|
|
388
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "text-sm" }, translations?.create || "Create")
|
|
389
|
+
)), /* @__PURE__ */ import_react3.default.createElement(MiniCalendar, { currentDate, onDateChange, onViewChange, locale }), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex-1 px-4 space-y-5 mt-5" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "bg-muted/20 rounded-2xl p-3 border-[0px] border-border/30" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
339
390
|
"div",
|
|
340
391
|
{
|
|
341
392
|
className: "flex items-center justify-between cursor-pointer hover:bg-accent/50 p-2 -m-1 rounded-xl mb-2 transition-all duration-200",
|
|
342
393
|
onClick: () => setCalendarsOpen(!calendarsOpen)
|
|
343
394
|
},
|
|
344
|
-
/* @__PURE__ */
|
|
345
|
-
/* @__PURE__ */
|
|
346
|
-
), calendarsOpen && /* @__PURE__ */
|
|
395
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "text-sm font-semibold text-foreground" }, translations?.calendars || "Calendars"),
|
|
396
|
+
/* @__PURE__ */ import_react3.default.createElement(import_lucide_react3.ChevronDown, { className: cn("w-4 h-4 text-muted-foreground transition-transform duration-200", calendarsOpen && "rotate-180") })
|
|
397
|
+
), calendarsOpen && /* @__PURE__ */ import_react3.default.createElement("div", { className: "space-y-1" }, displayCalendars.map((cal) => /* @__PURE__ */ import_react3.default.createElement(
|
|
347
398
|
"div",
|
|
348
399
|
{
|
|
349
400
|
key: cal.id,
|
|
350
401
|
className: "flex items-center gap-3 py-2 px-2 hover:bg-accent/60 rounded-xl cursor-pointer group transition-all duration-200",
|
|
351
402
|
onClick: () => onCalendarToggle?.(cal.id, !(cal.active ?? true))
|
|
352
403
|
},
|
|
353
|
-
/* @__PURE__ */
|
|
404
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "relative flex items-center justify-center" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
354
405
|
"input",
|
|
355
406
|
{
|
|
356
407
|
type: "checkbox",
|
|
@@ -363,7 +414,7 @@ var Sidebar = ({
|
|
|
363
414
|
style: { "--primary-color": cal.color },
|
|
364
415
|
"data-cal-id": cal.id
|
|
365
416
|
}
|
|
366
|
-
), /* @__PURE__ */
|
|
417
|
+
), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none opacity-0 peer-checked:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react3.default.createElement("svg", { className: "w-3.5 h-3.5 text-white", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 3 }, /* @__PURE__ */ import_react3.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }))), /* @__PURE__ */ import_react3.default.createElement("style", null, `
|
|
367
418
|
input[type="checkbox"][data-cal-id="${cal.id}"]:checked {
|
|
368
419
|
background-color: ${cal.color} !important;
|
|
369
420
|
border-color: ${cal.color} !important;
|
|
@@ -372,23 +423,23 @@ var Sidebar = ({
|
|
|
372
423
|
--tw-ring-color: ${cal.color}40 !important;
|
|
373
424
|
}
|
|
374
425
|
`)),
|
|
375
|
-
/* @__PURE__ */
|
|
376
|
-
/* @__PURE__ */
|
|
426
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center gap-2 flex-1 min-w-0" }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-sm text-foreground/90 truncate font-medium" }, cal.label)),
|
|
427
|
+
/* @__PURE__ */ import_react3.default.createElement(
|
|
377
428
|
"div",
|
|
378
429
|
{
|
|
379
430
|
className: "w-2 h-2 rounded-full opacity-60 group-hover:opacity-100 transition-opacity",
|
|
380
431
|
style: { backgroundColor: cal.color }
|
|
381
432
|
}
|
|
382
433
|
)
|
|
383
|
-
))))), /* @__PURE__ */
|
|
434
|
+
))))), /* @__PURE__ */ import_react3.default.createElement("div", { className: "mt-auto px-4 pt-5" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "bg-muted/20 rounded-2xl p-3" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex items-center gap-2 mb-3" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "p-1.5 bg-primary/10 rounded-lg" }, /* @__PURE__ */ import_react3.default.createElement(import_lucide_react3.Globe, { className: "w-4 h-4 text-primary" })), /* @__PURE__ */ import_react3.default.createElement("span", { className: "text-sm font-semibold text-foreground" }, translations?.timezone || "Timezone")), /* @__PURE__ */ import_react3.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
384
435
|
"button",
|
|
385
436
|
{
|
|
386
437
|
onClick: () => setTimezoneOpen(!timezoneOpen),
|
|
387
438
|
className: "w-full flex items-center justify-between bg-blue-200/40 hover:bg-blue-200/80 rounded-xl py-2.5 pl-4 pr-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/50 transition-all duration-200 text-left"
|
|
388
439
|
},
|
|
389
|
-
/* @__PURE__ */
|
|
390
|
-
/* @__PURE__ */
|
|
391
|
-
), timezoneOpen && /* @__PURE__ */
|
|
440
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "flex-1 truncate mr-2 font-medium" }, selectedTimezoneLabel),
|
|
441
|
+
/* @__PURE__ */ import_react3.default.createElement(import_lucide_react3.ChevronDown, { className: cn("w-4 h-4 text-muted-foreground transition-transform duration-200", timezoneOpen && "rotate-180") })
|
|
442
|
+
), timezoneOpen && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setTimezoneOpen(false) }), /* @__PURE__ */ import_react3.default.createElement("div", { className: "absolute bottom-full left-0 w-full mb-2 bg-background rounded-xl shadow-2xl z-50 max-h-[260px] overflow-y-auto p-1.5 animate-in fade-in zoom-in-95 duration-200 backdrop-blur-none" }, timezones.map((tz) => /* @__PURE__ */ import_react3.default.createElement(
|
|
392
443
|
"div",
|
|
393
444
|
{
|
|
394
445
|
key: tz.value,
|
|
@@ -404,14 +455,26 @@ var Sidebar = ({
|
|
|
404
455
|
formatTzLabel(tz)
|
|
405
456
|
))))))));
|
|
406
457
|
};
|
|
458
|
+
|
|
459
|
+
// src/views/MonthView.tsx
|
|
460
|
+
var import_react6 = __toESM(require("react"));
|
|
461
|
+
var import_date_fns5 = require("date-fns");
|
|
462
|
+
var import_date_fns_tz2 = require("date-fns-tz");
|
|
463
|
+
|
|
464
|
+
// src/components/dnd/DraggableEvent.tsx
|
|
465
|
+
var import_react4 = __toESM(require("react"));
|
|
466
|
+
var import_core = require("@dnd-kit/core");
|
|
467
|
+
var import_utilities = require("@dnd-kit/utilities");
|
|
407
468
|
var DraggableEvent = ({ event, children, className, style: propStyle, ...props }) => {
|
|
408
|
-
const
|
|
469
|
+
const dragDisabled = isEventDragDisabled(event);
|
|
470
|
+
const { attributes, listeners, setNodeRef, transform, isDragging } = (0, import_core.useDraggable)({
|
|
409
471
|
id: event.id,
|
|
410
|
-
data: { event }
|
|
472
|
+
data: { event },
|
|
473
|
+
disabled: dragDisabled
|
|
411
474
|
});
|
|
412
475
|
const style = {
|
|
413
476
|
...propStyle,
|
|
414
|
-
transform:
|
|
477
|
+
transform: import_utilities.CSS.Translate.toString(transform),
|
|
415
478
|
zIndex: isDragging ? 100 : propStyle?.zIndex,
|
|
416
479
|
// When dragging, we want the ORIGINAL element to be almost invisible (or fully invisible)
|
|
417
480
|
// so that the DragOverlay (the "ghost") is the only thing the user focuses on.
|
|
@@ -421,7 +484,7 @@ var DraggableEvent = ({ event, children, className, style: propStyle, ...props }
|
|
|
421
484
|
opacity: isDragging ? 0 : propStyle?.opacity
|
|
422
485
|
// Hiding original element completely
|
|
423
486
|
};
|
|
424
|
-
return /* @__PURE__ */
|
|
487
|
+
return /* @__PURE__ */ import_react4.default.createElement(
|
|
425
488
|
"div",
|
|
426
489
|
{
|
|
427
490
|
ref: setNodeRef,
|
|
@@ -429,20 +492,24 @@ var DraggableEvent = ({ event, children, className, style: propStyle, ...props }
|
|
|
429
492
|
...listeners,
|
|
430
493
|
...attributes,
|
|
431
494
|
...props,
|
|
432
|
-
className: cn("touch-none", className)
|
|
495
|
+
className: cn(!dragDisabled && "touch-none", className)
|
|
433
496
|
},
|
|
434
497
|
children
|
|
435
498
|
);
|
|
436
499
|
};
|
|
500
|
+
|
|
501
|
+
// src/components/dnd/DroppableCell.tsx
|
|
502
|
+
var import_react5 = __toESM(require("react"));
|
|
503
|
+
var import_core2 = require("@dnd-kit/core");
|
|
437
504
|
var DroppableCell = ({ id, date, resourceId, children, className, style, onClick }) => {
|
|
438
|
-
const { isOver, setNodeRef } =
|
|
505
|
+
const { isOver, setNodeRef } = (0, import_core2.useDroppable)({
|
|
439
506
|
id,
|
|
440
507
|
data: { date, resourceId }
|
|
441
508
|
});
|
|
442
509
|
const minutes = date.getMinutes();
|
|
443
510
|
const quarterClass = minutes === 0 ? "hover:bg-blue-50/50 dark:hover:bg-blue-900/10" : minutes === 15 ? "hover:bg-blue-50/80 dark:hover:bg-blue-900/20" : minutes === 30 ? "hover:bg-blue-100/50 dark:hover:bg-blue-900/30" : "hover:bg-blue-100/80 dark:hover:bg-blue-900/40";
|
|
444
511
|
const activeQuarterClass = minutes === 0 ? "bg-blue-50/50 dark:bg-blue-900/10 ring-2 ring-primary ring-inset" : minutes === 15 ? "bg-blue-50/80 dark:bg-blue-900/20 ring-2 ring-primary ring-inset" : minutes === 30 ? "bg-blue-100/50 dark:bg-blue-900/30 ring-2 ring-primary ring-inset" : "bg-blue-100/80 dark:bg-blue-900/40 ring-2 ring-primary ring-inset";
|
|
445
|
-
return /* @__PURE__ */
|
|
512
|
+
return /* @__PURE__ */ import_react5.default.createElement(
|
|
446
513
|
"div",
|
|
447
514
|
{
|
|
448
515
|
ref: setNodeRef,
|
|
@@ -459,7 +526,7 @@ var DroppableCell = ({ id, date, resourceId, children, className, style, onClick
|
|
|
459
526
|
};
|
|
460
527
|
|
|
461
528
|
// src/views/MonthView.tsx
|
|
462
|
-
var EventItem =
|
|
529
|
+
var EventItem = import_react6.default.memo(({ event, onEventClick }) => /* @__PURE__ */ import_react6.default.createElement(DraggableEvent, { event }, /* @__PURE__ */ import_react6.default.createElement(
|
|
463
530
|
"div",
|
|
464
531
|
{
|
|
465
532
|
className: cn(
|
|
@@ -477,7 +544,7 @@ var EventItem = React15__namespace.default.memo(({ event, onEventClick }) => /*
|
|
|
477
544
|
onEventClick?.(event);
|
|
478
545
|
}
|
|
479
546
|
},
|
|
480
|
-
/* @__PURE__ */
|
|
547
|
+
/* @__PURE__ */ import_react6.default.createElement("span", { className: "font-medium" }, event.title)
|
|
481
548
|
)));
|
|
482
549
|
EventItem.displayName = "EventItem";
|
|
483
550
|
var MonthView = ({
|
|
@@ -488,20 +555,24 @@ var MonthView = ({
|
|
|
488
555
|
timezone,
|
|
489
556
|
locale
|
|
490
557
|
}) => {
|
|
491
|
-
const
|
|
492
|
-
const
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
558
|
+
const weekStartsOn = locale?.options?.weekStartsOn ?? 1;
|
|
559
|
+
const days = (0, import_react6.useMemo)(
|
|
560
|
+
() => getMonthGrid(currentDate, weekStartsOn),
|
|
561
|
+
[currentDate, weekStartsOn]
|
|
562
|
+
);
|
|
563
|
+
const weekDays = (0, import_react6.useMemo)(() => {
|
|
564
|
+
const start = (0, import_date_fns5.startOfWeek)(currentDate, { weekStartsOn });
|
|
565
|
+
const end = (0, import_date_fns5.endOfWeek)(currentDate, { weekStartsOn });
|
|
566
|
+
return (0, import_date_fns5.eachDayOfInterval)({ start, end });
|
|
567
|
+
}, [currentDate, weekStartsOn]);
|
|
568
|
+
const getZonedDate = (0, import_react6.useCallback)((date) => {
|
|
569
|
+
return timezone ? (0, import_date_fns_tz2.toZonedTime)(date, timezone) : date;
|
|
499
570
|
}, [timezone]);
|
|
500
|
-
const eventsByDay =
|
|
571
|
+
const eventsByDay = (0, import_react6.useMemo)(() => {
|
|
501
572
|
const map = /* @__PURE__ */ new Map();
|
|
502
573
|
events.forEach((event) => {
|
|
503
574
|
const zonedStart = getZonedDate(event.start);
|
|
504
|
-
const key =
|
|
575
|
+
const key = (0, import_date_fns5.format)(zonedStart, "yyyy-MM-dd");
|
|
505
576
|
if (!map.has(key)) {
|
|
506
577
|
map.set(key, []);
|
|
507
578
|
}
|
|
@@ -509,19 +580,19 @@ var MonthView = ({
|
|
|
509
580
|
});
|
|
510
581
|
return map;
|
|
511
582
|
}, [events, getZonedDate]);
|
|
512
|
-
return /* @__PURE__ */
|
|
583
|
+
return /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col h-full bg-background border-[0.5px] scrollbar-hide border-border/50 rounded-2xl overflow-hidden min-w-[800px] md:min-w-0 shadow-sm" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "overflow-y-auto flex-1 relative" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "grid grid-cols-7 border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/30 via-muted/40 to-muted/30 sticky top-0 z-20 backdrop-blur-sm" }, weekDays.map((day) => /* @__PURE__ */ import_react6.default.createElement(
|
|
513
584
|
"div",
|
|
514
585
|
{
|
|
515
586
|
key: day.toISOString(),
|
|
516
587
|
className: "py-3 text-center text-xs font-semibold text-muted-foreground border-r-[0.5px] border-border/30 last:border-r-0 uppercase tracking-wider"
|
|
517
588
|
},
|
|
518
|
-
|
|
519
|
-
))), /* @__PURE__ */
|
|
520
|
-
const dayKey =
|
|
589
|
+
(0, import_date_fns5.format)(day, "EEE", { locale })
|
|
590
|
+
))), /* @__PURE__ */ import_react6.default.createElement("div", { className: "grid grid-cols-7", style: { gridAutoRows: "130px" } }, days.map((day) => {
|
|
591
|
+
const dayKey = (0, import_date_fns5.format)(day, "yyyy-MM-dd");
|
|
521
592
|
const dayEvents = eventsByDay.get(dayKey) || [];
|
|
522
|
-
const isCurrentMonth =
|
|
593
|
+
const isCurrentMonth = (0, import_date_fns5.isSameMonth)(day, currentDate);
|
|
523
594
|
const cellId = day.toISOString();
|
|
524
|
-
return /* @__PURE__ */
|
|
595
|
+
return /* @__PURE__ */ import_react6.default.createElement(
|
|
525
596
|
DroppableCell,
|
|
526
597
|
{
|
|
527
598
|
key: cellId,
|
|
@@ -530,18 +601,26 @@ var MonthView = ({
|
|
|
530
601
|
className: cn(
|
|
531
602
|
"h-[130px] p-2 border-b-[0.5px] border-r-[0.5px] border-border/30 last:border-r-0 relative transition-all duration-200 hover:bg-accent/5 flex flex-col gap-1.5 overflow-hidden group",
|
|
532
603
|
!isCurrentMonth && "bg-muted/5 text-muted-foreground/60",
|
|
533
|
-
|
|
604
|
+
(0, import_date_fns5.isToday)(day) && "bg-primary/5 ring-1 ring-inset ring-primary/20"
|
|
534
605
|
),
|
|
535
606
|
onClick: () => onDateClick?.(day)
|
|
536
607
|
},
|
|
537
|
-
/* @__PURE__ */
|
|
608
|
+
/* @__PURE__ */ import_react6.default.createElement("div", { className: "flex justify-between items-start" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: cn(
|
|
538
609
|
"text-sm font-semibold w-7 h-7 flex items-center justify-center rounded-full transition-all duration-200",
|
|
539
|
-
|
|
540
|
-
) },
|
|
541
|
-
/* @__PURE__ */
|
|
610
|
+
(0, import_date_fns5.isToday)(day) ? "bg-primary text-primary-foreground shadow-md shadow-primary/30" : "group-hover:bg-accent"
|
|
611
|
+
) }, (0, import_date_fns5.format)(day, "d", { locale })), dayEvents.length > 0 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-[10px] font-medium text-muted-foreground/60 bg-muted/50 px-1.5 py-0.5 rounded-full" }, dayEvents.length)),
|
|
612
|
+
/* @__PURE__ */ import_react6.default.createElement("div", { className: "flex-1 flex flex-col gap-1 scrollbar-hide overflow-y-auto overflow-x-hidden" }, dayEvents.slice(0, 4).map((event) => /* @__PURE__ */ import_react6.default.createElement(EventItem, { key: `${event.id}-${dayKey}`, event, onEventClick })), dayEvents.length > 4 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-[10px] text-primary font-semibold text-center py-1 px-2 rounded-md bg-primary/5 hover:bg-primary/10 cursor-pointer transition-colors" }, "+", dayEvents.length - 4, " more"))
|
|
542
613
|
);
|
|
543
614
|
}))));
|
|
544
615
|
};
|
|
616
|
+
|
|
617
|
+
// src/views/WeekView.tsx
|
|
618
|
+
var import_react8 = __toESM(require("react"));
|
|
619
|
+
var import_date_fns6 = require("date-fns");
|
|
620
|
+
var import_date_fns_tz3 = require("date-fns-tz");
|
|
621
|
+
|
|
622
|
+
// src/components/dnd/ResizableEvent.tsx
|
|
623
|
+
var import_react7 = __toESM(require("react"));
|
|
545
624
|
var ResizableEvent = ({
|
|
546
625
|
event,
|
|
547
626
|
hourHeight,
|
|
@@ -552,12 +631,14 @@ var ResizableEvent = ({
|
|
|
552
631
|
style,
|
|
553
632
|
readonly
|
|
554
633
|
}) => {
|
|
555
|
-
const
|
|
556
|
-
const [
|
|
557
|
-
const
|
|
558
|
-
const
|
|
559
|
-
const
|
|
560
|
-
const
|
|
634
|
+
const resizeLocked = readonly || isEventResizeDisabled(event);
|
|
635
|
+
const [isResizing, setIsResizing] = (0, import_react7.useState)(false);
|
|
636
|
+
const [resizeHeight, setResizeHeight] = (0, import_react7.useState)(null);
|
|
637
|
+
const containerRef = (0, import_react7.useRef)(null);
|
|
638
|
+
const startYRef = (0, import_react7.useRef)(0);
|
|
639
|
+
const startHeightRef = (0, import_react7.useRef)(0);
|
|
640
|
+
const resizeHeightRef = (0, import_react7.useRef)(null);
|
|
641
|
+
const handleResizeStart = (0, import_react7.useCallback)((e) => {
|
|
561
642
|
e.preventDefault();
|
|
562
643
|
e.stopPropagation();
|
|
563
644
|
const clientY = "touches" in e ? e.touches[0].clientY : e.clientY;
|
|
@@ -574,13 +655,15 @@ var ResizableEvent = ({
|
|
|
574
655
|
// Minimum height based on minDuration
|
|
575
656
|
startHeightRef.current + snappedDelta
|
|
576
657
|
);
|
|
658
|
+
resizeHeightRef.current = newHeight;
|
|
577
659
|
setResizeHeight(newHeight);
|
|
578
660
|
};
|
|
579
661
|
const handleEnd = () => {
|
|
580
662
|
setIsResizing(false);
|
|
581
|
-
|
|
663
|
+
const finalHeight = resizeHeightRef.current;
|
|
664
|
+
if (finalHeight !== null && containerRef.current && onResize) {
|
|
582
665
|
const originalHeight = startHeightRef.current;
|
|
583
|
-
const heightDiff =
|
|
666
|
+
const heightDiff = finalHeight - originalHeight;
|
|
584
667
|
const minutesDiff = heightDiff / hourHeight * 60;
|
|
585
668
|
const newEnd = new Date(event.end);
|
|
586
669
|
newEnd.setMinutes(newEnd.getMinutes() + minutesDiff);
|
|
@@ -588,6 +671,7 @@ var ResizableEvent = ({
|
|
|
588
671
|
onResize(event, newEnd);
|
|
589
672
|
}
|
|
590
673
|
}
|
|
674
|
+
resizeHeightRef.current = null;
|
|
591
675
|
setResizeHeight(null);
|
|
592
676
|
document.removeEventListener("mousemove", handleMove);
|
|
593
677
|
document.removeEventListener("mouseup", handleEnd);
|
|
@@ -598,8 +682,11 @@ var ResizableEvent = ({
|
|
|
598
682
|
document.addEventListener("mouseup", handleEnd);
|
|
599
683
|
document.addEventListener("touchmove", handleMove, { passive: false });
|
|
600
684
|
document.addEventListener("touchend", handleEnd);
|
|
601
|
-
}, [event, hourHeight, minDuration, onResize
|
|
602
|
-
|
|
685
|
+
}, [event, hourHeight, minDuration, onResize]);
|
|
686
|
+
const handlePointerDown = (0, import_react7.useCallback)((e) => {
|
|
687
|
+
e.stopPropagation();
|
|
688
|
+
}, []);
|
|
689
|
+
return /* @__PURE__ */ import_react7.default.createElement(
|
|
603
690
|
"div",
|
|
604
691
|
{
|
|
605
692
|
ref: containerRef,
|
|
@@ -610,24 +697,25 @@ var ResizableEvent = ({
|
|
|
610
697
|
}
|
|
611
698
|
},
|
|
612
699
|
children,
|
|
613
|
-
/* @__PURE__ */
|
|
700
|
+
/* @__PURE__ */ import_react7.default.createElement(
|
|
614
701
|
"div",
|
|
615
702
|
{
|
|
616
703
|
className: cn(
|
|
617
|
-
|
|
704
|
+
resizeLocked ? "cursor-default" : "cursor-ns-resize group-hover:opacity-100",
|
|
618
705
|
"absolute bottom-0 left-0 right-0 h-3 z-20 flex items-center justify-center",
|
|
619
706
|
"opacity-0 transition-opacity",
|
|
620
707
|
isResizing && "opacity-100"
|
|
621
708
|
),
|
|
622
|
-
|
|
623
|
-
|
|
709
|
+
onPointerDown: resizeLocked ? void 0 : handlePointerDown,
|
|
710
|
+
onMouseDown: resizeLocked ? void 0 : handleResizeStart,
|
|
711
|
+
onTouchStart: resizeLocked ? void 0 : handleResizeStart
|
|
624
712
|
},
|
|
625
|
-
/* @__PURE__ */
|
|
713
|
+
/* @__PURE__ */ import_react7.default.createElement("div", { className: cn(
|
|
626
714
|
"w-8 h-1 rounded-full transition-all",
|
|
627
715
|
isResizing ? "bg-primary" : "bg-muted-foreground/30 group-hover:bg-primary/50"
|
|
628
716
|
) })
|
|
629
717
|
),
|
|
630
|
-
isResizing && /* @__PURE__ */
|
|
718
|
+
isResizing && /* @__PURE__ */ import_react7.default.createElement("div", { className: "absolute inset-0 border-2 border-primary border-dashed rounded-md pointer-events-none bg-primary/5" })
|
|
631
719
|
);
|
|
632
720
|
};
|
|
633
721
|
|
|
@@ -642,29 +730,26 @@ var WeekView = ({
|
|
|
642
730
|
locale,
|
|
643
731
|
readonly
|
|
644
732
|
}) => {
|
|
645
|
-
const
|
|
646
|
-
const
|
|
647
|
-
const
|
|
733
|
+
const weekStartsOn = locale?.options?.weekStartsOn ?? 1;
|
|
734
|
+
const start = (0, import_date_fns6.startOfWeek)(currentDate, { weekStartsOn });
|
|
735
|
+
const end = (0, import_date_fns6.endOfWeek)(currentDate, { weekStartsOn });
|
|
736
|
+
const weekDays = (0, import_date_fns6.eachDayOfInterval)({ start, end });
|
|
648
737
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
649
738
|
const hourHeight = 60;
|
|
650
|
-
const scrollContainerRef =
|
|
651
|
-
const [now, setNow] =
|
|
652
|
-
|
|
739
|
+
const scrollContainerRef = import_react8.default.useRef(null);
|
|
740
|
+
const [now, setNow] = import_react8.default.useState(/* @__PURE__ */ new Date());
|
|
741
|
+
import_react8.default.useEffect(() => {
|
|
653
742
|
const interval = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
654
743
|
return () => clearInterval(interval);
|
|
655
744
|
}, []);
|
|
656
|
-
|
|
745
|
+
import_react8.default.useEffect(() => {
|
|
657
746
|
if (scrollContainerRef.current) {
|
|
658
|
-
const
|
|
659
|
-
|
|
660
|
-
const offsetHour = 4;
|
|
661
|
-
return (currentHour - offsetHour) * hourHeight;
|
|
662
|
-
};
|
|
663
|
-
scrollContainerRef.current.scrollTop = scrollToActualTime();
|
|
747
|
+
const offsetHour = 4;
|
|
748
|
+
scrollContainerRef.current.scrollTop = ((/* @__PURE__ */ new Date()).getHours() - offsetHour) * hourHeight;
|
|
664
749
|
}
|
|
665
750
|
}, []);
|
|
666
751
|
const getZonedDate = (date) => {
|
|
667
|
-
return timezone ?
|
|
752
|
+
return timezone ? (0, import_date_fns_tz3.toZonedTime)(date, timezone) : date;
|
|
668
753
|
};
|
|
669
754
|
const zonedNow = getZonedDate(/* @__PURE__ */ new Date());
|
|
670
755
|
const getTimezoneDisplay = (tz) => {
|
|
@@ -672,60 +757,60 @@ var WeekView = ({
|
|
|
672
757
|
let displayTime = "";
|
|
673
758
|
let acronym = "";
|
|
674
759
|
if (!tz) {
|
|
675
|
-
displayTime =
|
|
760
|
+
displayTime = (0, import_date_fns6.format)(date, "HH:mm");
|
|
676
761
|
try {
|
|
677
762
|
acronym = new Intl.DateTimeFormat("en-US", { timeZoneName: "short" }).formatToParts(date).find((part) => part.type === "timeZoneName")?.value || "";
|
|
678
|
-
} catch
|
|
763
|
+
} catch {
|
|
679
764
|
acronym = "LOC";
|
|
680
765
|
}
|
|
681
766
|
} else {
|
|
682
767
|
try {
|
|
683
|
-
const zDate =
|
|
684
|
-
displayTime =
|
|
768
|
+
const zDate = (0, import_date_fns_tz3.toZonedTime)(date, tz);
|
|
769
|
+
displayTime = (0, import_date_fns6.format)(zDate, "HH:mm");
|
|
685
770
|
acronym = new Intl.DateTimeFormat("en-US", { timeZone: tz, timeZoneName: "short" }).formatToParts(date).find((part) => part.type === "timeZoneName")?.value || "";
|
|
686
|
-
} catch
|
|
687
|
-
displayTime =
|
|
771
|
+
} catch {
|
|
772
|
+
displayTime = (0, import_date_fns6.format)(date, "HH:mm");
|
|
688
773
|
acronym = tz;
|
|
689
774
|
}
|
|
690
775
|
}
|
|
691
|
-
return /* @__PURE__ */
|
|
776
|
+
return /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col items-center justify-center leading-tight" }, /* @__PURE__ */ import_react8.default.createElement("span", null, displayTime), /* @__PURE__ */ import_react8.default.createElement("span", { className: "text-[10px] opacity-75" }, "(", acronym, ")"));
|
|
692
777
|
};
|
|
693
|
-
const
|
|
694
|
-
const
|
|
695
|
-
const
|
|
696
|
-
|
|
778
|
+
const is24h = uses24HourClock(locale);
|
|
779
|
+
const timeFormat = is24h ? "H:mm" : "h a";
|
|
780
|
+
const eventTimeFormat = is24h ? "H:mm" : "h:mm a";
|
|
781
|
+
const nowFormat = is24h ? "H:mm" : "h:mm";
|
|
782
|
+
return /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col h-full bg-background border-[0.5px] border-border/50 rounded-2xl overflow-hidden min-w-[800px] md:min-w-0 shadow-sm" }, /* @__PURE__ */ import_react8.default.createElement(
|
|
697
783
|
"div",
|
|
698
784
|
{
|
|
699
785
|
ref: scrollContainerRef,
|
|
700
|
-
className: "flex-1 overflow-y-auto scrollbar-hide relative bg-background scroll-smooth"
|
|
701
|
-
style: { scrollbarGutter: "stable" }
|
|
786
|
+
className: "flex-1 overflow-y-auto scrollbar-hide relative bg-background scroll-smooth"
|
|
702
787
|
},
|
|
703
|
-
/* @__PURE__ */
|
|
788
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "flex border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/20 via-background to-muted/20 z-20 sticky top-0 backdrop-blur-sm" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-none p-3 text-center text-xs font-semibold text-muted-foreground w-16 flex items-center justify-center border-r-[0.5px] border-border/30 bg-muted/10" }, getTimezoneDisplay(timezone)), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-1 grid grid-cols-7" }, weekDays.map((day, index) => /* @__PURE__ */ import_react8.default.createElement("div", { key: day.toISOString(), className: cn("py-3 px-2 text-center", index > 0 && "border-l-[0.5px] border-border/30") }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1.5" }, (0, import_date_fns6.format)(day, "EEE", { locale })), /* @__PURE__ */ import_react8.default.createElement("div", { className: cn(
|
|
704
789
|
"w-9 h-9 flex items-center justify-center rounded-xl mx-auto text-sm font-semibold transition-all duration-200",
|
|
705
|
-
|
|
706
|
-
) },
|
|
707
|
-
/* @__PURE__ */
|
|
790
|
+
(0, import_date_fns6.isToday)(day) ? "bg-primary text-primary-foreground shadow-lg shadow-primary/30 scale-110" : "text-foreground hover:bg-accent/80"
|
|
791
|
+
) }, (0, import_date_fns6.format)(day, "d", { locale })))))),
|
|
792
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
708
793
|
"div",
|
|
709
794
|
{
|
|
710
795
|
className: "flex min-w-full relative",
|
|
711
796
|
style: { height: hours.length * hourHeight }
|
|
712
797
|
},
|
|
713
|
-
/* @__PURE__ */
|
|
798
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-none w-16 border-r-[0.5px] border-border/30 relative bg-muted/5" }, hours.map((hour) => /* @__PURE__ */ import_react8.default.createElement(
|
|
714
799
|
"div",
|
|
715
800
|
{
|
|
716
801
|
key: hour,
|
|
717
802
|
className: "relative w-full text-[11px] text-muted-foreground/80 text-right pr-3 font-medium tabular-nums box-border",
|
|
718
803
|
style: { height: hourHeight }
|
|
719
804
|
},
|
|
720
|
-
/* @__PURE__ */
|
|
805
|
+
/* @__PURE__ */ import_react8.default.createElement("span", { className: "block -translate-y-1/2" }, hour !== 0 && (0, import_date_fns6.format)((/* @__PURE__ */ new Date()).setHours(hour, 0, 0, 0), timeFormat, { locale }))
|
|
721
806
|
))),
|
|
722
|
-
/* @__PURE__ */
|
|
807
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-1 grid grid-cols-7 relative" }, weekDays.map((day, dayIndex) => {
|
|
723
808
|
const dayEvents = events.filter((e) => {
|
|
724
809
|
const zonedStart = getZonedDate(e.start);
|
|
725
|
-
return
|
|
810
|
+
return (0, import_date_fns6.isSameDay)(zonedStart, day);
|
|
726
811
|
});
|
|
727
|
-
return /* @__PURE__ */
|
|
728
|
-
return /* @__PURE__ */
|
|
812
|
+
return /* @__PURE__ */ import_react8.default.createElement("div", { key: day.toISOString(), className: cn("relative h-full", dayIndex > 0 && "border-l-[0.5px] border-border/30") }, hours.map((hour) => {
|
|
813
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
729
814
|
"div",
|
|
730
815
|
{
|
|
731
816
|
key: hour,
|
|
@@ -736,7 +821,7 @@ var WeekView = ({
|
|
|
736
821
|
const cellDate = new Date(day);
|
|
737
822
|
cellDate.setHours(hour, minute, 0, 0);
|
|
738
823
|
const cellId = cellDate.toISOString();
|
|
739
|
-
return /* @__PURE__ */
|
|
824
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
740
825
|
DroppableCell,
|
|
741
826
|
{
|
|
742
827
|
key: minute,
|
|
@@ -748,7 +833,7 @@ var WeekView = ({
|
|
|
748
833
|
top: `${minute / 60 * 100}%`
|
|
749
834
|
}
|
|
750
835
|
},
|
|
751
|
-
/* @__PURE__ */
|
|
836
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
752
837
|
"div",
|
|
753
838
|
{
|
|
754
839
|
className: "w-full h-full bg-transparent cursor-pointer",
|
|
@@ -778,11 +863,11 @@ var WeekView = ({
|
|
|
778
863
|
const zonedEventStart = getZonedDate(event.start);
|
|
779
864
|
const zonedEventEnd = getZonedDate(event.end);
|
|
780
865
|
const startMinutes = zonedEventStart.getHours() * 60 + zonedEventStart.getMinutes();
|
|
781
|
-
const durationMinutes =
|
|
866
|
+
const durationMinutes = (0, import_date_fns6.differenceInMinutes)(zonedEventEnd, zonedEventStart);
|
|
782
867
|
const top = startMinutes / 60 * hourHeight;
|
|
783
868
|
const height = durationMinutes / 60 * hourHeight;
|
|
784
869
|
const isShortEvent = durationMinutes < 60;
|
|
785
|
-
return /* @__PURE__ */
|
|
870
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
786
871
|
DraggableEvent,
|
|
787
872
|
{
|
|
788
873
|
key: `${event.id}-${day.toISOString()}`,
|
|
@@ -797,7 +882,7 @@ var WeekView = ({
|
|
|
797
882
|
paddingRight: count > 1 ? "2px" : "0"
|
|
798
883
|
}
|
|
799
884
|
},
|
|
800
|
-
/* @__PURE__ */
|
|
885
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
801
886
|
ResizableEvent,
|
|
802
887
|
{
|
|
803
888
|
readonly,
|
|
@@ -807,13 +892,13 @@ var WeekView = ({
|
|
|
807
892
|
className: "h-full",
|
|
808
893
|
style: { height: "100%" }
|
|
809
894
|
},
|
|
810
|
-
/* @__PURE__ */
|
|
895
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
811
896
|
"div",
|
|
812
897
|
{
|
|
813
898
|
className: cn(
|
|
814
899
|
"rounded-md border shadow-sm transition-all hover:shadow-md group overflow-hidden relative",
|
|
815
900
|
"glass",
|
|
816
|
-
readonly ? "cursor-default" : "cursor-grab active:cursor-grabbing",
|
|
901
|
+
readonly || isEventDragDisabled(event) ? "cursor-default" : "cursor-grab active:cursor-grabbing",
|
|
817
902
|
!event.color && "border-primary/20 bg-primary/10",
|
|
818
903
|
isShortEvent ? "px-1 flex items-center justify-center" : "p-2",
|
|
819
904
|
// Add active border for overlapped events to distinguish them
|
|
@@ -832,14 +917,14 @@ var WeekView = ({
|
|
|
832
917
|
},
|
|
833
918
|
title: count > 1 ? `${event.title} (${index + 1}/${count})` : void 0
|
|
834
919
|
},
|
|
835
|
-
/* @__PURE__ */
|
|
920
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col h-full overflow-hidden w-full" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: cn(
|
|
836
921
|
"font-semibold truncate text-foreground/90 leading-tight",
|
|
837
922
|
isShortEvent ? "text-xs text-center" : "text-xs"
|
|
838
|
-
) }, event.title), !isShortEvent && /* @__PURE__ */
|
|
923
|
+
) }, event.title), !isShortEvent && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-[10px] text-muted-foreground truncate mt-0.5 font-medium leading-tight" }, (0, import_date_fns6.format)(zonedEventStart, eventTimeFormat, { locale }), " - ", (0, import_date_fns6.format)(zonedEventEnd, eventTimeFormat, { locale })), event.description && height > 50 && /* @__PURE__ */ import_react8.default.createElement("div", { className: "text-[10px] text-muted-foreground/80 truncate mt-1 leading-tight opacity-80" }, event.description)), count > 1 && !isShortEvent && /* @__PURE__ */ import_react8.default.createElement("div", { className: "absolute top-1 right-1 bg-background/80 backdrop-blur-sm rounded-full w-4 h-4 flex items-center justify-center text-[9px] font-bold text-muted-foreground border border-border shadow-sm" }, count))
|
|
839
924
|
)
|
|
840
925
|
)
|
|
841
926
|
);
|
|
842
|
-
}),
|
|
927
|
+
}), (0, import_date_fns6.isToday)(day) && /* @__PURE__ */ import_react8.default.createElement(
|
|
843
928
|
"div",
|
|
844
929
|
{
|
|
845
930
|
className: "absolute left-0 right-0 z-20 pointer-events-none flex items-center",
|
|
@@ -847,12 +932,12 @@ var WeekView = ({
|
|
|
847
932
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
848
933
|
}
|
|
849
934
|
},
|
|
850
|
-
/* @__PURE__ */
|
|
851
|
-
/* @__PURE__ */
|
|
935
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "h-[2px] w-full bg-gradient-to-r from-primary via-primary to-primary/50" }),
|
|
936
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "absolute -left-1.5 w-3 h-3 bg-primary rounded-full shadow-lg shadow-primary/40 ring-2 ring-background animate-pulse" })
|
|
852
937
|
));
|
|
853
938
|
}))
|
|
854
939
|
),
|
|
855
|
-
/* @__PURE__ */
|
|
940
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
856
941
|
"div",
|
|
857
942
|
{
|
|
858
943
|
className: "absolute left-0 w-16 pointer-events-none z-30 flex justify-end pr-2",
|
|
@@ -860,10 +945,15 @@ var WeekView = ({
|
|
|
860
945
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight + 80}px`
|
|
861
946
|
}
|
|
862
947
|
},
|
|
863
|
-
/* @__PURE__ */
|
|
948
|
+
/* @__PURE__ */ import_react8.default.createElement("span", { className: "text-[10px] font-bold text-primary-foreground bg-primary px-1.5 py-0.5 rounded-md shadow-md -translate-y-1/2 backdrop-blur-none" }, (0, import_date_fns6.format)(zonedNow, nowFormat, { locale }))
|
|
864
949
|
)
|
|
865
950
|
));
|
|
866
951
|
};
|
|
952
|
+
|
|
953
|
+
// src/views/DayView.tsx
|
|
954
|
+
var import_react9 = __toESM(require("react"));
|
|
955
|
+
var import_date_fns7 = require("date-fns");
|
|
956
|
+
var import_date_fns_tz4 = require("date-fns-tz");
|
|
867
957
|
var DayView = ({
|
|
868
958
|
currentDate,
|
|
869
959
|
events,
|
|
@@ -876,42 +966,39 @@ var DayView = ({
|
|
|
876
966
|
}) => {
|
|
877
967
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
878
968
|
const hourHeight = 80;
|
|
879
|
-
const scrollContainerRef =
|
|
880
|
-
const [now, setNow] =
|
|
881
|
-
|
|
969
|
+
const scrollContainerRef = import_react9.default.useRef(null);
|
|
970
|
+
const [now, setNow] = import_react9.default.useState(/* @__PURE__ */ new Date());
|
|
971
|
+
import_react9.default.useEffect(() => {
|
|
882
972
|
const interval = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
883
973
|
return () => clearInterval(interval);
|
|
884
974
|
}, []);
|
|
885
|
-
|
|
975
|
+
import_react9.default.useEffect(() => {
|
|
886
976
|
if (scrollContainerRef.current) {
|
|
887
|
-
const
|
|
888
|
-
|
|
889
|
-
const offsetHour = 3;
|
|
890
|
-
return (currentHour - offsetHour) * hourHeight;
|
|
891
|
-
};
|
|
892
|
-
scrollContainerRef.current.scrollTop = scrollToActualTime();
|
|
977
|
+
const offsetHour = 3;
|
|
978
|
+
scrollContainerRef.current.scrollTop = ((/* @__PURE__ */ new Date()).getHours() - offsetHour) * hourHeight;
|
|
893
979
|
}
|
|
894
980
|
}, []);
|
|
895
981
|
const getZonedDate = (date) => {
|
|
896
|
-
return timezone ?
|
|
982
|
+
return timezone ? (0, import_date_fns_tz4.toZonedTime)(date, timezone) : date;
|
|
897
983
|
};
|
|
898
984
|
const zonedNow = getZonedDate(now);
|
|
899
985
|
const dayEvents = events.filter((e) => {
|
|
900
986
|
const zonedStart = getZonedDate(e.start);
|
|
901
|
-
return
|
|
987
|
+
return (0, import_date_fns7.isSameDay)(zonedStart, currentDate);
|
|
902
988
|
});
|
|
903
|
-
const
|
|
904
|
-
const
|
|
905
|
-
const
|
|
906
|
-
|
|
989
|
+
const is24h = uses24HourClock(locale);
|
|
990
|
+
const timeFormat = is24h ? "H:mm" : "h a";
|
|
991
|
+
const eventTimeFormat = is24h ? "H:mm" : "h:mm a";
|
|
992
|
+
const nowFormat = is24h ? "H:mm" : "h:mm a";
|
|
993
|
+
return /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col h-full bg-background border-[0.5px] border-border/50 rounded-2xl overflow-hidden shadow-sm" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "px-6 py-4 border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/20 via-background to-muted/20 text-center shrink-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center justify-center gap-3" }, /* @__PURE__ */ import_react9.default.createElement("h2", { className: "text-xl font-semibold capitalize text-foreground" }, (0, import_date_fns7.format)(currentDate, "EEEE, MMMM d, yyyy", { locale })), (0, import_date_fns7.isToday)(currentDate) && /* @__PURE__ */ import_react9.default.createElement("span", { className: "text-xs font-semibold bg-primary text-primary-foreground px-3 py-1 rounded-full shadow-md shadow-primary/20" }, "Today"))), /* @__PURE__ */ import_react9.default.createElement("div", { ref: scrollContainerRef, className: "flex-1 overflow-y-auto relative" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex relative", style: { height: hours.length * hourHeight } }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "w-20 bg-muted/5 border-r-[0.5px] border-border/30 relative" }, hours.map((hour) => /* @__PURE__ */ import_react9.default.createElement(
|
|
907
994
|
"div",
|
|
908
995
|
{
|
|
909
996
|
key: hour,
|
|
910
997
|
className: "relative w-full",
|
|
911
998
|
style: { height: hourHeight }
|
|
912
999
|
},
|
|
913
|
-
hour !== 0 && /* @__PURE__ */
|
|
914
|
-
)),
|
|
1000
|
+
hour !== 0 && /* @__PURE__ */ import_react9.default.createElement("span", { className: "absolute w-full text-center -top-3 left-1/2 -translate-x-1/2 text-[11px] text-muted-foreground/80 font-medium tabular-nums bg-background px-1.5 py-0.5 rounded-md" }, (0, import_date_fns7.format)((/* @__PURE__ */ new Date()).setHours(hour, 0, 0, 0), timeFormat, { locale }))
|
|
1001
|
+
)), (0, import_date_fns7.isToday)(currentDate) && /* @__PURE__ */ import_react9.default.createElement(
|
|
915
1002
|
"div",
|
|
916
1003
|
{
|
|
917
1004
|
className: "absolute left-0 w-full pointer-events-none z-30 flex justify-end pr-2",
|
|
@@ -919,9 +1006,9 @@ var DayView = ({
|
|
|
919
1006
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
920
1007
|
}
|
|
921
1008
|
},
|
|
922
|
-
/* @__PURE__ */
|
|
923
|
-
)), /* @__PURE__ */
|
|
924
|
-
return /* @__PURE__ */
|
|
1009
|
+
/* @__PURE__ */ import_react9.default.createElement("span", { className: "text-[10px] font-bold text-white bg-primary px-2 py-1 rounded-lg shadow-md shadow-primary/30 -translate-y-1/2" }, (0, import_date_fns7.format)(zonedNow, nowFormat, { locale }))
|
|
1010
|
+
)), /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex-1 relative" }, hours.map((hour) => {
|
|
1011
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
925
1012
|
"div",
|
|
926
1013
|
{
|
|
927
1014
|
key: hour,
|
|
@@ -932,7 +1019,7 @@ var DayView = ({
|
|
|
932
1019
|
const cellDate = new Date(currentDate);
|
|
933
1020
|
cellDate.setHours(hour, minute, 0, 0);
|
|
934
1021
|
const cellId = cellDate.toISOString();
|
|
935
|
-
return /* @__PURE__ */
|
|
1022
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
936
1023
|
DroppableCell,
|
|
937
1024
|
{
|
|
938
1025
|
key: minute,
|
|
@@ -944,7 +1031,7 @@ var DayView = ({
|
|
|
944
1031
|
top: `${minute / 60 * 100}%`
|
|
945
1032
|
}
|
|
946
1033
|
},
|
|
947
|
-
/* @__PURE__ */
|
|
1034
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
948
1035
|
"div",
|
|
949
1036
|
{
|
|
950
1037
|
className: "h-full w-full bg-transparent cursor-pointer",
|
|
@@ -973,11 +1060,11 @@ var DayView = ({
|
|
|
973
1060
|
const zonedStart = getZonedDate(event.start);
|
|
974
1061
|
const zonedEnd = getZonedDate(event.end);
|
|
975
1062
|
const startMinutes = zonedStart.getHours() * 60 + zonedStart.getMinutes();
|
|
976
|
-
const durationMinutes =
|
|
1063
|
+
const durationMinutes = (0, import_date_fns7.differenceInMinutes)(zonedEnd, zonedStart);
|
|
977
1064
|
const top = startMinutes / 60 * hourHeight;
|
|
978
1065
|
const height = durationMinutes / 60 * hourHeight;
|
|
979
1066
|
const isShortEvent = durationMinutes < 45;
|
|
980
|
-
return /* @__PURE__ */
|
|
1067
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
981
1068
|
DraggableEvent,
|
|
982
1069
|
{
|
|
983
1070
|
key: `${event.id}-${currentDate.toISOString()}`,
|
|
@@ -991,7 +1078,7 @@ var DayView = ({
|
|
|
991
1078
|
paddingRight: count > 1 ? "2px" : "0"
|
|
992
1079
|
}
|
|
993
1080
|
},
|
|
994
|
-
/* @__PURE__ */
|
|
1081
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
995
1082
|
ResizableEvent,
|
|
996
1083
|
{
|
|
997
1084
|
readonly,
|
|
@@ -1001,13 +1088,13 @@ var DayView = ({
|
|
|
1001
1088
|
className: "h-full",
|
|
1002
1089
|
style: { height: "100%" }
|
|
1003
1090
|
},
|
|
1004
|
-
/* @__PURE__ */
|
|
1091
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
1005
1092
|
"div",
|
|
1006
1093
|
{
|
|
1007
1094
|
className: cn(
|
|
1008
1095
|
"h-full rounded-lg border-[0.5px] shadow-sm overflow-hidden transition-all hover:shadow-lg hover:z-20 group",
|
|
1009
1096
|
"glass backdrop-blur-sm",
|
|
1010
|
-
readonly ? "cursor-default" : "cursor-grab active:cursor-grabbing",
|
|
1097
|
+
readonly || isEventDragDisabled(event) ? "cursor-default" : "cursor-grab active:cursor-grabbing",
|
|
1011
1098
|
!event.color && "bg-primary/10 border-primary/20",
|
|
1012
1099
|
isShortEvent ? "px-2 flex items-center" : "px-3 py-2",
|
|
1013
1100
|
count > 1 && "border-l-4"
|
|
@@ -1024,15 +1111,15 @@ var DayView = ({
|
|
|
1024
1111
|
},
|
|
1025
1112
|
title: count > 1 ? `${event.title} (${index + 1}/${count})` : void 0
|
|
1026
1113
|
},
|
|
1027
|
-
/* @__PURE__ */
|
|
1114
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { className: "flex flex-col h-full overflow-hidden w-full" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: cn(
|
|
1028
1115
|
"font-semibold truncate leading-tight",
|
|
1029
1116
|
isShortEvent ? "text-xs" : "text-sm",
|
|
1030
1117
|
event.color ? "text-foreground" : "text-foreground/90"
|
|
1031
|
-
) }, event.title), !isShortEvent && /* @__PURE__ */
|
|
1118
|
+
) }, event.title), !isShortEvent && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { className: "text-xs text-muted-foreground mt-0.5 font-medium" }, (0, import_date_fns7.format)(zonedStart, eventTimeFormat, { locale }), " - ", (0, import_date_fns7.format)(zonedEnd, eventTimeFormat, { locale })), event.description && height > 60 && /* @__PURE__ */ import_react9.default.createElement("div", { className: "text-xs text-muted-foreground/80 mt-1 line-clamp-2" }, event.description)), count > 1 && !isShortEvent && /* @__PURE__ */ import_react9.default.createElement("div", { className: "absolute top-1.5 right-1.5 bg-background/90 backdrop-blur-sm rounded-full w-5 h-5 flex items-center justify-center text-[10px] font-bold text-muted-foreground border border-border shadow-sm" }, count))
|
|
1032
1119
|
)
|
|
1033
1120
|
)
|
|
1034
1121
|
);
|
|
1035
|
-
}),
|
|
1122
|
+
}), (0, import_date_fns7.isToday)(currentDate) && /* @__PURE__ */ import_react9.default.createElement(
|
|
1036
1123
|
"div",
|
|
1037
1124
|
{
|
|
1038
1125
|
className: "absolute left-0 right-0 z-20 pointer-events-none flex items-center",
|
|
@@ -1040,45 +1127,62 @@ var DayView = ({
|
|
|
1040
1127
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
1041
1128
|
}
|
|
1042
1129
|
},
|
|
1043
|
-
/* @__PURE__ */
|
|
1044
|
-
/* @__PURE__ */
|
|
1130
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { className: "h-[2px] w-full bg-gradient-to-r from-primary via-primary to-primary/50" }),
|
|
1131
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { className: "absolute -left-1.5 w-3 h-3 bg-primary rounded-full shadow-lg shadow-primary/40 ring-2 ring-background animate-pulse" })
|
|
1045
1132
|
)))));
|
|
1046
1133
|
};
|
|
1047
|
-
|
|
1134
|
+
|
|
1135
|
+
// src/views/AgendaView.tsx
|
|
1136
|
+
var import_react11 = __toESM(require("react"));
|
|
1137
|
+
var import_date_fns8 = require("date-fns");
|
|
1138
|
+
|
|
1139
|
+
// src/components/EmptyState.tsx
|
|
1140
|
+
var import_react10 = __toESM(require("react"));
|
|
1141
|
+
var import_lucide_react4 = require("lucide-react");
|
|
1142
|
+
var AgendaEmptyState = ({ onCreateEvent, translations }) => /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex flex-col items-center justify-center h-full min-h-[400px] py-12" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "relative mb-8" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "p-8 bg-gradient-to-br from-green-50 to-blue-50 dark:from-green-900/10 dark:to-blue-900/10 rounded-3xl border border-border/30" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "w-12 h-12 rounded-2xl bg-green-100 dark:bg-green-900/30 flex items-center justify-center" }, /* @__PURE__ */ import_react10.default.createElement("svg", { className: "w-6 h-6 text-green-600 dark:text-green-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2 }, /* @__PURE__ */ import_react10.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }))), /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-left" }, /* @__PURE__ */ import_react10.default.createElement("div", { className: "font-medium text-foreground" }, translations?.allCaughtUp || "All caught up!"), /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-sm text-muted-foreground" }, translations?.noEventsScheduled || "No events scheduled"))))), /* @__PURE__ */ import_react10.default.createElement("div", { className: "text-center max-w-sm" }, /* @__PURE__ */ import_react10.default.createElement("h3", { className: "text-lg font-semibold text-foreground mb-2" }, translations?.noUpcoming || "Your schedule is clear"), /* @__PURE__ */ import_react10.default.createElement("p", { className: "text-sm text-muted-foreground mb-6" }, translations?.noUpcomingHint || "No upcoming events to show. Create a new event to start planning."), onCreateEvent && /* @__PURE__ */ import_react10.default.createElement(
|
|
1048
1143
|
"button",
|
|
1049
1144
|
{
|
|
1050
1145
|
onClick: onCreateEvent,
|
|
1051
1146
|
className: "inline-flex items-center gap-2 px-5 py-2.5 bg-primary text-primary-foreground rounded-xl font-medium text-sm shadow-lg shadow-primary/20 hover:shadow-xl hover:shadow-primary/30 hover:scale-105 active:scale-95 transition-all duration-200"
|
|
1052
1147
|
},
|
|
1053
|
-
/* @__PURE__ */
|
|
1148
|
+
/* @__PURE__ */ import_react10.default.createElement(import_lucide_react4.Plus, { className: "w-4 h-4" }),
|
|
1054
1149
|
translations?.createEvent || "Create Event"
|
|
1055
1150
|
)));
|
|
1151
|
+
|
|
1152
|
+
// src/views/AgendaView.tsx
|
|
1153
|
+
var import_framer_motion = require("framer-motion");
|
|
1154
|
+
var import_lucide_react5 = require("lucide-react");
|
|
1056
1155
|
var formatDuration = (start, end) => {
|
|
1057
|
-
const minutes =
|
|
1156
|
+
const minutes = (0, import_date_fns8.differenceInMinutes)(end, start);
|
|
1058
1157
|
if (minutes < 60) return `${minutes}m`;
|
|
1059
1158
|
const hours = Math.floor(minutes / 60);
|
|
1060
1159
|
const remainingMinutes = minutes % 60;
|
|
1061
1160
|
if (remainingMinutes === 0) return `${hours}h`;
|
|
1062
1161
|
return `${hours}h ${remainingMinutes}m`;
|
|
1063
1162
|
};
|
|
1064
|
-
var getDateLabel = (date) => {
|
|
1065
|
-
if (
|
|
1066
|
-
if (
|
|
1067
|
-
return
|
|
1163
|
+
var getDateLabel = (date, locale, translations) => {
|
|
1164
|
+
if ((0, import_date_fns8.isToday)(date)) return translations?.today || "Today";
|
|
1165
|
+
if ((0, import_date_fns8.isTomorrow)(date)) return translations?.tomorrow || "Tomorrow";
|
|
1166
|
+
return (0, import_date_fns8.format)(date, "EEEE", { locale });
|
|
1068
1167
|
};
|
|
1069
1168
|
var AgendaView = ({
|
|
1070
1169
|
currentDate,
|
|
1071
1170
|
events,
|
|
1072
1171
|
onEventClick,
|
|
1073
|
-
onCreateEvent
|
|
1172
|
+
onCreateEvent,
|
|
1173
|
+
locale,
|
|
1174
|
+
translations
|
|
1074
1175
|
}) => {
|
|
1075
|
-
const
|
|
1076
|
-
|
|
1176
|
+
const is24h = uses24HourClock(locale);
|
|
1177
|
+
const timePattern = is24h ? "H:mm" : "h:mm a";
|
|
1178
|
+
const compactTimePattern = is24h ? "H:mm" : "h:mm";
|
|
1179
|
+
const groupedEvents = (0, import_react11.useMemo)(() => {
|
|
1180
|
+
const startDate = (0, import_date_fns8.startOfDay)(currentDate);
|
|
1077
1181
|
const groups = [];
|
|
1078
1182
|
const sortedEvents = [...events].sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
1079
1183
|
for (let i = 0; i < 30; i++) {
|
|
1080
|
-
const day =
|
|
1081
|
-
const dayEvents = sortedEvents.filter((event) =>
|
|
1184
|
+
const day = (0, import_date_fns8.addDays)(startDate, i);
|
|
1185
|
+
const dayEvents = sortedEvents.filter((event) => (0, import_date_fns8.isSameDay)(event.start, day));
|
|
1082
1186
|
if (dayEvents.length > 0) {
|
|
1083
1187
|
groups.push({ date: day, events: dayEvents });
|
|
1084
1188
|
}
|
|
@@ -1098,30 +1202,30 @@ var AgendaView = ({
|
|
|
1098
1202
|
hidden: { opacity: 0, x: -20 },
|
|
1099
1203
|
show: { opacity: 1, x: 0 }
|
|
1100
1204
|
};
|
|
1101
|
-
return /* @__PURE__ */
|
|
1102
|
-
|
|
1205
|
+
return /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col h-full bg-background overflow-y-auto" }, groupedEvents.length === 0 ? /* @__PURE__ */ import_react11.default.createElement(AgendaEmptyState, { onCreateEvent, translations }) : /* @__PURE__ */ import_react11.default.createElement(
|
|
1206
|
+
import_framer_motion.motion.div,
|
|
1103
1207
|
{
|
|
1104
1208
|
className: "max-w-3xl mx-auto w-full pb-10 px-4 md:px-6",
|
|
1105
1209
|
variants: container,
|
|
1106
1210
|
initial: "hidden",
|
|
1107
1211
|
animate: "show"
|
|
1108
1212
|
},
|
|
1109
|
-
groupedEvents.map((group
|
|
1110
|
-
|
|
1213
|
+
groupedEvents.map((group) => /* @__PURE__ */ import_react11.default.createElement(
|
|
1214
|
+
import_framer_motion.motion.div,
|
|
1111
1215
|
{
|
|
1112
1216
|
key: group.date.toISOString(),
|
|
1113
1217
|
className: "relative",
|
|
1114
1218
|
variants: item
|
|
1115
1219
|
},
|
|
1116
|
-
/* @__PURE__ */
|
|
1220
|
+
/* @__PURE__ */ import_react11.default.createElement("div", { className: "sticky top-0 bg-background/95 backdrop-blur-md py-4 z-10 border-b border-border/50" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: cn(
|
|
1117
1221
|
"flex flex-col items-center justify-center w-16 h-16 rounded-2xl transition-all",
|
|
1118
|
-
|
|
1119
|
-
) }, /* @__PURE__ */
|
|
1222
|
+
(0, import_date_fns8.isToday)(group.date) ? "bg-primary text-primary-foreground shadow-lg shadow-primary/30" : "bg-muted/50 text-foreground"
|
|
1223
|
+
) }, /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-2xl font-bold leading-none" }, (0, import_date_fns8.format)(group.date, "d")), /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-xs font-medium uppercase tracking-wide opacity-80" }, (0, import_date_fns8.format)(group.date, "MMM", { locale }))), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react11.default.createElement("span", { className: cn(
|
|
1120
1224
|
"text-lg font-semibold",
|
|
1121
|
-
|
|
1122
|
-
) }, getDateLabel(group.date)), /* @__PURE__ */
|
|
1123
|
-
/* @__PURE__ */
|
|
1124
|
-
|
|
1225
|
+
(0, import_date_fns8.isToday)(group.date) && "text-primary"
|
|
1226
|
+
) }, getDateLabel(group.date, locale, translations)), /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-sm text-muted-foreground" }, group.events.length, " ", group.events.length !== 1 ? translations?.eventPlural || "events" : translations?.eventSingular || "event")))),
|
|
1227
|
+
/* @__PURE__ */ import_react11.default.createElement("div", { className: "py-4 space-y-3" }, group.events.map((event) => /* @__PURE__ */ import_react11.default.createElement(
|
|
1228
|
+
import_framer_motion.motion.div,
|
|
1125
1229
|
{
|
|
1126
1230
|
key: event.id,
|
|
1127
1231
|
onClick: () => onEventClick?.(event),
|
|
@@ -1134,26 +1238,30 @@ var AgendaView = ({
|
|
|
1134
1238
|
whileHover: { scale: 1.01, y: -2 },
|
|
1135
1239
|
transition: { duration: 0.2 }
|
|
1136
1240
|
},
|
|
1137
|
-
/* @__PURE__ */
|
|
1241
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
1138
1242
|
"div",
|
|
1139
1243
|
{
|
|
1140
1244
|
className: "absolute left-0 top-3 bottom-3 w-1 rounded-full",
|
|
1141
1245
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
1142
1246
|
}
|
|
1143
1247
|
),
|
|
1144
|
-
/* @__PURE__ */
|
|
1145
|
-
/* @__PURE__ */
|
|
1248
|
+
/* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col items-center min-w-[70px] pl-2" }, event.allDay ? /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col items-center" }, /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-xs font-semibold text-muted-foreground bg-muted/80 px-2.5 py-1 rounded-full" }, translations?.allDay || "All Day")) : /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col items-center" }, /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-base font-semibold text-foreground" }, (0, import_date_fns8.format)(event.start, compactTimePattern, { locale })), !is24h && /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-xs text-muted-foreground uppercase" }, (0, import_date_fns8.format)(event.start, "a")), /* @__PURE__ */ import_react11.default.createElement("div", { className: "w-px h-3 bg-border my-1" }), /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-xs text-muted-foreground/70 font-medium" }, formatDuration(event.start, event.end)))),
|
|
1249
|
+
/* @__PURE__ */ import_react11.default.createElement("div", { className: "flex-1 min-w-0 space-y-2" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-start justify-between gap-2" }, /* @__PURE__ */ import_react11.default.createElement("h4", { className: "text-base font-semibold text-foreground group-hover:text-primary transition-colors line-clamp-1" }, event.title), /* @__PURE__ */ import_react11.default.createElement(
|
|
1146
1250
|
"div",
|
|
1147
1251
|
{
|
|
1148
1252
|
className: "w-3 h-3 rounded-full shrink-0 mt-1.5",
|
|
1149
1253
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
1150
1254
|
}
|
|
1151
|
-
)), event.description && /* @__PURE__ */
|
|
1152
|
-
/* @__PURE__ */
|
|
1255
|
+
)), event.description && /* @__PURE__ */ import_react11.default.createElement("p", { className: "text-sm text-muted-foreground line-clamp-2 leading-relaxed" }, event.description), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-wrap items-center gap-3 pt-1" }, !event.allDay && /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Clock, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ import_react11.default.createElement("span", null, (0, import_date_fns8.format)(event.start, timePattern, { locale }), " - ", (0, import_date_fns8.format)(event.end, timePattern, { locale }))), event.guests && event.guests.length > 0 && /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Users, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ import_react11.default.createElement("span", null, event.guests.length, " ", event.guests.length !== 1 ? translations?.guestsCount || "guests" : translations?.guestCount || "guest")), event.attachments && event.attachments.length > 0 && /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Paperclip, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ import_react11.default.createElement("span", null, event.attachments.length)), event.reminders && event.reminders.length > 0 && /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground" }, /* @__PURE__ */ import_react11.default.createElement(import_lucide_react5.Bell, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ import_react11.default.createElement("span", null, event.reminders.length)))),
|
|
1256
|
+
/* @__PURE__ */ import_react11.default.createElement("div", { className: "absolute right-4 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react11.default.createElement("svg", { className: "w-5 h-5 text-muted-foreground", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2" }, /* @__PURE__ */ import_react11.default.createElement("path", { d: "M9 18l6-6-6-6" })))
|
|
1153
1257
|
)))
|
|
1154
1258
|
))
|
|
1155
1259
|
));
|
|
1156
1260
|
};
|
|
1261
|
+
|
|
1262
|
+
// src/views/ResourceView.tsx
|
|
1263
|
+
var import_react12 = __toESM(require("react"));
|
|
1264
|
+
var import_date_fns9 = require("date-fns");
|
|
1157
1265
|
var ResourceView = ({
|
|
1158
1266
|
currentDate,
|
|
1159
1267
|
events,
|
|
@@ -1162,16 +1270,16 @@ var ResourceView = ({
|
|
|
1162
1270
|
onTimeSlotClick,
|
|
1163
1271
|
locale
|
|
1164
1272
|
}) => {
|
|
1165
|
-
const containerRef =
|
|
1273
|
+
const containerRef = (0, import_react12.useRef)(null);
|
|
1166
1274
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
1167
1275
|
const hourWidth = 100;
|
|
1168
|
-
const timeFormat = locale
|
|
1276
|
+
const timeFormat = uses24HourClock(locale) ? "H:mm" : "h a";
|
|
1169
1277
|
const getEventStyle = (event) => {
|
|
1170
1278
|
const start = new Date(event.start);
|
|
1171
1279
|
const end = new Date(event.end);
|
|
1172
|
-
const dayStart =
|
|
1173
|
-
const startMinutes =
|
|
1174
|
-
const durationMinutes =
|
|
1280
|
+
const dayStart = (0, import_date_fns9.startOfDay)(currentDate);
|
|
1281
|
+
const startMinutes = (0, import_date_fns9.differenceInMinutes)(start, dayStart);
|
|
1282
|
+
const durationMinutes = (0, import_date_fns9.differenceInMinutes)(end, start);
|
|
1175
1283
|
const left = startMinutes / 60 * hourWidth;
|
|
1176
1284
|
const width = durationMinutes / 60 * hourWidth;
|
|
1177
1285
|
return {
|
|
@@ -1180,19 +1288,19 @@ var ResourceView = ({
|
|
|
1180
1288
|
// Min width for visibility
|
|
1181
1289
|
};
|
|
1182
1290
|
};
|
|
1183
|
-
return /* @__PURE__ */
|
|
1291
|
+
return /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex flex-col h-full bg-background overflow-hidden" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex border-b border-border bg-muted/20" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-48 shrink-0 border-r border-border p-4 font-semibold text-sm bg-background sticky left-0 z-20" }, "Resources"), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex overflow-hidden" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex relative", style: { width: hours.length * hourWidth } }, hours.map((hour) => /* @__PURE__ */ import_react12.default.createElement(
|
|
1184
1292
|
"div",
|
|
1185
1293
|
{
|
|
1186
1294
|
key: hour,
|
|
1187
1295
|
className: "border-r border-border/50 text-xs text-muted-foreground p-2 font-medium shrink-0",
|
|
1188
1296
|
style: { width: hourWidth }
|
|
1189
1297
|
},
|
|
1190
|
-
|
|
1191
|
-
))))), /* @__PURE__ */
|
|
1298
|
+
(0, import_date_fns9.format)((/* @__PURE__ */ new Date()).setHours(hour, 0, 0, 0), timeFormat, { locale })
|
|
1299
|
+
))))), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex-1 overflow-auto relative", ref: containerRef }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "min-w-fit" }, resources.map((resource) => {
|
|
1192
1300
|
const resourceEvents = events.filter(
|
|
1193
|
-
(e) => e.resourceId === resource.id &&
|
|
1301
|
+
(e) => e.resourceId === resource.id && (0, import_date_fns9.isSameDay)(new Date(e.start), currentDate)
|
|
1194
1302
|
);
|
|
1195
|
-
return /* @__PURE__ */
|
|
1303
|
+
return /* @__PURE__ */ import_react12.default.createElement("div", { key: resource.id, className: "flex border-b border-border min-h-[100px]" }, /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-48 shrink-0 border-r border-border p-4 bg-background sticky left-0 z-10 flex items-center gap-3" }, resource.avatar ? /* @__PURE__ */ import_react12.default.createElement("img", { src: resource.avatar, alt: resource.label, className: "w-8 h-8 rounded-full object-cover" }) : /* @__PURE__ */ import_react12.default.createElement("div", { className: "w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-bold text-primary" }, resource.label.substring(0, 2).toUpperCase()), /* @__PURE__ */ import_react12.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-sm font-medium" }, resource.label), /* @__PURE__ */ import_react12.default.createElement("span", { className: "text-xs text-muted-foreground" }, "ID: ", resource.id))), /* @__PURE__ */ import_react12.default.createElement("div", { className: "relative flex", style: { width: hours.length * hourWidth } }, hours.map((hour) => /* @__PURE__ */ import_react12.default.createElement(
|
|
1196
1304
|
"div",
|
|
1197
1305
|
{
|
|
1198
1306
|
key: hour,
|
|
@@ -1203,7 +1311,7 @@ var ResourceView = ({
|
|
|
1203
1311
|
const slotDate = new Date(currentDate);
|
|
1204
1312
|
slotDate.setHours(hour, minute, 0, 0);
|
|
1205
1313
|
const slotId = `${resource.id}-${slotDate.toISOString()}`;
|
|
1206
|
-
return /* @__PURE__ */
|
|
1314
|
+
return /* @__PURE__ */ import_react12.default.createElement(
|
|
1207
1315
|
DroppableCell,
|
|
1208
1316
|
{
|
|
1209
1317
|
key: minute,
|
|
@@ -1217,7 +1325,7 @@ var ResourceView = ({
|
|
|
1217
1325
|
}
|
|
1218
1326
|
);
|
|
1219
1327
|
})
|
|
1220
|
-
)), resourceEvents.map((event) => /* @__PURE__ */
|
|
1328
|
+
)), resourceEvents.map((event) => /* @__PURE__ */ import_react12.default.createElement(
|
|
1221
1329
|
DraggableEvent,
|
|
1222
1330
|
{
|
|
1223
1331
|
key: event.id,
|
|
@@ -1234,10 +1342,17 @@ var ResourceView = ({
|
|
|
1234
1342
|
color: "#fff"
|
|
1235
1343
|
}
|
|
1236
1344
|
},
|
|
1237
|
-
/* @__PURE__ */
|
|
1345
|
+
/* @__PURE__ */ import_react12.default.createElement("div", { className: "truncate" }, event.title)
|
|
1238
1346
|
))));
|
|
1239
1347
|
}))));
|
|
1240
1348
|
};
|
|
1349
|
+
|
|
1350
|
+
// src/components/EventModal.tsx
|
|
1351
|
+
var import_react14 = __toESM(require("react"));
|
|
1352
|
+
|
|
1353
|
+
// src/components/ui/Modal.tsx
|
|
1354
|
+
var import_react13 = __toESM(require("react"));
|
|
1355
|
+
var import_lucide_react6 = require("lucide-react");
|
|
1241
1356
|
var Modal = ({
|
|
1242
1357
|
isOpen,
|
|
1243
1358
|
onClose,
|
|
@@ -1246,8 +1361,8 @@ var Modal = ({
|
|
|
1246
1361
|
className,
|
|
1247
1362
|
hideHeader = false
|
|
1248
1363
|
}) => {
|
|
1249
|
-
const overlayRef =
|
|
1250
|
-
|
|
1364
|
+
const overlayRef = (0, import_react13.useRef)(null);
|
|
1365
|
+
(0, import_react13.useEffect)(() => {
|
|
1251
1366
|
const handleEscape = (e) => {
|
|
1252
1367
|
if (e.key === "Escape") {
|
|
1253
1368
|
onClose();
|
|
@@ -1261,14 +1376,14 @@ var Modal = ({
|
|
|
1261
1376
|
};
|
|
1262
1377
|
}, [isOpen, onClose]);
|
|
1263
1378
|
if (!isOpen) return null;
|
|
1264
|
-
return /* @__PURE__ */
|
|
1379
|
+
return /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 z-50 flex items-center justify-center p-4 bg-black/40 backdrop-blur-md animate-in fade-in duration-300" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
1265
1380
|
"div",
|
|
1266
1381
|
{
|
|
1267
1382
|
ref: overlayRef,
|
|
1268
1383
|
className: "absolute inset-0",
|
|
1269
1384
|
onClick: onClose
|
|
1270
1385
|
}
|
|
1271
|
-
), /* @__PURE__ */
|
|
1386
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
1272
1387
|
"div",
|
|
1273
1388
|
{
|
|
1274
1389
|
className: cn(
|
|
@@ -1276,7 +1391,7 @@ var Modal = ({
|
|
|
1276
1391
|
className
|
|
1277
1392
|
)
|
|
1278
1393
|
},
|
|
1279
|
-
!hideHeader && /* @__PURE__ */
|
|
1394
|
+
!hideHeader && /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-border/50 shrink-0 bg-gradient-to-r from-muted/20 to-background" }, /* @__PURE__ */ import_react13.default.createElement("h3", { className: "text-lg font-semibold text-foreground" }, title), /* @__PURE__ */ import_react13.default.createElement(
|
|
1280
1395
|
Button,
|
|
1281
1396
|
{
|
|
1282
1397
|
variant: "ghost",
|
|
@@ -1284,12 +1399,17 @@ var Modal = ({
|
|
|
1284
1399
|
onClick: onClose,
|
|
1285
1400
|
className: "h-9 w-9 p-0 rounded-xl hover:bg-accent/80 transition-all duration-200"
|
|
1286
1401
|
},
|
|
1287
|
-
/* @__PURE__ */
|
|
1288
|
-
/* @__PURE__ */
|
|
1402
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lucide_react6.X, { className: "h-4 w-4" }),
|
|
1403
|
+
/* @__PURE__ */ import_react13.default.createElement("span", { className: "sr-only" }, "Close")
|
|
1289
1404
|
)),
|
|
1290
|
-
/* @__PURE__ */
|
|
1405
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: cn("overflow-y-auto flex-1", !hideHeader && "p-6") }, children)
|
|
1291
1406
|
));
|
|
1292
1407
|
};
|
|
1408
|
+
|
|
1409
|
+
// src/components/EventModal.tsx
|
|
1410
|
+
var import_date_fns10 = require("date-fns");
|
|
1411
|
+
var import_framer_motion2 = require("framer-motion");
|
|
1412
|
+
var import_lucide_react7 = require("lucide-react");
|
|
1293
1413
|
var REMINDER_OPTIONS = [
|
|
1294
1414
|
{ value: 0, label: "At time of event" },
|
|
1295
1415
|
{ value: 5, label: "5 minutes before" },
|
|
@@ -1331,13 +1451,10 @@ var EventModal = ({
|
|
|
1331
1451
|
initialDate,
|
|
1332
1452
|
onSave,
|
|
1333
1453
|
onDelete,
|
|
1334
|
-
calendars
|
|
1335
|
-
eventTypes,
|
|
1336
|
-
translations
|
|
1454
|
+
calendars
|
|
1337
1455
|
}) => {
|
|
1338
|
-
const [mode, setMode] =
|
|
1339
|
-
const [
|
|
1340
|
-
const [formData, setFormData] = React15.useState({
|
|
1456
|
+
const [mode, setMode] = (0, import_react14.useState)("create");
|
|
1457
|
+
const [formData, setFormData] = (0, import_react14.useState)({
|
|
1341
1458
|
title: "",
|
|
1342
1459
|
description: "",
|
|
1343
1460
|
location: "",
|
|
@@ -1351,10 +1468,10 @@ var EventModal = ({
|
|
|
1351
1468
|
attachments: [],
|
|
1352
1469
|
reminders: [{ id: "1", type: "notification", time: 30, label: "30 minutes before" }]
|
|
1353
1470
|
});
|
|
1354
|
-
const [isCalendarDropdownOpen, setIsCalendarDropdownOpen] =
|
|
1355
|
-
const [isColorPickerOpen, setIsColorPickerOpen] =
|
|
1356
|
-
const [isReminderDropdownOpen, setIsReminderDropdownOpen] =
|
|
1357
|
-
const [isGuestsDropdownOpen, setIsGuestsDropdownOpen] =
|
|
1471
|
+
const [isCalendarDropdownOpen, setIsCalendarDropdownOpen] = (0, import_react14.useState)(false);
|
|
1472
|
+
const [isColorPickerOpen, setIsColorPickerOpen] = (0, import_react14.useState)(false);
|
|
1473
|
+
const [isReminderDropdownOpen, setIsReminderDropdownOpen] = (0, import_react14.useState)(false);
|
|
1474
|
+
const [isGuestsDropdownOpen, setIsGuestsDropdownOpen] = (0, import_react14.useState)(false);
|
|
1358
1475
|
const fakeGuests = [
|
|
1359
1476
|
"alice@example.com",
|
|
1360
1477
|
"bob@example.com",
|
|
@@ -1362,9 +1479,8 @@ var EventModal = ({
|
|
|
1362
1479
|
"diana@example.com",
|
|
1363
1480
|
"evan@example.com"
|
|
1364
1481
|
];
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
React15.useEffect(() => {
|
|
1482
|
+
const [selectedGuests, setSelectedGuests] = (0, import_react14.useState)([]);
|
|
1483
|
+
(0, import_react14.useEffect)(() => {
|
|
1368
1484
|
if (isOpen) {
|
|
1369
1485
|
if (event) {
|
|
1370
1486
|
setMode("view");
|
|
@@ -1394,7 +1510,6 @@ var EventModal = ({
|
|
|
1394
1510
|
reminders: [{ id: "1", type: "notification", time: 30, label: "30 minutes before" }]
|
|
1395
1511
|
});
|
|
1396
1512
|
setSelectedGuests([]);
|
|
1397
|
-
setActiveTab("details");
|
|
1398
1513
|
}
|
|
1399
1514
|
}
|
|
1400
1515
|
}, [isOpen, event, initialDate, calendars]);
|
|
@@ -1429,7 +1544,7 @@ var EventModal = ({
|
|
|
1429
1544
|
};
|
|
1430
1545
|
const formatDateForInput = (date) => {
|
|
1431
1546
|
if (!date) return "";
|
|
1432
|
-
return
|
|
1547
|
+
return (0, import_date_fns10.format)(date, "yyyy-MM-dd'T'HH:mm");
|
|
1433
1548
|
};
|
|
1434
1549
|
const handleDateChange = (field, value) => {
|
|
1435
1550
|
const date = new Date(value);
|
|
@@ -1479,14 +1594,14 @@ var EventModal = ({
|
|
|
1479
1594
|
};
|
|
1480
1595
|
const getDurationText = () => {
|
|
1481
1596
|
if (!formData.start || !formData.end) return "";
|
|
1482
|
-
const mins =
|
|
1597
|
+
const mins = (0, import_date_fns10.differenceInMinutes)(formData.end, formData.start);
|
|
1483
1598
|
if (mins < 60) return `${mins} min`;
|
|
1484
1599
|
const hours = Math.floor(mins / 60);
|
|
1485
1600
|
const remainingMins = mins % 60;
|
|
1486
1601
|
if (remainingMins === 0) return `${hours} hr`;
|
|
1487
1602
|
return `${hours} hr ${remainingMins} min`;
|
|
1488
1603
|
};
|
|
1489
|
-
const renderViewMode = () => /* @__PURE__ */
|
|
1604
|
+
const renderViewMode = () => /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-col bg-background overflow-hidden w-full max-h-[90vh]" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1490
1605
|
"div",
|
|
1491
1606
|
{
|
|
1492
1607
|
className: "relative px-6 pt-6 pb-8",
|
|
@@ -1494,65 +1609,65 @@ var EventModal = ({
|
|
|
1494
1609
|
background: `linear-gradient(135deg, ${event?.color || "#3b82f6"}15 0%, transparent 100%)`
|
|
1495
1610
|
}
|
|
1496
1611
|
},
|
|
1497
|
-
/* @__PURE__ */
|
|
1612
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between mb-6" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1498
1613
|
"div",
|
|
1499
1614
|
{
|
|
1500
1615
|
className: "w-3 h-3 rounded-full",
|
|
1501
1616
|
style: { backgroundColor: event?.color || "#3b82f6" }
|
|
1502
1617
|
}
|
|
1503
|
-
), /* @__PURE__ */
|
|
1618
|
+
), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider" }, calendars?.find((c) => c.id === event?.calendarId)?.label || "Event")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1504
1619
|
"button",
|
|
1505
1620
|
{
|
|
1506
1621
|
onClick: () => setMode("edit"),
|
|
1507
1622
|
className: "p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground",
|
|
1508
1623
|
title: "Edit"
|
|
1509
1624
|
},
|
|
1510
|
-
/* @__PURE__ */
|
|
1511
|
-
), /* @__PURE__ */
|
|
1625
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Edit2, { className: "w-4 h-4" })
|
|
1626
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1512
1627
|
"button",
|
|
1513
1628
|
{
|
|
1514
1629
|
onClick: handleDelete,
|
|
1515
1630
|
className: "p-2 hover:bg-destructive/10 rounded-lg transition-all text-muted-foreground hover:text-destructive",
|
|
1516
1631
|
title: "Delete"
|
|
1517
1632
|
},
|
|
1518
|
-
/* @__PURE__ */
|
|
1519
|
-
), /* @__PURE__ */
|
|
1633
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Trash2, { className: "w-4 h-4" })
|
|
1634
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1520
1635
|
"button",
|
|
1521
1636
|
{
|
|
1522
1637
|
onClick: onClose,
|
|
1523
1638
|
className: "p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground",
|
|
1524
1639
|
title: "Close"
|
|
1525
1640
|
},
|
|
1526
|
-
/* @__PURE__ */
|
|
1641
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-4 h-4" })
|
|
1527
1642
|
))),
|
|
1528
|
-
/* @__PURE__ */
|
|
1529
|
-
/* @__PURE__ */
|
|
1530
|
-
), /* @__PURE__ */
|
|
1531
|
-
|
|
1643
|
+
/* @__PURE__ */ import_react14.default.createElement("h1", { className: "text-2xl font-bold text-foreground mb-3 leading-tight" }, event?.title || "(No title)"),
|
|
1644
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-3 text-sm" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2 px-3 py-1.5 bg-background/60 backdrop-blur-sm rounded-lg border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Calendar, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "font-medium" }, event?.start && (0, import_date_fns10.format)(new Date(event.start), "EEE, MMM d"))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2 px-3 py-1.5 bg-background/60 backdrop-blur-sm rounded-lg border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Clock, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "font-medium" }, event?.start && (0, import_date_fns10.format)(new Date(event.start), "h:mm a"), " \u2013 ", event?.end && (0, import_date_fns10.format)(new Date(event.end), "h:mm a"))))
|
|
1645
|
+
), /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-6 pb-6 space-y-4 overflow-y-auto flex-1" }, event?.location && /* @__PURE__ */ import_react14.default.createElement(
|
|
1646
|
+
import_framer_motion2.motion.div,
|
|
1532
1647
|
{
|
|
1533
1648
|
initial: { opacity: 0, y: 10 },
|
|
1534
1649
|
animate: { opacity: 1, y: 0 },
|
|
1535
1650
|
className: "flex items-start gap-3 p-4 rounded-2xl bg-muted/30 border border-border/30 group hover:bg-muted/50 transition-all cursor-pointer"
|
|
1536
1651
|
},
|
|
1537
|
-
/* @__PURE__ */
|
|
1538
|
-
/* @__PURE__ */
|
|
1539
|
-
/* @__PURE__ */
|
|
1540
|
-
), event?.guests && event.guests.length > 0 && /* @__PURE__ */
|
|
1541
|
-
|
|
1652
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "p-2 bg-primary/10 rounded-xl" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.MapPin, { className: "w-5 h-5 text-primary" })),
|
|
1653
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-sm font-medium text-foreground" }, event.location), /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-xs text-muted-foreground mt-0.5" }, "Click to open in maps")),
|
|
1654
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.ExternalLink, { className: "w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity" })
|
|
1655
|
+
), event?.guests && event.guests.length > 0 && /* @__PURE__ */ import_react14.default.createElement(
|
|
1656
|
+
import_framer_motion2.motion.div,
|
|
1542
1657
|
{
|
|
1543
1658
|
initial: { opacity: 0, y: 10 },
|
|
1544
1659
|
animate: { opacity: 1, y: 0 },
|
|
1545
1660
|
transition: { delay: 0.05 },
|
|
1546
1661
|
className: "space-y-3"
|
|
1547
1662
|
},
|
|
1548
|
-
/* @__PURE__ */
|
|
1549
|
-
/* @__PURE__ */
|
|
1663
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Users, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, event.guests.length, " ", event.guests.length > 1 ? "Guests" : "Guest"))),
|
|
1664
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-wrap gap-2" }, event.guests.map((email, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1550
1665
|
"div",
|
|
1551
1666
|
{
|
|
1552
1667
|
key: index,
|
|
1553
1668
|
className: "flex items-center gap-2 px-3 py-2 rounded-xl bg-muted/30 border border-border/30 hover:bg-muted/50 transition-all cursor-pointer group"
|
|
1554
1669
|
},
|
|
1555
|
-
/* @__PURE__ */
|
|
1670
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1556
1671
|
"div",
|
|
1557
1672
|
{
|
|
1558
1673
|
className: "w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold text-white",
|
|
@@ -1560,18 +1675,18 @@ var EventModal = ({
|
|
|
1560
1675
|
},
|
|
1561
1676
|
email[0].toUpperCase()
|
|
1562
1677
|
),
|
|
1563
|
-
/* @__PURE__ */
|
|
1678
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-sm font-medium text-foreground" }, email.split("@")[0]), /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-xs text-muted-foreground truncate" }, email))
|
|
1564
1679
|
)))
|
|
1565
|
-
), event?.reminders && event.reminders.length > 0 && /* @__PURE__ */
|
|
1566
|
-
|
|
1680
|
+
), event?.reminders && event.reminders.length > 0 && /* @__PURE__ */ import_react14.default.createElement(
|
|
1681
|
+
import_framer_motion2.motion.div,
|
|
1567
1682
|
{
|
|
1568
1683
|
initial: { opacity: 0, y: 10 },
|
|
1569
1684
|
animate: { opacity: 1, y: 0 },
|
|
1570
1685
|
transition: { delay: 0.1 },
|
|
1571
1686
|
className: "flex items-center gap-3"
|
|
1572
1687
|
},
|
|
1573
|
-
/* @__PURE__ */
|
|
1574
|
-
/* @__PURE__ */
|
|
1688
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "p-2 bg-amber-500/10 rounded-xl" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Bell, { className: "w-4 h-4 text-amber-500" })),
|
|
1689
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-wrap gap-2" }, event.reminders.map((reminder) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1575
1690
|
"span",
|
|
1576
1691
|
{
|
|
1577
1692
|
key: reminder.id,
|
|
@@ -1579,45 +1694,45 @@ var EventModal = ({
|
|
|
1579
1694
|
},
|
|
1580
1695
|
reminder.label || `${reminder.time} min before`
|
|
1581
1696
|
)))
|
|
1582
|
-
), event?.description && /* @__PURE__ */
|
|
1583
|
-
|
|
1697
|
+
), event?.description && /* @__PURE__ */ import_react14.default.createElement(
|
|
1698
|
+
import_framer_motion2.motion.div,
|
|
1584
1699
|
{
|
|
1585
1700
|
initial: { opacity: 0, y: 10 },
|
|
1586
1701
|
animate: { opacity: 1, y: 0 },
|
|
1587
1702
|
transition: { delay: 0.15 },
|
|
1588
1703
|
className: "space-y-2"
|
|
1589
1704
|
},
|
|
1590
|
-
/* @__PURE__ */
|
|
1591
|
-
/* @__PURE__ */
|
|
1592
|
-
), event?.attachments && event.attachments.length > 0 && /* @__PURE__ */
|
|
1593
|
-
|
|
1705
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.AlignLeft, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, "Notes")),
|
|
1706
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "text-sm text-foreground/80 whitespace-pre-wrap leading-relaxed pl-6 p-3 rounded-xl bg-muted/20 border border-border/30" }, event.description)
|
|
1707
|
+
), event?.attachments && event.attachments.length > 0 && /* @__PURE__ */ import_react14.default.createElement(
|
|
1708
|
+
import_framer_motion2.motion.div,
|
|
1594
1709
|
{
|
|
1595
1710
|
initial: { opacity: 0, y: 10 },
|
|
1596
1711
|
animate: { opacity: 1, y: 0 },
|
|
1597
1712
|
transition: { delay: 0.2 },
|
|
1598
1713
|
className: "space-y-2"
|
|
1599
1714
|
},
|
|
1600
|
-
/* @__PURE__ */
|
|
1601
|
-
/* @__PURE__ */
|
|
1715
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Paperclip, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, "Attachments")),
|
|
1716
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "grid gap-2" }, event.attachments.map((att) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1602
1717
|
"div",
|
|
1603
1718
|
{
|
|
1604
1719
|
key: att.id,
|
|
1605
1720
|
onClick: () => handleDownload(att),
|
|
1606
1721
|
className: "flex items-center gap-3 p-3 rounded-xl border border-border/30 bg-muted/20 hover:bg-muted/40 transition-all cursor-pointer group"
|
|
1607
1722
|
},
|
|
1608
|
-
/* @__PURE__ */
|
|
1609
|
-
/* @__PURE__ */
|
|
1610
|
-
/* @__PURE__ */
|
|
1723
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "p-2 bg-primary/10 rounded-lg" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.File, { className: "w-4 h-4 text-primary" })),
|
|
1724
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-sm font-medium text-foreground truncate" }, att.name), /* @__PURE__ */ import_react14.default.createElement("p", { className: "text-xs text-muted-foreground" }, att.size)),
|
|
1725
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Download, { className: "w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity" })
|
|
1611
1726
|
)))
|
|
1612
1727
|
)));
|
|
1613
|
-
const renderEditMode = () => /* @__PURE__ */
|
|
1728
|
+
const renderEditMode = () => /* @__PURE__ */ import_react14.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col bg-background overflow-hidden w-full max-h-[85vh]" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between px-5 py-4 border-b border-border/50 shrink-0" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1614
1729
|
"button",
|
|
1615
1730
|
{
|
|
1616
1731
|
type: "button",
|
|
1617
1732
|
onClick: () => setIsColorPickerOpen(!isColorPickerOpen),
|
|
1618
1733
|
className: "relative p-1"
|
|
1619
1734
|
},
|
|
1620
|
-
/* @__PURE__ */
|
|
1735
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1621
1736
|
"div",
|
|
1622
1737
|
{
|
|
1623
1738
|
className: "w-5 h-5 rounded-full cursor-pointer hover:scale-110 transition-transform",
|
|
@@ -1627,7 +1742,7 @@ var EventModal = ({
|
|
|
1627
1742
|
}
|
|
1628
1743
|
}
|
|
1629
1744
|
),
|
|
1630
|
-
isColorPickerOpen && /* @__PURE__ */
|
|
1745
|
+
isColorPickerOpen && /* @__PURE__ */ import_react14.default.createElement("div", { className: "absolute top-full left-0 mt-2 p-2 bg-background border border-border rounded-xl shadow-xl z-50 flex flex-wrap gap-1.5 w-[180px]" }, COLOR_PALETTE.map((color) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1631
1746
|
"button",
|
|
1632
1747
|
{
|
|
1633
1748
|
key: color,
|
|
@@ -1643,15 +1758,15 @@ var EventModal = ({
|
|
|
1643
1758
|
style: { backgroundColor: color, color }
|
|
1644
1759
|
}
|
|
1645
1760
|
)))
|
|
1646
|
-
), /* @__PURE__ */
|
|
1761
|
+
), /* @__PURE__ */ import_react14.default.createElement("h2", { className: "text-lg font-semibold text-foreground" }, mode === "edit" ? "Edit Event" : "New Event")), /* @__PURE__ */ import_react14.default.createElement(
|
|
1647
1762
|
"button",
|
|
1648
1763
|
{
|
|
1649
1764
|
type: "button",
|
|
1650
1765
|
onClick: onClose,
|
|
1651
1766
|
className: "p-2 hover:bg-accent rounded-xl transition-all text-muted-foreground hover:text-foreground"
|
|
1652
1767
|
},
|
|
1653
|
-
/* @__PURE__ */
|
|
1654
|
-
)), /* @__PURE__ */
|
|
1768
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-4 h-4" })
|
|
1769
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex-1 overflow-y-auto" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-5 py-4 space-y-5" }, /* @__PURE__ */ import_react14.default.createElement("div", null, /* @__PURE__ */ import_react14.default.createElement(
|
|
1655
1770
|
"input",
|
|
1656
1771
|
{
|
|
1657
1772
|
type: "text",
|
|
@@ -1662,7 +1777,7 @@ var EventModal = ({
|
|
|
1662
1777
|
onChange: (e) => setFormData({ ...formData, title: e.target.value }),
|
|
1663
1778
|
placeholder: "Add title"
|
|
1664
1779
|
}
|
|
1665
|
-
)), /* @__PURE__ */
|
|
1780
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-3 p-4 rounded-2xl bg-muted/20 border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "p-2 bg-primary/10 rounded-xl shrink-0" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Clock, { className: "w-5 h-5 text-primary" })), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex-1 grid grid-cols-2 gap-3" }, /* @__PURE__ */ import_react14.default.createElement("div", null, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1 block" }, "Start"), /* @__PURE__ */ import_react14.default.createElement(
|
|
1666
1781
|
"input",
|
|
1667
1782
|
{
|
|
1668
1783
|
type: "datetime-local",
|
|
@@ -1670,7 +1785,7 @@ var EventModal = ({
|
|
|
1670
1785
|
value: formatDateForInput(formData.start),
|
|
1671
1786
|
onChange: (e) => handleDateChange("start", e.target.value)
|
|
1672
1787
|
}
|
|
1673
|
-
)), /* @__PURE__ */
|
|
1788
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", null, /* @__PURE__ */ import_react14.default.createElement("label", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1 block" }, "End"), /* @__PURE__ */ import_react14.default.createElement(
|
|
1674
1789
|
"input",
|
|
1675
1790
|
{
|
|
1676
1791
|
type: "datetime-local",
|
|
@@ -1678,16 +1793,16 @@ var EventModal = ({
|
|
|
1678
1793
|
value: formatDateForInput(formData.end),
|
|
1679
1794
|
onChange: (e) => handleDateChange("end", e.target.value)
|
|
1680
1795
|
}
|
|
1681
|
-
)))), getDurationText() && /* @__PURE__ */
|
|
1796
|
+
)))), getDurationText() && /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs font-medium px-3 py-1 rounded-full bg-primary/10 text-primary" }, getDurationText())), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Bell, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, "Reminders")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1682
1797
|
"button",
|
|
1683
1798
|
{
|
|
1684
1799
|
type: "button",
|
|
1685
1800
|
onClick: () => setIsReminderDropdownOpen(!isReminderDropdownOpen),
|
|
1686
1801
|
className: "flex items-center gap-1 text-xs font-medium text-primary hover:text-primary/80 transition-colors"
|
|
1687
1802
|
},
|
|
1688
|
-
/* @__PURE__ */
|
|
1803
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Plus, { className: "w-3.5 h-3.5" }),
|
|
1689
1804
|
"Add"
|
|
1690
|
-
), isReminderDropdownOpen && /* @__PURE__ */
|
|
1805
|
+
), isReminderDropdownOpen && /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsReminderDropdownOpen(false) }), /* @__PURE__ */ import_react14.default.createElement("div", { className: "absolute right-0 top-full mt-1 w-48 bg-background border border-border rounded-xl shadow-xl z-50 py-1 max-h-60 overflow-y-auto" }, REMINDER_OPTIONS.map((option) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1691
1806
|
"button",
|
|
1692
1807
|
{
|
|
1693
1808
|
key: option.value,
|
|
@@ -1696,58 +1811,58 @@ var EventModal = ({
|
|
|
1696
1811
|
className: "w-full px-3 py-2 text-left text-sm hover:bg-accent transition-colors"
|
|
1697
1812
|
},
|
|
1698
1813
|
option.label
|
|
1699
|
-
)))))), formData.reminders && formData.reminders.length > 0 && /* @__PURE__ */
|
|
1814
|
+
)))))), formData.reminders && formData.reminders.length > 0 && /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-wrap gap-2" }, formData.reminders.map((reminder) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1700
1815
|
"div",
|
|
1701
1816
|
{
|
|
1702
1817
|
key: reminder.id,
|
|
1703
1818
|
className: "flex items-center gap-2 px-3 py-1.5 rounded-full bg-amber-500/10 border border-amber-500/20"
|
|
1704
1819
|
},
|
|
1705
|
-
/* @__PURE__ */
|
|
1706
|
-
/* @__PURE__ */
|
|
1707
|
-
/* @__PURE__ */
|
|
1820
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.BellRing, { className: "w-3.5 h-3.5 text-amber-500" }),
|
|
1821
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs font-medium text-amber-600 dark:text-amber-400" }, reminder.label),
|
|
1822
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1708
1823
|
"button",
|
|
1709
1824
|
{
|
|
1710
1825
|
type: "button",
|
|
1711
1826
|
onClick: () => removeReminder(reminder.id),
|
|
1712
1827
|
className: "p-0.5 hover:bg-amber-500/20 rounded-full transition-colors"
|
|
1713
1828
|
},
|
|
1714
|
-
/* @__PURE__ */
|
|
1829
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-3 h-3 text-amber-500" })
|
|
1715
1830
|
)
|
|
1716
|
-
)))), /* @__PURE__ */
|
|
1831
|
+
)))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Users, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, "Guests")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1717
1832
|
"button",
|
|
1718
1833
|
{
|
|
1719
1834
|
type: "button",
|
|
1720
1835
|
onClick: () => setIsGuestsDropdownOpen(!isGuestsDropdownOpen),
|
|
1721
1836
|
className: "w-full flex items-center justify-between px-4 py-3 bg-muted/20 border border-border/30 rounded-xl text-sm text-left hover:bg-muted/30 transition-all"
|
|
1722
1837
|
},
|
|
1723
|
-
/* @__PURE__ */
|
|
1724
|
-
/* @__PURE__ */
|
|
1725
|
-
), isGuestsDropdownOpen && /* @__PURE__ */
|
|
1838
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: selectedGuests.length > 0 ? "text-foreground font-medium" : "text-muted-foreground" }, selectedGuests.length > 0 ? `${selectedGuests.length} guest${selectedGuests.length > 1 ? "s" : ""} added` : "Add guests"),
|
|
1839
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.ChevronDown, { className: cn("w-4 h-4 text-muted-foreground transition-transform", isGuestsDropdownOpen && "rotate-180") })
|
|
1840
|
+
), isGuestsDropdownOpen && /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsGuestsDropdownOpen(false) }), /* @__PURE__ */ import_react14.default.createElement("div", { className: "absolute z-50 w-full mt-2 bg-background border border-border rounded-xl shadow-xl max-h-48 overflow-y-auto" }, fakeGuests.map((email) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1726
1841
|
"div",
|
|
1727
1842
|
{
|
|
1728
1843
|
key: email,
|
|
1729
1844
|
className: "px-4 py-3 hover:bg-accent cursor-pointer flex items-center gap-3 transition-colors",
|
|
1730
1845
|
onClick: () => toggleGuest(email)
|
|
1731
1846
|
},
|
|
1732
|
-
/* @__PURE__ */
|
|
1847
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: cn(
|
|
1733
1848
|
"w-5 h-5 rounded-md border-2 flex items-center justify-center transition-all",
|
|
1734
1849
|
selectedGuests.includes(email) ? "bg-primary border-primary" : "border-border"
|
|
1735
|
-
) }, selectedGuests.includes(email) && /* @__PURE__ */
|
|
1736
|
-
/* @__PURE__ */
|
|
1850
|
+
) }, selectedGuests.includes(email) && /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Check, { className: "w-3 h-3 text-primary-foreground" })),
|
|
1851
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1737
1852
|
"div",
|
|
1738
1853
|
{
|
|
1739
1854
|
className: "w-7 h-7 rounded-full flex items-center justify-center text-xs font-semibold text-white",
|
|
1740
1855
|
style: { backgroundColor: `hsl(${fakeGuests.indexOf(email) * 60}, 70%, 50%)` }
|
|
1741
1856
|
},
|
|
1742
1857
|
email[0].toUpperCase()
|
|
1743
|
-
), /* @__PURE__ */
|
|
1744
|
-
))))), selectedGuests.length > 0 && /* @__PURE__ */
|
|
1858
|
+
), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm" }, email))
|
|
1859
|
+
))))), selectedGuests.length > 0 && /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex flex-wrap gap-2 mt-2" }, selectedGuests.map((email) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1745
1860
|
"div",
|
|
1746
1861
|
{
|
|
1747
1862
|
key: email,
|
|
1748
1863
|
className: "flex items-center gap-2 pl-1 pr-2 py-1 bg-muted/30 border border-border/30 rounded-full"
|
|
1749
1864
|
},
|
|
1750
|
-
/* @__PURE__ */
|
|
1865
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1751
1866
|
"div",
|
|
1752
1867
|
{
|
|
1753
1868
|
className: "w-6 h-6 rounded-full flex items-center justify-center text-xs font-semibold text-white",
|
|
@@ -1755,17 +1870,17 @@ var EventModal = ({
|
|
|
1755
1870
|
},
|
|
1756
1871
|
email[0].toUpperCase()
|
|
1757
1872
|
),
|
|
1758
|
-
/* @__PURE__ */
|
|
1759
|
-
/* @__PURE__ */
|
|
1873
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs font-medium text-foreground" }, email.split("@")[0]),
|
|
1874
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1760
1875
|
"button",
|
|
1761
1876
|
{
|
|
1762
1877
|
type: "button",
|
|
1763
1878
|
onClick: () => toggleGuest(email),
|
|
1764
1879
|
className: "p-0.5 hover:bg-destructive/10 rounded-full transition-colors"
|
|
1765
1880
|
},
|
|
1766
|
-
/* @__PURE__ */
|
|
1881
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-3 h-3 text-muted-foreground" })
|
|
1767
1882
|
)
|
|
1768
|
-
)))), /* @__PURE__ */
|
|
1883
|
+
)))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-3 p-3 rounded-xl bg-muted/20 border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.MapPin, { className: "w-5 h-5 text-muted-foreground shrink-0" }), /* @__PURE__ */ import_react14.default.createElement(
|
|
1769
1884
|
"input",
|
|
1770
1885
|
{
|
|
1771
1886
|
type: "text",
|
|
@@ -1774,7 +1889,7 @@ var EventModal = ({
|
|
|
1774
1889
|
value: formData.location || "",
|
|
1775
1890
|
onChange: (e) => setFormData({ ...formData, location: e.target.value })
|
|
1776
1891
|
}
|
|
1777
|
-
)), /* @__PURE__ */
|
|
1892
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.AlignLeft, { className: "w-4 h-4 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm font-medium text-foreground" }, "Notes")), /* @__PURE__ */ import_react14.default.createElement(
|
|
1778
1893
|
"textarea",
|
|
1779
1894
|
{
|
|
1780
1895
|
className: "w-full bg-muted/20 border border-border/30 rounded-xl px-4 py-3 text-sm min-h-[100px] resize-none text-foreground placeholder-muted-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 transition-all",
|
|
@@ -1782,7 +1897,7 @@ var EventModal = ({
|
|
|
1782
1897
|
value: formData.description || "",
|
|
1783
1898
|
onChange: (e) => setFormData({ ...formData, description: e.target.value })
|
|
1784
1899
|
}
|
|
1785
|
-
)), /* @__PURE__ */
|
|
1900
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-3 p-3 rounded-xl bg-muted/20 border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Repeat, { className: "w-5 h-5 text-muted-foreground shrink-0" }), /* @__PURE__ */ import_react14.default.createElement(
|
|
1786
1901
|
"select",
|
|
1787
1902
|
{
|
|
1788
1903
|
className: "flex-1 bg-transparent text-sm text-foreground focus:outline-none cursor-pointer",
|
|
@@ -1801,28 +1916,28 @@ var EventModal = ({
|
|
|
1801
1916
|
}
|
|
1802
1917
|
}
|
|
1803
1918
|
},
|
|
1804
|
-
/* @__PURE__ */
|
|
1805
|
-
/* @__PURE__ */
|
|
1806
|
-
/* @__PURE__ */
|
|
1807
|
-
/* @__PURE__ */
|
|
1808
|
-
/* @__PURE__ */
|
|
1809
|
-
)), /* @__PURE__ */
|
|
1919
|
+
/* @__PURE__ */ import_react14.default.createElement("option", { value: "" }, "Does not repeat"),
|
|
1920
|
+
/* @__PURE__ */ import_react14.default.createElement("option", { value: "DAILY" }, "Daily"),
|
|
1921
|
+
/* @__PURE__ */ import_react14.default.createElement("option", { value: "WEEKLY" }, "Weekly"),
|
|
1922
|
+
/* @__PURE__ */ import_react14.default.createElement("option", { value: "MONTHLY" }, "Monthly"),
|
|
1923
|
+
/* @__PURE__ */ import_react14.default.createElement("option", { value: "YEARLY" }, "Yearly")
|
|
1924
|
+
)), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center justify-between p-3 rounded-xl bg-muted/20 border border-border/30" }, /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Tag, { className: "w-5 h-5 text-muted-foreground" }), /* @__PURE__ */ import_react14.default.createElement("span", { className: "text-sm text-foreground" }, "Calendar")), /* @__PURE__ */ import_react14.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1810
1925
|
"button",
|
|
1811
1926
|
{
|
|
1812
1927
|
type: "button",
|
|
1813
1928
|
onClick: () => setIsCalendarDropdownOpen(!isCalendarDropdownOpen),
|
|
1814
1929
|
className: "flex items-center gap-2 px-3 py-1.5 bg-background border border-border/50 rounded-lg text-sm hover:bg-accent/50 transition-all"
|
|
1815
1930
|
},
|
|
1816
|
-
/* @__PURE__ */
|
|
1931
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1817
1932
|
"div",
|
|
1818
1933
|
{
|
|
1819
1934
|
className: "w-3 h-3 rounded-full",
|
|
1820
1935
|
style: { backgroundColor: calendars?.find((c) => c.id === formData.calendarId)?.color || "#3b82f6" }
|
|
1821
1936
|
}
|
|
1822
1937
|
),
|
|
1823
|
-
/* @__PURE__ */
|
|
1824
|
-
/* @__PURE__ */
|
|
1825
|
-
), isCalendarDropdownOpen && /* @__PURE__ */
|
|
1938
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: "font-medium" }, calendars?.find((c) => c.id === formData.calendarId)?.label || "Select"),
|
|
1939
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.ChevronDown, { className: "w-3.5 h-3.5 text-muted-foreground" })
|
|
1940
|
+
), isCalendarDropdownOpen && /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => setIsCalendarDropdownOpen(false) }), /* @__PURE__ */ import_react14.default.createElement("div", { className: "absolute right-0 bottom-full mb-2 w-48 bg-background border border-border rounded-xl shadow-xl z-50 py-1" }, calendars?.map((cal) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1826
1941
|
"button",
|
|
1827
1942
|
{
|
|
1828
1943
|
key: cal.id,
|
|
@@ -1837,19 +1952,19 @@ var EventModal = ({
|
|
|
1837
1952
|
setIsCalendarDropdownOpen(false);
|
|
1838
1953
|
}
|
|
1839
1954
|
},
|
|
1840
|
-
/* @__PURE__ */
|
|
1841
|
-
/* @__PURE__ */
|
|
1842
|
-
formData.calendarId === cal.id && /* @__PURE__ */
|
|
1843
|
-
)))))))), /* @__PURE__ */
|
|
1955
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: "w-3 h-3 rounded-full", style: { backgroundColor: cal.color } }),
|
|
1956
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: "flex-1 text-sm" }, cal.label),
|
|
1957
|
+
formData.calendarId === cal.id && /* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Check, { className: "w-4 h-4 text-primary" })
|
|
1958
|
+
)))))))), /* @__PURE__ */ import_react14.default.createElement("div", { className: "px-5 py-4 border-t border-border/50 flex items-center justify-between bg-muted/10 shrink-0" }, mode === "edit" && /* @__PURE__ */ import_react14.default.createElement(
|
|
1844
1959
|
"button",
|
|
1845
1960
|
{
|
|
1846
1961
|
type: "button",
|
|
1847
1962
|
onClick: handleDelete,
|
|
1848
1963
|
className: "flex items-center gap-2 px-4 py-2 text-destructive hover:bg-destructive/10 rounded-xl transition-all text-sm font-medium"
|
|
1849
1964
|
},
|
|
1850
|
-
/* @__PURE__ */
|
|
1965
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Trash2, { className: "w-4 h-4" }),
|
|
1851
1966
|
"Delete"
|
|
1852
|
-
), mode === "create" && /* @__PURE__ */
|
|
1967
|
+
), mode === "create" && /* @__PURE__ */ import_react14.default.createElement("div", null), /* @__PURE__ */ import_react14.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1853
1968
|
"button",
|
|
1854
1969
|
{
|
|
1855
1970
|
type: "button",
|
|
@@ -1857,7 +1972,7 @@ var EventModal = ({
|
|
|
1857
1972
|
className: "px-4 py-2.5 text-muted-foreground hover:text-foreground font-medium text-sm rounded-xl transition-all hover:bg-accent"
|
|
1858
1973
|
},
|
|
1859
1974
|
"Cancel"
|
|
1860
|
-
), /* @__PURE__ */
|
|
1975
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1861
1976
|
"button",
|
|
1862
1977
|
{
|
|
1863
1978
|
type: "submit",
|
|
@@ -1865,8 +1980,8 @@ var EventModal = ({
|
|
|
1865
1980
|
},
|
|
1866
1981
|
mode === "edit" ? "Save Changes" : "Create Event"
|
|
1867
1982
|
))));
|
|
1868
|
-
return /* @__PURE__ */
|
|
1869
|
-
|
|
1983
|
+
return /* @__PURE__ */ import_react14.default.createElement(Modal, { isOpen, onClose, hideHeader: true, className: "p-0 overflow-hidden max-w-lg rounded-2xl shadow-2xl" }, /* @__PURE__ */ import_react14.default.createElement(import_framer_motion2.AnimatePresence, { mode: "wait" }, mode === "view" && event ? /* @__PURE__ */ import_react14.default.createElement(
|
|
1984
|
+
import_framer_motion2.motion.div,
|
|
1870
1985
|
{
|
|
1871
1986
|
key: "view",
|
|
1872
1987
|
initial: { opacity: 0 },
|
|
@@ -1875,8 +1990,8 @@ var EventModal = ({
|
|
|
1875
1990
|
transition: { duration: 0.15 }
|
|
1876
1991
|
},
|
|
1877
1992
|
renderViewMode()
|
|
1878
|
-
) : /* @__PURE__ */
|
|
1879
|
-
|
|
1993
|
+
) : /* @__PURE__ */ import_react14.default.createElement(
|
|
1994
|
+
import_framer_motion2.motion.div,
|
|
1880
1995
|
{
|
|
1881
1996
|
key: "edit",
|
|
1882
1997
|
initial: { opacity: 0 },
|
|
@@ -1887,9 +2002,12 @@ var EventModal = ({
|
|
|
1887
2002
|
renderEditMode()
|
|
1888
2003
|
)));
|
|
1889
2004
|
};
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
var
|
|
2005
|
+
|
|
2006
|
+
// src/components/Skeleton.tsx
|
|
2007
|
+
var import_react15 = __toESM(require("react"));
|
|
2008
|
+
var Skeleton = ({ className, style }) => /* @__PURE__ */ import_react15.default.createElement("div", { className: cn("animate-pulse bg-muted/40 rounded", className), style });
|
|
2009
|
+
var MonthViewSkeleton = () => /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-full bg-background border border-border/50 rounded-2xl overflow-hidden" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "grid grid-cols-7 border-b border-border/50 bg-muted/10" }, Array.from({ length: 7 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "py-3 px-2 text-center border-r border-border/30 last:border-r-0" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-4 w-8 mx-auto" })))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "grid grid-cols-7 flex-1" }, Array.from({ length: 35 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "min-h-[120px] border-r border-b border-border/30 p-2" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-4 w-6 mb-2" }), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-1" }, Math.random() > 0.5 && /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-5 w-full rounded-md" }), Math.random() > 0.7 && /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-5 w-3/4 rounded-md" }))))));
|
|
2010
|
+
var WeekViewSkeleton = () => /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-full bg-background border border-border/50 rounded-2xl overflow-hidden" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex border-b border-border/50 bg-muted/10" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "w-16 p-3 border-r border-border/30" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-8 w-10 mx-auto" })), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex-1 grid grid-cols-7" }, Array.from({ length: 7 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "py-3 px-2 text-center border-r border-border/30 last:border-r-0" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-3 w-8 mx-auto mb-1" }), /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-8 w-8 mx-auto rounded-xl" }))))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-1", style: { height: "600px" } }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "w-16 border-r border-border/30" }, Array.from({ length: 10 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "h-[60px] relative" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-4 w-10 absolute right-2 -translate-y-1/2" })))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex-1 grid grid-cols-7 relative" }, Array.from({ length: 7 }).map((_, colIdx) => /* @__PURE__ */ import_react15.default.createElement("div", { key: colIdx, className: "relative border-r border-border/30 last:border-r-0" }, Array.from({ length: 10 }).map((_2, rowIdx) => /* @__PURE__ */ import_react15.default.createElement("div", { key: rowIdx, className: "h-[60px] border-b border-dashed border-border/20" })), Math.random() > 0.3 && /* @__PURE__ */ import_react15.default.createElement(
|
|
1893
2011
|
Skeleton,
|
|
1894
2012
|
{
|
|
1895
2013
|
className: "absolute rounded-md",
|
|
@@ -1901,20 +2019,25 @@ var WeekViewSkeleton = () => /* @__PURE__ */ React15__namespace.default.createEl
|
|
|
1901
2019
|
}
|
|
1902
2020
|
}
|
|
1903
2021
|
))))));
|
|
1904
|
-
var DayViewSkeleton = () => /* @__PURE__ */
|
|
2022
|
+
var DayViewSkeleton = () => /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-full bg-background border border-border/50 rounded-2xl overflow-hidden" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "px-6 py-4 border-b border-border/50 bg-muted/10 text-center" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-7 w-64 mx-auto" })), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex flex-1", style: { height: "600px" } }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "w-20 border-r border-border/30 bg-muted/5" }, Array.from({ length: 10 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "h-[80px] relative" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-4 w-12 absolute left-1/2 -translate-x-1/2 -translate-y-1/2" })))), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex-1 relative" }, Array.from({ length: 10 }).map((_, i) => /* @__PURE__ */ import_react15.default.createElement("div", { key: i, className: "h-[80px] border-b border-dashed border-border/20" })), /* @__PURE__ */ import_react15.default.createElement(
|
|
1905
2023
|
Skeleton,
|
|
1906
2024
|
{
|
|
1907
2025
|
className: "absolute rounded-lg left-4 right-4",
|
|
1908
2026
|
style: { top: "160px", height: "120px" }
|
|
1909
2027
|
}
|
|
1910
|
-
), /* @__PURE__ */
|
|
2028
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
1911
2029
|
Skeleton,
|
|
1912
2030
|
{
|
|
1913
2031
|
className: "absolute rounded-lg left-4 right-4",
|
|
1914
2032
|
style: { top: "400px", height: "80px" }
|
|
1915
2033
|
}
|
|
1916
2034
|
))));
|
|
1917
|
-
var AgendaViewSkeleton = () => /* @__PURE__ */
|
|
2035
|
+
var AgendaViewSkeleton = () => /* @__PURE__ */ import_react15.default.createElement("div", { className: "h-full bg-background border border-border/50 rounded-2xl overflow-hidden p-6" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-6" }, Array.from({ length: 4 }).map((_, dayIdx) => /* @__PURE__ */ import_react15.default.createElement("div", { key: dayIdx }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-5 w-40 mb-4" }), /* @__PURE__ */ import_react15.default.createElement("div", { className: "space-y-3" }, Array.from({ length: 2 + Math.floor(Math.random() * 3) }).map((_2, eventIdx) => /* @__PURE__ */ import_react15.default.createElement("div", { key: eventIdx, className: "flex items-center gap-4 p-3 rounded-xl bg-muted/10" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-10 w-10 rounded-lg" }), /* @__PURE__ */ import_react15.default.createElement("div", { className: "flex-1 space-y-2" }, /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-4 w-3/4" }), /* @__PURE__ */ import_react15.default.createElement(Skeleton, { className: "h-3 w-1/2" })))))))));
|
|
2036
|
+
|
|
2037
|
+
// src/components/ContextMenu.tsx
|
|
2038
|
+
var import_react16 = __toESM(require("react"));
|
|
2039
|
+
var import_lucide_react8 = require("lucide-react");
|
|
2040
|
+
var import_framer_motion3 = require("framer-motion");
|
|
1918
2041
|
var EventContextMenu = ({
|
|
1919
2042
|
event,
|
|
1920
2043
|
position,
|
|
@@ -1925,8 +2048,8 @@ var EventContextMenu = ({
|
|
|
1925
2048
|
customActions = [],
|
|
1926
2049
|
translations
|
|
1927
2050
|
}) => {
|
|
1928
|
-
const menuRef =
|
|
1929
|
-
|
|
2051
|
+
const menuRef = (0, import_react16.useRef)(null);
|
|
2052
|
+
(0, import_react16.useEffect)(() => {
|
|
1930
2053
|
const handleKeyDown = (e) => {
|
|
1931
2054
|
if (e.key === "Escape") {
|
|
1932
2055
|
onClose();
|
|
@@ -1937,7 +2060,7 @@ var EventContextMenu = ({
|
|
|
1937
2060
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
1938
2061
|
}
|
|
1939
2062
|
}, [position, onClose]);
|
|
1940
|
-
|
|
2063
|
+
(0, import_react16.useEffect)(() => {
|
|
1941
2064
|
const handleClickOutside = (e) => {
|
|
1942
2065
|
if (menuRef.current && !menuRef.current.contains(e.target)) {
|
|
1943
2066
|
onClose();
|
|
@@ -1955,7 +2078,7 @@ var EventContextMenu = ({
|
|
|
1955
2078
|
...onEdit ? [{
|
|
1956
2079
|
id: "edit",
|
|
1957
2080
|
label: translations?.edit || "Edit",
|
|
1958
|
-
icon: /* @__PURE__ */
|
|
2081
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Edit3, { className: "w-4 h-4" }),
|
|
1959
2082
|
onClick: () => {
|
|
1960
2083
|
onEdit(event);
|
|
1961
2084
|
onClose();
|
|
@@ -1964,7 +2087,7 @@ var EventContextMenu = ({
|
|
|
1964
2087
|
...onDuplicate ? [{
|
|
1965
2088
|
id: "duplicate",
|
|
1966
2089
|
label: translations?.duplicate || "Duplicate",
|
|
1967
|
-
icon: /* @__PURE__ */
|
|
2090
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Copy, { className: "w-4 h-4" }),
|
|
1968
2091
|
onClick: () => {
|
|
1969
2092
|
onDuplicate(event);
|
|
1970
2093
|
onClose();
|
|
@@ -1974,7 +2097,7 @@ var EventContextMenu = ({
|
|
|
1974
2097
|
...onDelete ? [{
|
|
1975
2098
|
id: "delete",
|
|
1976
2099
|
label: translations?.delete || "Delete",
|
|
1977
|
-
icon: /* @__PURE__ */
|
|
2100
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Trash2, { className: "w-4 h-4" }),
|
|
1978
2101
|
onClick: () => {
|
|
1979
2102
|
onDelete(event.id);
|
|
1980
2103
|
onClose();
|
|
@@ -1986,8 +2109,8 @@ var EventContextMenu = ({
|
|
|
1986
2109
|
x: Math.min(position.x, window.innerWidth - 200),
|
|
1987
2110
|
y: Math.min(position.y, window.innerHeight - (actions.length * 44 + 80))
|
|
1988
2111
|
};
|
|
1989
|
-
return /* @__PURE__ */
|
|
1990
|
-
|
|
2112
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_framer_motion3.AnimatePresence, null, /* @__PURE__ */ import_react16.default.createElement(
|
|
2113
|
+
import_framer_motion3.motion.div,
|
|
1991
2114
|
{
|
|
1992
2115
|
ref: menuRef,
|
|
1993
2116
|
initial: { opacity: 0, scale: 0.95, y: -5 },
|
|
@@ -2000,14 +2123,14 @@ var EventContextMenu = ({
|
|
|
2000
2123
|
top: adjustedPosition.y
|
|
2001
2124
|
}
|
|
2002
2125
|
},
|
|
2003
|
-
/* @__PURE__ */
|
|
2126
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "px-3 py-2 border-b-[0.5px] border-border bg-muted/30" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
2004
2127
|
"div",
|
|
2005
2128
|
{
|
|
2006
2129
|
className: "w-2.5 h-2.5 rounded-full shrink-0",
|
|
2007
2130
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
2008
2131
|
}
|
|
2009
|
-
), /* @__PURE__ */
|
|
2010
|
-
/* @__PURE__ */
|
|
2132
|
+
), /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-sm font-medium truncate text-foreground" }, event.title))),
|
|
2133
|
+
/* @__PURE__ */ import_react16.default.createElement("div", { className: "py-1" }, actions.map((action, index) => /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, { key: action.id }, index > 0 && action.variant === "danger" && /* @__PURE__ */ import_react16.default.createElement("div", { className: "h-px bg-border my-1" }), /* @__PURE__ */ import_react16.default.createElement(
|
|
2011
2134
|
"button",
|
|
2012
2135
|
{
|
|
2013
2136
|
onClick: action.onClick,
|
|
@@ -2019,13 +2142,13 @@ var EventContextMenu = ({
|
|
|
2019
2142
|
)
|
|
2020
2143
|
},
|
|
2021
2144
|
action.icon,
|
|
2022
|
-
/* @__PURE__ */
|
|
2145
|
+
/* @__PURE__ */ import_react16.default.createElement("span", null, action.label)
|
|
2023
2146
|
))))
|
|
2024
2147
|
));
|
|
2025
2148
|
};
|
|
2026
2149
|
var useEventContextMenu = () => {
|
|
2027
|
-
const [contextMenu, setContextMenu] =
|
|
2028
|
-
const openContextMenu =
|
|
2150
|
+
const [contextMenu, setContextMenu] = (0, import_react16.useState)({ event: null, position: null });
|
|
2151
|
+
const openContextMenu = (0, import_react16.useCallback)((event, e) => {
|
|
2029
2152
|
e.preventDefault();
|
|
2030
2153
|
e.stopPropagation();
|
|
2031
2154
|
setContextMenu({
|
|
@@ -2033,7 +2156,7 @@ var useEventContextMenu = () => {
|
|
|
2033
2156
|
position: { x: e.clientX, y: e.clientY }
|
|
2034
2157
|
});
|
|
2035
2158
|
}, []);
|
|
2036
|
-
const closeContextMenu =
|
|
2159
|
+
const closeContextMenu = (0, import_react16.useCallback)(() => {
|
|
2037
2160
|
setContextMenu({ event: null, position: null });
|
|
2038
2161
|
}, []);
|
|
2039
2162
|
return {
|
|
@@ -2044,6 +2167,146 @@ var useEventContextMenu = () => {
|
|
|
2044
2167
|
};
|
|
2045
2168
|
};
|
|
2046
2169
|
|
|
2170
|
+
// src/locales/index.ts
|
|
2171
|
+
var en = {
|
|
2172
|
+
today: "Today",
|
|
2173
|
+
month: "Month",
|
|
2174
|
+
week: "Week",
|
|
2175
|
+
day: "Day",
|
|
2176
|
+
agenda: "Agenda",
|
|
2177
|
+
resource: "Resources",
|
|
2178
|
+
createEvent: "Create Event",
|
|
2179
|
+
editEvent: "Edit Event",
|
|
2180
|
+
delete: "Delete",
|
|
2181
|
+
save: "Save",
|
|
2182
|
+
cancel: "Cancel",
|
|
2183
|
+
title: "Add title",
|
|
2184
|
+
start: "Start",
|
|
2185
|
+
end: "End",
|
|
2186
|
+
allDay: "All Day",
|
|
2187
|
+
description: "Description",
|
|
2188
|
+
repeat: "Repeat",
|
|
2189
|
+
noRepeat: "Does not repeat",
|
|
2190
|
+
selectCalendar: "Select Calendar",
|
|
2191
|
+
selectType: "Select Type",
|
|
2192
|
+
daily: "Daily",
|
|
2193
|
+
weekly: "Weekly",
|
|
2194
|
+
monthly: "Monthly",
|
|
2195
|
+
yearly: "Yearly",
|
|
2196
|
+
search: "Search events...",
|
|
2197
|
+
allTypes: "All Types",
|
|
2198
|
+
timezone: "Time zone",
|
|
2199
|
+
localTime: "Local Time",
|
|
2200
|
+
create: "Create",
|
|
2201
|
+
calendars: "Calendars",
|
|
2202
|
+
event: "Event",
|
|
2203
|
+
task: "Task",
|
|
2204
|
+
appointmentSchedule: "Appointment schedule",
|
|
2205
|
+
new: "New",
|
|
2206
|
+
dateAndTime: "Date & Time",
|
|
2207
|
+
whosJoining: "Who's joining?",
|
|
2208
|
+
suggestedTimes: "Suggested times for guests",
|
|
2209
|
+
viewSuggestions: "View suggestions",
|
|
2210
|
+
whereWillItBe: "Where will it be?",
|
|
2211
|
+
location: "Enter address",
|
|
2212
|
+
descriptionAndAttachments: "Description",
|
|
2213
|
+
dragAndDrop: "Drag & drop files or",
|
|
2214
|
+
guests: "Guests",
|
|
2215
|
+
addGuests: "Add guests",
|
|
2216
|
+
addAttachment: "Upload files",
|
|
2217
|
+
moreOptions: "More options",
|
|
2218
|
+
doesNotRepeat: "Does not repeat",
|
|
2219
|
+
locationHelpText: 'Enter a physical address (e.g. "123 Main St") to generate the map.',
|
|
2220
|
+
notes: "Notes...",
|
|
2221
|
+
guestCount: "guest",
|
|
2222
|
+
guestsCount: "guests",
|
|
2223
|
+
repeatFor: "Repeat for",
|
|
2224
|
+
times: "times",
|
|
2225
|
+
until: "Until",
|
|
2226
|
+
endRepeat: "End repeat",
|
|
2227
|
+
never: "Never",
|
|
2228
|
+
afterOccurrences: "After occurrences",
|
|
2229
|
+
onDate: "On date",
|
|
2230
|
+
tomorrow: "Tomorrow",
|
|
2231
|
+
edit: "Edit",
|
|
2232
|
+
duplicate: "Duplicate",
|
|
2233
|
+
eventSingular: "event",
|
|
2234
|
+
eventPlural: "events",
|
|
2235
|
+
allCaughtUp: "All caught up!",
|
|
2236
|
+
noEventsScheduled: "No events scheduled",
|
|
2237
|
+
noUpcoming: "Your schedule is clear",
|
|
2238
|
+
noUpcomingHint: "No upcoming events to show. Create a new event to start planning."
|
|
2239
|
+
};
|
|
2240
|
+
var fr = {
|
|
2241
|
+
today: "Aujourd'hui",
|
|
2242
|
+
month: "Mois",
|
|
2243
|
+
week: "Semaine",
|
|
2244
|
+
day: "Jour",
|
|
2245
|
+
agenda: "Agenda",
|
|
2246
|
+
resource: "Ressources",
|
|
2247
|
+
createEvent: "Cr\xE9er un \xE9v\xE9nement",
|
|
2248
|
+
editEvent: "Modifier l'\xE9v\xE9nement",
|
|
2249
|
+
delete: "Supprimer",
|
|
2250
|
+
save: "Enregistrer",
|
|
2251
|
+
cancel: "Annuler",
|
|
2252
|
+
title: "Ajouter un titre",
|
|
2253
|
+
start: "D\xE9but",
|
|
2254
|
+
end: "Fin",
|
|
2255
|
+
allDay: "Toute la journ\xE9e",
|
|
2256
|
+
description: "Description",
|
|
2257
|
+
repeat: "R\xE9p\xE9ter",
|
|
2258
|
+
noRepeat: "Ne se r\xE9p\xE8te pas",
|
|
2259
|
+
selectCalendar: "S\xE9lectionner un calendrier",
|
|
2260
|
+
selectType: "S\xE9lectionner un type",
|
|
2261
|
+
daily: "Quotidien",
|
|
2262
|
+
weekly: "Hebdomadaire",
|
|
2263
|
+
monthly: "Mensuel",
|
|
2264
|
+
yearly: "Annuel",
|
|
2265
|
+
search: "Rechercher...",
|
|
2266
|
+
allTypes: "Tous les types",
|
|
2267
|
+
timezone: "Fuseau horaire",
|
|
2268
|
+
localTime: "Heure locale",
|
|
2269
|
+
create: "Cr\xE9er",
|
|
2270
|
+
calendars: "Calendriers",
|
|
2271
|
+
event: "\xC9v\xE9nement",
|
|
2272
|
+
task: "T\xE2che",
|
|
2273
|
+
appointmentSchedule: "Planning de rendez-vous",
|
|
2274
|
+
new: "Nouveau",
|
|
2275
|
+
dateAndTime: "Date et heure",
|
|
2276
|
+
whosJoining: "Qui participe ?",
|
|
2277
|
+
suggestedTimes: "Horaires sugg\xE9r\xE9s",
|
|
2278
|
+
viewSuggestions: "Voir les suggestions",
|
|
2279
|
+
whereWillItBe: "O\xF9 aura lieu ?",
|
|
2280
|
+
location: "Entrer une adresse",
|
|
2281
|
+
descriptionAndAttachments: "Description",
|
|
2282
|
+
dragAndDrop: "Glisser-d\xE9poser des fichiers ou",
|
|
2283
|
+
guests: "Invit\xE9s",
|
|
2284
|
+
addGuests: "Ajouter des invit\xE9s",
|
|
2285
|
+
addAttachment: "T\xE9l\xE9charger des fichiers",
|
|
2286
|
+
moreOptions: "Plus d'options",
|
|
2287
|
+
doesNotRepeat: "Ne se r\xE9p\xE8te pas",
|
|
2288
|
+
locationHelpText: 'Entrez une adresse physique (ex: "123 Rue Principale") pour g\xE9n\xE9rer la carte.',
|
|
2289
|
+
notes: "Notes...",
|
|
2290
|
+
guestCount: "invit\xE9",
|
|
2291
|
+
guestsCount: "invit\xE9s",
|
|
2292
|
+
repeatFor: "R\xE9p\xE9ter pendant",
|
|
2293
|
+
times: "fois",
|
|
2294
|
+
until: "Jusqu'au",
|
|
2295
|
+
endRepeat: "Fin de r\xE9p\xE9tition",
|
|
2296
|
+
never: "Jamais",
|
|
2297
|
+
afterOccurrences: "Apr\xE8s occurrences",
|
|
2298
|
+
onDate: "\xC0 la date",
|
|
2299
|
+
tomorrow: "Demain",
|
|
2300
|
+
edit: "Modifier",
|
|
2301
|
+
duplicate: "Dupliquer",
|
|
2302
|
+
eventSingular: "\xE9v\xE9nement",
|
|
2303
|
+
eventPlural: "\xE9v\xE9nements",
|
|
2304
|
+
allCaughtUp: "Tout est \xE0 jour !",
|
|
2305
|
+
noEventsScheduled: "Aucun \xE9v\xE9nement pr\xE9vu",
|
|
2306
|
+
noUpcoming: "Votre planning est libre",
|
|
2307
|
+
noUpcomingHint: "Aucun \xE9v\xE9nement \xE0 venir. Cr\xE9ez un nouvel \xE9v\xE9nement pour commencer \xE0 planifier."
|
|
2308
|
+
};
|
|
2309
|
+
|
|
2047
2310
|
// src/lib/theme.ts
|
|
2048
2311
|
function colorToHsl(color) {
|
|
2049
2312
|
let r = 0, g = 0, b = 0;
|
|
@@ -2069,7 +2332,7 @@ function colorToHsl(color) {
|
|
|
2069
2332
|
const min = Math.min(r, g, b);
|
|
2070
2333
|
let h = 0;
|
|
2071
2334
|
let s = 0;
|
|
2072
|
-
|
|
2335
|
+
const l = (max + min) / 2;
|
|
2073
2336
|
if (max !== min) {
|
|
2074
2337
|
const d = max - min;
|
|
2075
2338
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
@@ -2122,6 +2385,12 @@ function getThemeStyles(theme) {
|
|
|
2122
2385
|
}
|
|
2123
2386
|
return styles;
|
|
2124
2387
|
}
|
|
2388
|
+
|
|
2389
|
+
// src/hooks/useCalendarLogic.ts
|
|
2390
|
+
var import_react17 = require("react");
|
|
2391
|
+
var import_date_fns11 = require("date-fns");
|
|
2392
|
+
var import_date_fns_tz5 = require("date-fns-tz");
|
|
2393
|
+
var import_rrule = require("rrule");
|
|
2125
2394
|
var useCalendarLogic = ({
|
|
2126
2395
|
events,
|
|
2127
2396
|
view: controlledView,
|
|
@@ -2135,23 +2404,23 @@ var useCalendarLogic = ({
|
|
|
2135
2404
|
readOnly,
|
|
2136
2405
|
timezone
|
|
2137
2406
|
}) => {
|
|
2138
|
-
const [internalView, setInternalView] =
|
|
2139
|
-
const [internalDate, setInternalDate] =
|
|
2140
|
-
const [isSidebarOpen, setIsSidebarOpen] =
|
|
2141
|
-
const [isModalOpen, setIsModalOpen] =
|
|
2142
|
-
const [selectedEvent, setSelectedEvent] =
|
|
2143
|
-
const [modalInitialDate, setModalInitialDate] =
|
|
2407
|
+
const [internalView, setInternalView] = (0, import_react17.useState)("week");
|
|
2408
|
+
const [internalDate, setInternalDate] = (0, import_react17.useState)(/* @__PURE__ */ new Date());
|
|
2409
|
+
const [isSidebarOpen, setIsSidebarOpen] = (0, import_react17.useState)(true);
|
|
2410
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react17.useState)(false);
|
|
2411
|
+
const [selectedEvent, setSelectedEvent] = (0, import_react17.useState)(null);
|
|
2412
|
+
const [modalInitialDate, setModalInitialDate] = (0, import_react17.useState)(void 0);
|
|
2144
2413
|
const view = controlledView ?? internalView;
|
|
2145
2414
|
const currentDate = controlledDate ?? internalDate;
|
|
2146
|
-
const expandedEvents =
|
|
2415
|
+
const expandedEvents = (0, import_react17.useMemo)(() => {
|
|
2147
2416
|
const allEvents = [];
|
|
2148
|
-
const rangeStart =
|
|
2149
|
-
const rangeEnd =
|
|
2417
|
+
const rangeStart = (0, import_date_fns11.subDays)(currentDate, 365);
|
|
2418
|
+
const rangeEnd = (0, import_date_fns11.addDays)(currentDate, 365);
|
|
2150
2419
|
events.forEach((event) => {
|
|
2151
2420
|
if (event.recurrence) {
|
|
2152
2421
|
try {
|
|
2153
|
-
const rule = new
|
|
2154
|
-
freq:
|
|
2422
|
+
const rule = new import_rrule.RRule({
|
|
2423
|
+
freq: import_rrule.RRule[event.recurrence.freq],
|
|
2155
2424
|
interval: event.recurrence.interval || 1,
|
|
2156
2425
|
dtstart: new Date(event.start),
|
|
2157
2426
|
until: event.recurrence.until ? new Date(event.recurrence.until) : void 0,
|
|
@@ -2159,7 +2428,7 @@ var useCalendarLogic = ({
|
|
|
2159
2428
|
});
|
|
2160
2429
|
const dates = rule.between(rangeStart, rangeEnd);
|
|
2161
2430
|
dates.forEach((date) => {
|
|
2162
|
-
const duration =
|
|
2431
|
+
const duration = (0, import_date_fns11.differenceInMilliseconds)(new Date(event.end), new Date(event.start));
|
|
2163
2432
|
allEvents.push({
|
|
2164
2433
|
...event,
|
|
2165
2434
|
id: `${event.id}-${date.getTime()}`,
|
|
@@ -2197,34 +2466,34 @@ var useCalendarLogic = ({
|
|
|
2197
2466
|
const handlePrev = () => {
|
|
2198
2467
|
switch (view) {
|
|
2199
2468
|
case "month":
|
|
2200
|
-
handleDateChange(
|
|
2469
|
+
handleDateChange((0, import_date_fns11.subMonths)(currentDate, 1));
|
|
2201
2470
|
break;
|
|
2202
2471
|
case "week":
|
|
2203
|
-
handleDateChange(
|
|
2472
|
+
handleDateChange((0, import_date_fns11.subWeeks)(currentDate, 1));
|
|
2204
2473
|
break;
|
|
2205
2474
|
case "day":
|
|
2206
2475
|
case "resource":
|
|
2207
|
-
handleDateChange(
|
|
2476
|
+
handleDateChange((0, import_date_fns11.subDays)(currentDate, 1));
|
|
2208
2477
|
break;
|
|
2209
2478
|
case "agenda":
|
|
2210
|
-
handleDateChange(
|
|
2479
|
+
handleDateChange((0, import_date_fns11.subDays)(currentDate, 7));
|
|
2211
2480
|
break;
|
|
2212
2481
|
}
|
|
2213
2482
|
};
|
|
2214
2483
|
const handleNext = () => {
|
|
2215
2484
|
switch (view) {
|
|
2216
2485
|
case "month":
|
|
2217
|
-
handleDateChange(
|
|
2486
|
+
handleDateChange((0, import_date_fns11.addMonths)(currentDate, 1));
|
|
2218
2487
|
break;
|
|
2219
2488
|
case "week":
|
|
2220
|
-
handleDateChange(
|
|
2489
|
+
handleDateChange((0, import_date_fns11.addWeeks)(currentDate, 1));
|
|
2221
2490
|
break;
|
|
2222
2491
|
case "day":
|
|
2223
2492
|
case "resource":
|
|
2224
|
-
handleDateChange(
|
|
2493
|
+
handleDateChange((0, import_date_fns11.addDays)(currentDate, 1));
|
|
2225
2494
|
break;
|
|
2226
2495
|
case "agenda":
|
|
2227
|
-
handleDateChange(
|
|
2496
|
+
handleDateChange((0, import_date_fns11.addDays)(currentDate, 7));
|
|
2228
2497
|
break;
|
|
2229
2498
|
}
|
|
2230
2499
|
};
|
|
@@ -2292,17 +2561,17 @@ var useCalendarLogic = ({
|
|
|
2292
2561
|
if (!activeEvent || !overDate) return;
|
|
2293
2562
|
const originalStart = new Date(activeEvent.start);
|
|
2294
2563
|
const originalEnd = new Date(activeEvent.end);
|
|
2295
|
-
const duration =
|
|
2564
|
+
const duration = (0, import_date_fns11.differenceInMilliseconds)(originalEnd, originalStart);
|
|
2296
2565
|
let newStart;
|
|
2297
2566
|
if (view === "month") {
|
|
2298
2567
|
if (timezone) {
|
|
2299
|
-
const zonedOriginal =
|
|
2568
|
+
const zonedOriginal = (0, import_date_fns_tz5.toZonedTime)(originalStart, timezone);
|
|
2300
2569
|
const zonedNew = new Date(overDate);
|
|
2301
2570
|
zonedNew.setHours(zonedOriginal.getHours());
|
|
2302
2571
|
zonedNew.setMinutes(zonedOriginal.getMinutes());
|
|
2303
2572
|
zonedNew.setSeconds(zonedOriginal.getSeconds());
|
|
2304
2573
|
zonedNew.setMilliseconds(zonedOriginal.getMilliseconds());
|
|
2305
|
-
newStart =
|
|
2574
|
+
newStart = (0, import_date_fns_tz5.fromZonedTime)(zonedNew, timezone);
|
|
2306
2575
|
} else {
|
|
2307
2576
|
newStart = new Date(overDate);
|
|
2308
2577
|
newStart.setHours(originalStart.getHours());
|
|
@@ -2312,7 +2581,7 @@ var useCalendarLogic = ({
|
|
|
2312
2581
|
}
|
|
2313
2582
|
} else {
|
|
2314
2583
|
if (timezone) {
|
|
2315
|
-
newStart =
|
|
2584
|
+
newStart = (0, import_date_fns_tz5.fromZonedTime)(overDate, timezone);
|
|
2316
2585
|
} else {
|
|
2317
2586
|
newStart = new Date(overDate);
|
|
2318
2587
|
}
|
|
@@ -2361,6 +2630,12 @@ var useCalendarLogic = ({
|
|
|
2361
2630
|
handleDragEnd
|
|
2362
2631
|
};
|
|
2363
2632
|
};
|
|
2633
|
+
|
|
2634
|
+
// src/index.tsx
|
|
2635
|
+
var import_date_fns12 = require("date-fns");
|
|
2636
|
+
|
|
2637
|
+
// src/hooks/useSwipeGesture.ts
|
|
2638
|
+
var import_react18 = require("react");
|
|
2364
2639
|
var useSwipeGesture = (options) => {
|
|
2365
2640
|
const {
|
|
2366
2641
|
onSwipeLeft,
|
|
@@ -2372,9 +2647,9 @@ var useSwipeGesture = (options) => {
|
|
|
2372
2647
|
allowedTime = 500,
|
|
2373
2648
|
enabled = true
|
|
2374
2649
|
} = options;
|
|
2375
|
-
const touchInfoRef =
|
|
2376
|
-
const elementRef =
|
|
2377
|
-
const handleTouchStart =
|
|
2650
|
+
const touchInfoRef = (0, import_react18.useRef)(null);
|
|
2651
|
+
const elementRef = (0, import_react18.useRef)(null);
|
|
2652
|
+
const handleTouchStart = (0, import_react18.useCallback)((e) => {
|
|
2378
2653
|
if (!enabled) return;
|
|
2379
2654
|
const touch = e.touches[0];
|
|
2380
2655
|
touchInfoRef.current = {
|
|
@@ -2383,7 +2658,7 @@ var useSwipeGesture = (options) => {
|
|
|
2383
2658
|
startTime: Date.now()
|
|
2384
2659
|
};
|
|
2385
2660
|
}, [enabled]);
|
|
2386
|
-
const handleTouchEnd =
|
|
2661
|
+
const handleTouchEnd = (0, import_react18.useCallback)((e) => {
|
|
2387
2662
|
if (!enabled || !touchInfoRef.current) return;
|
|
2388
2663
|
const touch = e.changedTouches[0];
|
|
2389
2664
|
const { startX, startY, startTime } = touchInfoRef.current;
|
|
@@ -2407,7 +2682,7 @@ var useSwipeGesture = (options) => {
|
|
|
2407
2682
|
}
|
|
2408
2683
|
touchInfoRef.current = null;
|
|
2409
2684
|
}, [enabled, threshold, restraint, allowedTime, onSwipeLeft, onSwipeRight, onSwipeUp, onSwipeDown]);
|
|
2410
|
-
|
|
2685
|
+
(0, import_react18.useEffect)(() => {
|
|
2411
2686
|
const element = elementRef.current;
|
|
2412
2687
|
if (!element) return;
|
|
2413
2688
|
element.addEventListener("touchstart", handleTouchStart, { passive: true });
|
|
@@ -2463,7 +2738,7 @@ var Scheduler = ({
|
|
|
2463
2738
|
locale
|
|
2464
2739
|
// Date-fns locale
|
|
2465
2740
|
}) => {
|
|
2466
|
-
const [activeDragEvent, setActiveDragEvent] =
|
|
2741
|
+
const [activeDragEvent, setActiveDragEvent] = (0, import_react19.useState)(null);
|
|
2467
2742
|
const {
|
|
2468
2743
|
contextMenuEvent,
|
|
2469
2744
|
contextMenuPosition,
|
|
@@ -2505,16 +2780,16 @@ var Scheduler = ({
|
|
|
2505
2780
|
readOnly,
|
|
2506
2781
|
timezone
|
|
2507
2782
|
});
|
|
2508
|
-
const sensors =
|
|
2509
|
-
|
|
2783
|
+
const sensors = (0, import_core3.useSensors)(
|
|
2784
|
+
(0, import_core3.useSensor)(import_core3.PointerSensor, {
|
|
2510
2785
|
activationConstraint: {
|
|
2511
2786
|
distance: 8
|
|
2512
2787
|
}
|
|
2513
2788
|
})
|
|
2514
2789
|
);
|
|
2515
2790
|
const gridSize = 15;
|
|
2516
|
-
const snapToGrid =
|
|
2517
|
-
const modifiers
|
|
2791
|
+
const snapToGrid = (0, import_modifiers.createSnapModifier)(gridSize);
|
|
2792
|
+
const modifiers = [snapToGrid, import_modifiers.restrictToWindowEdges];
|
|
2518
2793
|
const dndSensors = readOnly ? [] : sensors;
|
|
2519
2794
|
const handleEventResize = (event, newEnd) => {
|
|
2520
2795
|
if (readOnly) return;
|
|
@@ -2528,35 +2803,14 @@ var Scheduler = ({
|
|
|
2528
2803
|
});
|
|
2529
2804
|
}
|
|
2530
2805
|
};
|
|
2531
|
-
const id =
|
|
2806
|
+
const id = (0, import_react19.useId)();
|
|
2532
2807
|
const swipeRef = useViewSwipe(handlePrev, handleNext, true);
|
|
2808
|
+
const languagePack = language === "fr" ? fr : en;
|
|
2533
2809
|
const t = {
|
|
2534
|
-
|
|
2535
|
-
month: "Month",
|
|
2536
|
-
week: "Week",
|
|
2537
|
-
day: "Day",
|
|
2538
|
-
agenda: "Agenda",
|
|
2539
|
-
resource: "Resource",
|
|
2540
|
-
createEvent: "Create Event",
|
|
2541
|
-
editEvent: "Edit Event",
|
|
2542
|
-
delete: "Delete",
|
|
2543
|
-
save: "Save",
|
|
2544
|
-
cancel: "Cancel",
|
|
2545
|
-
title: "Title",
|
|
2546
|
-
start: "Start",
|
|
2547
|
-
end: "End",
|
|
2548
|
-
allDay: "All Day",
|
|
2549
|
-
description: "Description",
|
|
2550
|
-
repeat: "Repeat",
|
|
2551
|
-
noRepeat: "Does not repeat",
|
|
2552
|
-
selectCalendar: "Select Calendar",
|
|
2553
|
-
selectType: "Select Type",
|
|
2554
|
-
daily: "Daily",
|
|
2555
|
-
weekly: "Weekly",
|
|
2556
|
-
monthly: "Monthly",
|
|
2557
|
-
yearly: "Yearly",
|
|
2810
|
+
...languagePack,
|
|
2558
2811
|
...translations
|
|
2559
2812
|
};
|
|
2813
|
+
const overlayTimeFormat = uses24HourClock(locale) ? "H:mm" : "h:mm a";
|
|
2560
2814
|
const handleDragStart = (event) => {
|
|
2561
2815
|
const { active } = event;
|
|
2562
2816
|
const draggedEvent = expandedEvents.find((e) => e.id === active.id);
|
|
@@ -2574,20 +2828,20 @@ var Scheduler = ({
|
|
|
2574
2828
|
return 80;
|
|
2575
2829
|
}
|
|
2576
2830
|
if (view !== "week" && view !== "day") return void 0;
|
|
2577
|
-
const duration =
|
|
2831
|
+
const duration = (0, import_date_fns12.differenceInMinutes)(activeDragEvent.end, activeDragEvent.start);
|
|
2578
2832
|
const hourHeight = view === "day" ? 80 : 60;
|
|
2579
2833
|
return duration / 60 * hourHeight;
|
|
2580
2834
|
};
|
|
2581
2835
|
const getDragWidth = () => {
|
|
2582
2836
|
if (view === "month") return "100%";
|
|
2583
2837
|
if (view === "resource" && activeDragEvent) {
|
|
2584
|
-
const duration =
|
|
2838
|
+
const duration = (0, import_date_fns12.differenceInMinutes)(activeDragEvent.end, activeDragEvent.start);
|
|
2585
2839
|
const width = duration / 60 * 100;
|
|
2586
2840
|
return `${Math.max(width, 4)}px`;
|
|
2587
2841
|
}
|
|
2588
2842
|
return "150px";
|
|
2589
2843
|
};
|
|
2590
|
-
const filteredEvents =
|
|
2844
|
+
const filteredEvents = (0, import_react19.useMemo)(() => {
|
|
2591
2845
|
if (!calendars) return expandedEvents;
|
|
2592
2846
|
const activeCalendarIds = calendars.filter((c) => c.active !== false).map((c) => c.id);
|
|
2593
2847
|
return expandedEvents.filter((e) => {
|
|
@@ -2595,22 +2849,22 @@ var Scheduler = ({
|
|
|
2595
2849
|
return activeCalendarIds.includes(e.calendarId);
|
|
2596
2850
|
});
|
|
2597
2851
|
}, [expandedEvents, calendars]);
|
|
2598
|
-
return /* @__PURE__ */
|
|
2599
|
-
|
|
2852
|
+
return /* @__PURE__ */ import_react19.default.createElement(
|
|
2853
|
+
import_core3.DndContext,
|
|
2600
2854
|
{
|
|
2601
2855
|
id,
|
|
2602
2856
|
sensors: dndSensors,
|
|
2603
2857
|
onDragStart: handleDragStart,
|
|
2604
2858
|
onDragEnd: onDragEndWrapper,
|
|
2605
|
-
modifiers
|
|
2859
|
+
modifiers
|
|
2606
2860
|
},
|
|
2607
|
-
/* @__PURE__ */
|
|
2861
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2608
2862
|
"div",
|
|
2609
2863
|
{
|
|
2610
2864
|
className: cn("flex flex-col h-full bg-background text-foreground relative", className),
|
|
2611
2865
|
style: getThemeStyles(theme)
|
|
2612
2866
|
},
|
|
2613
|
-
/* @__PURE__ */
|
|
2867
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2614
2868
|
CalendarHeader,
|
|
2615
2869
|
{
|
|
2616
2870
|
currentDate,
|
|
@@ -2629,8 +2883,8 @@ var Scheduler = ({
|
|
|
2629
2883
|
locale
|
|
2630
2884
|
}
|
|
2631
2885
|
),
|
|
2632
|
-
/* @__PURE__ */
|
|
2633
|
-
|
|
2886
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2887
|
+
import_framer_motion4.motion.div,
|
|
2634
2888
|
{
|
|
2635
2889
|
className: cn(
|
|
2636
2890
|
"hidden md:block overflow-hidden"
|
|
@@ -2645,7 +2899,7 @@ var Scheduler = ({
|
|
|
2645
2899
|
ease: [0.4, 0, 0.2, 1]
|
|
2646
2900
|
}
|
|
2647
2901
|
},
|
|
2648
|
-
/* @__PURE__ */
|
|
2902
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2649
2903
|
Sidebar,
|
|
2650
2904
|
{
|
|
2651
2905
|
currentDate,
|
|
@@ -2658,11 +2912,12 @@ var Scheduler = ({
|
|
|
2658
2912
|
readOnly,
|
|
2659
2913
|
calendars,
|
|
2660
2914
|
onCalendarToggle,
|
|
2661
|
-
translations: t
|
|
2915
|
+
translations: t,
|
|
2916
|
+
locale
|
|
2662
2917
|
}
|
|
2663
2918
|
)
|
|
2664
|
-
), /* @__PURE__ */
|
|
2665
|
-
|
|
2919
|
+
), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex-1 flex flex-col overflow-hidden relative" }, isLoading ? /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex-1 overflow-auto p-0 md:p-4" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-full min-w-full" }, view === "month" && /* @__PURE__ */ import_react19.default.createElement(MonthViewSkeleton, null), view === "week" && /* @__PURE__ */ import_react19.default.createElement(WeekViewSkeleton, null), view === "day" && /* @__PURE__ */ import_react19.default.createElement(DayViewSkeleton, null), view === "agenda" && /* @__PURE__ */ import_react19.default.createElement(AgendaViewSkeleton, null), view === "resource" && /* @__PURE__ */ import_react19.default.createElement(WeekViewSkeleton, null))) : /* @__PURE__ */ import_react19.default.createElement("div", { ref: swipeRef, className: "flex-1 overflow-auto p-0 md:p-4 touch-pan-y" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "h-full min-w-full" }, /* @__PURE__ */ import_react19.default.createElement(import_framer_motion4.AnimatePresence, { mode: "wait", initial: false }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2920
|
+
import_framer_motion4.motion.div,
|
|
2666
2921
|
{
|
|
2667
2922
|
key: `${view}-${currentDate.toISOString()}-${timezone || "local"}`,
|
|
2668
2923
|
initial: { opacity: 0, scale: 0.98, y: 15 },
|
|
@@ -2686,7 +2941,7 @@ var Scheduler = ({
|
|
|
2686
2941
|
},
|
|
2687
2942
|
className: "h-full"
|
|
2688
2943
|
},
|
|
2689
|
-
view === "month" && /* @__PURE__ */
|
|
2944
|
+
view === "month" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2690
2945
|
MonthView,
|
|
2691
2946
|
{
|
|
2692
2947
|
currentDate,
|
|
@@ -2697,7 +2952,7 @@ var Scheduler = ({
|
|
|
2697
2952
|
locale
|
|
2698
2953
|
}
|
|
2699
2954
|
),
|
|
2700
|
-
view === "week" && /* @__PURE__ */
|
|
2955
|
+
view === "week" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2701
2956
|
WeekView,
|
|
2702
2957
|
{
|
|
2703
2958
|
currentDate,
|
|
@@ -2710,7 +2965,7 @@ var Scheduler = ({
|
|
|
2710
2965
|
readonly: readOnly
|
|
2711
2966
|
}
|
|
2712
2967
|
),
|
|
2713
|
-
view === "day" && /* @__PURE__ */
|
|
2968
|
+
view === "day" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2714
2969
|
DayView,
|
|
2715
2970
|
{
|
|
2716
2971
|
currentDate,
|
|
@@ -2723,36 +2978,38 @@ var Scheduler = ({
|
|
|
2723
2978
|
readonly: readOnly
|
|
2724
2979
|
}
|
|
2725
2980
|
),
|
|
2726
|
-
view === "agenda" && /* @__PURE__ */
|
|
2981
|
+
view === "agenda" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2727
2982
|
AgendaView,
|
|
2728
2983
|
{
|
|
2729
2984
|
currentDate,
|
|
2730
2985
|
events: filteredEvents,
|
|
2731
2986
|
onEventClick: handleEventClickInternal,
|
|
2732
|
-
onCreateEvent: handleCreateEvent
|
|
2987
|
+
onCreateEvent: handleCreateEvent,
|
|
2988
|
+
locale,
|
|
2989
|
+
translations: t
|
|
2733
2990
|
}
|
|
2734
2991
|
),
|
|
2735
|
-
view === "resource" && resources && /* @__PURE__ */
|
|
2992
|
+
view === "resource" && resources && /* @__PURE__ */ import_react19.default.createElement(
|
|
2736
2993
|
ResourceView,
|
|
2737
2994
|
{
|
|
2738
2995
|
currentDate,
|
|
2739
2996
|
events: filteredEvents,
|
|
2740
2997
|
resources,
|
|
2741
2998
|
onEventClick: handleEventClickInternal,
|
|
2742
|
-
onTimeSlotClick: (date
|
|
2999
|
+
onTimeSlotClick: (date) => {
|
|
2743
3000
|
if (readOnly) return;
|
|
2744
3001
|
handleTimeSlotClick(date);
|
|
2745
3002
|
},
|
|
2746
3003
|
locale
|
|
2747
3004
|
}
|
|
2748
3005
|
)
|
|
2749
|
-
)))), /* @__PURE__ */
|
|
3006
|
+
)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "md:hidden absolute bottom-6 right-6 z-50" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2750
3007
|
"button",
|
|
2751
3008
|
{
|
|
2752
3009
|
onClick: handleCreateEvent,
|
|
2753
3010
|
className: "w-14 h-14 bg-blue-600 rounded-full shadow-lg flex items-center justify-center text-white active:scale-90 transition-transform"
|
|
2754
3011
|
},
|
|
2755
|
-
/* @__PURE__ */
|
|
3012
|
+
/* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("path", { d: "M5 12h14" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M12 5v14" }))
|
|
2756
3013
|
)))),
|
|
2757
3014
|
renderEventForm ? renderEventForm({
|
|
2758
3015
|
isOpen: isModalOpen,
|
|
@@ -2761,7 +3018,7 @@ var Scheduler = ({
|
|
|
2761
3018
|
initialDate: modalInitialDate,
|
|
2762
3019
|
onSave: handleModalSave,
|
|
2763
3020
|
onDelete: handleModalDelete
|
|
2764
|
-
}) : /* @__PURE__ */
|
|
3021
|
+
}) : /* @__PURE__ */ import_react19.default.createElement(
|
|
2765
3022
|
EventModal,
|
|
2766
3023
|
{
|
|
2767
3024
|
isOpen: isModalOpen,
|
|
@@ -2775,7 +3032,7 @@ var Scheduler = ({
|
|
|
2775
3032
|
translations: t
|
|
2776
3033
|
}
|
|
2777
3034
|
),
|
|
2778
|
-
/* @__PURE__ */
|
|
3035
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2779
3036
|
EventContextMenu,
|
|
2780
3037
|
{
|
|
2781
3038
|
event: contextMenuEvent,
|
|
@@ -2802,13 +3059,13 @@ var Scheduler = ({
|
|
|
2802
3059
|
closeContextMenu();
|
|
2803
3060
|
},
|
|
2804
3061
|
translations: {
|
|
2805
|
-
edit: t.editEvent || "Edit",
|
|
3062
|
+
edit: t.edit || t.editEvent || "Edit",
|
|
2806
3063
|
delete: t.delete || "Delete",
|
|
2807
|
-
duplicate: "Duplicate"
|
|
3064
|
+
duplicate: t.duplicate || "Duplicate"
|
|
2808
3065
|
}
|
|
2809
3066
|
}
|
|
2810
3067
|
),
|
|
2811
|
-
/* @__PURE__ */
|
|
3068
|
+
/* @__PURE__ */ import_react19.default.createElement(import_core3.DragOverlay, { dropAnimation: null }, activeDragEvent ? /* @__PURE__ */ import_react19.default.createElement(
|
|
2812
3069
|
"div",
|
|
2813
3070
|
{
|
|
2814
3071
|
className: cn(
|
|
@@ -2826,19 +3083,19 @@ var Scheduler = ({
|
|
|
2826
3083
|
transform: "rotate(-2deg) scale(1.02)"
|
|
2827
3084
|
}
|
|
2828
3085
|
},
|
|
2829
|
-
/* @__PURE__ */
|
|
3086
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2.5 h-full flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2830
3087
|
"div",
|
|
2831
3088
|
{
|
|
2832
3089
|
className: "absolute left-0 top-0 bottom-0 w-1 rounded-l-lg",
|
|
2833
3090
|
style: { backgroundColor: activeDragEvent.color || "var(--primary)" }
|
|
2834
3091
|
}
|
|
2835
|
-
), /* @__PURE__ */
|
|
3092
|
+
), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pl-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "font-semibold truncate text-sm" }, activeDragEvent.title), (view === "week" || view === "day") && getDragHeight() && getDragHeight() > 40 && /* @__PURE__ */ import_react19.default.createElement("div", { className: "text-xs opacity-80 mt-0.5 flex items-center gap-1" }, /* @__PURE__ */ import_react19.default.createElement("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2" }, /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react19.default.createElement("path", { d: "M12 6v6l4 2" })), (0, import_date_fns12.format)(activeDragEvent.start, overlayTimeFormat, { locale }), " - ", (0, import_date_fns12.format)(activeDragEvent.end, overlayTimeFormat, { locale }))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute bottom-1.5 right-1.5 opacity-60" }, /* @__PURE__ */ import_react19.default.createElement("svg", { className: "w-4 h-4", viewBox: "0 0 24 24", fill: "currentColor" }, /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "9", cy: "5", r: "1.5" }), /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "15", cy: "5", r: "1.5" }), /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "9", cy: "12", r: "1.5" }), /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "15", cy: "12", r: "1.5" }), /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "9", cy: "19", r: "1.5" }), /* @__PURE__ */ import_react19.default.createElement("circle", { cx: "15", cy: "19", r: "1.5" }))))
|
|
2836
3093
|
) : null)
|
|
2837
3094
|
)
|
|
2838
3095
|
);
|
|
2839
3096
|
};
|
|
2840
|
-
|
|
2841
|
-
exports
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
3097
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
3098
|
+
0 && (module.exports = {
|
|
3099
|
+
Scheduler,
|
|
3100
|
+
cn
|
|
3101
|
+
});
|