dishui 0.0.67 → 0.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/calendar.js +5 -0
  2. package/dist/components/Demo/index.js +76 -80
  3. package/dist/components/Demo/index.js.map +1 -1
  4. package/dist/components/pro/Calendar/Calendar.js +576 -0
  5. package/dist/components/pro/Calendar/Calendar.js.map +1 -0
  6. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js +104 -0
  7. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -0
  8. package/dist/components/pro/Calendar/hooks/useCalendarState.js +187 -0
  9. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -0
  10. package/dist/components/pro/Calendar/utils.js +193 -0
  11. package/dist/components/pro/Calendar/utils.js.map +1 -0
  12. package/dist/components/pro/Gantt/Gantt.js +868 -0
  13. package/dist/components/pro/Gantt/Gantt.js.map +1 -0
  14. package/dist/components/pro/Gantt/hooks/useGanttDrag.js +99 -0
  15. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -0
  16. package/dist/components/pro/Gantt/hooks/useGanttState.js +95 -0
  17. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -0
  18. package/dist/components/pro/Gantt/utils.js +236 -0
  19. package/dist/components/pro/Gantt/utils.js.map +1 -0
  20. package/dist/dishui.css +1 -1
  21. package/dist/gantt.js +5 -0
  22. package/dist/hooks/useCopyToClipboard.d.ts +2 -1
  23. package/dist/hooks/useCopyToClipboard.js +17 -9
  24. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.js +9 -1
  27. package/dist/utils/i18n.js +40 -0
  28. package/dist/utils/i18n.js.map +1 -1
  29. package/package.json +12 -1
  30. package/dist/pages/components/Gantt/index.d.ts +0 -3
  31. package/dist/pages/components/Gantt/index.en.d.ts +0 -3
  32. package/dist/pages/components/Gantt/index.zh.d.ts +0 -3
