@underverse-ui/underverse 0.2.93 → 0.2.94

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
@@ -8236,8 +8236,19 @@ function useHorizontalScrollSync(args) {
8236
8236
  };
8237
8237
  }, [bodyRef, headerRef, leftRef]);
8238
8238
  }
8239
- function useVirtualRows(args) {
8240
- const { enabled, overscan, rowHeight, itemCount, scrollRef } = args;
8239
+ function lowerBound(arr, target) {
8240
+ let lo = 0;
8241
+ let hi = arr.length;
8242
+ while (lo < hi) {
8243
+ const mid = lo + hi >> 1;
8244
+ if (arr[mid] < target) lo = mid + 1;
8245
+ else hi = mid;
8246
+ }
8247
+ return lo;
8248
+ }
8249
+ function useVirtualVariableRows(args) {
8250
+ const { enabled, overscan, rowHeights, scrollRef } = args;
8251
+ const itemCount = rowHeights.length;
8241
8252
  const [viewportHeight, setViewportHeight] = React27.useState(0);
8242
8253
  const [scrollTop, setScrollTop] = React27.useState(0);
8243
8254
  React27.useEffect(() => {
@@ -8256,16 +8267,28 @@ function useVirtualRows(args) {
8256
8267
  el.addEventListener("scroll", onScroll, { passive: true });
8257
8268
  return () => el.removeEventListener("scroll", onScroll);
8258
8269
  }, [scrollRef]);
8270
+ const prefix = React27.useMemo(() => {
8271
+ const out = new Array(itemCount + 1);
8272
+ out[0] = 0;
8273
+ for (let i = 0; i < itemCount; i++) {
8274
+ out[i + 1] = out[i] + (rowHeights[i] ?? 0);
8275
+ }
8276
+ return out;
8277
+ }, [itemCount, rowHeights]);
8259
8278
  return React27.useMemo(() => {
8260
8279
  if (!enabled) {
8261
- return { startIndex: 0, endIndex: itemCount, topSpacer: 0, bottomSpacer: 0 };
8262
- }
8263
- const startIndex = clamp3(Math.floor(scrollTop / rowHeight) - overscan, 0, itemCount);
8264
- const endIndex = clamp3(Math.ceil((scrollTop + viewportHeight) / rowHeight) + overscan, 0, itemCount);
8265
- const topSpacer = startIndex * rowHeight;
8266
- const bottomSpacer = (itemCount - endIndex) * rowHeight;
8267
- return { startIndex, endIndex, topSpacer, bottomSpacer };
8268
- }, [enabled, itemCount, overscan, rowHeight, scrollTop, viewportHeight]);
8280
+ return { startIndex: 0, endIndex: itemCount, topSpacer: 0, bottomSpacer: 0, totalHeight: prefix[itemCount] ?? 0 };
8281
+ }
8282
+ const total = prefix[itemCount] ?? 0;
8283
+ const startPos = Math.max(0, Math.min(scrollTop, total));
8284
+ const endPos = Math.max(0, Math.min(scrollTop + viewportHeight, total));
8285
+ let startIndex = Math.max(0, lowerBound(prefix, startPos) - 1);
8286
+ let endIndex = Math.min(itemCount, lowerBound(prefix, endPos) + overscan);
8287
+ startIndex = clamp3(startIndex - overscan, 0, itemCount);
8288
+ const topSpacer = prefix[startIndex] ?? 0;
8289
+ const bottomSpacer = total - (prefix[endIndex] ?? total);
8290
+ return { startIndex, endIndex, topSpacer, bottomSpacer, totalHeight: total };
8291
+ }, [enabled, itemCount, overscan, prefix, scrollTop, viewportHeight]);
8269
8292
  }
8270
8293
 
8271
8294
  // ../../components/ui/CalendarTimeline/CalendarTimeline.tsx
