calendarkit-pro 1.2.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.js +555 -457
- package/dist/index.mjs +496 -383
- 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,46 +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
|
}
|
|
39
57
|
var isEventDragDisabled = (event) => event?.draggable === false;
|
|
40
58
|
var isEventResizeDisabled = (event) => event?.resizable === false || event?.resizable === void 0 && isEventDragDisabled(event);
|
|
41
59
|
|
|
42
60
|
// src/components/ui/button.tsx
|
|
43
|
-
var buttonVariants =
|
|
61
|
+
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
44
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",
|
|
45
63
|
{
|
|
46
64
|
variants: {
|
|
@@ -65,10 +83,10 @@ var buttonVariants = classVarianceAuthority.cva(
|
|
|
65
83
|
}
|
|
66
84
|
}
|
|
67
85
|
);
|
|
68
|
-
var Button =
|
|
69
|
-
({ className, variant, size,
|
|
86
|
+
var Button = React.forwardRef(
|
|
87
|
+
({ className, variant, size, ...props }, ref) => {
|
|
70
88
|
const Comp = "button";
|
|
71
|
-
return /* @__PURE__ */
|
|
89
|
+
return /* @__PURE__ */ React.createElement(
|
|
72
90
|
Comp,
|
|
73
91
|
{
|
|
74
92
|
className: cn(buttonVariants({ variant, size, className })),
|
|
@@ -79,6 +97,9 @@ var Button = React15__namespace.forwardRef(
|
|
|
79
97
|
}
|
|
80
98
|
);
|
|
81
99
|
Button.displayName = "Button";
|
|
100
|
+
|
|
101
|
+
// src/components/CalendarHeader.tsx
|
|
102
|
+
var import_lucide_react = require("lucide-react");
|
|
82
103
|
var CalendarHeader = ({
|
|
83
104
|
currentDate,
|
|
84
105
|
onPrev,
|
|
@@ -96,12 +117,12 @@ var CalendarHeader = ({
|
|
|
96
117
|
locale
|
|
97
118
|
}) => {
|
|
98
119
|
const viewConfig = [
|
|
99
|
-
{ key: "month", icon:
|
|
100
|
-
{ key: "week", icon:
|
|
101
|
-
{ key: "day", icon:
|
|
102
|
-
{ 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 }
|
|
103
124
|
];
|
|
104
|
-
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(
|
|
105
126
|
Button,
|
|
106
127
|
{
|
|
107
128
|
variant: "ghost",
|
|
@@ -109,8 +130,8 @@ var CalendarHeader = ({
|
|
|
109
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",
|
|
110
131
|
onClick: onMenuClick
|
|
111
132
|
},
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
), /* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ import_react.default.createElement(import_lucide_react.Menu, { className: "h-5 w-5" })
|
|
134
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
114
135
|
Button,
|
|
115
136
|
{
|
|
116
137
|
variant: "outline",
|
|
@@ -118,7 +139,7 @@ var CalendarHeader = ({
|
|
|
118
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"
|
|
119
140
|
},
|
|
120
141
|
translations.today
|
|
121
|
-
), /* @__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(
|
|
122
143
|
Button,
|
|
123
144
|
{
|
|
124
145
|
variant: "ghost",
|
|
@@ -126,8 +147,8 @@ var CalendarHeader = ({
|
|
|
126
147
|
onClick: onPrev,
|
|
127
148
|
className: "rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200"
|
|
128
149
|
},
|
|
129
|
-
/* @__PURE__ */
|
|
130
|
-
), /* @__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(
|
|
131
152
|
Button,
|
|
132
153
|
{
|
|
133
154
|
variant: "ghost",
|
|
@@ -135,8 +156,8 @@ var CalendarHeader = ({
|
|
|
135
156
|
onClick: onNext,
|
|
136
157
|
className: "rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200"
|
|
137
158
|
},
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
)), /* @__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(
|
|
140
161
|
Button,
|
|
141
162
|
{
|
|
142
163
|
variant: "ghost",
|
|
@@ -145,7 +166,7 @@ var CalendarHeader = ({
|
|
|
145
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"
|
|
146
167
|
},
|
|
147
168
|
language
|
|
148
|
-
), onThemeToggle && /* @__PURE__ */
|
|
169
|
+
), onThemeToggle && /* @__PURE__ */ import_react.default.createElement(
|
|
149
170
|
Button,
|
|
150
171
|
{
|
|
151
172
|
variant: "ghost",
|
|
@@ -153,8 +174,8 @@ var CalendarHeader = ({
|
|
|
153
174
|
className: "rounded-xl h-9 w-9 hover:bg-accent/80 transition-all duration-200",
|
|
154
175
|
onClick: onThemeToggle
|
|
155
176
|
},
|
|
156
|
-
isDarkMode ? /* @__PURE__ */
|
|
157
|
-
), !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(
|
|
158
179
|
Button,
|
|
159
180
|
{
|
|
160
181
|
key,
|
|
@@ -166,24 +187,35 @@ var CalendarHeader = ({
|
|
|
166
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"
|
|
167
188
|
)
|
|
168
189
|
},
|
|
169
|
-
/* @__PURE__ */
|
|
170
|
-
/* @__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])
|
|
171
192
|
)))));
|
|
172
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");
|
|
173
205
|
var getMonthGrid = (date, weekStartOn = 0) => {
|
|
174
|
-
const monthStart =
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return dateFns.eachDayOfInterval({
|
|
179
|
-
start: startDate,
|
|
180
|
-
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 })
|
|
181
210
|
});
|
|
182
211
|
};
|
|
183
212
|
var uses24HourClock = (locale) => {
|
|
184
213
|
if (!locale) return false;
|
|
185
|
-
return !/[ap]\.?m/i.test(
|
|
214
|
+
return !/[ap]\.?m/i.test((0, import_date_fns2.format)(new Date(2e3, 0, 1, 13, 0), "p", { locale }));
|
|
186
215
|
};
|
|
216
|
+
|
|
217
|
+
// src/components/MiniCalendar.tsx
|
|
218
|
+
var import_lucide_react2 = require("lucide-react");
|
|
187
219
|
var MiniCalendar = ({
|
|
188
220
|
currentDate,
|
|
189
221
|
onDateChange,
|
|
@@ -191,12 +223,12 @@ var MiniCalendar = ({
|
|
|
191
223
|
className,
|
|
192
224
|
locale
|
|
193
225
|
}) => {
|
|
194
|
-
const [viewDate, setViewDate] =
|
|
195
|
-
|
|
226
|
+
const [viewDate, setViewDate] = import_react2.default.useState(currentDate);
|
|
227
|
+
import_react2.default.useEffect(() => {
|
|
196
228
|
setViewDate(currentDate);
|
|
197
229
|
}, [currentDate]);
|
|
198
230
|
const weekStartsOn = locale?.options?.weekStartsOn ?? 0;
|
|
199
|
-
const days =
|
|
231
|
+
const days = import_react2.default.useMemo(
|
|
200
232
|
() => getMonthGrid(viewDate, weekStartsOn),
|
|
201
233
|
[viewDate, weekStartsOn]
|
|
202
234
|
);
|
|
@@ -205,13 +237,13 @@ var MiniCalendar = ({
|
|
|
205
237
|
return locale.localize.day(dayIndex, { width: "narrow" });
|
|
206
238
|
}) : ["S", "M", "T", "W", "T", "F", "S"];
|
|
207
239
|
const handlePrev = () => {
|
|
208
|
-
const newDate =
|
|
240
|
+
const newDate = (0, import_date_fns3.subMonths)(viewDate, 1);
|
|
209
241
|
setViewDate(newDate);
|
|
210
242
|
onDateChange(newDate);
|
|
211
243
|
if (onViewChange) onViewChange("month");
|
|
212
244
|
};
|
|
213
245
|
const handleNext = () => {
|
|
214
|
-
const newDate =
|
|
246
|
+
const newDate = (0, import_date_fns3.addMonths)(viewDate, 1);
|
|
215
247
|
setViewDate(newDate);
|
|
216
248
|
onDateChange(newDate);
|
|
217
249
|
if (onViewChange) onViewChange("month");
|
|
@@ -220,7 +252,7 @@ var MiniCalendar = ({
|
|
|
220
252
|
onDateChange(day);
|
|
221
253
|
if (onViewChange) onViewChange("day");
|
|
222
254
|
};
|
|
223
|
-
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(
|
|
224
256
|
Button,
|
|
225
257
|
{
|
|
226
258
|
variant: "ghost",
|
|
@@ -229,8 +261,8 @@ var MiniCalendar = ({
|
|
|
229
261
|
onClick: handlePrev,
|
|
230
262
|
"aria-label": "Previous month"
|
|
231
263
|
},
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
-
), /* @__PURE__ */
|
|
264
|
+
/* @__PURE__ */ import_react2.default.createElement(import_lucide_react2.ChevronLeft, { className: "h-4 w-4" })
|
|
265
|
+
), /* @__PURE__ */ import_react2.default.createElement(
|
|
234
266
|
Button,
|
|
235
267
|
{
|
|
236
268
|
variant: "ghost",
|
|
@@ -239,12 +271,12 @@ var MiniCalendar = ({
|
|
|
239
271
|
onClick: handleNext,
|
|
240
272
|
"aria-label": "Next month"
|
|
241
273
|
},
|
|
242
|
-
/* @__PURE__ */
|
|
243
|
-
))), /* @__PURE__ */
|
|
244
|
-
const isSelected =
|
|
245
|
-
const isCurrentMonth =
|
|
246
|
-
const isTodayDate =
|
|
247
|
-
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(
|
|
248
280
|
"button",
|
|
249
281
|
{
|
|
250
282
|
key: day.toISOString(),
|
|
@@ -257,10 +289,14 @@ var MiniCalendar = ({
|
|
|
257
289
|
!isSelected && isTodayDate && "bg-primary/10 text-primary ring-1 ring-primary/30"
|
|
258
290
|
)
|
|
259
291
|
},
|
|
260
|
-
|
|
292
|
+
(0, import_date_fns3.format)(day, "d")
|
|
261
293
|
);
|
|
262
294
|
})));
|
|
263
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");
|
|
264
300
|
var Sidebar = ({
|
|
265
301
|
currentDate,
|
|
266
302
|
onDateChange,
|
|
@@ -275,11 +311,11 @@ var Sidebar = ({
|
|
|
275
311
|
translations,
|
|
276
312
|
locale
|
|
277
313
|
}) => {
|
|
278
|
-
const [calendarsOpen, setCalendarsOpen] =
|
|
279
|
-
const [timezoneOpen, setTimezoneOpen] =
|
|
280
|
-
const [now, setNow] =
|
|
281
|
-
const [hasMounted, setHasMounted] =
|
|
282
|
-
|
|
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)(() => {
|
|
283
319
|
setHasMounted(true);
|
|
284
320
|
setNow(/* @__PURE__ */ new Date());
|
|
285
321
|
const timer = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
@@ -295,7 +331,7 @@ var Sidebar = ({
|
|
|
295
331
|
if (!tz || !now) return "LOC";
|
|
296
332
|
try {
|
|
297
333
|
return new Intl.DateTimeFormat("en-US", { timeZone: tz, timeZoneName: "short" }).formatToParts(now).find((part) => part.type === "timeZoneName")?.value || "";
|
|
298
|
-
} catch
|
|
334
|
+
} catch {
|
|
299
335
|
return "";
|
|
300
336
|
}
|
|
301
337
|
};
|
|
@@ -316,56 +352,56 @@ var Sidebar = ({
|
|
|
316
352
|
];
|
|
317
353
|
const formatTzLabel = (tz, showTime = true) => {
|
|
318
354
|
if (!hasMounted || !now || !showTime) {
|
|
319
|
-
return /* @__PURE__ */
|
|
355
|
+
return /* @__PURE__ */ import_react3.default.createElement("span", null, tz.label);
|
|
320
356
|
}
|
|
321
357
|
let time = "";
|
|
322
358
|
let acronym = tz.acronym;
|
|
323
359
|
try {
|
|
324
360
|
if (!tz.value) {
|
|
325
|
-
time =
|
|
361
|
+
time = (0, import_date_fns4.format)(now, "HH:mm");
|
|
326
362
|
try {
|
|
327
363
|
acronym = new Intl.DateTimeFormat("en-US", { timeZoneName: "short" }).formatToParts(now).find((part) => part.type === "timeZoneName")?.value || "LOC";
|
|
328
|
-
} catch
|
|
364
|
+
} catch {
|
|
329
365
|
}
|
|
330
366
|
} else {
|
|
331
|
-
const zDate =
|
|
332
|
-
time =
|
|
367
|
+
const zDate = (0, import_date_fns_tz.toZonedTime)(now, tz.value);
|
|
368
|
+
time = (0, import_date_fns4.format)(zDate, "HH:mm");
|
|
333
369
|
const dynAcronym = getAcronym(tz.value);
|
|
334
370
|
if (dynAcronym && !dynAcronym.includes("GMT") && !dynAcronym.includes("Time")) {
|
|
335
371
|
acronym = dynAcronym;
|
|
336
372
|
}
|
|
337
373
|
}
|
|
338
|
-
} catch
|
|
339
|
-
return /* @__PURE__ */
|
|
374
|
+
} catch {
|
|
375
|
+
return /* @__PURE__ */ import_react3.default.createElement("span", null, tz.label);
|
|
340
376
|
}
|
|
341
|
-
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, ")")));
|
|
342
378
|
};
|
|
343
379
|
const selectedTzObj = timezones.find((t) => t.value === (timezone || ""));
|
|
344
380
|
const selectedTimezoneLabel = selectedTzObj ? formatTzLabel(selectedTzObj) : translations?.localTime || "Local Time";
|
|
345
|
-
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(
|
|
346
382
|
Button,
|
|
347
383
|
{
|
|
348
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",
|
|
349
385
|
onClick: onEventCreate
|
|
350
386
|
},
|
|
351
|
-
/* @__PURE__ */
|
|
352
|
-
/* @__PURE__ */
|
|
353
|
-
)), /* @__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(
|
|
354
390
|
"div",
|
|
355
391
|
{
|
|
356
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",
|
|
357
393
|
onClick: () => setCalendarsOpen(!calendarsOpen)
|
|
358
394
|
},
|
|
359
|
-
/* @__PURE__ */
|
|
360
|
-
/* @__PURE__ */
|
|
361
|
-
), 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(
|
|
362
398
|
"div",
|
|
363
399
|
{
|
|
364
400
|
key: cal.id,
|
|
365
401
|
className: "flex items-center gap-3 py-2 px-2 hover:bg-accent/60 rounded-xl cursor-pointer group transition-all duration-200",
|
|
366
402
|
onClick: () => onCalendarToggle?.(cal.id, !(cal.active ?? true))
|
|
367
403
|
},
|
|
368
|
-
/* @__PURE__ */
|
|
404
|
+
/* @__PURE__ */ import_react3.default.createElement("div", { className: "relative flex items-center justify-center" }, /* @__PURE__ */ import_react3.default.createElement(
|
|
369
405
|
"input",
|
|
370
406
|
{
|
|
371
407
|
type: "checkbox",
|
|
@@ -378,7 +414,7 @@ var Sidebar = ({
|
|
|
378
414
|
style: { "--primary-color": cal.color },
|
|
379
415
|
"data-cal-id": cal.id
|
|
380
416
|
}
|
|
381
|
-
), /* @__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, `
|
|
382
418
|
input[type="checkbox"][data-cal-id="${cal.id}"]:checked {
|
|
383
419
|
background-color: ${cal.color} !important;
|
|
384
420
|
border-color: ${cal.color} !important;
|
|
@@ -387,23 +423,23 @@ var Sidebar = ({
|
|
|
387
423
|
--tw-ring-color: ${cal.color}40 !important;
|
|
388
424
|
}
|
|
389
425
|
`)),
|
|
390
|
-
/* @__PURE__ */
|
|
391
|
-
/* @__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(
|
|
392
428
|
"div",
|
|
393
429
|
{
|
|
394
430
|
className: "w-2 h-2 rounded-full opacity-60 group-hover:opacity-100 transition-opacity",
|
|
395
431
|
style: { backgroundColor: cal.color }
|
|
396
432
|
}
|
|
397
433
|
)
|
|
398
|
-
))))), /* @__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(
|
|
399
435
|
"button",
|
|
400
436
|
{
|
|
401
437
|
onClick: () => setTimezoneOpen(!timezoneOpen),
|
|
402
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"
|
|
403
439
|
},
|
|
404
|
-
/* @__PURE__ */
|
|
405
|
-
/* @__PURE__ */
|
|
406
|
-
), 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(
|
|
407
443
|
"div",
|
|
408
444
|
{
|
|
409
445
|
key: tz.value,
|
|
@@ -419,16 +455,26 @@ var Sidebar = ({
|
|
|
419
455
|
formatTzLabel(tz)
|
|
420
456
|
))))))));
|
|
421
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");
|
|
422
468
|
var DraggableEvent = ({ event, children, className, style: propStyle, ...props }) => {
|
|
423
469
|
const dragDisabled = isEventDragDisabled(event);
|
|
424
|
-
const { attributes, listeners, setNodeRef, transform, isDragging } =
|
|
470
|
+
const { attributes, listeners, setNodeRef, transform, isDragging } = (0, import_core.useDraggable)({
|
|
425
471
|
id: event.id,
|
|
426
472
|
data: { event },
|
|
427
473
|
disabled: dragDisabled
|
|
428
474
|
});
|
|
429
475
|
const style = {
|
|
430
476
|
...propStyle,
|
|
431
|
-
transform:
|
|
477
|
+
transform: import_utilities.CSS.Translate.toString(transform),
|
|
432
478
|
zIndex: isDragging ? 100 : propStyle?.zIndex,
|
|
433
479
|
// When dragging, we want the ORIGINAL element to be almost invisible (or fully invisible)
|
|
434
480
|
// so that the DragOverlay (the "ghost") is the only thing the user focuses on.
|
|
@@ -438,7 +484,7 @@ var DraggableEvent = ({ event, children, className, style: propStyle, ...props }
|
|
|
438
484
|
opacity: isDragging ? 0 : propStyle?.opacity
|
|
439
485
|
// Hiding original element completely
|
|
440
486
|
};
|
|
441
|
-
return /* @__PURE__ */
|
|
487
|
+
return /* @__PURE__ */ import_react4.default.createElement(
|
|
442
488
|
"div",
|
|
443
489
|
{
|
|
444
490
|
ref: setNodeRef,
|
|
@@ -451,15 +497,19 @@ var DraggableEvent = ({ event, children, className, style: propStyle, ...props }
|
|
|
451
497
|
children
|
|
452
498
|
);
|
|
453
499
|
};
|
|
500
|
+
|
|
501
|
+
// src/components/dnd/DroppableCell.tsx
|
|
502
|
+
var import_react5 = __toESM(require("react"));
|
|
503
|
+
var import_core2 = require("@dnd-kit/core");
|
|
454
504
|
var DroppableCell = ({ id, date, resourceId, children, className, style, onClick }) => {
|
|
455
|
-
const { isOver, setNodeRef } =
|
|
505
|
+
const { isOver, setNodeRef } = (0, import_core2.useDroppable)({
|
|
456
506
|
id,
|
|
457
507
|
data: { date, resourceId }
|
|
458
508
|
});
|
|
459
509
|
const minutes = date.getMinutes();
|
|
460
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";
|
|
461
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";
|
|
462
|
-
return /* @__PURE__ */
|
|
512
|
+
return /* @__PURE__ */ import_react5.default.createElement(
|
|
463
513
|
"div",
|
|
464
514
|
{
|
|
465
515
|
ref: setNodeRef,
|
|
@@ -476,7 +526,7 @@ var DroppableCell = ({ id, date, resourceId, children, className, style, onClick
|
|
|
476
526
|
};
|
|
477
527
|
|
|
478
528
|
// src/views/MonthView.tsx
|
|
479
|
-
var EventItem =
|
|
529
|
+
var EventItem = import_react6.default.memo(({ event, onEventClick }) => /* @__PURE__ */ import_react6.default.createElement(DraggableEvent, { event }, /* @__PURE__ */ import_react6.default.createElement(
|
|
480
530
|
"div",
|
|
481
531
|
{
|
|
482
532
|
className: cn(
|
|
@@ -494,7 +544,7 @@ var EventItem = React15__namespace.default.memo(({ event, onEventClick }) => /*
|
|
|
494
544
|
onEventClick?.(event);
|
|
495
545
|
}
|
|
496
546
|
},
|
|
497
|
-
/* @__PURE__ */
|
|
547
|
+
/* @__PURE__ */ import_react6.default.createElement("span", { className: "font-medium" }, event.title)
|
|
498
548
|
)));
|
|
499
549
|
EventItem.displayName = "EventItem";
|
|
500
550
|
var MonthView = ({
|
|
@@ -506,23 +556,23 @@ var MonthView = ({
|
|
|
506
556
|
locale
|
|
507
557
|
}) => {
|
|
508
558
|
const weekStartsOn = locale?.options?.weekStartsOn ?? 1;
|
|
509
|
-
const days =
|
|
559
|
+
const days = (0, import_react6.useMemo)(
|
|
510
560
|
() => getMonthGrid(currentDate, weekStartsOn),
|
|
511
561
|
[currentDate, weekStartsOn]
|
|
512
562
|
);
|
|
513
|
-
const weekDays =
|
|
514
|
-
const start =
|
|
515
|
-
const end =
|
|
516
|
-
return
|
|
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 });
|
|
517
567
|
}, [currentDate, weekStartsOn]);
|
|
518
|
-
const getZonedDate =
|
|
519
|
-
return timezone ?
|
|
568
|
+
const getZonedDate = (0, import_react6.useCallback)((date) => {
|
|
569
|
+
return timezone ? (0, import_date_fns_tz2.toZonedTime)(date, timezone) : date;
|
|
520
570
|
}, [timezone]);
|
|
521
|
-
const eventsByDay =
|
|
571
|
+
const eventsByDay = (0, import_react6.useMemo)(() => {
|
|
522
572
|
const map = /* @__PURE__ */ new Map();
|
|
523
573
|
events.forEach((event) => {
|
|
524
574
|
const zonedStart = getZonedDate(event.start);
|
|
525
|
-
const key =
|
|
575
|
+
const key = (0, import_date_fns5.format)(zonedStart, "yyyy-MM-dd");
|
|
526
576
|
if (!map.has(key)) {
|
|
527
577
|
map.set(key, []);
|
|
528
578
|
}
|
|
@@ -530,19 +580,19 @@ var MonthView = ({
|
|
|
530
580
|
});
|
|
531
581
|
return map;
|
|
532
582
|
}, [events, getZonedDate]);
|
|
533
|
-
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(
|
|
534
584
|
"div",
|
|
535
585
|
{
|
|
536
586
|
key: day.toISOString(),
|
|
537
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"
|
|
538
588
|
},
|
|
539
|
-
|
|
540
|
-
))), /* @__PURE__ */
|
|
541
|
-
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");
|
|
542
592
|
const dayEvents = eventsByDay.get(dayKey) || [];
|
|
543
|
-
const isCurrentMonth =
|
|
593
|
+
const isCurrentMonth = (0, import_date_fns5.isSameMonth)(day, currentDate);
|
|
544
594
|
const cellId = day.toISOString();
|
|
545
|
-
return /* @__PURE__ */
|
|
595
|
+
return /* @__PURE__ */ import_react6.default.createElement(
|
|
546
596
|
DroppableCell,
|
|
547
597
|
{
|
|
548
598
|
key: cellId,
|
|
@@ -551,18 +601,26 @@ var MonthView = ({
|
|
|
551
601
|
className: cn(
|
|
552
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",
|
|
553
603
|
!isCurrentMonth && "bg-muted/5 text-muted-foreground/60",
|
|
554
|
-
|
|
604
|
+
(0, import_date_fns5.isToday)(day) && "bg-primary/5 ring-1 ring-inset ring-primary/20"
|
|
555
605
|
),
|
|
556
606
|
onClick: () => onDateClick?.(day)
|
|
557
607
|
},
|
|
558
|
-
/* @__PURE__ */
|
|
608
|
+
/* @__PURE__ */ import_react6.default.createElement("div", { className: "flex justify-between items-start" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: cn(
|
|
559
609
|
"text-sm font-semibold w-7 h-7 flex items-center justify-center rounded-full transition-all duration-200",
|
|
560
|
-
|
|
561
|
-
) },
|
|
562
|
-
/* @__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"))
|
|
563
613
|
);
|
|
564
614
|
}))));
|
|
565
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"));
|
|
566
624
|
var ResizableEvent = ({
|
|
567
625
|
event,
|
|
568
626
|
hourHeight,
|
|
@@ -574,13 +632,13 @@ var ResizableEvent = ({
|
|
|
574
632
|
readonly
|
|
575
633
|
}) => {
|
|
576
634
|
const resizeLocked = readonly || isEventResizeDisabled(event);
|
|
577
|
-
const [isResizing, setIsResizing] =
|
|
578
|
-
const [resizeHeight, setResizeHeight] =
|
|
579
|
-
const containerRef =
|
|
580
|
-
const startYRef =
|
|
581
|
-
const startHeightRef =
|
|
582
|
-
const resizeHeightRef =
|
|
583
|
-
const handleResizeStart =
|
|
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) => {
|
|
584
642
|
e.preventDefault();
|
|
585
643
|
e.stopPropagation();
|
|
586
644
|
const clientY = "touches" in e ? e.touches[0].clientY : e.clientY;
|
|
@@ -625,10 +683,10 @@ var ResizableEvent = ({
|
|
|
625
683
|
document.addEventListener("touchmove", handleMove, { passive: false });
|
|
626
684
|
document.addEventListener("touchend", handleEnd);
|
|
627
685
|
}, [event, hourHeight, minDuration, onResize]);
|
|
628
|
-
const handlePointerDown =
|
|
686
|
+
const handlePointerDown = (0, import_react7.useCallback)((e) => {
|
|
629
687
|
e.stopPropagation();
|
|
630
688
|
}, []);
|
|
631
|
-
return /* @__PURE__ */
|
|
689
|
+
return /* @__PURE__ */ import_react7.default.createElement(
|
|
632
690
|
"div",
|
|
633
691
|
{
|
|
634
692
|
ref: containerRef,
|
|
@@ -639,7 +697,7 @@ var ResizableEvent = ({
|
|
|
639
697
|
}
|
|
640
698
|
},
|
|
641
699
|
children,
|
|
642
|
-
/* @__PURE__ */
|
|
700
|
+
/* @__PURE__ */ import_react7.default.createElement(
|
|
643
701
|
"div",
|
|
644
702
|
{
|
|
645
703
|
className: cn(
|
|
@@ -652,12 +710,12 @@ var ResizableEvent = ({
|
|
|
652
710
|
onMouseDown: resizeLocked ? void 0 : handleResizeStart,
|
|
653
711
|
onTouchStart: resizeLocked ? void 0 : handleResizeStart
|
|
654
712
|
},
|
|
655
|
-
/* @__PURE__ */
|
|
713
|
+
/* @__PURE__ */ import_react7.default.createElement("div", { className: cn(
|
|
656
714
|
"w-8 h-1 rounded-full transition-all",
|
|
657
715
|
isResizing ? "bg-primary" : "bg-muted-foreground/30 group-hover:bg-primary/50"
|
|
658
716
|
) })
|
|
659
717
|
),
|
|
660
|
-
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" })
|
|
661
719
|
);
|
|
662
720
|
};
|
|
663
721
|
|
|
@@ -673,29 +731,25 @@ var WeekView = ({
|
|
|
673
731
|
readonly
|
|
674
732
|
}) => {
|
|
675
733
|
const weekStartsOn = locale?.options?.weekStartsOn ?? 1;
|
|
676
|
-
const start =
|
|
677
|
-
const end =
|
|
678
|
-
const weekDays =
|
|
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 });
|
|
679
737
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
680
738
|
const hourHeight = 60;
|
|
681
|
-
const scrollContainerRef =
|
|
682
|
-
const [now, setNow] =
|
|
683
|
-
|
|
739
|
+
const scrollContainerRef = import_react8.default.useRef(null);
|
|
740
|
+
const [now, setNow] = import_react8.default.useState(/* @__PURE__ */ new Date());
|
|
741
|
+
import_react8.default.useEffect(() => {
|
|
684
742
|
const interval = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
685
743
|
return () => clearInterval(interval);
|
|
686
744
|
}, []);
|
|
687
|
-
|
|
745
|
+
import_react8.default.useEffect(() => {
|
|
688
746
|
if (scrollContainerRef.current) {
|
|
689
|
-
const
|
|
690
|
-
|
|
691
|
-
const offsetHour = 4;
|
|
692
|
-
return (currentHour - offsetHour) * hourHeight;
|
|
693
|
-
};
|
|
694
|
-
scrollContainerRef.current.scrollTop = scrollToActualTime();
|
|
747
|
+
const offsetHour = 4;
|
|
748
|
+
scrollContainerRef.current.scrollTop = ((/* @__PURE__ */ new Date()).getHours() - offsetHour) * hourHeight;
|
|
695
749
|
}
|
|
696
750
|
}, []);
|
|
697
751
|
const getZonedDate = (date) => {
|
|
698
|
-
return timezone ?
|
|
752
|
+
return timezone ? (0, import_date_fns_tz3.toZonedTime)(date, timezone) : date;
|
|
699
753
|
};
|
|
700
754
|
const zonedNow = getZonedDate(/* @__PURE__ */ new Date());
|
|
701
755
|
const getTimezoneDisplay = (tz) => {
|
|
@@ -703,60 +757,60 @@ var WeekView = ({
|
|
|
703
757
|
let displayTime = "";
|
|
704
758
|
let acronym = "";
|
|
705
759
|
if (!tz) {
|
|
706
|
-
displayTime =
|
|
760
|
+
displayTime = (0, import_date_fns6.format)(date, "HH:mm");
|
|
707
761
|
try {
|
|
708
762
|
acronym = new Intl.DateTimeFormat("en-US", { timeZoneName: "short" }).formatToParts(date).find((part) => part.type === "timeZoneName")?.value || "";
|
|
709
|
-
} catch
|
|
763
|
+
} catch {
|
|
710
764
|
acronym = "LOC";
|
|
711
765
|
}
|
|
712
766
|
} else {
|
|
713
767
|
try {
|
|
714
|
-
const zDate =
|
|
715
|
-
displayTime =
|
|
768
|
+
const zDate = (0, import_date_fns_tz3.toZonedTime)(date, tz);
|
|
769
|
+
displayTime = (0, import_date_fns6.format)(zDate, "HH:mm");
|
|
716
770
|
acronym = new Intl.DateTimeFormat("en-US", { timeZone: tz, timeZoneName: "short" }).formatToParts(date).find((part) => part.type === "timeZoneName")?.value || "";
|
|
717
|
-
} catch
|
|
718
|
-
displayTime =
|
|
771
|
+
} catch {
|
|
772
|
+
displayTime = (0, import_date_fns6.format)(date, "HH:mm");
|
|
719
773
|
acronym = tz;
|
|
720
774
|
}
|
|
721
775
|
}
|
|
722
|
-
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, ")"));
|
|
723
777
|
};
|
|
724
778
|
const is24h = uses24HourClock(locale);
|
|
725
779
|
const timeFormat = is24h ? "H:mm" : "h a";
|
|
726
780
|
const eventTimeFormat = is24h ? "H:mm" : "h:mm a";
|
|
727
781
|
const nowFormat = is24h ? "H:mm" : "h:mm";
|
|
728
|
-
return /* @__PURE__ */
|
|
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(
|
|
729
783
|
"div",
|
|
730
784
|
{
|
|
731
785
|
ref: scrollContainerRef,
|
|
732
786
|
className: "flex-1 overflow-y-auto scrollbar-hide relative bg-background scroll-smooth"
|
|
733
787
|
},
|
|
734
|
-
/* @__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(
|
|
735
789
|
"w-9 h-9 flex items-center justify-center rounded-xl mx-auto text-sm font-semibold transition-all duration-200",
|
|
736
|
-
|
|
737
|
-
) },
|
|
738
|
-
/* @__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(
|
|
739
793
|
"div",
|
|
740
794
|
{
|
|
741
795
|
className: "flex min-w-full relative",
|
|
742
796
|
style: { height: hours.length * hourHeight }
|
|
743
797
|
},
|
|
744
|
-
/* @__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(
|
|
745
799
|
"div",
|
|
746
800
|
{
|
|
747
801
|
key: hour,
|
|
748
802
|
className: "relative w-full text-[11px] text-muted-foreground/80 text-right pr-3 font-medium tabular-nums box-border",
|
|
749
803
|
style: { height: hourHeight }
|
|
750
804
|
},
|
|
751
|
-
/* @__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 }))
|
|
752
806
|
))),
|
|
753
|
-
/* @__PURE__ */
|
|
807
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { className: "flex-1 grid grid-cols-7 relative" }, weekDays.map((day, dayIndex) => {
|
|
754
808
|
const dayEvents = events.filter((e) => {
|
|
755
809
|
const zonedStart = getZonedDate(e.start);
|
|
756
|
-
return
|
|
810
|
+
return (0, import_date_fns6.isSameDay)(zonedStart, day);
|
|
757
811
|
});
|
|
758
|
-
return /* @__PURE__ */
|
|
759
|
-
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(
|
|
760
814
|
"div",
|
|
761
815
|
{
|
|
762
816
|
key: hour,
|
|
@@ -767,7 +821,7 @@ var WeekView = ({
|
|
|
767
821
|
const cellDate = new Date(day);
|
|
768
822
|
cellDate.setHours(hour, minute, 0, 0);
|
|
769
823
|
const cellId = cellDate.toISOString();
|
|
770
|
-
return /* @__PURE__ */
|
|
824
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
771
825
|
DroppableCell,
|
|
772
826
|
{
|
|
773
827
|
key: minute,
|
|
@@ -779,7 +833,7 @@ var WeekView = ({
|
|
|
779
833
|
top: `${minute / 60 * 100}%`
|
|
780
834
|
}
|
|
781
835
|
},
|
|
782
|
-
/* @__PURE__ */
|
|
836
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
783
837
|
"div",
|
|
784
838
|
{
|
|
785
839
|
className: "w-full h-full bg-transparent cursor-pointer",
|
|
@@ -809,11 +863,11 @@ var WeekView = ({
|
|
|
809
863
|
const zonedEventStart = getZonedDate(event.start);
|
|
810
864
|
const zonedEventEnd = getZonedDate(event.end);
|
|
811
865
|
const startMinutes = zonedEventStart.getHours() * 60 + zonedEventStart.getMinutes();
|
|
812
|
-
const durationMinutes =
|
|
866
|
+
const durationMinutes = (0, import_date_fns6.differenceInMinutes)(zonedEventEnd, zonedEventStart);
|
|
813
867
|
const top = startMinutes / 60 * hourHeight;
|
|
814
868
|
const height = durationMinutes / 60 * hourHeight;
|
|
815
869
|
const isShortEvent = durationMinutes < 60;
|
|
816
|
-
return /* @__PURE__ */
|
|
870
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
817
871
|
DraggableEvent,
|
|
818
872
|
{
|
|
819
873
|
key: `${event.id}-${day.toISOString()}`,
|
|
@@ -828,7 +882,7 @@ var WeekView = ({
|
|
|
828
882
|
paddingRight: count > 1 ? "2px" : "0"
|
|
829
883
|
}
|
|
830
884
|
},
|
|
831
|
-
/* @__PURE__ */
|
|
885
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
832
886
|
ResizableEvent,
|
|
833
887
|
{
|
|
834
888
|
readonly,
|
|
@@ -838,7 +892,7 @@ var WeekView = ({
|
|
|
838
892
|
className: "h-full",
|
|
839
893
|
style: { height: "100%" }
|
|
840
894
|
},
|
|
841
|
-
/* @__PURE__ */
|
|
895
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
842
896
|
"div",
|
|
843
897
|
{
|
|
844
898
|
className: cn(
|
|
@@ -863,14 +917,14 @@ var WeekView = ({
|
|
|
863
917
|
},
|
|
864
918
|
title: count > 1 ? `${event.title} (${index + 1}/${count})` : void 0
|
|
865
919
|
},
|
|
866
|
-
/* @__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(
|
|
867
921
|
"font-semibold truncate text-foreground/90 leading-tight",
|
|
868
922
|
isShortEvent ? "text-xs text-center" : "text-xs"
|
|
869
|
-
) }, 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))
|
|
870
924
|
)
|
|
871
925
|
)
|
|
872
926
|
);
|
|
873
|
-
}),
|
|
927
|
+
}), (0, import_date_fns6.isToday)(day) && /* @__PURE__ */ import_react8.default.createElement(
|
|
874
928
|
"div",
|
|
875
929
|
{
|
|
876
930
|
className: "absolute left-0 right-0 z-20 pointer-events-none flex items-center",
|
|
@@ -878,12 +932,12 @@ var WeekView = ({
|
|
|
878
932
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
879
933
|
}
|
|
880
934
|
},
|
|
881
|
-
/* @__PURE__ */
|
|
882
|
-
/* @__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" })
|
|
883
937
|
));
|
|
884
938
|
}))
|
|
885
939
|
),
|
|
886
|
-
/* @__PURE__ */
|
|
940
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
887
941
|
"div",
|
|
888
942
|
{
|
|
889
943
|
className: "absolute left-0 w-16 pointer-events-none z-30 flex justify-end pr-2",
|
|
@@ -891,10 +945,15 @@ var WeekView = ({
|
|
|
891
945
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight + 80}px`
|
|
892
946
|
}
|
|
893
947
|
},
|
|
894
|
-
/* @__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 }))
|
|
895
949
|
)
|
|
896
950
|
));
|
|
897
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");
|
|
898
957
|
var DayView = ({
|
|
899
958
|
currentDate,
|
|
900
959
|
events,
|
|
@@ -907,43 +966,39 @@ var DayView = ({
|
|
|
907
966
|
}) => {
|
|
908
967
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
909
968
|
const hourHeight = 80;
|
|
910
|
-
const scrollContainerRef =
|
|
911
|
-
const [now, setNow] =
|
|
912
|
-
|
|
969
|
+
const scrollContainerRef = import_react9.default.useRef(null);
|
|
970
|
+
const [now, setNow] = import_react9.default.useState(/* @__PURE__ */ new Date());
|
|
971
|
+
import_react9.default.useEffect(() => {
|
|
913
972
|
const interval = setInterval(() => setNow(/* @__PURE__ */ new Date()), 6e4);
|
|
914
973
|
return () => clearInterval(interval);
|
|
915
974
|
}, []);
|
|
916
|
-
|
|
975
|
+
import_react9.default.useEffect(() => {
|
|
917
976
|
if (scrollContainerRef.current) {
|
|
918
|
-
const
|
|
919
|
-
|
|
920
|
-
const offsetHour = 3;
|
|
921
|
-
return (currentHour - offsetHour) * hourHeight;
|
|
922
|
-
};
|
|
923
|
-
scrollContainerRef.current.scrollTop = scrollToActualTime();
|
|
977
|
+
const offsetHour = 3;
|
|
978
|
+
scrollContainerRef.current.scrollTop = ((/* @__PURE__ */ new Date()).getHours() - offsetHour) * hourHeight;
|
|
924
979
|
}
|
|
925
980
|
}, []);
|
|
926
981
|
const getZonedDate = (date) => {
|
|
927
|
-
return timezone ?
|
|
982
|
+
return timezone ? (0, import_date_fns_tz4.toZonedTime)(date, timezone) : date;
|
|
928
983
|
};
|
|
929
984
|
const zonedNow = getZonedDate(now);
|
|
930
985
|
const dayEvents = events.filter((e) => {
|
|
931
986
|
const zonedStart = getZonedDate(e.start);
|
|
932
|
-
return
|
|
987
|
+
return (0, import_date_fns7.isSameDay)(zonedStart, currentDate);
|
|
933
988
|
});
|
|
934
989
|
const is24h = uses24HourClock(locale);
|
|
935
990
|
const timeFormat = is24h ? "H:mm" : "h a";
|
|
936
991
|
const eventTimeFormat = is24h ? "H:mm" : "h:mm a";
|
|
937
992
|
const nowFormat = is24h ? "H:mm" : "h:mm a";
|
|
938
|
-
return /* @__PURE__ */
|
|
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(
|
|
939
994
|
"div",
|
|
940
995
|
{
|
|
941
996
|
key: hour,
|
|
942
997
|
className: "relative w-full",
|
|
943
998
|
style: { height: hourHeight }
|
|
944
999
|
},
|
|
945
|
-
hour !== 0 && /* @__PURE__ */
|
|
946
|
-
)),
|
|
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(
|
|
947
1002
|
"div",
|
|
948
1003
|
{
|
|
949
1004
|
className: "absolute left-0 w-full pointer-events-none z-30 flex justify-end pr-2",
|
|
@@ -951,9 +1006,9 @@ var DayView = ({
|
|
|
951
1006
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
952
1007
|
}
|
|
953
1008
|
},
|
|
954
|
-
/* @__PURE__ */
|
|
955
|
-
)), /* @__PURE__ */
|
|
956
|
-
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(
|
|
957
1012
|
"div",
|
|
958
1013
|
{
|
|
959
1014
|
key: hour,
|
|
@@ -964,7 +1019,7 @@ var DayView = ({
|
|
|
964
1019
|
const cellDate = new Date(currentDate);
|
|
965
1020
|
cellDate.setHours(hour, minute, 0, 0);
|
|
966
1021
|
const cellId = cellDate.toISOString();
|
|
967
|
-
return /* @__PURE__ */
|
|
1022
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
968
1023
|
DroppableCell,
|
|
969
1024
|
{
|
|
970
1025
|
key: minute,
|
|
@@ -976,7 +1031,7 @@ var DayView = ({
|
|
|
976
1031
|
top: `${minute / 60 * 100}%`
|
|
977
1032
|
}
|
|
978
1033
|
},
|
|
979
|
-
/* @__PURE__ */
|
|
1034
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
980
1035
|
"div",
|
|
981
1036
|
{
|
|
982
1037
|
className: "h-full w-full bg-transparent cursor-pointer",
|
|
@@ -1005,11 +1060,11 @@ var DayView = ({
|
|
|
1005
1060
|
const zonedStart = getZonedDate(event.start);
|
|
1006
1061
|
const zonedEnd = getZonedDate(event.end);
|
|
1007
1062
|
const startMinutes = zonedStart.getHours() * 60 + zonedStart.getMinutes();
|
|
1008
|
-
const durationMinutes =
|
|
1063
|
+
const durationMinutes = (0, import_date_fns7.differenceInMinutes)(zonedEnd, zonedStart);
|
|
1009
1064
|
const top = startMinutes / 60 * hourHeight;
|
|
1010
1065
|
const height = durationMinutes / 60 * hourHeight;
|
|
1011
1066
|
const isShortEvent = durationMinutes < 45;
|
|
1012
|
-
return /* @__PURE__ */
|
|
1067
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
1013
1068
|
DraggableEvent,
|
|
1014
1069
|
{
|
|
1015
1070
|
key: `${event.id}-${currentDate.toISOString()}`,
|
|
@@ -1023,7 +1078,7 @@ var DayView = ({
|
|
|
1023
1078
|
paddingRight: count > 1 ? "2px" : "0"
|
|
1024
1079
|
}
|
|
1025
1080
|
},
|
|
1026
|
-
/* @__PURE__ */
|
|
1081
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
1027
1082
|
ResizableEvent,
|
|
1028
1083
|
{
|
|
1029
1084
|
readonly,
|
|
@@ -1033,7 +1088,7 @@ var DayView = ({
|
|
|
1033
1088
|
className: "h-full",
|
|
1034
1089
|
style: { height: "100%" }
|
|
1035
1090
|
},
|
|
1036
|
-
/* @__PURE__ */
|
|
1091
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
1037
1092
|
"div",
|
|
1038
1093
|
{
|
|
1039
1094
|
className: cn(
|
|
@@ -1056,15 +1111,15 @@ var DayView = ({
|
|
|
1056
1111
|
},
|
|
1057
1112
|
title: count > 1 ? `${event.title} (${index + 1}/${count})` : void 0
|
|
1058
1113
|
},
|
|
1059
|
-
/* @__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(
|
|
1060
1115
|
"font-semibold truncate leading-tight",
|
|
1061
1116
|
isShortEvent ? "text-xs" : "text-sm",
|
|
1062
1117
|
event.color ? "text-foreground" : "text-foreground/90"
|
|
1063
|
-
) }, 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))
|
|
1064
1119
|
)
|
|
1065
1120
|
)
|
|
1066
1121
|
);
|
|
1067
|
-
}),
|
|
1122
|
+
}), (0, import_date_fns7.isToday)(currentDate) && /* @__PURE__ */ import_react9.default.createElement(
|
|
1068
1123
|
"div",
|
|
1069
1124
|
{
|
|
1070
1125
|
className: "absolute left-0 right-0 z-20 pointer-events-none flex items-center",
|
|
@@ -1072,21 +1127,33 @@ var DayView = ({
|
|
|
1072
1127
|
top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`
|
|
1073
1128
|
}
|
|
1074
1129
|
},
|
|
1075
|
-
/* @__PURE__ */
|
|
1076
|
-
/* @__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" })
|
|
1077
1132
|
)))));
|
|
1078
1133
|
};
|
|
1079
|
-
|
|
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(
|
|
1080
1143
|
"button",
|
|
1081
1144
|
{
|
|
1082
1145
|
onClick: onCreateEvent,
|
|
1083
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"
|
|
1084
1147
|
},
|
|
1085
|
-
/* @__PURE__ */
|
|
1148
|
+
/* @__PURE__ */ import_react10.default.createElement(import_lucide_react4.Plus, { className: "w-4 h-4" }),
|
|
1086
1149
|
translations?.createEvent || "Create Event"
|
|
1087
1150
|
)));
|
|
1151
|
+
|
|
1152
|
+
// src/views/AgendaView.tsx
|
|
1153
|
+
var import_framer_motion = require("framer-motion");
|
|
1154
|
+
var import_lucide_react5 = require("lucide-react");
|
|
1088
1155
|
var formatDuration = (start, end) => {
|
|
1089
|
-
const minutes =
|
|
1156
|
+
const minutes = (0, import_date_fns8.differenceInMinutes)(end, start);
|
|
1090
1157
|
if (minutes < 60) return `${minutes}m`;
|
|
1091
1158
|
const hours = Math.floor(minutes / 60);
|
|
1092
1159
|
const remainingMinutes = minutes % 60;
|
|
@@ -1094,9 +1161,9 @@ var formatDuration = (start, end) => {
|
|
|
1094
1161
|
return `${hours}h ${remainingMinutes}m`;
|
|
1095
1162
|
};
|
|
1096
1163
|
var getDateLabel = (date, locale, translations) => {
|
|
1097
|
-
if (
|
|
1098
|
-
if (
|
|
1099
|
-
return
|
|
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 });
|
|
1100
1167
|
};
|
|
1101
1168
|
var AgendaView = ({
|
|
1102
1169
|
currentDate,
|
|
@@ -1109,13 +1176,13 @@ var AgendaView = ({
|
|
|
1109
1176
|
const is24h = uses24HourClock(locale);
|
|
1110
1177
|
const timePattern = is24h ? "H:mm" : "h:mm a";
|
|
1111
1178
|
const compactTimePattern = is24h ? "H:mm" : "h:mm";
|
|
1112
|
-
const groupedEvents =
|
|
1113
|
-
const startDate =
|
|
1179
|
+
const groupedEvents = (0, import_react11.useMemo)(() => {
|
|
1180
|
+
const startDate = (0, import_date_fns8.startOfDay)(currentDate);
|
|
1114
1181
|
const groups = [];
|
|
1115
1182
|
const sortedEvents = [...events].sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
1116
1183
|
for (let i = 0; i < 30; i++) {
|
|
1117
|
-
const day =
|
|
1118
|
-
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));
|
|
1119
1186
|
if (dayEvents.length > 0) {
|
|
1120
1187
|
groups.push({ date: day, events: dayEvents });
|
|
1121
1188
|
}
|
|
@@ -1135,30 +1202,30 @@ var AgendaView = ({
|
|
|
1135
1202
|
hidden: { opacity: 0, x: -20 },
|
|
1136
1203
|
show: { opacity: 1, x: 0 }
|
|
1137
1204
|
};
|
|
1138
|
-
return /* @__PURE__ */
|
|
1139
|
-
|
|
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,
|
|
1140
1207
|
{
|
|
1141
1208
|
className: "max-w-3xl mx-auto w-full pb-10 px-4 md:px-6",
|
|
1142
1209
|
variants: container,
|
|
1143
1210
|
initial: "hidden",
|
|
1144
1211
|
animate: "show"
|
|
1145
1212
|
},
|
|
1146
|
-
groupedEvents.map((group
|
|
1147
|
-
|
|
1213
|
+
groupedEvents.map((group) => /* @__PURE__ */ import_react11.default.createElement(
|
|
1214
|
+
import_framer_motion.motion.div,
|
|
1148
1215
|
{
|
|
1149
1216
|
key: group.date.toISOString(),
|
|
1150
1217
|
className: "relative",
|
|
1151
1218
|
variants: item
|
|
1152
1219
|
},
|
|
1153
|
-
/* @__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(
|
|
1154
1221
|
"flex flex-col items-center justify-center w-16 h-16 rounded-2xl transition-all",
|
|
1155
|
-
|
|
1156
|
-
) }, /* @__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(
|
|
1157
1224
|
"text-lg font-semibold",
|
|
1158
|
-
|
|
1159
|
-
) }, getDateLabel(group.date, locale, translations)), /* @__PURE__ */
|
|
1160
|
-
/* @__PURE__ */
|
|
1161
|
-
|
|
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,
|
|
1162
1229
|
{
|
|
1163
1230
|
key: event.id,
|
|
1164
1231
|
onClick: () => onEventClick?.(event),
|
|
@@ -1171,26 +1238,30 @@ var AgendaView = ({
|
|
|
1171
1238
|
whileHover: { scale: 1.01, y: -2 },
|
|
1172
1239
|
transition: { duration: 0.2 }
|
|
1173
1240
|
},
|
|
1174
|
-
/* @__PURE__ */
|
|
1241
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
1175
1242
|
"div",
|
|
1176
1243
|
{
|
|
1177
1244
|
className: "absolute left-0 top-3 bottom-3 w-1 rounded-full",
|
|
1178
1245
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
1179
1246
|
}
|
|
1180
1247
|
),
|
|
1181
|
-
/* @__PURE__ */
|
|
1182
|
-
/* @__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(
|
|
1183
1250
|
"div",
|
|
1184
1251
|
{
|
|
1185
1252
|
className: "w-3 h-3 rounded-full shrink-0 mt-1.5",
|
|
1186
1253
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
1187
1254
|
}
|
|
1188
|
-
)), event.description && /* @__PURE__ */
|
|
1189
|
-
/* @__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" })))
|
|
1190
1257
|
)))
|
|
1191
1258
|
))
|
|
1192
1259
|
));
|
|
1193
1260
|
};
|
|
1261
|
+
|
|
1262
|
+
// src/views/ResourceView.tsx
|
|
1263
|
+
var import_react12 = __toESM(require("react"));
|
|
1264
|
+
var import_date_fns9 = require("date-fns");
|
|
1194
1265
|
var ResourceView = ({
|
|
1195
1266
|
currentDate,
|
|
1196
1267
|
events,
|
|
@@ -1199,16 +1270,16 @@ var ResourceView = ({
|
|
|
1199
1270
|
onTimeSlotClick,
|
|
1200
1271
|
locale
|
|
1201
1272
|
}) => {
|
|
1202
|
-
const containerRef =
|
|
1273
|
+
const containerRef = (0, import_react12.useRef)(null);
|
|
1203
1274
|
const hours = Array.from({ length: 24 }, (_, i) => i);
|
|
1204
1275
|
const hourWidth = 100;
|
|
1205
1276
|
const timeFormat = uses24HourClock(locale) ? "H:mm" : "h a";
|
|
1206
1277
|
const getEventStyle = (event) => {
|
|
1207
1278
|
const start = new Date(event.start);
|
|
1208
1279
|
const end = new Date(event.end);
|
|
1209
|
-
const dayStart =
|
|
1210
|
-
const startMinutes =
|
|
1211
|
-
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);
|
|
1212
1283
|
const left = startMinutes / 60 * hourWidth;
|
|
1213
1284
|
const width = durationMinutes / 60 * hourWidth;
|
|
1214
1285
|
return {
|
|
@@ -1217,19 +1288,19 @@ var ResourceView = ({
|
|
|
1217
1288
|
// Min width for visibility
|
|
1218
1289
|
};
|
|
1219
1290
|
};
|
|
1220
|
-
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(
|
|
1221
1292
|
"div",
|
|
1222
1293
|
{
|
|
1223
1294
|
key: hour,
|
|
1224
1295
|
className: "border-r border-border/50 text-xs text-muted-foreground p-2 font-medium shrink-0",
|
|
1225
1296
|
style: { width: hourWidth }
|
|
1226
1297
|
},
|
|
1227
|
-
|
|
1228
|
-
))))), /* @__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) => {
|
|
1229
1300
|
const resourceEvents = events.filter(
|
|
1230
|
-
(e) => e.resourceId === resource.id &&
|
|
1301
|
+
(e) => e.resourceId === resource.id && (0, import_date_fns9.isSameDay)(new Date(e.start), currentDate)
|
|
1231
1302
|
);
|
|
1232
|
-
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(
|
|
1233
1304
|
"div",
|
|
1234
1305
|
{
|
|
1235
1306
|
key: hour,
|
|
@@ -1240,7 +1311,7 @@ var ResourceView = ({
|
|
|
1240
1311
|
const slotDate = new Date(currentDate);
|
|
1241
1312
|
slotDate.setHours(hour, minute, 0, 0);
|
|
1242
1313
|
const slotId = `${resource.id}-${slotDate.toISOString()}`;
|
|
1243
|
-
return /* @__PURE__ */
|
|
1314
|
+
return /* @__PURE__ */ import_react12.default.createElement(
|
|
1244
1315
|
DroppableCell,
|
|
1245
1316
|
{
|
|
1246
1317
|
key: minute,
|
|
@@ -1254,7 +1325,7 @@ var ResourceView = ({
|
|
|
1254
1325
|
}
|
|
1255
1326
|
);
|
|
1256
1327
|
})
|
|
1257
|
-
)), resourceEvents.map((event) => /* @__PURE__ */
|
|
1328
|
+
)), resourceEvents.map((event) => /* @__PURE__ */ import_react12.default.createElement(
|
|
1258
1329
|
DraggableEvent,
|
|
1259
1330
|
{
|
|
1260
1331
|
key: event.id,
|
|
@@ -1271,10 +1342,17 @@ var ResourceView = ({
|
|
|
1271
1342
|
color: "#fff"
|
|
1272
1343
|
}
|
|
1273
1344
|
},
|
|
1274
|
-
/* @__PURE__ */
|
|
1345
|
+
/* @__PURE__ */ import_react12.default.createElement("div", { className: "truncate" }, event.title)
|
|
1275
1346
|
))));
|
|
1276
1347
|
}))));
|
|
1277
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");
|
|
1278
1356
|
var Modal = ({
|
|
1279
1357
|
isOpen,
|
|
1280
1358
|
onClose,
|
|
@@ -1283,8 +1361,8 @@ var Modal = ({
|
|
|
1283
1361
|
className,
|
|
1284
1362
|
hideHeader = false
|
|
1285
1363
|
}) => {
|
|
1286
|
-
const overlayRef =
|
|
1287
|
-
|
|
1364
|
+
const overlayRef = (0, import_react13.useRef)(null);
|
|
1365
|
+
(0, import_react13.useEffect)(() => {
|
|
1288
1366
|
const handleEscape = (e) => {
|
|
1289
1367
|
if (e.key === "Escape") {
|
|
1290
1368
|
onClose();
|
|
@@ -1298,14 +1376,14 @@ var Modal = ({
|
|
|
1298
1376
|
};
|
|
1299
1377
|
}, [isOpen, onClose]);
|
|
1300
1378
|
if (!isOpen) return null;
|
|
1301
|
-
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(
|
|
1302
1380
|
"div",
|
|
1303
1381
|
{
|
|
1304
1382
|
ref: overlayRef,
|
|
1305
1383
|
className: "absolute inset-0",
|
|
1306
1384
|
onClick: onClose
|
|
1307
1385
|
}
|
|
1308
|
-
), /* @__PURE__ */
|
|
1386
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
1309
1387
|
"div",
|
|
1310
1388
|
{
|
|
1311
1389
|
className: cn(
|
|
@@ -1313,7 +1391,7 @@ var Modal = ({
|
|
|
1313
1391
|
className
|
|
1314
1392
|
)
|
|
1315
1393
|
},
|
|
1316
|
-
!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(
|
|
1317
1395
|
Button,
|
|
1318
1396
|
{
|
|
1319
1397
|
variant: "ghost",
|
|
@@ -1321,12 +1399,17 @@ var Modal = ({
|
|
|
1321
1399
|
onClick: onClose,
|
|
1322
1400
|
className: "h-9 w-9 p-0 rounded-xl hover:bg-accent/80 transition-all duration-200"
|
|
1323
1401
|
},
|
|
1324
|
-
/* @__PURE__ */
|
|
1325
|
-
/* @__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")
|
|
1326
1404
|
)),
|
|
1327
|
-
/* @__PURE__ */
|
|
1405
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: cn("overflow-y-auto flex-1", !hideHeader && "p-6") }, children)
|
|
1328
1406
|
));
|
|
1329
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");
|
|
1330
1413
|
var REMINDER_OPTIONS = [
|
|
1331
1414
|
{ value: 0, label: "At time of event" },
|
|
1332
1415
|
{ value: 5, label: "5 minutes before" },
|
|
@@ -1368,13 +1451,10 @@ var EventModal = ({
|
|
|
1368
1451
|
initialDate,
|
|
1369
1452
|
onSave,
|
|
1370
1453
|
onDelete,
|
|
1371
|
-
calendars
|
|
1372
|
-
eventTypes,
|
|
1373
|
-
translations
|
|
1454
|
+
calendars
|
|
1374
1455
|
}) => {
|
|
1375
|
-
const [mode, setMode] =
|
|
1376
|
-
const [
|
|
1377
|
-
const [formData, setFormData] = React15.useState({
|
|
1456
|
+
const [mode, setMode] = (0, import_react14.useState)("create");
|
|
1457
|
+
const [formData, setFormData] = (0, import_react14.useState)({
|
|
1378
1458
|
title: "",
|
|
1379
1459
|
description: "",
|
|
1380
1460
|
location: "",
|
|
@@ -1388,10 +1468,10 @@ var EventModal = ({
|
|
|
1388
1468
|
attachments: [],
|
|
1389
1469
|
reminders: [{ id: "1", type: "notification", time: 30, label: "30 minutes before" }]
|
|
1390
1470
|
});
|
|
1391
|
-
const [isCalendarDropdownOpen, setIsCalendarDropdownOpen] =
|
|
1392
|
-
const [isColorPickerOpen, setIsColorPickerOpen] =
|
|
1393
|
-
const [isReminderDropdownOpen, setIsReminderDropdownOpen] =
|
|
1394
|
-
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);
|
|
1395
1475
|
const fakeGuests = [
|
|
1396
1476
|
"alice@example.com",
|
|
1397
1477
|
"bob@example.com",
|
|
@@ -1399,9 +1479,8 @@ var EventModal = ({
|
|
|
1399
1479
|
"diana@example.com",
|
|
1400
1480
|
"evan@example.com"
|
|
1401
1481
|
];
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
React15.useEffect(() => {
|
|
1482
|
+
const [selectedGuests, setSelectedGuests] = (0, import_react14.useState)([]);
|
|
1483
|
+
(0, import_react14.useEffect)(() => {
|
|
1405
1484
|
if (isOpen) {
|
|
1406
1485
|
if (event) {
|
|
1407
1486
|
setMode("view");
|
|
@@ -1431,7 +1510,6 @@ var EventModal = ({
|
|
|
1431
1510
|
reminders: [{ id: "1", type: "notification", time: 30, label: "30 minutes before" }]
|
|
1432
1511
|
});
|
|
1433
1512
|
setSelectedGuests([]);
|
|
1434
|
-
setActiveTab("details");
|
|
1435
1513
|
}
|
|
1436
1514
|
}
|
|
1437
1515
|
}, [isOpen, event, initialDate, calendars]);
|
|
@@ -1466,7 +1544,7 @@ var EventModal = ({
|
|
|
1466
1544
|
};
|
|
1467
1545
|
const formatDateForInput = (date) => {
|
|
1468
1546
|
if (!date) return "";
|
|
1469
|
-
return
|
|
1547
|
+
return (0, import_date_fns10.format)(date, "yyyy-MM-dd'T'HH:mm");
|
|
1470
1548
|
};
|
|
1471
1549
|
const handleDateChange = (field, value) => {
|
|
1472
1550
|
const date = new Date(value);
|
|
@@ -1516,14 +1594,14 @@ var EventModal = ({
|
|
|
1516
1594
|
};
|
|
1517
1595
|
const getDurationText = () => {
|
|
1518
1596
|
if (!formData.start || !formData.end) return "";
|
|
1519
|
-
const mins =
|
|
1597
|
+
const mins = (0, import_date_fns10.differenceInMinutes)(formData.end, formData.start);
|
|
1520
1598
|
if (mins < 60) return `${mins} min`;
|
|
1521
1599
|
const hours = Math.floor(mins / 60);
|
|
1522
1600
|
const remainingMins = mins % 60;
|
|
1523
1601
|
if (remainingMins === 0) return `${hours} hr`;
|
|
1524
1602
|
return `${hours} hr ${remainingMins} min`;
|
|
1525
1603
|
};
|
|
1526
|
-
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(
|
|
1527
1605
|
"div",
|
|
1528
1606
|
{
|
|
1529
1607
|
className: "relative px-6 pt-6 pb-8",
|
|
@@ -1531,65 +1609,65 @@ var EventModal = ({
|
|
|
1531
1609
|
background: `linear-gradient(135deg, ${event?.color || "#3b82f6"}15 0%, transparent 100%)`
|
|
1532
1610
|
}
|
|
1533
1611
|
},
|
|
1534
|
-
/* @__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(
|
|
1535
1613
|
"div",
|
|
1536
1614
|
{
|
|
1537
1615
|
className: "w-3 h-3 rounded-full",
|
|
1538
1616
|
style: { backgroundColor: event?.color || "#3b82f6" }
|
|
1539
1617
|
}
|
|
1540
|
-
), /* @__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(
|
|
1541
1619
|
"button",
|
|
1542
1620
|
{
|
|
1543
1621
|
onClick: () => setMode("edit"),
|
|
1544
1622
|
className: "p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground",
|
|
1545
1623
|
title: "Edit"
|
|
1546
1624
|
},
|
|
1547
|
-
/* @__PURE__ */
|
|
1548
|
-
), /* @__PURE__ */
|
|
1625
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Edit2, { className: "w-4 h-4" })
|
|
1626
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1549
1627
|
"button",
|
|
1550
1628
|
{
|
|
1551
1629
|
onClick: handleDelete,
|
|
1552
1630
|
className: "p-2 hover:bg-destructive/10 rounded-lg transition-all text-muted-foreground hover:text-destructive",
|
|
1553
1631
|
title: "Delete"
|
|
1554
1632
|
},
|
|
1555
|
-
/* @__PURE__ */
|
|
1556
|
-
), /* @__PURE__ */
|
|
1633
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Trash2, { className: "w-4 h-4" })
|
|
1634
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1557
1635
|
"button",
|
|
1558
1636
|
{
|
|
1559
1637
|
onClick: onClose,
|
|
1560
1638
|
className: "p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground",
|
|
1561
1639
|
title: "Close"
|
|
1562
1640
|
},
|
|
1563
|
-
/* @__PURE__ */
|
|
1641
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-4 h-4" })
|
|
1564
1642
|
))),
|
|
1565
|
-
/* @__PURE__ */
|
|
1566
|
-
/* @__PURE__ */
|
|
1567
|
-
), /* @__PURE__ */
|
|
1568
|
-
|
|
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,
|
|
1569
1647
|
{
|
|
1570
1648
|
initial: { opacity: 0, y: 10 },
|
|
1571
1649
|
animate: { opacity: 1, y: 0 },
|
|
1572
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"
|
|
1573
1651
|
},
|
|
1574
|
-
/* @__PURE__ */
|
|
1575
|
-
/* @__PURE__ */
|
|
1576
|
-
/* @__PURE__ */
|
|
1577
|
-
), event?.guests && event.guests.length > 0 && /* @__PURE__ */
|
|
1578
|
-
|
|
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,
|
|
1579
1657
|
{
|
|
1580
1658
|
initial: { opacity: 0, y: 10 },
|
|
1581
1659
|
animate: { opacity: 1, y: 0 },
|
|
1582
1660
|
transition: { delay: 0.05 },
|
|
1583
1661
|
className: "space-y-3"
|
|
1584
1662
|
},
|
|
1585
|
-
/* @__PURE__ */
|
|
1586
|
-
/* @__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(
|
|
1587
1665
|
"div",
|
|
1588
1666
|
{
|
|
1589
1667
|
key: index,
|
|
1590
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"
|
|
1591
1669
|
},
|
|
1592
|
-
/* @__PURE__ */
|
|
1670
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1593
1671
|
"div",
|
|
1594
1672
|
{
|
|
1595
1673
|
className: "w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold text-white",
|
|
@@ -1597,18 +1675,18 @@ var EventModal = ({
|
|
|
1597
1675
|
},
|
|
1598
1676
|
email[0].toUpperCase()
|
|
1599
1677
|
),
|
|
1600
|
-
/* @__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))
|
|
1601
1679
|
)))
|
|
1602
|
-
), event?.reminders && event.reminders.length > 0 && /* @__PURE__ */
|
|
1603
|
-
|
|
1680
|
+
), event?.reminders && event.reminders.length > 0 && /* @__PURE__ */ import_react14.default.createElement(
|
|
1681
|
+
import_framer_motion2.motion.div,
|
|
1604
1682
|
{
|
|
1605
1683
|
initial: { opacity: 0, y: 10 },
|
|
1606
1684
|
animate: { opacity: 1, y: 0 },
|
|
1607
1685
|
transition: { delay: 0.1 },
|
|
1608
1686
|
className: "flex items-center gap-3"
|
|
1609
1687
|
},
|
|
1610
|
-
/* @__PURE__ */
|
|
1611
|
-
/* @__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(
|
|
1612
1690
|
"span",
|
|
1613
1691
|
{
|
|
1614
1692
|
key: reminder.id,
|
|
@@ -1616,45 +1694,45 @@ var EventModal = ({
|
|
|
1616
1694
|
},
|
|
1617
1695
|
reminder.label || `${reminder.time} min before`
|
|
1618
1696
|
)))
|
|
1619
|
-
), event?.description && /* @__PURE__ */
|
|
1620
|
-
|
|
1697
|
+
), event?.description && /* @__PURE__ */ import_react14.default.createElement(
|
|
1698
|
+
import_framer_motion2.motion.div,
|
|
1621
1699
|
{
|
|
1622
1700
|
initial: { opacity: 0, y: 10 },
|
|
1623
1701
|
animate: { opacity: 1, y: 0 },
|
|
1624
1702
|
transition: { delay: 0.15 },
|
|
1625
1703
|
className: "space-y-2"
|
|
1626
1704
|
},
|
|
1627
|
-
/* @__PURE__ */
|
|
1628
|
-
/* @__PURE__ */
|
|
1629
|
-
), event?.attachments && event.attachments.length > 0 && /* @__PURE__ */
|
|
1630
|
-
|
|
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,
|
|
1631
1709
|
{
|
|
1632
1710
|
initial: { opacity: 0, y: 10 },
|
|
1633
1711
|
animate: { opacity: 1, y: 0 },
|
|
1634
1712
|
transition: { delay: 0.2 },
|
|
1635
1713
|
className: "space-y-2"
|
|
1636
1714
|
},
|
|
1637
|
-
/* @__PURE__ */
|
|
1638
|
-
/* @__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(
|
|
1639
1717
|
"div",
|
|
1640
1718
|
{
|
|
1641
1719
|
key: att.id,
|
|
1642
1720
|
onClick: () => handleDownload(att),
|
|
1643
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"
|
|
1644
1722
|
},
|
|
1645
|
-
/* @__PURE__ */
|
|
1646
|
-
/* @__PURE__ */
|
|
1647
|
-
/* @__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" })
|
|
1648
1726
|
)))
|
|
1649
1727
|
)));
|
|
1650
|
-
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(
|
|
1651
1729
|
"button",
|
|
1652
1730
|
{
|
|
1653
1731
|
type: "button",
|
|
1654
1732
|
onClick: () => setIsColorPickerOpen(!isColorPickerOpen),
|
|
1655
1733
|
className: "relative p-1"
|
|
1656
1734
|
},
|
|
1657
|
-
/* @__PURE__ */
|
|
1735
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1658
1736
|
"div",
|
|
1659
1737
|
{
|
|
1660
1738
|
className: "w-5 h-5 rounded-full cursor-pointer hover:scale-110 transition-transform",
|
|
@@ -1664,7 +1742,7 @@ var EventModal = ({
|
|
|
1664
1742
|
}
|
|
1665
1743
|
}
|
|
1666
1744
|
),
|
|
1667
|
-
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(
|
|
1668
1746
|
"button",
|
|
1669
1747
|
{
|
|
1670
1748
|
key: color,
|
|
@@ -1680,15 +1758,15 @@ var EventModal = ({
|
|
|
1680
1758
|
style: { backgroundColor: color, color }
|
|
1681
1759
|
}
|
|
1682
1760
|
)))
|
|
1683
|
-
), /* @__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(
|
|
1684
1762
|
"button",
|
|
1685
1763
|
{
|
|
1686
1764
|
type: "button",
|
|
1687
1765
|
onClick: onClose,
|
|
1688
1766
|
className: "p-2 hover:bg-accent rounded-xl transition-all text-muted-foreground hover:text-foreground"
|
|
1689
1767
|
},
|
|
1690
|
-
/* @__PURE__ */
|
|
1691
|
-
)), /* @__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(
|
|
1692
1770
|
"input",
|
|
1693
1771
|
{
|
|
1694
1772
|
type: "text",
|
|
@@ -1699,7 +1777,7 @@ var EventModal = ({
|
|
|
1699
1777
|
onChange: (e) => setFormData({ ...formData, title: e.target.value }),
|
|
1700
1778
|
placeholder: "Add title"
|
|
1701
1779
|
}
|
|
1702
|
-
)), /* @__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(
|
|
1703
1781
|
"input",
|
|
1704
1782
|
{
|
|
1705
1783
|
type: "datetime-local",
|
|
@@ -1707,7 +1785,7 @@ var EventModal = ({
|
|
|
1707
1785
|
value: formatDateForInput(formData.start),
|
|
1708
1786
|
onChange: (e) => handleDateChange("start", e.target.value)
|
|
1709
1787
|
}
|
|
1710
|
-
)), /* @__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(
|
|
1711
1789
|
"input",
|
|
1712
1790
|
{
|
|
1713
1791
|
type: "datetime-local",
|
|
@@ -1715,16 +1793,16 @@ var EventModal = ({
|
|
|
1715
1793
|
value: formatDateForInput(formData.end),
|
|
1716
1794
|
onChange: (e) => handleDateChange("end", e.target.value)
|
|
1717
1795
|
}
|
|
1718
|
-
)))), 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(
|
|
1719
1797
|
"button",
|
|
1720
1798
|
{
|
|
1721
1799
|
type: "button",
|
|
1722
1800
|
onClick: () => setIsReminderDropdownOpen(!isReminderDropdownOpen),
|
|
1723
1801
|
className: "flex items-center gap-1 text-xs font-medium text-primary hover:text-primary/80 transition-colors"
|
|
1724
1802
|
},
|
|
1725
|
-
/* @__PURE__ */
|
|
1803
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Plus, { className: "w-3.5 h-3.5" }),
|
|
1726
1804
|
"Add"
|
|
1727
|
-
), 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(
|
|
1728
1806
|
"button",
|
|
1729
1807
|
{
|
|
1730
1808
|
key: option.value,
|
|
@@ -1733,58 +1811,58 @@ var EventModal = ({
|
|
|
1733
1811
|
className: "w-full px-3 py-2 text-left text-sm hover:bg-accent transition-colors"
|
|
1734
1812
|
},
|
|
1735
1813
|
option.label
|
|
1736
|
-
)))))), 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(
|
|
1737
1815
|
"div",
|
|
1738
1816
|
{
|
|
1739
1817
|
key: reminder.id,
|
|
1740
1818
|
className: "flex items-center gap-2 px-3 py-1.5 rounded-full bg-amber-500/10 border border-amber-500/20"
|
|
1741
1819
|
},
|
|
1742
|
-
/* @__PURE__ */
|
|
1743
|
-
/* @__PURE__ */
|
|
1744
|
-
/* @__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(
|
|
1745
1823
|
"button",
|
|
1746
1824
|
{
|
|
1747
1825
|
type: "button",
|
|
1748
1826
|
onClick: () => removeReminder(reminder.id),
|
|
1749
1827
|
className: "p-0.5 hover:bg-amber-500/20 rounded-full transition-colors"
|
|
1750
1828
|
},
|
|
1751
|
-
/* @__PURE__ */
|
|
1829
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-3 h-3 text-amber-500" })
|
|
1752
1830
|
)
|
|
1753
|
-
)))), /* @__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(
|
|
1754
1832
|
"button",
|
|
1755
1833
|
{
|
|
1756
1834
|
type: "button",
|
|
1757
1835
|
onClick: () => setIsGuestsDropdownOpen(!isGuestsDropdownOpen),
|
|
1758
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"
|
|
1759
1837
|
},
|
|
1760
|
-
/* @__PURE__ */
|
|
1761
|
-
/* @__PURE__ */
|
|
1762
|
-
), 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(
|
|
1763
1841
|
"div",
|
|
1764
1842
|
{
|
|
1765
1843
|
key: email,
|
|
1766
1844
|
className: "px-4 py-3 hover:bg-accent cursor-pointer flex items-center gap-3 transition-colors",
|
|
1767
1845
|
onClick: () => toggleGuest(email)
|
|
1768
1846
|
},
|
|
1769
|
-
/* @__PURE__ */
|
|
1847
|
+
/* @__PURE__ */ import_react14.default.createElement("div", { className: cn(
|
|
1770
1848
|
"w-5 h-5 rounded-md border-2 flex items-center justify-center transition-all",
|
|
1771
1849
|
selectedGuests.includes(email) ? "bg-primary border-primary" : "border-border"
|
|
1772
|
-
) }, selectedGuests.includes(email) && /* @__PURE__ */
|
|
1773
|
-
/* @__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(
|
|
1774
1852
|
"div",
|
|
1775
1853
|
{
|
|
1776
1854
|
className: "w-7 h-7 rounded-full flex items-center justify-center text-xs font-semibold text-white",
|
|
1777
1855
|
style: { backgroundColor: `hsl(${fakeGuests.indexOf(email) * 60}, 70%, 50%)` }
|
|
1778
1856
|
},
|
|
1779
1857
|
email[0].toUpperCase()
|
|
1780
|
-
), /* @__PURE__ */
|
|
1781
|
-
))))), 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(
|
|
1782
1860
|
"div",
|
|
1783
1861
|
{
|
|
1784
1862
|
key: email,
|
|
1785
1863
|
className: "flex items-center gap-2 pl-1 pr-2 py-1 bg-muted/30 border border-border/30 rounded-full"
|
|
1786
1864
|
},
|
|
1787
|
-
/* @__PURE__ */
|
|
1865
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1788
1866
|
"div",
|
|
1789
1867
|
{
|
|
1790
1868
|
className: "w-6 h-6 rounded-full flex items-center justify-center text-xs font-semibold text-white",
|
|
@@ -1792,17 +1870,17 @@ var EventModal = ({
|
|
|
1792
1870
|
},
|
|
1793
1871
|
email[0].toUpperCase()
|
|
1794
1872
|
),
|
|
1795
|
-
/* @__PURE__ */
|
|
1796
|
-
/* @__PURE__ */
|
|
1873
|
+
/* @__PURE__ */ import_react14.default.createElement("span", { className: "text-xs font-medium text-foreground" }, email.split("@")[0]),
|
|
1874
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1797
1875
|
"button",
|
|
1798
1876
|
{
|
|
1799
1877
|
type: "button",
|
|
1800
1878
|
onClick: () => toggleGuest(email),
|
|
1801
1879
|
className: "p-0.5 hover:bg-destructive/10 rounded-full transition-colors"
|
|
1802
1880
|
},
|
|
1803
|
-
/* @__PURE__ */
|
|
1881
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.X, { className: "w-3 h-3 text-muted-foreground" })
|
|
1804
1882
|
)
|
|
1805
|
-
)))), /* @__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(
|
|
1806
1884
|
"input",
|
|
1807
1885
|
{
|
|
1808
1886
|
type: "text",
|
|
@@ -1811,7 +1889,7 @@ var EventModal = ({
|
|
|
1811
1889
|
value: formData.location || "",
|
|
1812
1890
|
onChange: (e) => setFormData({ ...formData, location: e.target.value })
|
|
1813
1891
|
}
|
|
1814
|
-
)), /* @__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(
|
|
1815
1893
|
"textarea",
|
|
1816
1894
|
{
|
|
1817
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",
|
|
@@ -1819,7 +1897,7 @@ var EventModal = ({
|
|
|
1819
1897
|
value: formData.description || "",
|
|
1820
1898
|
onChange: (e) => setFormData({ ...formData, description: e.target.value })
|
|
1821
1899
|
}
|
|
1822
|
-
)), /* @__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(
|
|
1823
1901
|
"select",
|
|
1824
1902
|
{
|
|
1825
1903
|
className: "flex-1 bg-transparent text-sm text-foreground focus:outline-none cursor-pointer",
|
|
@@ -1838,28 +1916,28 @@ var EventModal = ({
|
|
|
1838
1916
|
}
|
|
1839
1917
|
}
|
|
1840
1918
|
},
|
|
1841
|
-
/* @__PURE__ */
|
|
1842
|
-
/* @__PURE__ */
|
|
1843
|
-
/* @__PURE__ */
|
|
1844
|
-
/* @__PURE__ */
|
|
1845
|
-
/* @__PURE__ */
|
|
1846
|
-
)), /* @__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(
|
|
1847
1925
|
"button",
|
|
1848
1926
|
{
|
|
1849
1927
|
type: "button",
|
|
1850
1928
|
onClick: () => setIsCalendarDropdownOpen(!isCalendarDropdownOpen),
|
|
1851
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"
|
|
1852
1930
|
},
|
|
1853
|
-
/* @__PURE__ */
|
|
1931
|
+
/* @__PURE__ */ import_react14.default.createElement(
|
|
1854
1932
|
"div",
|
|
1855
1933
|
{
|
|
1856
1934
|
className: "w-3 h-3 rounded-full",
|
|
1857
1935
|
style: { backgroundColor: calendars?.find((c) => c.id === formData.calendarId)?.color || "#3b82f6" }
|
|
1858
1936
|
}
|
|
1859
1937
|
),
|
|
1860
|
-
/* @__PURE__ */
|
|
1861
|
-
/* @__PURE__ */
|
|
1862
|
-
), 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(
|
|
1863
1941
|
"button",
|
|
1864
1942
|
{
|
|
1865
1943
|
key: cal.id,
|
|
@@ -1874,19 +1952,19 @@ var EventModal = ({
|
|
|
1874
1952
|
setIsCalendarDropdownOpen(false);
|
|
1875
1953
|
}
|
|
1876
1954
|
},
|
|
1877
|
-
/* @__PURE__ */
|
|
1878
|
-
/* @__PURE__ */
|
|
1879
|
-
formData.calendarId === cal.id && /* @__PURE__ */
|
|
1880
|
-
)))))))), /* @__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(
|
|
1881
1959
|
"button",
|
|
1882
1960
|
{
|
|
1883
1961
|
type: "button",
|
|
1884
1962
|
onClick: handleDelete,
|
|
1885
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"
|
|
1886
1964
|
},
|
|
1887
|
-
/* @__PURE__ */
|
|
1965
|
+
/* @__PURE__ */ import_react14.default.createElement(import_lucide_react7.Trash2, { className: "w-4 h-4" }),
|
|
1888
1966
|
"Delete"
|
|
1889
|
-
), 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(
|
|
1890
1968
|
"button",
|
|
1891
1969
|
{
|
|
1892
1970
|
type: "button",
|
|
@@ -1894,7 +1972,7 @@ var EventModal = ({
|
|
|
1894
1972
|
className: "px-4 py-2.5 text-muted-foreground hover:text-foreground font-medium text-sm rounded-xl transition-all hover:bg-accent"
|
|
1895
1973
|
},
|
|
1896
1974
|
"Cancel"
|
|
1897
|
-
), /* @__PURE__ */
|
|
1975
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1898
1976
|
"button",
|
|
1899
1977
|
{
|
|
1900
1978
|
type: "submit",
|
|
@@ -1902,8 +1980,8 @@ var EventModal = ({
|
|
|
1902
1980
|
},
|
|
1903
1981
|
mode === "edit" ? "Save Changes" : "Create Event"
|
|
1904
1982
|
))));
|
|
1905
|
-
return /* @__PURE__ */
|
|
1906
|
-
|
|
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,
|
|
1907
1985
|
{
|
|
1908
1986
|
key: "view",
|
|
1909
1987
|
initial: { opacity: 0 },
|
|
@@ -1912,8 +1990,8 @@ var EventModal = ({
|
|
|
1912
1990
|
transition: { duration: 0.15 }
|
|
1913
1991
|
},
|
|
1914
1992
|
renderViewMode()
|
|
1915
|
-
) : /* @__PURE__ */
|
|
1916
|
-
|
|
1993
|
+
) : /* @__PURE__ */ import_react14.default.createElement(
|
|
1994
|
+
import_framer_motion2.motion.div,
|
|
1917
1995
|
{
|
|
1918
1996
|
key: "edit",
|
|
1919
1997
|
initial: { opacity: 0 },
|
|
@@ -1924,9 +2002,12 @@ var EventModal = ({
|
|
|
1924
2002
|
renderEditMode()
|
|
1925
2003
|
)));
|
|
1926
2004
|
};
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
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(
|
|
1930
2011
|
Skeleton,
|
|
1931
2012
|
{
|
|
1932
2013
|
className: "absolute rounded-md",
|
|
@@ -1938,20 +2019,25 @@ var WeekViewSkeleton = () => /* @__PURE__ */ React15__namespace.default.createEl
|
|
|
1938
2019
|
}
|
|
1939
2020
|
}
|
|
1940
2021
|
))))));
|
|
1941
|
-
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(
|
|
1942
2023
|
Skeleton,
|
|
1943
2024
|
{
|
|
1944
2025
|
className: "absolute rounded-lg left-4 right-4",
|
|
1945
2026
|
style: { top: "160px", height: "120px" }
|
|
1946
2027
|
}
|
|
1947
|
-
), /* @__PURE__ */
|
|
2028
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
1948
2029
|
Skeleton,
|
|
1949
2030
|
{
|
|
1950
2031
|
className: "absolute rounded-lg left-4 right-4",
|
|
1951
2032
|
style: { top: "400px", height: "80px" }
|
|
1952
2033
|
}
|
|
1953
2034
|
))));
|
|
1954
|
-
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");
|
|
1955
2041
|
var EventContextMenu = ({
|
|
1956
2042
|
event,
|
|
1957
2043
|
position,
|
|
@@ -1962,8 +2048,8 @@ var EventContextMenu = ({
|
|
|
1962
2048
|
customActions = [],
|
|
1963
2049
|
translations
|
|
1964
2050
|
}) => {
|
|
1965
|
-
const menuRef =
|
|
1966
|
-
|
|
2051
|
+
const menuRef = (0, import_react16.useRef)(null);
|
|
2052
|
+
(0, import_react16.useEffect)(() => {
|
|
1967
2053
|
const handleKeyDown = (e) => {
|
|
1968
2054
|
if (e.key === "Escape") {
|
|
1969
2055
|
onClose();
|
|
@@ -1974,7 +2060,7 @@ var EventContextMenu = ({
|
|
|
1974
2060
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
1975
2061
|
}
|
|
1976
2062
|
}, [position, onClose]);
|
|
1977
|
-
|
|
2063
|
+
(0, import_react16.useEffect)(() => {
|
|
1978
2064
|
const handleClickOutside = (e) => {
|
|
1979
2065
|
if (menuRef.current && !menuRef.current.contains(e.target)) {
|
|
1980
2066
|
onClose();
|
|
@@ -1992,7 +2078,7 @@ var EventContextMenu = ({
|
|
|
1992
2078
|
...onEdit ? [{
|
|
1993
2079
|
id: "edit",
|
|
1994
2080
|
label: translations?.edit || "Edit",
|
|
1995
|
-
icon: /* @__PURE__ */
|
|
2081
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Edit3, { className: "w-4 h-4" }),
|
|
1996
2082
|
onClick: () => {
|
|
1997
2083
|
onEdit(event);
|
|
1998
2084
|
onClose();
|
|
@@ -2001,7 +2087,7 @@ var EventContextMenu = ({
|
|
|
2001
2087
|
...onDuplicate ? [{
|
|
2002
2088
|
id: "duplicate",
|
|
2003
2089
|
label: translations?.duplicate || "Duplicate",
|
|
2004
|
-
icon: /* @__PURE__ */
|
|
2090
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Copy, { className: "w-4 h-4" }),
|
|
2005
2091
|
onClick: () => {
|
|
2006
2092
|
onDuplicate(event);
|
|
2007
2093
|
onClose();
|
|
@@ -2011,7 +2097,7 @@ var EventContextMenu = ({
|
|
|
2011
2097
|
...onDelete ? [{
|
|
2012
2098
|
id: "delete",
|
|
2013
2099
|
label: translations?.delete || "Delete",
|
|
2014
|
-
icon: /* @__PURE__ */
|
|
2100
|
+
icon: /* @__PURE__ */ import_react16.default.createElement(import_lucide_react8.Trash2, { className: "w-4 h-4" }),
|
|
2015
2101
|
onClick: () => {
|
|
2016
2102
|
onDelete(event.id);
|
|
2017
2103
|
onClose();
|
|
@@ -2023,8 +2109,8 @@ var EventContextMenu = ({
|
|
|
2023
2109
|
x: Math.min(position.x, window.innerWidth - 200),
|
|
2024
2110
|
y: Math.min(position.y, window.innerHeight - (actions.length * 44 + 80))
|
|
2025
2111
|
};
|
|
2026
|
-
return /* @__PURE__ */
|
|
2027
|
-
|
|
2112
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_framer_motion3.AnimatePresence, null, /* @__PURE__ */ import_react16.default.createElement(
|
|
2113
|
+
import_framer_motion3.motion.div,
|
|
2028
2114
|
{
|
|
2029
2115
|
ref: menuRef,
|
|
2030
2116
|
initial: { opacity: 0, scale: 0.95, y: -5 },
|
|
@@ -2037,14 +2123,14 @@ var EventContextMenu = ({
|
|
|
2037
2123
|
top: adjustedPosition.y
|
|
2038
2124
|
}
|
|
2039
2125
|
},
|
|
2040
|
-
/* @__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(
|
|
2041
2127
|
"div",
|
|
2042
2128
|
{
|
|
2043
2129
|
className: "w-2.5 h-2.5 rounded-full shrink-0",
|
|
2044
2130
|
style: { backgroundColor: event.color || "var(--primary)" }
|
|
2045
2131
|
}
|
|
2046
|
-
), /* @__PURE__ */
|
|
2047
|
-
/* @__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(
|
|
2048
2134
|
"button",
|
|
2049
2135
|
{
|
|
2050
2136
|
onClick: action.onClick,
|
|
@@ -2056,13 +2142,13 @@ var EventContextMenu = ({
|
|
|
2056
2142
|
)
|
|
2057
2143
|
},
|
|
2058
2144
|
action.icon,
|
|
2059
|
-
/* @__PURE__ */
|
|
2145
|
+
/* @__PURE__ */ import_react16.default.createElement("span", null, action.label)
|
|
2060
2146
|
))))
|
|
2061
2147
|
));
|
|
2062
2148
|
};
|
|
2063
2149
|
var useEventContextMenu = () => {
|
|
2064
|
-
const [contextMenu, setContextMenu] =
|
|
2065
|
-
const openContextMenu =
|
|
2150
|
+
const [contextMenu, setContextMenu] = (0, import_react16.useState)({ event: null, position: null });
|
|
2151
|
+
const openContextMenu = (0, import_react16.useCallback)((event, e) => {
|
|
2066
2152
|
e.preventDefault();
|
|
2067
2153
|
e.stopPropagation();
|
|
2068
2154
|
setContextMenu({
|
|
@@ -2070,7 +2156,7 @@ var useEventContextMenu = () => {
|
|
|
2070
2156
|
position: { x: e.clientX, y: e.clientY }
|
|
2071
2157
|
});
|
|
2072
2158
|
}, []);
|
|
2073
|
-
const closeContextMenu =
|
|
2159
|
+
const closeContextMenu = (0, import_react16.useCallback)(() => {
|
|
2074
2160
|
setContextMenu({ event: null, position: null });
|
|
2075
2161
|
}, []);
|
|
2076
2162
|
return {
|
|
@@ -2246,7 +2332,7 @@ function colorToHsl(color) {
|
|
|
2246
2332
|
const min = Math.min(r, g, b);
|
|
2247
2333
|
let h = 0;
|
|
2248
2334
|
let s = 0;
|
|
2249
|
-
|
|
2335
|
+
const l = (max + min) / 2;
|
|
2250
2336
|
if (max !== min) {
|
|
2251
2337
|
const d = max - min;
|
|
2252
2338
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
@@ -2299,6 +2385,12 @@ function getThemeStyles(theme) {
|
|
|
2299
2385
|
}
|
|
2300
2386
|
return styles;
|
|
2301
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");
|
|
2302
2394
|
var useCalendarLogic = ({
|
|
2303
2395
|
events,
|
|
2304
2396
|
view: controlledView,
|
|
@@ -2312,23 +2404,23 @@ var useCalendarLogic = ({
|
|
|
2312
2404
|
readOnly,
|
|
2313
2405
|
timezone
|
|
2314
2406
|
}) => {
|
|
2315
|
-
const [internalView, setInternalView] =
|
|
2316
|
-
const [internalDate, setInternalDate] =
|
|
2317
|
-
const [isSidebarOpen, setIsSidebarOpen] =
|
|
2318
|
-
const [isModalOpen, setIsModalOpen] =
|
|
2319
|
-
const [selectedEvent, setSelectedEvent] =
|
|
2320
|
-
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);
|
|
2321
2413
|
const view = controlledView ?? internalView;
|
|
2322
2414
|
const currentDate = controlledDate ?? internalDate;
|
|
2323
|
-
const expandedEvents =
|
|
2415
|
+
const expandedEvents = (0, import_react17.useMemo)(() => {
|
|
2324
2416
|
const allEvents = [];
|
|
2325
|
-
const rangeStart =
|
|
2326
|
-
const rangeEnd =
|
|
2417
|
+
const rangeStart = (0, import_date_fns11.subDays)(currentDate, 365);
|
|
2418
|
+
const rangeEnd = (0, import_date_fns11.addDays)(currentDate, 365);
|
|
2327
2419
|
events.forEach((event) => {
|
|
2328
2420
|
if (event.recurrence) {
|
|
2329
2421
|
try {
|
|
2330
|
-
const rule = new
|
|
2331
|
-
freq:
|
|
2422
|
+
const rule = new import_rrule.RRule({
|
|
2423
|
+
freq: import_rrule.RRule[event.recurrence.freq],
|
|
2332
2424
|
interval: event.recurrence.interval || 1,
|
|
2333
2425
|
dtstart: new Date(event.start),
|
|
2334
2426
|
until: event.recurrence.until ? new Date(event.recurrence.until) : void 0,
|
|
@@ -2336,7 +2428,7 @@ var useCalendarLogic = ({
|
|
|
2336
2428
|
});
|
|
2337
2429
|
const dates = rule.between(rangeStart, rangeEnd);
|
|
2338
2430
|
dates.forEach((date) => {
|
|
2339
|
-
const duration =
|
|
2431
|
+
const duration = (0, import_date_fns11.differenceInMilliseconds)(new Date(event.end), new Date(event.start));
|
|
2340
2432
|
allEvents.push({
|
|
2341
2433
|
...event,
|
|
2342
2434
|
id: `${event.id}-${date.getTime()}`,
|
|
@@ -2374,34 +2466,34 @@ var useCalendarLogic = ({
|
|
|
2374
2466
|
const handlePrev = () => {
|
|
2375
2467
|
switch (view) {
|
|
2376
2468
|
case "month":
|
|
2377
|
-
handleDateChange(
|
|
2469
|
+
handleDateChange((0, import_date_fns11.subMonths)(currentDate, 1));
|
|
2378
2470
|
break;
|
|
2379
2471
|
case "week":
|
|
2380
|
-
handleDateChange(
|
|
2472
|
+
handleDateChange((0, import_date_fns11.subWeeks)(currentDate, 1));
|
|
2381
2473
|
break;
|
|
2382
2474
|
case "day":
|
|
2383
2475
|
case "resource":
|
|
2384
|
-
handleDateChange(
|
|
2476
|
+
handleDateChange((0, import_date_fns11.subDays)(currentDate, 1));
|
|
2385
2477
|
break;
|
|
2386
2478
|
case "agenda":
|
|
2387
|
-
handleDateChange(
|
|
2479
|
+
handleDateChange((0, import_date_fns11.subDays)(currentDate, 7));
|
|
2388
2480
|
break;
|
|
2389
2481
|
}
|
|
2390
2482
|
};
|
|
2391
2483
|
const handleNext = () => {
|
|
2392
2484
|
switch (view) {
|
|
2393
2485
|
case "month":
|
|
2394
|
-
handleDateChange(
|
|
2486
|
+
handleDateChange((0, import_date_fns11.addMonths)(currentDate, 1));
|
|
2395
2487
|
break;
|
|
2396
2488
|
case "week":
|
|
2397
|
-
handleDateChange(
|
|
2489
|
+
handleDateChange((0, import_date_fns11.addWeeks)(currentDate, 1));
|
|
2398
2490
|
break;
|
|
2399
2491
|
case "day":
|
|
2400
2492
|
case "resource":
|
|
2401
|
-
handleDateChange(
|
|
2493
|
+
handleDateChange((0, import_date_fns11.addDays)(currentDate, 1));
|
|
2402
2494
|
break;
|
|
2403
2495
|
case "agenda":
|
|
2404
|
-
handleDateChange(
|
|
2496
|
+
handleDateChange((0, import_date_fns11.addDays)(currentDate, 7));
|
|
2405
2497
|
break;
|
|
2406
2498
|
}
|
|
2407
2499
|
};
|
|
@@ -2469,17 +2561,17 @@ var useCalendarLogic = ({
|
|
|
2469
2561
|
if (!activeEvent || !overDate) return;
|
|
2470
2562
|
const originalStart = new Date(activeEvent.start);
|
|
2471
2563
|
const originalEnd = new Date(activeEvent.end);
|
|
2472
|
-
const duration =
|
|
2564
|
+
const duration = (0, import_date_fns11.differenceInMilliseconds)(originalEnd, originalStart);
|
|
2473
2565
|
let newStart;
|
|
2474
2566
|
if (view === "month") {
|
|
2475
2567
|
if (timezone) {
|
|
2476
|
-
const zonedOriginal =
|
|
2568
|
+
const zonedOriginal = (0, import_date_fns_tz5.toZonedTime)(originalStart, timezone);
|
|
2477
2569
|
const zonedNew = new Date(overDate);
|
|
2478
2570
|
zonedNew.setHours(zonedOriginal.getHours());
|
|
2479
2571
|
zonedNew.setMinutes(zonedOriginal.getMinutes());
|
|
2480
2572
|
zonedNew.setSeconds(zonedOriginal.getSeconds());
|
|
2481
2573
|
zonedNew.setMilliseconds(zonedOriginal.getMilliseconds());
|
|
2482
|
-
newStart =
|
|
2574
|
+
newStart = (0, import_date_fns_tz5.fromZonedTime)(zonedNew, timezone);
|
|
2483
2575
|
} else {
|
|
2484
2576
|
newStart = new Date(overDate);
|
|
2485
2577
|
newStart.setHours(originalStart.getHours());
|
|
@@ -2489,7 +2581,7 @@ var useCalendarLogic = ({
|
|
|
2489
2581
|
}
|
|
2490
2582
|
} else {
|
|
2491
2583
|
if (timezone) {
|
|
2492
|
-
newStart =
|
|
2584
|
+
newStart = (0, import_date_fns_tz5.fromZonedTime)(overDate, timezone);
|
|
2493
2585
|
} else {
|
|
2494
2586
|
newStart = new Date(overDate);
|
|
2495
2587
|
}
|
|
@@ -2538,6 +2630,12 @@ var useCalendarLogic = ({
|
|
|
2538
2630
|
handleDragEnd
|
|
2539
2631
|
};
|
|
2540
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");
|
|
2541
2639
|
var useSwipeGesture = (options) => {
|
|
2542
2640
|
const {
|
|
2543
2641
|
onSwipeLeft,
|
|
@@ -2549,9 +2647,9 @@ var useSwipeGesture = (options) => {
|
|
|
2549
2647
|
allowedTime = 500,
|
|
2550
2648
|
enabled = true
|
|
2551
2649
|
} = options;
|
|
2552
|
-
const touchInfoRef =
|
|
2553
|
-
const elementRef =
|
|
2554
|
-
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) => {
|
|
2555
2653
|
if (!enabled) return;
|
|
2556
2654
|
const touch = e.touches[0];
|
|
2557
2655
|
touchInfoRef.current = {
|
|
@@ -2560,7 +2658,7 @@ var useSwipeGesture = (options) => {
|
|
|
2560
2658
|
startTime: Date.now()
|
|
2561
2659
|
};
|
|
2562
2660
|
}, [enabled]);
|
|
2563
|
-
const handleTouchEnd =
|
|
2661
|
+
const handleTouchEnd = (0, import_react18.useCallback)((e) => {
|
|
2564
2662
|
if (!enabled || !touchInfoRef.current) return;
|
|
2565
2663
|
const touch = e.changedTouches[0];
|
|
2566
2664
|
const { startX, startY, startTime } = touchInfoRef.current;
|
|
@@ -2584,7 +2682,7 @@ var useSwipeGesture = (options) => {
|
|
|
2584
2682
|
}
|
|
2585
2683
|
touchInfoRef.current = null;
|
|
2586
2684
|
}, [enabled, threshold, restraint, allowedTime, onSwipeLeft, onSwipeRight, onSwipeUp, onSwipeDown]);
|
|
2587
|
-
|
|
2685
|
+
(0, import_react18.useEffect)(() => {
|
|
2588
2686
|
const element = elementRef.current;
|
|
2589
2687
|
if (!element) return;
|
|
2590
2688
|
element.addEventListener("touchstart", handleTouchStart, { passive: true });
|
|
@@ -2640,7 +2738,7 @@ var Scheduler = ({
|
|
|
2640
2738
|
locale
|
|
2641
2739
|
// Date-fns locale
|
|
2642
2740
|
}) => {
|
|
2643
|
-
const [activeDragEvent, setActiveDragEvent] =
|
|
2741
|
+
const [activeDragEvent, setActiveDragEvent] = (0, import_react19.useState)(null);
|
|
2644
2742
|
const {
|
|
2645
2743
|
contextMenuEvent,
|
|
2646
2744
|
contextMenuPosition,
|
|
@@ -2682,16 +2780,16 @@ var Scheduler = ({
|
|
|
2682
2780
|
readOnly,
|
|
2683
2781
|
timezone
|
|
2684
2782
|
});
|
|
2685
|
-
const sensors =
|
|
2686
|
-
|
|
2783
|
+
const sensors = (0, import_core3.useSensors)(
|
|
2784
|
+
(0, import_core3.useSensor)(import_core3.PointerSensor, {
|
|
2687
2785
|
activationConstraint: {
|
|
2688
2786
|
distance: 8
|
|
2689
2787
|
}
|
|
2690
2788
|
})
|
|
2691
2789
|
);
|
|
2692
2790
|
const gridSize = 15;
|
|
2693
|
-
const snapToGrid =
|
|
2694
|
-
const modifiers
|
|
2791
|
+
const snapToGrid = (0, import_modifiers.createSnapModifier)(gridSize);
|
|
2792
|
+
const modifiers = [snapToGrid, import_modifiers.restrictToWindowEdges];
|
|
2695
2793
|
const dndSensors = readOnly ? [] : sensors;
|
|
2696
2794
|
const handleEventResize = (event, newEnd) => {
|
|
2697
2795
|
if (readOnly) return;
|
|
@@ -2705,7 +2803,7 @@ var Scheduler = ({
|
|
|
2705
2803
|
});
|
|
2706
2804
|
}
|
|
2707
2805
|
};
|
|
2708
|
-
const id =
|
|
2806
|
+
const id = (0, import_react19.useId)();
|
|
2709
2807
|
const swipeRef = useViewSwipe(handlePrev, handleNext, true);
|
|
2710
2808
|
const languagePack = language === "fr" ? fr : en;
|
|
2711
2809
|
const t = {
|
|
@@ -2730,20 +2828,20 @@ var Scheduler = ({
|
|
|
2730
2828
|
return 80;
|
|
2731
2829
|
}
|
|
2732
2830
|
if (view !== "week" && view !== "day") return void 0;
|
|
2733
|
-
const duration =
|
|
2831
|
+
const duration = (0, import_date_fns12.differenceInMinutes)(activeDragEvent.end, activeDragEvent.start);
|
|
2734
2832
|
const hourHeight = view === "day" ? 80 : 60;
|
|
2735
2833
|
return duration / 60 * hourHeight;
|
|
2736
2834
|
};
|
|
2737
2835
|
const getDragWidth = () => {
|
|
2738
2836
|
if (view === "month") return "100%";
|
|
2739
2837
|
if (view === "resource" && activeDragEvent) {
|
|
2740
|
-
const duration =
|
|
2838
|
+
const duration = (0, import_date_fns12.differenceInMinutes)(activeDragEvent.end, activeDragEvent.start);
|
|
2741
2839
|
const width = duration / 60 * 100;
|
|
2742
2840
|
return `${Math.max(width, 4)}px`;
|
|
2743
2841
|
}
|
|
2744
2842
|
return "150px";
|
|
2745
2843
|
};
|
|
2746
|
-
const filteredEvents =
|
|
2844
|
+
const filteredEvents = (0, import_react19.useMemo)(() => {
|
|
2747
2845
|
if (!calendars) return expandedEvents;
|
|
2748
2846
|
const activeCalendarIds = calendars.filter((c) => c.active !== false).map((c) => c.id);
|
|
2749
2847
|
return expandedEvents.filter((e) => {
|
|
@@ -2751,22 +2849,22 @@ var Scheduler = ({
|
|
|
2751
2849
|
return activeCalendarIds.includes(e.calendarId);
|
|
2752
2850
|
});
|
|
2753
2851
|
}, [expandedEvents, calendars]);
|
|
2754
|
-
return /* @__PURE__ */
|
|
2755
|
-
|
|
2852
|
+
return /* @__PURE__ */ import_react19.default.createElement(
|
|
2853
|
+
import_core3.DndContext,
|
|
2756
2854
|
{
|
|
2757
2855
|
id,
|
|
2758
2856
|
sensors: dndSensors,
|
|
2759
2857
|
onDragStart: handleDragStart,
|
|
2760
2858
|
onDragEnd: onDragEndWrapper,
|
|
2761
|
-
modifiers
|
|
2859
|
+
modifiers
|
|
2762
2860
|
},
|
|
2763
|
-
/* @__PURE__ */
|
|
2861
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2764
2862
|
"div",
|
|
2765
2863
|
{
|
|
2766
2864
|
className: cn("flex flex-col h-full bg-background text-foreground relative", className),
|
|
2767
2865
|
style: getThemeStyles(theme)
|
|
2768
2866
|
},
|
|
2769
|
-
/* @__PURE__ */
|
|
2867
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2770
2868
|
CalendarHeader,
|
|
2771
2869
|
{
|
|
2772
2870
|
currentDate,
|
|
@@ -2785,8 +2883,8 @@ var Scheduler = ({
|
|
|
2785
2883
|
locale
|
|
2786
2884
|
}
|
|
2787
2885
|
),
|
|
2788
|
-
/* @__PURE__ */
|
|
2789
|
-
|
|
2886
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "flex flex-1 overflow-hidden" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2887
|
+
import_framer_motion4.motion.div,
|
|
2790
2888
|
{
|
|
2791
2889
|
className: cn(
|
|
2792
2890
|
"hidden md:block overflow-hidden"
|
|
@@ -2801,7 +2899,7 @@ var Scheduler = ({
|
|
|
2801
2899
|
ease: [0.4, 0, 0.2, 1]
|
|
2802
2900
|
}
|
|
2803
2901
|
},
|
|
2804
|
-
/* @__PURE__ */
|
|
2902
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2805
2903
|
Sidebar,
|
|
2806
2904
|
{
|
|
2807
2905
|
currentDate,
|
|
@@ -2818,8 +2916,8 @@ var Scheduler = ({
|
|
|
2818
2916
|
locale
|
|
2819
2917
|
}
|
|
2820
2918
|
)
|
|
2821
|
-
), /* @__PURE__ */
|
|
2822
|
-
|
|
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,
|
|
2823
2921
|
{
|
|
2824
2922
|
key: `${view}-${currentDate.toISOString()}-${timezone || "local"}`,
|
|
2825
2923
|
initial: { opacity: 0, scale: 0.98, y: 15 },
|
|
@@ -2843,7 +2941,7 @@ var Scheduler = ({
|
|
|
2843
2941
|
},
|
|
2844
2942
|
className: "h-full"
|
|
2845
2943
|
},
|
|
2846
|
-
view === "month" && /* @__PURE__ */
|
|
2944
|
+
view === "month" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2847
2945
|
MonthView,
|
|
2848
2946
|
{
|
|
2849
2947
|
currentDate,
|
|
@@ -2854,7 +2952,7 @@ var Scheduler = ({
|
|
|
2854
2952
|
locale
|
|
2855
2953
|
}
|
|
2856
2954
|
),
|
|
2857
|
-
view === "week" && /* @__PURE__ */
|
|
2955
|
+
view === "week" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2858
2956
|
WeekView,
|
|
2859
2957
|
{
|
|
2860
2958
|
currentDate,
|
|
@@ -2867,7 +2965,7 @@ var Scheduler = ({
|
|
|
2867
2965
|
readonly: readOnly
|
|
2868
2966
|
}
|
|
2869
2967
|
),
|
|
2870
|
-
view === "day" && /* @__PURE__ */
|
|
2968
|
+
view === "day" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2871
2969
|
DayView,
|
|
2872
2970
|
{
|
|
2873
2971
|
currentDate,
|
|
@@ -2880,7 +2978,7 @@ var Scheduler = ({
|
|
|
2880
2978
|
readonly: readOnly
|
|
2881
2979
|
}
|
|
2882
2980
|
),
|
|
2883
|
-
view === "agenda" && /* @__PURE__ */
|
|
2981
|
+
view === "agenda" && /* @__PURE__ */ import_react19.default.createElement(
|
|
2884
2982
|
AgendaView,
|
|
2885
2983
|
{
|
|
2886
2984
|
currentDate,
|
|
@@ -2891,27 +2989,27 @@ var Scheduler = ({
|
|
|
2891
2989
|
translations: t
|
|
2892
2990
|
}
|
|
2893
2991
|
),
|
|
2894
|
-
view === "resource" && resources && /* @__PURE__ */
|
|
2992
|
+
view === "resource" && resources && /* @__PURE__ */ import_react19.default.createElement(
|
|
2895
2993
|
ResourceView,
|
|
2896
2994
|
{
|
|
2897
2995
|
currentDate,
|
|
2898
2996
|
events: filteredEvents,
|
|
2899
2997
|
resources,
|
|
2900
2998
|
onEventClick: handleEventClickInternal,
|
|
2901
|
-
onTimeSlotClick: (date
|
|
2999
|
+
onTimeSlotClick: (date) => {
|
|
2902
3000
|
if (readOnly) return;
|
|
2903
3001
|
handleTimeSlotClick(date);
|
|
2904
3002
|
},
|
|
2905
3003
|
locale
|
|
2906
3004
|
}
|
|
2907
3005
|
)
|
|
2908
|
-
)))), /* @__PURE__ */
|
|
3006
|
+
)))), /* @__PURE__ */ import_react19.default.createElement("div", { className: "md:hidden absolute bottom-6 right-6 z-50" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2909
3007
|
"button",
|
|
2910
3008
|
{
|
|
2911
3009
|
onClick: handleCreateEvent,
|
|
2912
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"
|
|
2913
3011
|
},
|
|
2914
|
-
/* @__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" }))
|
|
2915
3013
|
)))),
|
|
2916
3014
|
renderEventForm ? renderEventForm({
|
|
2917
3015
|
isOpen: isModalOpen,
|
|
@@ -2920,7 +3018,7 @@ var Scheduler = ({
|
|
|
2920
3018
|
initialDate: modalInitialDate,
|
|
2921
3019
|
onSave: handleModalSave,
|
|
2922
3020
|
onDelete: handleModalDelete
|
|
2923
|
-
}) : /* @__PURE__ */
|
|
3021
|
+
}) : /* @__PURE__ */ import_react19.default.createElement(
|
|
2924
3022
|
EventModal,
|
|
2925
3023
|
{
|
|
2926
3024
|
isOpen: isModalOpen,
|
|
@@ -2934,7 +3032,7 @@ var Scheduler = ({
|
|
|
2934
3032
|
translations: t
|
|
2935
3033
|
}
|
|
2936
3034
|
),
|
|
2937
|
-
/* @__PURE__ */
|
|
3035
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
2938
3036
|
EventContextMenu,
|
|
2939
3037
|
{
|
|
2940
3038
|
event: contextMenuEvent,
|
|
@@ -2967,7 +3065,7 @@ var Scheduler = ({
|
|
|
2967
3065
|
}
|
|
2968
3066
|
}
|
|
2969
3067
|
),
|
|
2970
|
-
/* @__PURE__ */
|
|
3068
|
+
/* @__PURE__ */ import_react19.default.createElement(import_core3.DragOverlay, { dropAnimation: null }, activeDragEvent ? /* @__PURE__ */ import_react19.default.createElement(
|
|
2971
3069
|
"div",
|
|
2972
3070
|
{
|
|
2973
3071
|
className: cn(
|
|
@@ -2985,19 +3083,19 @@ var Scheduler = ({
|
|
|
2985
3083
|
transform: "rotate(-2deg) scale(1.02)"
|
|
2986
3084
|
}
|
|
2987
3085
|
},
|
|
2988
|
-
/* @__PURE__ */
|
|
3086
|
+
/* @__PURE__ */ import_react19.default.createElement("div", { className: "p-2.5 h-full flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
2989
3087
|
"div",
|
|
2990
3088
|
{
|
|
2991
3089
|
className: "absolute left-0 top-0 bottom-0 w-1 rounded-l-lg",
|
|
2992
3090
|
style: { backgroundColor: activeDragEvent.color || "var(--primary)" }
|
|
2993
3091
|
}
|
|
2994
|
-
), /* @__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" }))))
|
|
2995
3093
|
) : null)
|
|
2996
3094
|
)
|
|
2997
3095
|
);
|
|
2998
3096
|
};
|
|
2999
|
-
|
|
3000
|
-
exports
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3097
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
3098
|
+
0 && (module.exports = {
|
|
3099
|
+
Scheduler,
|
|
3100
|
+
cn
|
|
3101
|
+
});
|