@@ -0,0 +1,576 @@
1
+ import { DEFAULT_COLOR_OPTIONS as e, TIME_GRID_HEIGHT as t, TIME_SLOTS as n, formatDate as r, getHolidayEntry as i, isHoliday as a, isToday as o, isWeekend as s, timeToMinutes as c } from "./utils.js";
2
+ import { useCalendarState as l } from "./hooks/useCalendarState.js";
3
+ import { useCalendarDrag as u } from "./hooks/useCalendarDrag.js";
4
+ /* empty css */
5
+ import { forwardRef as d, useEffect as f, useImperativeHandle as p, useRef as m, useState as h } from "react";
6
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
7
+ //#region src/components/pro/Calendar/Calendar.tsx
8
+ var v = d((d, h) => {
9
+ let { entries: v, holidays: b, defaultView: x = "month", defaultDate: S, readOnly: C = !1, locale: w = "en", labels: T, height: E, width: D, onEntryAdd: O, onEntryUpdate: k, onEntryDelete: A, onEntryDrop: j, onEntryClick: M, onDateClick: N, onViewChange: P, holidayColor: F, todayColor: I, weekendColor: L, className: R, style: z, colorOptions: B = e } = d, V = l({
10
+ entries: v,
11
+ holidays: b,
12
+ defaultView: x,
13
+ defaultDate: S,
14
+ locale: w,
15
+ labels: T,
16
+ colorOptions: B,
17
+ readOnly: C,
18
+ onEntryAdd: O,
19
+ onEntryUpdate: k,
20
+ onEntryDelete: A,
21
+ onViewChange: P
22
+ }), H = u({
23
+ readOnly: C,
24
+ onEntryDrop: j,
25
+ onEntryUpdate: (e) => {
26
+ V.updateEntry(e), k?.(e);
27
+ }
28
+ });
29
+ p(h, () => ({
30
+ goToToday: V.goToToday,
31
+ goToDate: V.goToDate,
32
+ setView: V.setViewMode,
33
+ getEntries: () => V.entries
34
+ }));
35
+ let U = m(null);
36
+ f(() => {
37
+ V.modalState.open ? U.current?.showModal() : U.current?.close();
38
+ }, [V.modalState.open]);
39
+ let W = () => /* @__PURE__ */ _("div", {
40
+ className: "flex items-center gap-2 p-2 border-b border-base-300 flex-wrap",
41
+ children: [
42
+ /* @__PURE__ */ _("div", {
43
+ className: "flex items-center gap-1",
44
+ children: [
45
+ /* @__PURE__ */ g("button", {
46
+ type: "button",
47
+ className: "btn btn-ghost btn-xs btn-square",
48
+ onClick: V.goPrev,
49
+ "aria-label": "Previous",
50
+ children: /* @__PURE__ */ g("svg", {
51
+ xmlns: "http://www.w3.org/2000/svg",
52
+ viewBox: "0 0 20 20",
53
+ fill: "currentColor",
54
+ className: "w-4 h-4",
55
+ children: /* @__PURE__ */ g("path", {
56
+ fillRule: "evenodd",
57
+ d: "M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z",
58
+ clipRule: "evenodd"
59
+ })
60
+ })
61
+ }),
62
+ /* @__PURE__ */ g("button", {
63
+ type: "button",
64
+ className: "btn btn-ghost btn-xs btn-square",
65
+ onClick: V.goNext,
66
+ "aria-label": "Next",
67
+ children: /* @__PURE__ */ g("svg", {
68
+ xmlns: "http://www.w3.org/2000/svg",
69
+ viewBox: "0 0 20 20",
70
+ fill: "currentColor",
71
+ className: "w-4 h-4",
72
+ children: /* @__PURE__ */ g("path", {
73
+ fillRule: "evenodd",
74
+ d: "M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z",
75
+ clipRule: "evenodd"
76
+ })
77
+ })
78
+ }),
79
+ /* @__PURE__ */ g("button", {
80
+ type: "button",
81
+ className: "btn btn-ghost btn-xs",
82
+ onClick: V.goToToday,
83
+ children: V.labels.today
84
+ })
85
+ ]
86
+ }),
87
+ /* @__PURE__ */ g("h2", {
88
+ className: "text-sm font-semibold flex-1 text-center min-w-0 truncate",
89
+ children: V.title
90
+ }),
91
+ /* @__PURE__ */ g("div", {
92
+ className: "join",
93
+ children: [
94
+ "month",
95
+ "week",
96
+ "day"
97
+ ].map((e) => /* @__PURE__ */ g("button", {
98
+ type: "button",
99
+ className: `btn btn-xs join-item ${V.viewMode === e ? "btn-active" : ""}`,
100
+ onClick: () => V.setViewMode(e),
101
+ children: e === "month" ? V.labels.month : e === "week" ? V.labels.week : V.labels.day
102
+ }, e))
103
+ }),
104
+ !C && /* @__PURE__ */ _("button", {
105
+ type: "button",
106
+ className: "btn btn-primary btn-xs",
107
+ onClick: () => V.openAddModal(),
108
+ children: ["+ ", V.labels.addEntry]
109
+ })
110
+ ]
111
+ }), G = () => {
112
+ let e = V.currentDateObj.getMonth();
113
+ return /* @__PURE__ */ _("div", {
114
+ className: "flex flex-col flex-1 min-h-0 overflow-hidden",
115
+ children: [/* @__PURE__ */ g("div", {
116
+ className: "cal-weekday-header",
117
+ children: V.labels.weekDays.map((e, t) => /* @__PURE__ */ g("div", {
118
+ className: "cal-weekday-header-cell",
119
+ children: e
120
+ }, t))
121
+ }), /* @__PURE__ */ g("div", {
122
+ className: "cal-month-grid overflow-auto cal-scroll",
123
+ children: V.monthDates.map((t, n) => {
124
+ let c = r(t), l = t.getMonth() === e, u = o(t), d = s(t), f = a(c, b), p = i(c, b), m = V.getEntriesForDate(c), h = H.isDropTarget(c), v = [
125
+ "cal-month-cell",
126
+ !l && "cal-month-cell--outside",
127
+ u && "cal-month-cell--today",
128
+ d && !f && "cal-month-cell--weekend",
129
+ f && "cal-month-cell--holiday",
130
+ h && "cal-month-cell--drop-target"
131
+ ].filter(Boolean).join(" ");
132
+ return /* @__PURE__ */ _("div", {
133
+ className: v,
134
+ style: {
135
+ ...u && I ? { backgroundColor: I + "33" } : {},
136
+ ...f && F ? { backgroundColor: F + "33" } : {},
137
+ ...d && !f && L ? { backgroundColor: L + "22" } : {}
138
+ },
139
+ onClick: (e) => {
140
+ e.target.closest(".cal-entry-pill") || (N?.(c), C || V.openAddModal(c));
141
+ },
142
+ onDragOver: (e) => H.handleDragOver(e, c),
143
+ onDragLeave: H.handleDragLeave,
144
+ onDrop: (e) => H.handleDrop(e, c),
145
+ children: [
146
+ /* @__PURE__ */ _("div", {
147
+ className: "flex items-center gap-1 mb-0.5",
148
+ children: [/* @__PURE__ */ g("span", {
149
+ className: `text-xs font-medium leading-none ${u ? "bg-primary text-primary-content rounded-full w-5 h-5 flex items-center justify-center" : ""}`,
150
+ children: t.getDate()
151
+ }), p && !p.isWorkday && /* @__PURE__ */ g("span", {
152
+ className: "cal-holiday-tag",
153
+ children: p.name
154
+ })]
155
+ }),
156
+ m.slice(0, 3).map((e) => /* @__PURE__ */ _("div", {
157
+ className: `cal-entry-pill ${H.draggingEntryId === e.id ? "cal-entry-pill--dragging" : ""}`,
158
+ style: {
159
+ backgroundColor: (e.color || "#3b82f6") + "22",
160
+ color: e.color || "#3b82f6"
161
+ },
162
+ draggable: !C,
163
+ onDragStart: (t) => H.handleDragStart(t, e),
164
+ onDragEnd: H.handleDragEnd,
165
+ onClick: (t) => {
166
+ t.stopPropagation(), M?.(e), C || V.openEditModal(e);
167
+ },
168
+ title: e.title,
169
+ children: [/* @__PURE__ */ g("span", {
170
+ className: "cal-entry-dot",
171
+ style: { backgroundColor: e.color || "#3b82f6" }
172
+ }), /* @__PURE__ */ g("span", {
173
+ className: "truncate",
174
+ children: e.title
175
+ })]
176
+ }, e.id)),
177
+ m.length > 3 && /* @__PURE__ */ _("div", {
178
+ className: "text-[0.6rem] opacity-50 pl-1",
179
+ children: [
180
+ "+",
181
+ m.length - 3,
182
+ " more"
183
+ ]
184
+ })
185
+ ]
186
+ }, n);
187
+ })
188
+ })]
189
+ });
190
+ }, K = () => {
191
+ let e = V.viewMode === "week" ? V.weekDates : [V.currentDateObj], l = (e) => V.getEntriesForDate(e).filter((e) => !e.allDay && e.startTime), u = (e) => V.getEntriesForDate(e).filter((e) => e.allDay || !e.startTime), d = /* @__PURE__ */ new Date(), f = (d.getHours() * 60 + d.getMinutes()) / 30 * 28;
192
+ return /* @__PURE__ */ _("div", {
193
+ className: "flex flex-col flex-1 min-h-0 overflow-hidden",
194
+ children: [
195
+ /* @__PURE__ */ _("div", {
196
+ className: "cal-column-header",
197
+ children: [/* @__PURE__ */ g("div", { className: "cal-column-header-gutter" }), /* @__PURE__ */ g("div", {
198
+ className: "cal-column-header-cells",
199
+ children: e.map((e, t) => {
200
+ let n = r(e), a = o(e), c = s(e), l = i(n, b);
201
+ return /* @__PURE__ */ _("div", {
202
+ className: `cal-column-header-cell ${a ? "cal-column-header-cell--today" : ""} ${c ? "cal-column-header-cell--weekend" : ""}`,
203
+ children: [
204
+ /* @__PURE__ */ g("div", {
205
+ className: "font-medium",
206
+ children: V.labels.weekDays[e.getDay()]
207
+ }),
208
+ /* @__PURE__ */ g("div", {
209
+ className: `text-lg font-bold ${a ? "bg-primary text-primary-content rounded-full w-7 h-7 flex items-center justify-center mx-auto" : ""}`,
210
+ children: e.getDate()
211
+ }),
212
+ l && !l.isWorkday && /* @__PURE__ */ g("span", {
213
+ className: "cal-holiday-tag",
214
+ children: l.name
215
+ })
216
+ ]
217
+ }, t);
218
+ })
219
+ })]
220
+ }),
221
+ /* @__PURE__ */ _("div", {
222
+ className: "cal-allday-section",
223
+ children: [/* @__PURE__ */ g("div", {
224
+ className: "cal-allday-gutter",
225
+ children: V.labels.allDay
226
+ }), /* @__PURE__ */ g("div", {
227
+ className: "cal-allday-cells",
228
+ children: e.map((e, t) => {
229
+ let n = r(e), i = u(n), o = H.isDropTarget(n) && !H.dropTarget?.time, c = s(e), l = a(n, b), d = [
230
+ "cal-allday-cell",
231
+ c && !l && "cal-allday-cell--weekend",
232
+ l && "cal-allday-cell--holiday",
233
+ o && "cal-allday-cell--drop-target"
234
+ ].filter(Boolean).join(" ");
235
+ return /* @__PURE__ */ g("div", {
236
+ className: d,
237
+ onDragOver: (e) => H.handleDragOver(e, n),
238
+ onDragLeave: H.handleDragLeave,
239
+ onDrop: (e) => H.handleDrop(e, n),
240
+ children: i.map((e) => /* @__PURE__ */ _("div", {
241
+ className: `cal-entry-pill ${H.draggingEntryId === e.id ? "cal-entry-pill--dragging" : ""}`,
242
+ style: {
243
+ backgroundColor: (e.color || "#3b82f6") + "22",
244
+ color: e.color || "#3b82f6"
245
+ },
246
+ draggable: !C,
247
+ onDragStart: (t) => H.handleDragStart(t, e),
248
+ onDragEnd: H.handleDragEnd,
249
+ onClick: (t) => {
250
+ t.stopPropagation(), M?.(e), C || V.openEditModal(e);
251
+ },
252
+ children: [/* @__PURE__ */ g("span", {
253
+ className: "cal-entry-dot",
254
+ style: { backgroundColor: e.color || "#3b82f6" }
255
+ }), /* @__PURE__ */ g("span", {
256
+ className: "truncate",
257
+ children: e.title
258
+ })]
259
+ }, e.id))
260
+ }, t);
261
+ })
262
+ })]
263
+ }),
264
+ /* @__PURE__ */ _("div", {
265
+ className: "cal-time-grid",
266
+ children: [/* @__PURE__ */ g("div", {
267
+ className: "cal-time-gutter cal-scroll overflow-y-auto",
268
+ children: /* @__PURE__ */ g("div", {
269
+ style: { height: t },
270
+ children: n.map((e, t) => /* @__PURE__ */ g("div", {
271
+ className: "cal-time-gutter-label",
272
+ children: t % 2 == 0 ? e : ""
273
+ }, t))
274
+ })
275
+ }), /* @__PURE__ */ g("div", {
276
+ className: "cal-time-columns cal-scroll",
277
+ children: e.map((e, i) => {
278
+ let u = r(e), d = l(u), p = o(e), m = s(e), h = a(u, b), v = [
279
+ "cal-time-column",
280
+ p && "cal-time-column--today",
281
+ m && !h && "cal-time-column--weekend",
282
+ h && "cal-time-column--holiday"
283
+ ].filter(Boolean).join(" ");
284
+ return /* @__PURE__ */ _("div", {
285
+ className: v,
286
+ style: { height: t },
287
+ children: [
288
+ n.map((e, t) => {
289
+ let n = H.isDropTarget(u, e);
290
+ return /* @__PURE__ */ g("div", {
291
+ className: `cal-time-slot ${n ? "cal-time-slot--drop-target" : ""}`,
292
+ onDragOver: (t) => H.handleDragOver(t, u, e),
293
+ onDragLeave: H.handleDragLeave,
294
+ onDrop: (t) => H.handleDrop(t, u, e),
295
+ onClick: () => {
296
+ N?.(u), C || V.openAddModal(u, e);
297
+ }
298
+ }, t);
299
+ }),
300
+ d.map((e) => {
301
+ let t = c(e.startTime), n = e.endTime ? c(e.endTime) : t + 60, r = t / 30 * 28, i = Math.max((n - t) / 30 * 28, 14), a = H.draggingEntryId === e.id;
302
+ return /* @__PURE__ */ _("div", {
303
+ className: `cal-time-entry ${a ? "cal-time-entry--dragging" : ""}`,
304
+ style: {
305
+ top: r,
306
+ height: i,
307
+ backgroundColor: (e.color || "#3b82f6") + "33",
308
+ borderLeft: `3px solid ${e.color || "#3b82f6"}`,
309
+ color: e.color || "#3b82f6"
310
+ },
311
+ draggable: !C,
312
+ onDragStart: (t) => H.handleDragStart(t, e),
313
+ onDragEnd: H.handleDragEnd,
314
+ onClick: (t) => {
315
+ t.stopPropagation(), M?.(e), C || V.openEditModal(e);
316
+ },
317
+ children: [
318
+ /* @__PURE__ */ g("span", {
319
+ className: "cal-time-entry-title",
320
+ children: e.title
321
+ }),
322
+ /* @__PURE__ */ _("span", {
323
+ className: "cal-time-entry-time",
324
+ children: [e.startTime, e.endTime ? ` - ${e.endTime}` : ""]
325
+ }),
326
+ !C && /* @__PURE__ */ g("div", {
327
+ className: "cal-time-entry-resize",
328
+ draggable: !0,
329
+ onDragStart: (t) => H.handleResizeStart(t, e),
330
+ onDragEnd: H.handleDragEnd
331
+ })
332
+ ]
333
+ }, e.id);
334
+ }),
335
+ p && /* @__PURE__ */ g("div", {
336
+ className: "cal-now-line",
337
+ style: { top: f }
338
+ })
339
+ ]
340
+ }, i);
341
+ })
342
+ })]
343
+ })
344
+ ]
345
+ });
346
+ }, q = () => /* @__PURE__ */ _("dialog", {
347
+ ref: U,
348
+ className: "modal cal-modal",
349
+ onClose: V.closeModal,
350
+ children: [/* @__PURE__ */ g("div", {
351
+ className: "modal-box",
352
+ children: /* @__PURE__ */ g(y, {
353
+ mode: V.modalState.mode,
354
+ entry: V.modalState.entry,
355
+ labels: V.labels,
356
+ colorOptions: B,
357
+ onSave: V.saveModal,
358
+ onDelete: V.modalState.mode === "edit" ? V.deleteModalEntry : void 0,
359
+ onCancel: V.closeModal
360
+ }, `${V.modalState.mode}-${V.modalState.entry.id || ""}-${V.modalState.entry.date || ""}-${V.modalState.entry.startTime || ""}-${V.modalState.open}`)
361
+ }), /* @__PURE__ */ g("form", {
362
+ method: "dialog",
363
+ className: "modal-backdrop",
364
+ children: /* @__PURE__ */ g("button", {
365
+ type: "button",
366
+ onClick: V.closeModal,
367
+ children: "close"
368
+ })
369
+ })]
370
+ }), J = {
371
+ height: E || "100%",
372
+ width: D || "100%",
373
+ ...z
374
+ };
375
+ return /* @__PURE__ */ _("div", {
376
+ className: `cal-root flex flex-col bg-base-100 border border-base-300 rounded-lg overflow-hidden ${R || ""}`,
377
+ style: J,
378
+ children: [
379
+ W(),
380
+ V.viewMode === "month" && G(),
381
+ (V.viewMode === "week" || V.viewMode === "day") && K(),
382
+ q()
383
+ ]
384
+ });
385
+ });
386
+ v.displayName = "Calendar";
387
+ function y({ mode: e, entry: t, labels: n, colorOptions: r, onSave: i, onDelete: a, onCancel: o }) {
388
+ let [s, c] = h(() => ({
389
+ title: t.title || "",
390
+ date: t.date || "",
391
+ startTime: t.startTime || "",
392
+ endTime: t.endTime || "",
393
+ description: t.description || "",
394
+ color: t.color || r[0] || "#3b82f6",
395
+ allDay: t.allDay ?? !t.startTime
396
+ })), [l, u] = h(!1), d = (e) => {
397
+ e.preventDefault(), s.title?.trim() && i(s);
398
+ }, f = (e, t) => {
399
+ c((n) => ({
400
+ ...n,
401
+ [e]: t
402
+ }));
403
+ };
404
+ return /* @__PURE__ */ _("form", {
405
+ onSubmit: d,
406
+ className: "flex flex-col gap-3",
407
+ children: [
408
+ /* @__PURE__ */ g("h3", {
409
+ className: "font-bold text-lg",
410
+ children: e === "add" ? n.addEntry : n.editEntry
411
+ }),
412
+ /* @__PURE__ */ _("div", {
413
+ className: "form-control",
414
+ children: [/* @__PURE__ */ g("label", {
415
+ className: "label py-1",
416
+ children: /* @__PURE__ */ g("span", {
417
+ className: "label-text text-xs",
418
+ children: n.title
419
+ })
420
+ }), /* @__PURE__ */ g("input", {
421
+ type: "text",
422
+ className: "input input-bordered input-sm w-full",
423
+ placeholder: n.title,
424
+ value: s.title || "",
425
+ onChange: (e) => f("title", e.target.value),
426
+ autoFocus: !0,
427
+ required: !0
428
+ })]
429
+ }),
430
+ /* @__PURE__ */ _("div", {
431
+ className: "form-control",
432
+ children: [/* @__PURE__ */ g("label", {
433
+ className: "label py-1",
434
+ children: /* @__PURE__ */ g("span", {
435
+ className: "label-text text-xs",
436
+ children: n.date
437
+ })
438
+ }), /* @__PURE__ */ g("input", {
439
+ type: "date",
440
+ className: "input input-bordered input-sm w-full",
441
+ value: s.date || "",
442
+ onChange: (e) => f("date", e.target.value),
443
+ required: !0
444
+ })]
445
+ }),
446
+ /* @__PURE__ */ g("div", {
447
+ className: "form-control",
448
+ children: /* @__PURE__ */ _("label", {
449
+ className: "label cursor-pointer justify-start gap-2 py-1",
450
+ children: [/* @__PURE__ */ g("input", {
451
+ type: "checkbox",
452
+ className: "checkbox checkbox-sm checkbox-primary",
453
+ checked: s.allDay ?? !0,
454
+ onChange: (e) => f("allDay", e.target.checked)
455
+ }), /* @__PURE__ */ g("span", {
456
+ className: "label-text text-xs",
457
+ children: n.allDay
458
+ })]
459
+ })
460
+ }),
461
+ !s.allDay && /* @__PURE__ */ _("div", {
462
+ className: "flex gap-2",
463
+ children: [/* @__PURE__ */ _("div", {
464
+ className: "form-control flex-1",
465
+ children: [/* @__PURE__ */ g("label", {
466
+ className: "label py-1",
467
+ children: /* @__PURE__ */ g("span", {
468
+ className: "label-text text-xs",
469
+ children: n.startTime
470
+ })
471
+ }), /* @__PURE__ */ g("input", {
472
+ type: "time",
473
+ className: "input input-bordered input-sm w-full",
474
+ value: s.startTime || "",
475
+ onChange: (e) => f("startTime", e.target.value)
476
+ })]
477
+ }), /* @__PURE__ */ _("div", {
478
+ className: "form-control flex-1",
479
+ children: [/* @__PURE__ */ g("label", {
480
+ className: "label py-1",
481
+ children: /* @__PURE__ */ g("span", {
482
+ className: "label-text text-xs",
483
+ children: n.endTime
484
+ })
485
+ }), /* @__PURE__ */ g("input", {
486
+ type: "time",
487
+ className: "input input-bordered input-sm w-full",
488
+ value: s.endTime || "",
489
+ onChange: (e) => f("endTime", e.target.value)
490
+ })]
491
+ })]
492
+ }),
493
+ /* @__PURE__ */ _("div", {
494
+ className: "form-control",
495
+ children: [/* @__PURE__ */ g("label", {
496
+ className: "label py-1",
497
+ children: /* @__PURE__ */ g("span", {
498
+ className: "label-text text-xs",
499
+ children: n.description
500
+ })
501
+ }), /* @__PURE__ */ g("textarea", {
502
+ className: "textarea textarea-bordered textarea-sm w-full",
503
+ rows: 2,
504
+ placeholder: n.description,
505
+ value: s.description || "",
506
+ onChange: (e) => f("description", e.target.value)
507
+ })]
508
+ }),
509
+ /* @__PURE__ */ _("div", {
510
+ className: "form-control",
511
+ children: [/* @__PURE__ */ g("label", {
512
+ className: "label py-1",
513
+ children: /* @__PURE__ */ g("span", {
514
+ className: "label-text text-xs",
515
+ children: n.color
516
+ })
517
+ }), /* @__PURE__ */ g("div", {
518
+ className: "flex gap-2 flex-wrap",
519
+ children: r.map((e) => /* @__PURE__ */ g("button", {
520
+ type: "button",
521
+ className: `cal-color-swatch ${s.color === e ? "cal-color-swatch--selected" : ""}`,
522
+ style: { backgroundColor: e },
523
+ onClick: () => f("color", e),
524
+ "aria-label": e
525
+ }, e))
526
+ })]
527
+ }),
528
+ /* @__PURE__ */ _("div", {
529
+ className: "flex justify-between items-center pt-2",
530
+ children: [/* @__PURE__ */ _("div", { children: [a && !l && /* @__PURE__ */ g("button", {
531
+ type: "button",
532
+ className: "btn btn-error btn-sm btn-outline",
533
+ onClick: () => u(!0),
534
+ children: n.deleteEntry
535
+ }), a && l && /* @__PURE__ */ _("div", {
536
+ className: "flex items-center gap-2",
537
+ children: [
538
+ /* @__PURE__ */ g("span", {
539
+ className: "text-xs text-error",
540
+ children: n.confirmDelete
541
+ }),
542
+ /* @__PURE__ */ g("button", {
543
+ type: "button",
544
+ className: "btn btn-error btn-xs",
545
+ onClick: a,
546
+ children: n.deleteEntry
547
+ }),
548
+ /* @__PURE__ */ g("button", {
549
+ type: "button",
550
+ className: "btn btn-ghost btn-xs",
551
+ onClick: () => u(!1),
552
+ children: n.cancel
553
+ })
554
+ ]
555
+ })] }), /* @__PURE__ */ _("div", {
556
+ className: "flex gap-2",
557
+ children: [/* @__PURE__ */ g("button", {
558
+ type: "button",
559
+ className: "btn btn-ghost btn-sm",
560
+ onClick: o,
561
+ children: n.cancel
562
+ }), /* @__PURE__ */ g("button", {
563
+ type: "submit",
564
+ className: "btn btn-primary btn-sm",
565
+ disabled: !s.title?.trim(),
566
+ children: n.save
567
+ })]
568
+ })]
569
+ })
570
+ ]
571
+ });
572
+ }
573
+ //#endregion
574
+ export { v as default };
575
+
576
+ //# sourceMappingURL=Calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.js","names":[],"sources":["../../../../src/components/pro/Calendar/Calendar.tsx"],"sourcesContent":["/**\n * DishUI Calendar Component\n *\n * A full-featured calendar with month/week/day views, drag-and-drop,\n * holiday support, and entry management.\n */\n\nimport React, {\n forwardRef,\n useImperativeHandle,\n useRef,\n useState,\n useEffect,\n} from \"react\";\nimport type {\n CalendarProps,\n CalendarHandle,\n CalendarEntry,\n CalendarViewMode,\n} from \"./types\";\nimport { useCalendarState } from \"./hooks/useCalendarState\";\nimport { useCalendarDrag } from \"./hooks/useCalendarDrag\";\nimport {\n formatDate,\n isToday,\n isWeekend,\n isHoliday,\n getHolidayEntry,\n timeToMinutes,\n TIME_SLOTS,\n SLOT_HEIGHT,\n TIME_GRID_HEIGHT,\n DEFAULT_COLOR_OPTIONS,\n} from \"./utils\";\nimport \"./styles.css\";\n\n// ─── Component ────────────────────────────────────────────────────\n\nconst Calendar = forwardRef<CalendarHandle, CalendarProps>((props, ref) => {\n const {\n entries: externalEntries,\n holidays,\n defaultView = \"month\",\n defaultDate,\n readOnly = false,\n locale = \"en\",\n labels: userLabels,\n height,\n width,\n onEntryAdd,\n onEntryUpdate,\n onEntryDelete,\n onEntryDrop,\n onEntryClick,\n onDateClick,\n onViewChange,\n holidayColor,\n todayColor,\n weekendColor,\n className,\n style,\n colorOptions = DEFAULT_COLOR_OPTIONS,\n } = props;\n\n // ─── State Hook ─────────────────────────────────────────────────\n\n const state = useCalendarState({\n entries: externalEntries,\n holidays,\n defaultView,\n defaultDate,\n locale,\n labels: userLabels,\n colorOptions,\n readOnly,\n onEntryAdd,\n onEntryUpdate,\n onEntryDelete,\n onViewChange,\n });\n\n // ─── Drag Hook ──────────────────────────────────────────────────\n\n const drag = useCalendarDrag({\n readOnly,\n onEntryDrop,\n onEntryUpdate: (entry) => {\n state.updateEntry(entry);\n onEntryUpdate?.(entry);\n },\n });\n\n // ─── Imperative Handle ──────────────────────────────────────────\n\n useImperativeHandle(ref, () => ({\n goToToday: state.goToToday,\n goToDate: state.goToDate,\n setView: state.setViewMode,\n getEntries: () => state.entries,\n }));\n\n // ─── Modal Refs ─────────────────────────────────────────────────\n\n const modalRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n if (state.modalState.open) {\n modalRef.current?.showModal();\n } else {\n modalRef.current?.close();\n }\n }, [state.modalState.open]);\n\n // ─── Render Header ──────────────────────────────────────────────\n\n const renderHeader = () => (\n <div className=\"flex items-center gap-2 p-2 border-b border-base-300 flex-wrap\">\n {/* Navigation */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={state.goPrev}\n aria-label=\"Previous\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-square\"\n onClick={state.goNext}\n aria-label=\"Next\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs\"\n onClick={state.goToToday}\n >\n {state.labels.today}\n </button>\n </div>\n\n {/* Title */}\n <h2 className=\"text-sm font-semibold flex-1 text-center min-w-0 truncate\">\n {state.title}\n </h2>\n\n {/* View Toggle */}\n <div className=\"join\">\n {([\"month\", \"week\", \"day\"] as CalendarViewMode[]).map((v) => (\n <button\n key={v}\n type=\"button\"\n className={`btn btn-xs join-item ${state.viewMode === v ? \"btn-active\" : \"\"}`}\n onClick={() => state.setViewMode(v)}\n >\n {v === \"month\"\n ? state.labels.month\n : v === \"week\"\n ? state.labels.week\n : state.labels.day}\n </button>\n ))}\n </div>\n\n {/* Add Button */}\n {!readOnly && (\n <button\n type=\"button\"\n className=\"btn btn-primary btn-xs\"\n onClick={() => state.openAddModal()}\n >\n + {state.labels.addEntry}\n </button>\n )}\n </div>\n );\n\n // ─── Render Month View ──────────────────────────────────────────\n\n const renderMonthView = () => {\n const currentMonth = state.currentDateObj.getMonth();\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n {/* Weekday headers */}\n <div className=\"cal-weekday-header\">\n {state.labels.weekDays!.map((day, i) => (\n <div key={i} className=\"cal-weekday-header-cell\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Month grid */}\n <div className=\"cal-month-grid overflow-auto cal-scroll\">\n {state.monthDates.map((date, idx) => {\n const dateStr = formatDate(date);\n const isCurrentMonth = date.getMonth() === currentMonth;\n const isTodayCell = isToday(date);\n const isWknd = isWeekend(date);\n const isHol = isHoliday(dateStr, holidays);\n const holEntry = getHolidayEntry(dateStr, holidays);\n const dayEntries = state.getEntriesForDate(dateStr);\n const isTarget = drag.isDropTarget(dateStr);\n\n const cellClasses = [\n \"cal-month-cell\",\n !isCurrentMonth && \"cal-month-cell--outside\",\n isTodayCell && \"cal-month-cell--today\",\n isWknd && !isHol && \"cal-month-cell--weekend\",\n isHol && \"cal-month-cell--holiday\",\n isTarget && \"cal-month-cell--drop-target\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={idx}\n className={cellClasses}\n style={{\n ...(isTodayCell && todayColor\n ? { backgroundColor: todayColor + \"33\" }\n : {}),\n ...(isHol && holidayColor\n ? { backgroundColor: holidayColor + \"33\" }\n : {}),\n ...(isWknd && !isHol && weekendColor\n ? { backgroundColor: weekendColor + \"22\" }\n : {}),\n }}\n onClick={(e) => {\n // Only fire if not clicking on an entry\n if ((e.target as HTMLElement).closest(\".cal-entry-pill\"))\n return;\n onDateClick?.(dateStr);\n if (!readOnly) {\n state.openAddModal(dateStr);\n }\n }}\n onDragOver={(e) => drag.handleDragOver(e, dateStr)}\n onDragLeave={drag.handleDragLeave}\n onDrop={(e) => drag.handleDrop(e, dateStr)}\n >\n {/* Date number */}\n <div className=\"flex items-center gap-1 mb-0.5\">\n <span\n className={`text-xs font-medium leading-none ${\n isTodayCell\n ? \"bg-primary text-primary-content rounded-full w-5 h-5 flex items-center justify-center\"\n : \"\"\n }`}\n >\n {date.getDate()}\n </span>\n {holEntry && !holEntry.isWorkday && (\n <span className=\"cal-holiday-tag\">{holEntry.name}</span>\n )}\n </div>\n\n {/* Entry pills */}\n {dayEntries.slice(0, 3).map((entry) => (\n <div\n key={entry.id}\n className={`cal-entry-pill ${drag.draggingEntryId === entry.id ? \"cal-entry-pill--dragging\" : \"\"}`}\n style={{\n backgroundColor: (entry.color || \"#3b82f6\") + \"22\",\n color: entry.color || \"#3b82f6\",\n }}\n draggable={!readOnly}\n onDragStart={(e) => drag.handleDragStart(e, entry)}\n onDragEnd={drag.handleDragEnd}\n onClick={(e) => {\n e.stopPropagation();\n onEntryClick?.(entry);\n if (!readOnly) {\n state.openEditModal(entry);\n }\n }}\n title={entry.title}\n >\n <span\n className=\"cal-entry-dot\"\n style={{ backgroundColor: entry.color || \"#3b82f6\" }}\n />\n <span className=\"truncate\">{entry.title}</span>\n </div>\n ))}\n {dayEntries.length > 3 && (\n <div className=\"text-[0.6rem] opacity-50 pl-1\">\n +{dayEntries.length - 3} more\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n };\n\n // ─── Render Week/Day View ───────────────────────────────────────\n\n const renderTimeView = () => {\n const dates =\n state.viewMode === \"week\" ? state.weekDates : [state.currentDateObj];\n\n // Separate all-day entries from timed entries\n const getTimedEntries = (dateStr: string) =>\n state.getEntriesForDate(dateStr).filter((e) => !e.allDay && e.startTime);\n const getAllDayEntries = (dateStr: string) =>\n state.getEntriesForDate(dateStr).filter((e) => e.allDay || !e.startTime);\n\n // Now indicator position\n const now = new Date();\n const nowMinutes = now.getHours() * 60 + now.getMinutes();\n const nowTop = (nowMinutes / 30) * SLOT_HEIGHT;\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n {/* Column headers */}\n <div className=\"cal-column-header\">\n <div className=\"cal-column-header-gutter\" />\n <div className=\"cal-column-header-cells\">\n {dates.map((date, i) => {\n const dateStr = formatDate(date);\n const isTodayCol = isToday(date);\n const isWknd = isWeekend(date);\n const holEntry = getHolidayEntry(dateStr, holidays);\n\n return (\n <div\n key={i}\n className={`cal-column-header-cell ${isTodayCol ? \"cal-column-header-cell--today\" : \"\"} ${isWknd ? \"cal-column-header-cell--weekend\" : \"\"}`}\n >\n <div className=\"font-medium\">\n {state.labels.weekDays![date.getDay()]}\n </div>\n <div\n className={`text-lg font-bold ${isTodayCol ? \"bg-primary text-primary-content rounded-full w-7 h-7 flex items-center justify-center mx-auto\" : \"\"}`}\n >\n {date.getDate()}\n </div>\n {holEntry && !holEntry.isWorkday && (\n <span className=\"cal-holiday-tag\">{holEntry.name}</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* All-day section */}\n <div className=\"cal-allday-section\">\n <div className=\"cal-allday-gutter\">{state.labels.allDay}</div>\n <div className=\"cal-allday-cells\">\n {dates.map((date, i) => {\n const dateStr = formatDate(date);\n const allDayEntries = getAllDayEntries(dateStr);\n const isTarget =\n drag.isDropTarget(dateStr) && !drag.dropTarget?.time;\n const isWkndAllDay = isWeekend(date);\n const isHolAllDay = isHoliday(dateStr, holidays);\n\n const allDayClasses = [\n \"cal-allday-cell\",\n isWkndAllDay && !isHolAllDay && \"cal-allday-cell--weekend\",\n isHolAllDay && \"cal-allday-cell--holiday\",\n isTarget && \"cal-allday-cell--drop-target\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={i}\n className={allDayClasses}\n onDragOver={(e) => drag.handleDragOver(e, dateStr)}\n onDragLeave={drag.handleDragLeave}\n onDrop={(e) => drag.handleDrop(e, dateStr)}\n >\n {allDayEntries.map((entry) => (\n <div\n key={entry.id}\n className={`cal-entry-pill ${drag.draggingEntryId === entry.id ? \"cal-entry-pill--dragging\" : \"\"}`}\n style={{\n backgroundColor: (entry.color || \"#3b82f6\") + \"22\",\n color: entry.color || \"#3b82f6\",\n }}\n draggable={!readOnly}\n onDragStart={(e) => drag.handleDragStart(e, entry)}\n onDragEnd={drag.handleDragEnd}\n onClick={(e) => {\n e.stopPropagation();\n onEntryClick?.(entry);\n if (!readOnly) state.openEditModal(entry);\n }}\n >\n <span\n className=\"cal-entry-dot\"\n style={{ backgroundColor: entry.color || \"#3b82f6\" }}\n />\n <span className=\"truncate\">{entry.title}</span>\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Time grid */}\n <div className=\"cal-time-grid\">\n {/* Time gutter */}\n <div className=\"cal-time-gutter cal-scroll overflow-y-auto\">\n <div style={{ height: TIME_GRID_HEIGHT }}>\n {TIME_SLOTS.map((slot, i) => (\n <div key={i} className=\"cal-time-gutter-label\">\n {i % 2 === 0 ? slot : \"\"}\n </div>\n ))}\n </div>\n </div>\n\n {/* Time columns */}\n <div className=\"cal-time-columns cal-scroll\">\n {dates.map((date, colIdx) => {\n const dateStr = formatDate(date);\n const timedEntries = getTimedEntries(dateStr);\n const isTodayCol = isToday(date);\n const isWkndCol = isWeekend(date);\n const isHolCol = isHoliday(dateStr, holidays);\n\n const columnClasses = [\n \"cal-time-column\",\n isTodayCol && \"cal-time-column--today\",\n isWkndCol && !isHolCol && \"cal-time-column--weekend\",\n isHolCol && \"cal-time-column--holiday\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={colIdx}\n className={columnClasses}\n style={{ height: TIME_GRID_HEIGHT }}\n >\n {/* Time slots (drop targets) */}\n {TIME_SLOTS.map((slot, slotIdx) => {\n const isTarget = drag.isDropTarget(dateStr, slot);\n return (\n <div\n key={slotIdx}\n className={`cal-time-slot ${isTarget ? \"cal-time-slot--drop-target\" : \"\"}`}\n onDragOver={(e) =>\n drag.handleDragOver(e, dateStr, slot)\n }\n onDragLeave={drag.handleDragLeave}\n onDrop={(e) => drag.handleDrop(e, dateStr, slot)}\n onClick={() => {\n onDateClick?.(dateStr);\n if (!readOnly) state.openAddModal(dateStr, slot);\n }}\n />\n );\n })}\n\n {/* Timed entries */}\n {timedEntries.map((entry) => {\n const startMin = timeToMinutes(entry.startTime);\n const endMin = entry.endTime\n ? timeToMinutes(entry.endTime)\n : startMin + 60;\n const top = (startMin / 30) * SLOT_HEIGHT;\n const height = Math.max(\n ((endMin - startMin) / 30) * SLOT_HEIGHT,\n SLOT_HEIGHT / 2,\n );\n const isDraggingThis = drag.draggingEntryId === entry.id;\n\n return (\n <div\n key={entry.id}\n className={`cal-time-entry ${isDraggingThis ? \"cal-time-entry--dragging\" : \"\"}`}\n style={{\n top,\n height,\n backgroundColor: (entry.color || \"#3b82f6\") + \"33\",\n borderLeft: `3px solid ${entry.color || \"#3b82f6\"}`,\n color: entry.color || \"#3b82f6\",\n }}\n draggable={!readOnly}\n onDragStart={(e) => drag.handleDragStart(e, entry)}\n onDragEnd={drag.handleDragEnd}\n onClick={(e) => {\n e.stopPropagation();\n onEntryClick?.(entry);\n if (!readOnly) state.openEditModal(entry);\n }}\n >\n <span className=\"cal-time-entry-title\">\n {entry.title}\n </span>\n <span className=\"cal-time-entry-time\">\n {entry.startTime}\n {entry.endTime ? ` - ${entry.endTime}` : \"\"}\n </span>\n\n {/* Resize handle */}\n {!readOnly && (\n <div\n className=\"cal-time-entry-resize\"\n draggable\n onDragStart={(e) =>\n drag.handleResizeStart(e, entry)\n }\n onDragEnd={drag.handleDragEnd}\n />\n )}\n </div>\n );\n })}\n\n {/* Now indicator */}\n {isTodayCol && (\n <div className=\"cal-now-line\" style={{ top: nowTop }} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n };\n\n // ─── Entry Form Modal ───────────────────────────────────────────\n\n const renderModal = () => {\n return (\n <dialog\n ref={modalRef}\n className=\"modal cal-modal\"\n onClose={state.closeModal}\n >\n <div className=\"modal-box\">\n <EntryForm\n key={`${state.modalState.mode}-${state.modalState.entry.id || \"\"}-${state.modalState.entry.date || \"\"}-${state.modalState.entry.startTime || \"\"}-${state.modalState.open}`}\n mode={state.modalState.mode}\n entry={state.modalState.entry}\n labels={state.labels}\n colorOptions={colorOptions}\n onSave={state.saveModal}\n onDelete={\n state.modalState.mode === \"edit\"\n ? state.deleteModalEntry\n : undefined\n }\n onCancel={state.closeModal}\n />\n </div>\n <form method=\"dialog\" className=\"modal-backdrop\">\n <button type=\"button\" onClick={state.closeModal}>\n close\n </button>\n </form>\n </dialog>\n );\n };\n\n // ─── Main Render ────────────────────────────────────────────────\n\n const containerStyle: React.CSSProperties = {\n height: height || \"100%\",\n width: width || \"100%\",\n ...style,\n };\n\n return (\n <div\n className={`cal-root flex flex-col bg-base-100 border border-base-300 rounded-lg overflow-hidden ${className || \"\"}`}\n style={containerStyle}\n >\n {renderHeader()}\n {state.viewMode === \"month\" && renderMonthView()}\n {(state.viewMode === \"week\" || state.viewMode === \"day\") &&\n renderTimeView()}\n {renderModal()}\n </div>\n );\n});\n\nCalendar.displayName = \"Calendar\";\nexport default Calendar;\n\n// ─── Entry Form Sub-component ─────────────────────────────────────\n\ninterface EntryFormProps {\n mode: \"add\" | \"edit\";\n entry: Partial<CalendarEntry>;\n labels: Required<import(\"./types\").CalendarLabels>;\n colorOptions: string[];\n onSave: (entry: Partial<CalendarEntry>) => void;\n onDelete?: () => void;\n onCancel: () => void;\n}\n\nfunction EntryForm({\n mode,\n entry,\n labels,\n colorOptions,\n onSave,\n onDelete,\n onCancel,\n}: EntryFormProps) {\n const [formData, setFormData] = useState<Partial<CalendarEntry>>(() => ({\n title: entry.title || \"\",\n date: entry.date || \"\",\n startTime: entry.startTime || \"\",\n endTime: entry.endTime || \"\",\n description: entry.description || \"\",\n color: entry.color || colorOptions[0] || \"#3b82f6\",\n allDay: entry.allDay ?? (entry.startTime ? false : true),\n }));\n\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!formData.title?.trim()) return;\n onSave(formData);\n };\n\n const handleFieldChange = (\n field: keyof CalendarEntry,\n value: string | boolean,\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-3\">\n <h3 className=\"font-bold text-lg\">\n {mode === \"add\" ? labels.addEntry : labels.editEntry}\n </h3>\n\n {/* Title */}\n <div className=\"form-control\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.title}</span>\n </label>\n <input\n type=\"text\"\n className=\"input input-bordered input-sm w-full\"\n placeholder={labels.title}\n value={formData.title || \"\"}\n onChange={(e) => handleFieldChange(\"title\", e.target.value)}\n autoFocus\n required\n />\n </div>\n\n {/* Date */}\n <div className=\"form-control\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.date}</span>\n </label>\n <input\n type=\"date\"\n className=\"input input-bordered input-sm w-full\"\n value={formData.date || \"\"}\n onChange={(e) => handleFieldChange(\"date\", e.target.value)}\n required\n />\n </div>\n\n {/* All Day Toggle */}\n <div className=\"form-control\">\n <label className=\"label cursor-pointer justify-start gap-2 py-1\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm checkbox-primary\"\n checked={formData.allDay ?? true}\n onChange={(e) => handleFieldChange(\"allDay\", e.target.checked)}\n />\n <span className=\"label-text text-xs\">{labels.allDay}</span>\n </label>\n </div>\n\n {/* Time fields (only when not all-day) */}\n {!formData.allDay && (\n <div className=\"flex gap-2\">\n <div className=\"form-control flex-1\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.startTime}</span>\n </label>\n <input\n type=\"time\"\n className=\"input input-bordered input-sm w-full\"\n value={formData.startTime || \"\"}\n onChange={(e) => handleFieldChange(\"startTime\", e.target.value)}\n />\n </div>\n <div className=\"form-control flex-1\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.endTime}</span>\n </label>\n <input\n type=\"time\"\n className=\"input input-bordered input-sm w-full\"\n value={formData.endTime || \"\"}\n onChange={(e) => handleFieldChange(\"endTime\", e.target.value)}\n />\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"form-control\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.description}</span>\n </label>\n <textarea\n className=\"textarea textarea-bordered textarea-sm w-full\"\n rows={2}\n placeholder={labels.description}\n value={formData.description || \"\"}\n onChange={(e) => handleFieldChange(\"description\", e.target.value)}\n />\n </div>\n\n {/* Color picker */}\n <div className=\"form-control\">\n <label className=\"label py-1\">\n <span className=\"label-text text-xs\">{labels.color}</span>\n </label>\n <div className=\"flex gap-2 flex-wrap\">\n {colorOptions.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`cal-color-swatch ${formData.color === color ? \"cal-color-swatch--selected\" : \"\"}`}\n style={{ backgroundColor: color }}\n onClick={() => handleFieldChange(\"color\", color)}\n aria-label={color}\n />\n ))}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex justify-between items-center pt-2\">\n <div>\n {onDelete && !confirmingDelete && (\n <button\n type=\"button\"\n className=\"btn btn-error btn-sm btn-outline\"\n onClick={() => setConfirmingDelete(true)}\n >\n {labels.deleteEntry}\n </button>\n )}\n {onDelete && confirmingDelete && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-error\">{labels.confirmDelete}</span>\n <button\n type=\"button\"\n className=\"btn btn-error btn-xs\"\n onClick={onDelete}\n >\n {labels.deleteEntry}\n </button>\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs\"\n onClick={() => setConfirmingDelete(false)}\n >\n {labels.cancel}\n </button>\n </div>\n )}\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-sm\"\n onClick={onCancel}\n >\n {labels.cancel}\n </button>\n <button\n type=\"submit\"\n className=\"btn btn-primary btn-sm\"\n disabled={!formData.title?.trim()}\n >\n {labels.save}\n </button>\n </div>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}