@underverse-ui/underverse 0.2.88 → 0.2.89

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.d.cts CHANGED
@@ -904,6 +904,7 @@ declare function Calendar({ month, defaultMonth, onMonthChange, value, defaultVa
904
904
  type CalendarTimelineView = "month" | "week" | "day";
905
905
  type CalendarTimelineDateInput = Date | string | number;
906
906
  type CalendarTimelineSize = "sm" | "md" | "xl";
907
+ type CalendarTimelineSheetSize = "sm" | "md" | "lg" | "xl" | "full";
907
908
  interface CalendarTimelineGroup {
908
909
  id: string;
909
910
  label: React$1.ReactNode;
@@ -980,6 +981,26 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
980
981
  resources: CalendarTimelineResource<TResourceMeta>[];
981
982
  events: CalendarTimelineEvent<TEventMeta>[];
982
983
  size?: CalendarTimelineSize;
984
+ /**
985
+ * Enable the built-in right-side event details sheet on click.
986
+ * If `renderEventSheet` is provided, this defaults to enabled.
987
+ */
988
+ enableEventSheet?: boolean;
989
+ eventSheetSize?: CalendarTimelineSheetSize;
990
+ renderEventSheet?: (args: {
991
+ event: CalendarTimelineEvent<TEventMeta>;
992
+ resource?: CalendarTimelineResource<TResourceMeta>;
993
+ close: () => void;
994
+ locale: string;
995
+ timeZone: string;
996
+ view: CalendarTimelineView;
997
+ }) => React$1.ReactNode;
998
+ selectedEventId?: string | null;
999
+ defaultSelectedEventId?: string | null;
1000
+ onSelectedEventIdChange?: (eventId: string | null) => void;
1001
+ eventSheetOpen?: boolean;
1002
+ defaultEventSheetOpen?: boolean;
1003
+ onEventSheetOpenChange?: (open: boolean) => void;
983
1004
  view?: CalendarTimelineView;
984
1005
  defaultView?: CalendarTimelineView;
985
1006
  onViewChange?: (view: CalendarTimelineView) => void;
@@ -1041,7 +1062,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1041
1062
  virtualization?: CalendarTimelineVirtualization;
1042
1063
  }
1043
1064
 
1044
- declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, rowHeight, slotMinWidth, dayTimeStepMinutes, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEvent, onEventMove, onEventResize, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1065
+ declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, rowHeight, slotMinWidth, dayTimeStepMinutes, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEvent, onEventMove, onEventResize, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1045
1066
 
1046
1067
  type ComboboxOption = string | {
1047
1068
  label: string;
package/dist/index.d.ts CHANGED
@@ -904,6 +904,7 @@ declare function Calendar({ month, defaultMonth, onMonthChange, value, defaultVa
904
904
  type CalendarTimelineView = "month" | "week" | "day";
905
905
  type CalendarTimelineDateInput = Date | string | number;
906
906
  type CalendarTimelineSize = "sm" | "md" | "xl";
907
+ type CalendarTimelineSheetSize = "sm" | "md" | "lg" | "xl" | "full";
907
908
  interface CalendarTimelineGroup {
908
909
  id: string;
909
910
  label: React$1.ReactNode;
@@ -980,6 +981,26 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
980
981
  resources: CalendarTimelineResource<TResourceMeta>[];
981
982
  events: CalendarTimelineEvent<TEventMeta>[];
982
983
  size?: CalendarTimelineSize;
984
+ /**
985
+ * Enable the built-in right-side event details sheet on click.
986
+ * If `renderEventSheet` is provided, this defaults to enabled.
987
+ */
988
+ enableEventSheet?: boolean;
989
+ eventSheetSize?: CalendarTimelineSheetSize;
990
+ renderEventSheet?: (args: {
991
+ event: CalendarTimelineEvent<TEventMeta>;
992
+ resource?: CalendarTimelineResource<TResourceMeta>;
993
+ close: () => void;
994
+ locale: string;
995
+ timeZone: string;
996
+ view: CalendarTimelineView;
997
+ }) => React$1.ReactNode;
998
+ selectedEventId?: string | null;
999
+ defaultSelectedEventId?: string | null;
1000
+ onSelectedEventIdChange?: (eventId: string | null) => void;
1001
+ eventSheetOpen?: boolean;
1002
+ defaultEventSheetOpen?: boolean;
1003
+ onEventSheetOpenChange?: (open: boolean) => void;
983
1004
  view?: CalendarTimelineView;
984
1005
  defaultView?: CalendarTimelineView;
985
1006
  onViewChange?: (view: CalendarTimelineView) => void;
@@ -1041,7 +1062,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1041
1062
  virtualization?: CalendarTimelineVirtualization;
1042
1063
  }
1043
1064
 
1044
- declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, rowHeight, slotMinWidth, dayTimeStepMinutes, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEvent, onEventMove, onEventResize, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1065
+ declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, rowHeight, slotMinWidth, dayTimeStepMinutes, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEvent, onEventMove, onEventResize, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1045
1066
 
1046
1067
  type ComboboxOption = string | {
1047
1068
  label: string;
package/dist/index.js CHANGED
@@ -7832,6 +7832,15 @@ function CalendarTimeline({
7832
7832
  resources,
7833
7833
  events,
7834
7834
  size = "md",
7835
+ enableEventSheet,
7836
+ eventSheetSize = "md",
7837
+ renderEventSheet,
7838
+ selectedEventId,
7839
+ defaultSelectedEventId,
7840
+ onSelectedEventIdChange,
7841
+ eventSheetOpen,
7842
+ defaultEventSheetOpen,
7843
+ onEventSheetOpenChange,
7835
7844
  view,
7836
7845
  defaultView = "month",
7837
7846
  onViewChange,
@@ -7872,6 +7881,28 @@ function CalendarTimeline({
7872
7881
  const detectedLocale = useLocale();
7873
7882
  const resolvedLocale = React28.useMemo(() => localeToBCP47(locale ?? detectedLocale), [locale, detectedLocale]);
7874
7883
  const resolvedTimeZone = React28.useMemo(() => timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC", [timeZone]);
7884
+ const effectiveEnableEventSheet = enableEventSheet ?? Boolean(renderEventSheet);
7885
+ const isControlledSelectedEventId = selectedEventId !== void 0;
7886
+ const [internalSelectedEventId, setInternalSelectedEventId] = React28.useState(defaultSelectedEventId ?? null);
7887
+ const activeSelectedEventId = isControlledSelectedEventId ? selectedEventId : internalSelectedEventId;
7888
+ const setSelectedEventId = React28.useCallback(
7889
+ (next) => {
7890
+ if (!isControlledSelectedEventId) setInternalSelectedEventId(next);
7891
+ onSelectedEventIdChange?.(next);
7892
+ },
7893
+ [isControlledSelectedEventId, onSelectedEventIdChange]
7894
+ );
7895
+ const isControlledEventSheetOpen = eventSheetOpen !== void 0;
7896
+ const [internalEventSheetOpen, setInternalEventSheetOpen] = React28.useState(defaultEventSheetOpen ?? false);
7897
+ const activeEventSheetOpen = isControlledEventSheetOpen ? Boolean(eventSheetOpen) : internalEventSheetOpen;
7898
+ const setEventSheetOpen = React28.useCallback(
7899
+ (next) => {
7900
+ if (!isControlledEventSheetOpen) setInternalEventSheetOpen(next);
7901
+ onEventSheetOpenChange?.(next);
7902
+ if (!next) setSelectedEventId(null);
7903
+ },
7904
+ [isControlledEventSheetOpen, onEventSheetOpenChange, setSelectedEventId]
7905
+ );
7875
7906
  const sizeConfig = React28.useMemo(() => {
7876
7907
  const cfgBySize = {
7877
7908
  sm: {
@@ -8088,6 +8119,31 @@ function CalendarTimeline({
8088
8119
  for (const r of resources) map.set(r.id, r);
8089
8120
  return map;
8090
8121
  }, [resources]);
8122
+ const selectedEvent = React28.useMemo(() => {
8123
+ if (!activeSelectedEventId) return null;
8124
+ const found = normalizedEvents.find((e) => e.id === activeSelectedEventId);
8125
+ return found ?? null;
8126
+ }, [activeSelectedEventId, normalizedEvents]);
8127
+ const selectedResource = React28.useMemo(() => {
8128
+ if (!selectedEvent) return void 0;
8129
+ return resourceById.get(selectedEvent.resourceId);
8130
+ }, [resourceById, selectedEvent]);
8131
+ const selectedTimeText = React28.useMemo(() => {
8132
+ if (!selectedEvent) return "";
8133
+ return formatters?.eventTime?.({
8134
+ start: selectedEvent._start,
8135
+ end: selectedEvent._end,
8136
+ locale: resolvedLocale,
8137
+ timeZone: resolvedTimeZone,
8138
+ view: activeView
8139
+ }) ?? defaultEventTime({ start: selectedEvent._start, end: selectedEvent._end, locale: resolvedLocale, timeZone: resolvedTimeZone, view: activeView });
8140
+ }, [activeView, formatters, resolvedLocale, resolvedTimeZone, selectedEvent]);
8141
+ React28.useEffect(() => {
8142
+ if (!effectiveEnableEventSheet) return;
8143
+ if (activeEventSheetOpen && activeSelectedEventId && !selectedEvent) {
8144
+ setEventSheetOpen(false);
8145
+ }
8146
+ }, [activeEventSheetOpen, activeSelectedEventId, effectiveEnableEventSheet, selectedEvent, setEventSheetOpen]);
8091
8147
  const leftRef = React28.useRef(null);
8092
8148
  const bodyRef = React28.useRef(null);
8093
8149
  const headerRef = React28.useRef(null);
@@ -8556,7 +8612,13 @@ function CalendarTimeline({
8556
8612
  role: "button",
8557
8613
  tabIndex: 0,
8558
8614
  "aria-label": aria,
8559
- onClick: () => onEventClick?.(ev),
8615
+ onClick: () => {
8616
+ onEventClick?.(ev);
8617
+ if (effectiveEnableEventSheet) {
8618
+ setSelectedEventId(ev.id);
8619
+ setEventSheetOpen(true);
8620
+ }
8621
+ },
8560
8622
  onDoubleClick: () => onEventDoubleClick?.(ev),
8561
8623
  onPointerDown: (e) => onPointerDownEvent(e, ev, "move"),
8562
8624
  children: [
@@ -8622,7 +8684,35 @@ function CalendarTimeline({
8622
8684
  ]
8623
8685
  }
8624
8686
  )
8625
- ] })
8687
+ ] }),
8688
+ effectiveEnableEventSheet && selectedEvent ? /* @__PURE__ */ jsx33(
8689
+ Sheet,
8690
+ {
8691
+ open: activeEventSheetOpen,
8692
+ onOpenChange: setEventSheetOpen,
8693
+ side: "right",
8694
+ size: eventSheetSize,
8695
+ title: selectedEvent.title ?? "Event",
8696
+ description: selectedTimeText || void 0,
8697
+ children: renderEventSheet ? renderEventSheet({
8698
+ event: selectedEvent,
8699
+ resource: selectedResource,
8700
+ close: () => setEventSheetOpen(false),
8701
+ locale: resolvedLocale,
8702
+ timeZone: resolvedTimeZone,
8703
+ view: activeView
8704
+ }) : /* @__PURE__ */ jsxs28("div", { className: "space-y-3", children: [
8705
+ selectedResource?.label ? /* @__PURE__ */ jsxs28("div", { children: [
8706
+ /* @__PURE__ */ jsx33("div", { className: "text-xs text-muted-foreground", children: t("resourcesHeader") }),
8707
+ /* @__PURE__ */ jsx33("div", { className: "font-medium", children: selectedResource.label })
8708
+ ] }) : null,
8709
+ /* @__PURE__ */ jsxs28("div", { children: [
8710
+ /* @__PURE__ */ jsx33("div", { className: "text-xs text-muted-foreground", children: "ID" }),
8711
+ /* @__PURE__ */ jsx33("div", { className: "font-mono text-xs break-all", children: selectedEvent.id })
8712
+ ] })
8713
+ ] })
8714
+ }
8715
+ ) : null
8626
8716
  ]
8627
8717
  }
8628
8718
  );