@underverse-ui/underverse 0.2.99 → 0.2.100

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
@@ -1095,6 +1095,14 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1095
1095
  defaultRowHeights?: Record<string, number>;
1096
1096
  /** Called when per-resource row heights change. */
1097
1097
  onRowHeightsChange?: (next: Record<string, number>) => void;
1098
+ /**
1099
+ * Auto-expand each resource row height to fit overlapping events (lanes) without collapsing into "+more".
1100
+ * When enabled, `maxLanesPerRow` is ignored unless overridden via `autoRowHeight.maxLanesPerRow`.
1101
+ */
1102
+ autoRowHeight?: boolean | {
1103
+ maxRowHeight?: number;
1104
+ maxLanesPerRow?: number;
1105
+ };
1098
1106
  /**
1099
1107
  * Allow resizing layout with mouse:
1100
1108
  * - column: drag the divider in the header
@@ -1177,7 +1185,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1177
1185
  virtualization?: CalendarTimelineVirtualization;
1178
1186
  }
1179
1187
 
1180
- 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, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1188
+ 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, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1181
1189
 
1182
1190
  type ComboboxOption = string | {
1183
1191
  label: string;
package/dist/index.d.ts CHANGED
@@ -1095,6 +1095,14 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1095
1095
  defaultRowHeights?: Record<string, number>;
1096
1096
  /** Called when per-resource row heights change. */
1097
1097
  onRowHeightsChange?: (next: Record<string, number>) => void;
1098
+ /**
1099
+ * Auto-expand each resource row height to fit overlapping events (lanes) without collapsing into "+more".
1100
+ * When enabled, `maxLanesPerRow` is ignored unless overridden via `autoRowHeight.maxLanesPerRow`.
1101
+ */
1102
+ autoRowHeight?: boolean | {
1103
+ maxRowHeight?: number;
1104
+ maxLanesPerRow?: number;
1105
+ };
1098
1106
  /**
1099
1107
  * Allow resizing layout with mouse:
1100
1108
  * - column: drag the divider in the header
@@ -1177,7 +1185,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
1177
1185
  virtualization?: CalendarTimelineVirtualization;
1178
1186
  }
1179
1187
 
1180
- 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, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1188
+ 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, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
1181
1189
 
1182
1190
  type ComboboxOption = string | {
1183
1191
  label: string;
package/dist/index.js CHANGED
@@ -8584,6 +8584,7 @@ function CalendarTimeline({
8584
8584
  rowHeights,
8585
8585
  defaultRowHeights,
8586
8586
  onRowHeightsChange,
8587
+ autoRowHeight,
8587
8588
  enableLayoutResize,
8588
8589
  slotMinWidth,
8589
8590
  dayTimeStepMinutes = 60,
@@ -8636,6 +8637,10 @@ function CalendarTimeline({
8636
8637
  [isControlledEventSheetOpen, onEventSheetOpenChange, setSelectedEventId]
8637
8638
  );
8638
8639
  const sizeConfig = React28.useMemo(() => getSizeConfig(size), [size]);
8640
+ const densityClass = sizeConfig.densityClass;
8641
+ const eventHeight = sizeConfig.eventHeight;
8642
+ const laneGap = sizeConfig.laneGap;
8643
+ const lanePaddingY = sizeConfig.lanePaddingY;
8639
8644
  const canResizeColumn = React28.useMemo(() => {
8640
8645
  const cfg = enableLayoutResize;
8641
8646
  if (!cfg) return false;
@@ -8823,13 +8828,43 @@ function CalendarTimeline({
8823
8828
  setInternalRowHeights(defaultRowHeights);
8824
8829
  }, [defaultRowHeights, isControlledRowHeights]);
8825
8830
  const activeRowHeights = isControlledRowHeights ? rowHeights : internalRowHeights;
8831
+ const autoRowHeightCfg = React28.useMemo(() => {
8832
+ if (!autoRowHeight) return null;
8833
+ return autoRowHeight === true ? {} : autoRowHeight;
8834
+ }, [autoRowHeight]);
8835
+ const effectiveMaxLanesPerRow = React28.useMemo(() => {
8836
+ if (!autoRowHeightCfg) return maxLanesPerRow;
8837
+ const maxLanes = autoRowHeightCfg.maxLanesPerRow;
8838
+ if (typeof maxLanes === "number" && Number.isFinite(maxLanes) && maxLanes > 0) return Math.floor(maxLanes);
8839
+ return Number.POSITIVE_INFINITY;
8840
+ }, [autoRowHeightCfg, maxLanesPerRow]);
8841
+ const autoRowHeightsByResource = React28.useMemo(() => {
8842
+ if (!autoRowHeightCfg) return null;
8843
+ const maxRowHeight2 = autoRowHeightCfg.maxRowHeight;
8844
+ const out = /* @__PURE__ */ new Map();
8845
+ for (const [resourceId, list] of eventsByResource.entries()) {
8846
+ const mapped = list.map((ev) => {
8847
+ const startIdx = binarySearchLastLE(slotStarts, ev._start);
8848
+ const endIdx = clamp3(binarySearchFirstGE(slotStarts, ev._end), startIdx + 1, slots.length);
8849
+ return { startIdx, endIdx };
8850
+ });
8851
+ const { laneCount } = intervalPack(mapped);
8852
+ const lanesToFit = Number.isFinite(effectiveMaxLanesPerRow) ? Math.max(1, Math.min(laneCount, effectiveMaxLanesPerRow)) : Math.max(1, laneCount);
8853
+ const needed = lanePaddingY * 2 + lanesToFit * eventHeight + laneGap * Math.max(0, lanesToFit - 1);
8854
+ const next = typeof maxRowHeight2 === "number" && Number.isFinite(maxRowHeight2) && maxRowHeight2 > 0 ? Math.min(needed, maxRowHeight2) : needed;
8855
+ out.set(resourceId, next);
8856
+ }
8857
+ return out;
8858
+ }, [autoRowHeightCfg, eventHeight, eventsByResource, laneGap, lanePaddingY, slotStarts, slots.length, effectiveMaxLanesPerRow]);
8826
8859
  const getResourceRowHeight = React28.useCallback(
8827
8860
  (resourceId) => {
8828
8861
  const h = activeRowHeights[resourceId];
8829
- if (typeof h === "number" && Number.isFinite(h) && h > 0) return h;
8830
- return effectiveRowHeight;
8862
+ const base = typeof h === "number" && Number.isFinite(h) && h > 0 ? h : effectiveRowHeight;
8863
+ const auto = autoRowHeightsByResource?.get(resourceId);
8864
+ if (typeof auto === "number" && Number.isFinite(auto) && auto > 0) return Math.max(base, auto);
8865
+ return base;
8831
8866
  },
8832
- [activeRowHeights, effectiveRowHeight]
8867
+ [activeRowHeights, autoRowHeightsByResource, effectiveRowHeight]
8833
8868
  );
