@underverse-ui/underverse 0.2.92 → 0.2.93

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/dist/index.cjs CHANGED
@@ -6600,6 +6600,13 @@ function Calendar2({
6600
6600
  maxEventsPerDay = 3,
6601
6601
  onEventClick,
6602
6602
  renderEvent,
6603
+ enableEventSheet,
6604
+ eventSheetSize = "md",
6605
+ renderEventSheet,
6606
+ selectedEventId,
6607
+ eventSheetOpen,
6608
+ onEventSheetOpenChange,
6609
+ onSelectedEventIdChange,
6603
6610
  ...rest
6604
6611
  }) {
6605
6612
  const isControlledMonth = month != null;
@@ -6630,6 +6637,60 @@ function Calendar2({
6630
6637
  }
6631
6638
  return map;
6632
6639
  }, [events]);
6640
+ const effectiveEnableEventSheet = enableEventSheet ?? !!renderEventSheet;
6641
+ const isEventSheetOpenControlled = eventSheetOpen !== void 0;
6642
+ const [internalEventSheetOpen, setInternalEventSheetOpen] = React24.useState(false);
6643
+ const activeEventSheetOpen = isEventSheetOpenControlled ? !!eventSheetOpen : internalEventSheetOpen;
6644
+ const isSelectedEventControlled = selectedEventId !== void 0;
6645
+ const [internalSelectedEventRef, setInternalSelectedEventRef] = React24.useState(null);
6646
+ const setEventSheetOpen = React24.useCallback(
6647
+ (open) => {
6648
+ if (!isEventSheetOpenControlled) setInternalEventSheetOpen(open);
6649
+ onEventSheetOpenChange?.(open);
6650
+ if (!open) {
6651
+ if (!isSelectedEventControlled) setInternalSelectedEventRef(null);
6652
+ onSelectedEventIdChange?.(void 0);
6653
+ }
6654
+ },
6655
+ [isEventSheetOpenControlled, isSelectedEventControlled, onEventSheetOpenChange, onSelectedEventIdChange]
6656
+ );
6657
+ const selectedEventRef = React24.useMemo(() => {
6658
+ if (isSelectedEventControlled && selectedEventId != null) {
6659
+ const ev = events.find((e) => e.id === selectedEventId);
6660
+ if (!ev) return null;
6661
+ const d = toDate(ev.date);
6662
+ const dayKey = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
6663
+ return { dayKey, eventId: selectedEventId };
6664
+ }
6665
+ return internalSelectedEventRef;
6666
+ }, [events, internalSelectedEventRef, isSelectedEventControlled, selectedEventId]);
6667
+ const selectedEvent = React24.useMemo(() => {
6668
+ if (!selectedEventRef) return null;
6669
+ const list = byDay.get(selectedEventRef.dayKey) || [];
6670
+ if (selectedEventRef.eventId != null) {
6671
+ return list.find((e) => e.id === selectedEventRef.eventId) || null;
6672
+ }
6673
+ const idx = selectedEventRef.index ?? -1;
6674
+ return idx >= 0 && idx < list.length ? list[idx] : null;
6675
+ }, [byDay, selectedEventRef]);
6676
+ const selectedEventDate = React24.useMemo(() => {
6677
+ if (!selectedEventRef) return null;
6678
+ const [y, m, d] = selectedEventRef.dayKey.split("-").map((x) => Number(x));
6679
+ if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(d)) return null;
6680
+ return new Date(y, m, d);
6681
+ }, [selectedEventRef]);
6682
+ const handleEventActivate = React24.useCallback(
6683
+ (event, date, dayKey, index) => {
6684
+ onEventClick?.(event, date);
6685
+ onSelectedEventIdChange?.(event.id ?? void 0);
6686
+ if (!effectiveEnableEventSheet) return;
6687
+ if (!isSelectedEventControlled) {
6688
+ setInternalSelectedEventRef({ dayKey, eventId: event.id, index });
6689
+ }
6690
+ setEventSheetOpen(true);
6691
+ },
6692
+ [effectiveEnableEventSheet, isSelectedEventControlled, onEventClick, onSelectedEventIdChange, setEventSheetOpen]
6693
+ );
6633
6694
  const isSelected = (d) => {
6634
6695
  if (!selected) return false;
6635
6696
  if (selectMode === "single" && selected instanceof Date) return isSameDay(selected, d);
@@ -6773,7 +6834,7 @@ function Calendar2({
6773
6834
  "button",
6774
6835
  {
6775
6836
  type: "button",
6776
- onClick: () => onEventClick?.(e, d),
6837
+ onClick: () => handleEventActivate(e, d, k, i),
6777
6838
  className: cn(
6778
6839
  "w-full text-left rounded-lg px-2 py-1",
6779
6840
  "transition-colors duration-150 hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
@@ -6937,7 +6998,7 @@ function Calendar2({
6937
6998
  "button",
6938
6999
  {
6939
7000
  type: "button",
6940
- onClick: () => onEventClick?.(e, d),
7001
+ onClick: () => handleEventActivate(e, d, k, i),
6941
7002
  className: cn(
6942
7003
  "w-full text-left rounded-lg px-2 py-1",
6943
7004
  "transition-colors duration-150 hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
@@ -6987,7 +7048,32 @@ function Calendar2({
6987
7048
  `wd-${idx}`
6988
7049
  );
6989
7050
  }) })
6990
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: cn(months > 1 ? "grid md:grid-cols-2 lg:grid-cols-3 gap-4" : ""), children: Array.from({ length: Math.max(1, months) }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(React24.Fragment, { children: renderMonth(addMonths(view, i)) }, `cal-month-${view.getFullYear()}-${view.getMonth()}-${i}`)) })
7051
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: cn(months > 1 ? "grid md:grid-cols-2 lg:grid-cols-3 gap-4" : ""), children: Array.from({ length: Math.max(1, months) }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(React24.Fragment, { children: renderMonth(addMonths(view, i)) }, `cal-month-${view.getFullYear()}-${view.getMonth()}-${i}`)) }),
7052
+ effectiveEnableEventSheet && selectedEvent && selectedEventDate ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
7053
+ Sheet,
7054
+ {
7055
+ open: activeEventSheetOpen,
7056
+ onOpenChange: setEventSheetOpen,
7057
+ side: "right",
7058
+ size: eventSheetSize,
7059
+ title: selectedEvent.title ?? "Event",
7060
+ description: selectedEventDate.toDateString(),
7061
+ children: renderEventSheet ? renderEventSheet({ event: selectedEvent, date: selectedEventDate, close: () => setEventSheetOpen(false) }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-3", children: [
7062
+ selectedEvent.id != null ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { children: [
7063
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "text-xs text-muted-foreground", children: "ID" }),
7064
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "font-mono text-xs break-all", children: String(selectedEvent.id) })
7065
+ ] }) : null,
7066
+ selectedEvent.badge ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { children: [
7067
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "text-xs text-muted-foreground", children: "Badge" }),
7068
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "text-sm", children: selectedEvent.badge })
7069
+ ] }) : null,
7070
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex items-center gap-2", children: [
7071
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "h-3 w-3 rounded-full", style: { backgroundColor: selectedEvent.color || "hsl(var(--primary))" } }),
7072
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "text-sm text-muted-foreground", children: "Color" })
7073
+ ] })
7074
+ ] })
7075
+ }
7076
+ ) : null
6991
7077
  ] });
6992
7078
  }
6993
7079