@@ -8322,7 +8345,19 @@ function CalendarTimeline({
8322
8345
  defaultGroupCollapsed,
8323
8346
  onGroupCollapsedChange,
8324
8347
  resourceColumnWidth,
8348
+ defaultResourceColumnWidth,
8349
+ onResourceColumnWidthChange,
8350
+ minResourceColumnWidth,
8351
+ maxResourceColumnWidth,
8325
8352
  rowHeight,
8353
+ defaultRowHeight,
8354
+ onRowHeightChange,
8355
+ minRowHeight,
8356
+ maxRowHeight,
8357
+ rowHeights,
8358
+ defaultRowHeights,
8359
+ onRowHeightsChange,
8360
+ enableLayoutResize,
8326
8361
  slotMinWidth,
8327
8362
  dayTimeStepMinutes = 60,
8328
8363
  maxLanesPerRow = 3,
@@ -8421,9 +8456,42 @@ function CalendarTimeline({
8421
8456
  };
8422
8457
  return cfgBySize[size];
8423
8458
  }, [size]);
8424
- const effectiveResourceColumnWidth = resourceColumnWidth ?? sizeConfig.resourceColumnWidth;
8425
- const effectiveRowHeight = rowHeight ?? sizeConfig.rowHeight;
8459
+ const canResizeColumn = React28.useMemo(() => {
8460
+ const cfg = enableLayoutResize;
8461
+ if (!cfg) return false;
8462
+ if (cfg === true) return true;
8463
+ return cfg.column !== false;
8464
+ }, [enableLayoutResize]);
8465
+ const canResizeRow = React28.useMemo(() => {
8466
+ const cfg = enableLayoutResize;
8467
+ if (!cfg) return false;
8468
+ if (cfg === true) return true;
8469
+ return cfg.row !== false;
8470
+ }, [enableLayoutResize]);
8471
+ const isControlledResourceColumnWidth = resourceColumnWidth !== void 0;
8472
+ const [internalResourceColumnWidth, setInternalResourceColumnWidth] = React28.useState(() => {
8473
+ const init = defaultResourceColumnWidth ?? sizeConfig.resourceColumnWidth;
8474
+ return typeof init === "number" ? init : sizeConfig.resourceColumnWidth;
8475
+ });
8476
+ React28.useEffect(() => {
8477
+ if (isControlledResourceColumnWidth) return;
8478
+ if (defaultResourceColumnWidth == null) return;
8479
+ setInternalResourceColumnWidth(defaultResourceColumnWidth);
8480
+ }, [defaultResourceColumnWidth, isControlledResourceColumnWidth]);
8481
+ const effectiveResourceColumnWidth = isControlledResourceColumnWidth ? resourceColumnWidth : internalResourceColumnWidth;
8482
+ const isControlledRowHeight = rowHeight !== void 0;
8483
+ const [internalRowHeight, setInternalRowHeight] = React28.useState(() => defaultRowHeight ?? sizeConfig.rowHeight);
8484
+ React28.useEffect(() => {
8485
+ if (isControlledRowHeight) return;
8486
+ if (defaultRowHeight == null) return;
8487
+ setInternalRowHeight(defaultRowHeight);
8488
+ }, [defaultRowHeight, isControlledRowHeight]);
8489
+ const effectiveRowHeight = isControlledRowHeight ? rowHeight : internalRowHeight;
8426
8490
  const effectiveSlotMinWidth = slotMinWidth ?? sizeConfig.slotMinWidth;
8491
+ const colMin = minResourceColumnWidth ?? 160;
8492
+ const colMax = maxResourceColumnWidth ?? 520;
8493
+ const rowMin = minRowHeight ?? 36;
8494
+ const rowMax = maxRowHeight ?? 120;
8427
8495
  const isControlledView = view !== void 0;
8428
8496
  const [internalView, setInternalView] = React28.useState(defaultView);
8429
8497
  const activeView = isControlledView ? view : internalView;
@@ -8613,6 +8681,135 @@ function CalendarTimeline({
8613
8681
  const bodyRef = React28.useRef(null);
8614
8682
  const headerRef = React28.useRef(null);
8615
8683
  useHorizontalScrollSync({ bodyRef, headerRef, leftRef });
8684
+ const virt = virtualization?.enabled;
8685
+ const overscan = virtualization?.overscan ?? 8;
8686
+ const isControlledRowHeights = rowHeights !== void 0;
8687
+ const [internalRowHeights, setInternalRowHeights] = React28.useState(() => defaultRowHeights ?? {});
8688
+ React28.useEffect(() => {
8689
+ if (isControlledRowHeights) return;
8690
+ if (!defaultRowHeights) return;
8691
+ setInternalRowHeights(defaultRowHeights);
8692
+ }, [defaultRowHeights, isControlledRowHeights]);
8693
+ const activeRowHeights = isControlledRowHeights ? rowHeights : internalRowHeights;
8694
+ const getResourceRowHeight = React28.useCallback(
8695
+ (resourceId) => {
8696
+ const h = activeRowHeights[resourceId];
8697
+ if (typeof h === "number" && Number.isFinite(h) && h > 0) return h;
8698
+ return effectiveRowHeight;
8699
+ },
8700
+ [activeRowHeights, effectiveRowHeight]
8701
+ );
8702
+ const setRowHeightForResource = React28.useCallback(
8703
+ (resourceId, height) => {
8704
+ const clamped = clamp3(Math.round(height), rowMin, rowMax);
8705
+ onRowHeightChange?.(clamped);
8706
+ if (isControlledRowHeights) {
8707
+ const next = { ...activeRowHeights ?? {}, [resourceId]: clamped };
8708
+ onRowHeightsChange?.(next);
8709
+ return;
8710
+ }
8711
+ setInternalRowHeights((prev) => {
8712
+ const next = { ...prev, [resourceId]: clamped };
8713
+ onRowHeightsChange?.(next);
8714
+ return next;
8715
+ });
8716
+ },
8717
+ [activeRowHeights, isControlledRowHeights, onRowHeightChange, onRowHeightsChange, rowMax, rowMin]
8718
+ );
8719
+ const rowHeightsArray = React28.useMemo(() => {
8720
+ return rows.map((r) => {
8721
+ if (r.kind === "resource") return getResourceRowHeight(r.resource.id);
8722
+ return effectiveRowHeight;
8723
+ });
8724
+ }, [effectiveRowHeight, getResourceRowHeight, rows]);
8725
+ const virtualResult = useVirtualVariableRows({
8726
+ enabled: virt,
8727
+ overscan,
8728
+ rowHeights: rowHeightsArray,
8729
+ scrollRef: bodyRef
8730
+ });
8731
+ const startRow = virt ? virtualResult.startIndex : 0;
8732
+ const endRow = virt ? virtualResult.endIndex : rows.length;
8733
+ const topSpacer = virt ? virtualResult.topSpacer : 0;
8734
+ const bottomSpacer = virt ? virtualResult.bottomSpacer : 0;
8735
+ const resizeRef = React28.useRef(null);
8736
+ const setResourceColumnWidth = React28.useCallback(
8737
+ (next) => {
8738
+ const clamped = clamp3(Math.round(next), colMin, colMax);
8739
+ if (!isControlledResourceColumnWidth) setInternalResourceColumnWidth(clamped);
8740
+ onResourceColumnWidthChange?.(clamped);
8741
+ },
8742
+ [colMax, colMin, isControlledResourceColumnWidth, onResourceColumnWidthChange]
8743
+ );
8744
+ const startResize = React28.useCallback(
8745
+ (mode, e, args) => {
8746
+ resizeRef.current = {
8747
+ mode,
8748
+ pointerId: e.pointerId,
8749
+ startX: e.clientX,
8750
+ startY: e.clientY,
8751
+ startWidth: args.startWidth,
8752
+ startHeight: args.startHeight,
8753
+ resourceId: args.resourceId
8754
+ };
8755
+ document.body.style.cursor = mode === "column" ? "col-resize" : "row-resize";
8756
+ document.body.style.userSelect = "none";
8757
+ const onMove = (ev) => {
8758
+ const st = resizeRef.current;
8759
+ if (!st) return;
8760
+ if (ev.pointerId !== st.pointerId) return;
8761
+ if (st.mode === "column") {
8762
+ setResourceColumnWidth(st.startWidth + (ev.clientX - st.startX));
8763
+ } else {
8764
+ if (!st.resourceId) return;
8765
+ setRowHeightForResource(st.resourceId, st.startHeight + (ev.clientY - st.startY));
8766
+ }
8767
+ };
8768
+ const onUp = (ev) => {
8769
+ const st = resizeRef.current;
8770
+ if (!st) return;
8771
+ if (ev.pointerId !== st.pointerId) return;
8772
+ resizeRef.current = null;
8773
+ document.body.style.cursor = "";
8774
+ document.body.style.userSelect = "";
8775
+ window.removeEventListener("pointermove", onMove);
8776
+ window.removeEventListener("pointerup", onUp);
8777
+ };
8778
+ window.addEventListener("pointermove", onMove);
8779
+ window.addEventListener("pointerup", onUp);
8780
+ e.currentTarget.setPointerCapture?.(e.pointerId);
8781
+ e.preventDefault();
8782
+ e.stopPropagation();
8783
+ },
8784
+ [setResourceColumnWidth, setRowHeightForResource]
8785
+ );
8786
+ React28.useEffect(() => {
8787
+ return () => {
8788
+ if (!resizeRef.current) return;
8789
+ resizeRef.current = null;
8790
+ document.body.style.cursor = "";
8791
+ document.body.style.userSelect = "";
8792
+ };
8793
+ }, []);
8794
+ const beginResizeColumn = React28.useCallback(
8795
+ (e) => {
8796
+ if (!canResizeColumn) return;
8797
+ if (typeof effectiveResourceColumnWidth !== "number") return;
8798
+ startResize("column", e, { startWidth: effectiveResourceColumnWidth, startHeight: effectiveRowHeight });
8799
+ },
8800
+ [canResizeColumn, effectiveResourceColumnWidth, effectiveRowHeight, startResize]
8801
+ );
8802
+ const beginResizeResourceRow = React28.useCallback(
8803
+ (resourceId) => (e) => {
8804
+ if (!canResizeRow) return;
8805
+ startResize("row", e, {
8806
+ startWidth: typeof effectiveResourceColumnWidth === "number" ? effectiveResourceColumnWidth : 0,
8807
+ startHeight: getResourceRowHeight(resourceId),
8808
+ resourceId
8809
+ });
8810
+ },
8811
+ [canResizeRow, effectiveResourceColumnWidth, getResourceRowHeight, startResize]
8812
+ );
8616
8813
  const title = React28.useMemo(() => {
8617
8814
  if (activeView === "month") {
8618
8815
  return formatters?.monthTitle?.(activeDate, { locale: resolvedLocale, timeZone: resolvedTimeZone }) ?? defaultMonthTitle(activeDate, resolvedLocale, resolvedTimeZone);
@@ -8636,20 +8833,6 @@ function CalendarTimeline({
8636
8833
  const eventHeight = sizeConfig.eventHeight;
8637
8834
  const laneGap = sizeConfig.laneGap;
8638
8835
  const lanePaddingY = sizeConfig.lanePaddingY;
8639
- const virt = virtualization?.enabled;
8640
- const overscan = virtualization?.overscan ?? 8;
8641
- const {
8642
- startIndex: startRow,
8643
- endIndex: endRow,
8644
- topSpacer,
8645
- bottomSpacer
8646
- } = useVirtualRows({
8647
- enabled: virt,
8648
- overscan,
8649
- rowHeight: effectiveRowHeight,
8650
- itemCount: rows.length,
8651
- scrollRef: bodyRef
8652
- });
8653
8836
  const dragRef = React28.useRef(null);
8654
8837
  const [preview, setPreview] = React28.useState(null);
8655
8838
  const getPointerContext = React28.useCallback(
@@ -8910,12 +9093,34 @@ function CalendarTimeline({
8910
9093
  )) })
8911
9094
  ] }),
8912
9095
  /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex border-t border-border/20", children: [
8913
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
9096
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
8914
9097
  "div",
8915
9098
  {
8916
- className: "shrink-0 border-r border-border/30 bg-muted/20 flex items-center justify-center",
9099
+ className: "shrink-0 border-r border-border/30 bg-muted/20 flex items-center justify-center relative group/uv-ct-top-left",
8917
9100
  style: { width: effectiveResourceColumnWidth, minWidth: effectiveResourceColumnWidth },
8918
- children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-xs font-medium text-muted-foreground/70 uppercase tracking-wider", children: t("resourcesHeader") })
9101
+ children: [
9102
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-xs font-medium text-muted-foreground/70 uppercase tracking-wider", children: t("resourcesHeader") }),
9103
+ canResizeColumn && typeof effectiveResourceColumnWidth === "number" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
9104
+ "div",
9105
+ {
9106
+ role: "separator",
9107
+ "aria-orientation": "vertical",
9108
+ "aria-label": "Resize resource column",
9109
+ className: cn(
9110
+ "absolute right-0 top-0 h-full w-3 cursor-col-resize z-20",
9111
+ "bg-transparent hover:bg-primary/10 active:bg-primary/15",
9112
+ "transition-all",
9113
+ "opacity-0 pointer-events-none",
9114
+ "group-hover/uv-ct-top-left:opacity-100 group-hover/uv-ct-top-left:pointer-events-auto"
9115
+ ),
9116
+ onPointerDown: beginResizeColumn,
9117
+ children: [
9118
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute inset-y-2 left-1/2 w-px -translate-x-1/2 bg-border/70" }),
9119
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-70", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.GripVertical, { className: "h-4 w-4 text-muted-foreground" }) })
9120
+ ]
9121
+ }
9122
+ ) : null
9123
+ ]
8919
9124
  }
8920
9125
  ),
8921
9126
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { ref: headerRef, className: "overflow-x-auto overflow-y-hidden scrollbar-none", children: slotHeaderNodes })
@@ -8925,13 +9130,33 @@ function CalendarTimeline({
8925
9130
  "div",
8926
9131
  {
8927
9132
  className: cn(
8928
- "h-full w-full flex items-center border-b border-border/30 bg-linear-to-r from-background to-background/95",
9133
+ "h-full w-full flex items-center border-b border-border/30 bg-linear-to-r from-background to-background/95 relative",
8929
9134
  sizeConfig.resourceRowClass,
8930
- "hover:from-muted/30 hover:to-muted/10 transition-all duration-200 group"
9135
+ "hover:from-muted/30 hover:to-muted/10 transition-all duration-200 group/uv-ct-row-header"
8931
9136
  ),
8932
9137
  children: [
8933
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "shrink-0 opacity-0 group-hover:opacity-60 transition-opacity cursor-grab", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.GripVertical, { className: "h-4 w-4 text-muted-foreground" }) }),
8934
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn("flex-1 min-w-0", r.disabled && "opacity-50"), children: renderResource ? renderResource(r) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "font-medium text-sm truncate block", children: r.label }) })
9138
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "shrink-0 opacity-0 group-hover/uv-ct-row-header:opacity-60 transition-opacity cursor-grab", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.GripVertical, { className: "h-4 w-4 text-muted-foreground" }) }),
9139
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn("flex-1 min-w-0", r.disabled && "opacity-50"), children: renderResource ? renderResource(r) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "font-medium text-sm truncate block", children: r.label }) }),
9140
+ canResizeRow ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
9141
+ "div",
9142
+ {
9143
+ role: "separator",
9144
+ "aria-orientation": "horizontal",
9145
+ "aria-label": "Resize row height",
9146
+ className: cn(
9147
+ "absolute left-0 bottom-0 w-full h-3 cursor-row-resize z-20",
9148
+ "bg-transparent hover:bg-primary/10 active:bg-primary/15",
9149
+ "transition-all",
9150
+ "opacity-0 pointer-events-none",
9151
+ "group-hover/uv-ct-row-header:opacity-100 group-hover/uv-ct-row-header:pointer-events-auto"
9152
+ ),
9153
+ onPointerDown: beginResizeResourceRow(r.id),
9154
+ children: [
9155
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute inset-x-3 top-1/2 h-px -translate-y-1/2 bg-border/70" }),
9156
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute top-1/2 right-3 -translate-y-1/2 opacity-70", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react18.GripVertical, { className: "h-4 w-4 text-muted-foreground rotate-90" }) })
9157
+ ]
9158
+ }
9159
+ ) : null
8935
9160
  ]