8834
8869
  const setRowHeightForResource = React28.useCallback(
8835
8870
  (resourceId, height) => {
@@ -8962,10 +8997,6 @@ function CalendarTimeline({
8962
8997
  const fmt = getDtf(resolvedLocale, resolvedTimeZone, { weekday: "long", year: "numeric", month: "long", day: "numeric" });
8963
8998
  return fmt.format(range.start);
8964
8999
  }, [activeDate, activeView, formatters, l.week, range.end, range.start, resolvedLocale, resolvedTimeZone]);
8965
- const densityClass = sizeConfig.densityClass;
8966
- const eventHeight = sizeConfig.eventHeight;
8967
- const laneGap = sizeConfig.laneGap;
8968
- const lanePaddingY = sizeConfig.lanePaddingY;
8969
9000
  const createMode = interactions?.createMode ?? "drag";
8970
9001
  const canCreate = !isViewOnly && (interactions?.creatable ?? false) && !!onCreateEvent;
8971
9002
  const [createOpen, setCreateOpen] = React28.useState(false);
@@ -9350,10 +9381,10 @@ function CalendarTimeline({
9350
9381
  return { ev: { ...ev, _start: s, _end: e }, startIdx, endIdx };
9351
9382
  });
9352
9383
  const { packed, laneCount } = intervalPack(mapped);
9353
- const visible = packed.filter((p) => p.lane < maxLanesPerRow);
9354
- const hidden = packed.filter((p) => p.lane >= maxLanesPerRow);
9384
+ const visible = packed.filter((p) => p.lane < effectiveMaxLanesPerRow);
9385
+ const hidden = packed.filter((p) => p.lane >= effectiveMaxLanesPerRow);
9355
9386
  const rowHeightPx = getResourceRowHeight(resourceId);
9356
- const visibleLaneCount = Math.max(1, Math.min(laneCount, maxLanesPerRow));
9387
+ const visibleLaneCount = Math.max(1, Math.min(laneCount, effectiveMaxLanesPerRow));
9357
9388
  const available = Math.max(0, rowHeightPx - lanePaddingY * 2 - laneGap * Math.max(0, visibleLaneCount - 1));
9358
9389
  const fitPerLane = visibleLaneCount > 0 ? Math.floor(available / visibleLaneCount) : eventHeight;
9359
9390
  const perLaneHeight = Math.max(9, Math.min(eventHeight, fitPerLane || eventHeight));
@@ -9371,7 +9402,7 @@ function CalendarTimeline({
9371
9402
  });
9372
9403
  }
9373
9404
  return map;
9374
- }, [eventsByResource, getResourceRowHeight, laneGap, lanePaddingY, slotStarts, slots.length, slotWidth, maxLanesPerRow, preview, eventHeight]);
9405
+ }, [eventsByResource, getResourceRowHeight, laneGap, lanePaddingY, slotStarts, slots.length, slotWidth, effectiveMaxLanesPerRow, preview, eventHeight]);
9375
9406
  return /* @__PURE__ */ jsxs31(
9376
9407
  "div",
9377
9408
  {