8936
9161
  }
8937
9162
  );
@@ -8984,11 +9209,12 @@ function CalendarTimeline({
8984
9209
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: topSpacer } }),
8985
9210
  rows.slice(startRow, endRow).map((row, idx) => {
8986
9211
  const rowIndex = startRow + idx;
9212
+ const h = rowHeightsArray[rowIndex] ?? effectiveRowHeight;
8987
9213
  if (row.kind === "group") {
8988
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: effectiveRowHeight }, children: renderGroupRow(row.group) }, `lg_${row.group.id}_${rowIndex}`);
9214
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: h }, children: renderGroupRow(row.group) }, `lg_${row.group.id}_${rowIndex}`);
8989
9215
  }
8990
9216
  const r = row.resource;
8991
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: effectiveRowHeight }, children: ResourceCell(r) }, `lr_${r.id}_${rowIndex}`);
9217
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: h }, children: ResourceCell(r) }, `lr_${r.id}_${rowIndex}`);
8992
9218
  }),
8993
9219
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: bottomSpacer } })
8994
9220
  ]
@@ -9005,8 +9231,9 @@ function CalendarTimeline({
9005
9231
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { style: { height: topSpacer } }),
9006
9232
  rows.slice(startRow, endRow).map((row, idx) => {
9007
9233
  const rowIndex = startRow + idx;
9234
+ const h = rowHeightsArray[rowIndex] ?? effectiveRowHeight;
9008
9235
  if (row.kind === "group") {
9009
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex", style: { height: effectiveRowHeight }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "border-b border-border/30 bg-linear-to-r from-muted/15 to-muted/5", style: { width: gridWidth, minWidth: gridWidth } }) }, `rg_${row.group.id}_${rowIndex}`);
9236
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "flex", style: { height: h }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "border-b border-border/30 bg-linear-to-r from-muted/15 to-muted/5", style: { width: gridWidth, minWidth: gridWidth } }) }, `rg_${row.group.id}_${rowIndex}`);
9010
9237
  }
9011
9238
  const r = row.resource;
9012
9239
  const layout = layoutsByResource.get(r.id) ?? { visible: [], hidden: [] };
@@ -9015,7 +9242,7 @@ function CalendarTimeline({
9015
9242
  "div",
9016
9243
  {
9017
9244
  className: "group/row hover:bg-muted/5 transition-colors duration-150",
9018
- style: { height: effectiveRowHeight },
9245
+ style: { height: h },
9019
9246
  "data-uv-ct-row": r.id,
9020
9247
  children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "relative shrink-0", style: { width: gridWidth, minWidth: gridWidth, height: "100%" }, children: [
9021
9248
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute inset-0", onPointerDown: onPointerDownCell, "data-uv-ct-timeline": true, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "absolute inset-0 flex", children: slots.map((s, i2) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(