@underverse-ui/underverse 1.0.104 → 1.0.106

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "package": "@underverse-ui/underverse",
3
- "version": "1.0.104",
3
+ "version": "1.0.106",
4
4
  "sourceEntry": "src/index.ts",
5
- "totalExports": 225,
5
+ "totalExports": 230,
6
6
  "exports": [
7
7
  {
8
8
  "name": "*",
@@ -100,6 +100,13 @@
100
100
  "reexport": true,
101
101
  "local": false
102
102
  },
103
+ {
104
+ "name": "BottomSheetProps",
105
+ "kind": "type",
106
+ "source": "./components/Sheet",
107
+ "reexport": true,
108
+ "local": false
109
+ },
103
110
  {
104
111
  "name": "Breadcrumb",
105
112
  "kind": "value",
@@ -536,6 +543,13 @@
536
543
  "reexport": true,
537
544
  "local": false
538
545
  },
546
+ {
547
+ "name": "DrawerProps",
548
+ "kind": "type",
549
+ "source": "./components/Sheet",
550
+ "reexport": true,
551
+ "local": false
552
+ },
539
553
  {
540
554
  "name": "DropdownMenu",
541
555
  "kind": "value",
@@ -1101,6 +1115,13 @@
1101
1115
  "reexport": true,
1102
1116
  "local": false
1103
1117
  },
1118
+ {
1119
+ "name": "SheetProps",
1120
+ "kind": "type",
1121
+ "source": "./components/Sheet",
1122
+ "reexport": true,
1123
+ "local": false
1124
+ },
1104
1125
  {
1105
1126
  "name": "SidebarSheet",
1106
1127
  "kind": "value",
@@ -1108,6 +1129,13 @@
1108
1129
  "reexport": true,
1109
1130
  "local": false
1110
1131
  },
1132
+ {
1133
+ "name": "SidebarSheetProps",
1134
+ "kind": "type",
1135
+ "source": "./components/Sheet",
1136
+ "reexport": true,
1137
+ "local": false
1138
+ },
1111
1139
  {
1112
1140
  "name": "SimplePagination",
1113
1141
  "kind": "value",
@@ -1151,6 +1179,13 @@
1151
1179
  "reexport": true,
1152
1180
  "local": false
1153
1181
  },
1182
+ {
1183
+ "name": "SlideOverProps",
1184
+ "kind": "type",
1185
+ "source": "./components/Sheet",
1186
+ "reexport": true,
1187
+ "local": false
1188
+ },
1154
1189
  {
1155
1190
  "name": "Slider",
1156
1191
  "kind": "value",
package/dist/index.cjs CHANGED
@@ -6267,11 +6267,21 @@ var Sheet = ({
6267
6267
  closeOnEscape = true,
6268
6268
  header,
6269
6269
  footer,
6270
- overlayOpacity
6270
+ overlayOpacity,
6271
+ resizable = false,
6272
+ minSize = 280,
6273
+ maxSize,
6274
+ onResize
6271
6275
  }) => {
6272
6276
  const [mounted, setMounted] = React19.useState(false);
6273
6277
  const [isAnimating, setIsAnimating] = React19.useState(true);
6274
6278
  const [isVisible, setIsVisible] = React19.useState(false);
6279
+ const [isResizing, setIsResizing] = React19.useState(false);
6280
+ const [sheetSize, setSheetSize] = React19.useState(null);
6281
+ const sheetRef = React19.useRef(null);
6282
+ const resizeStateRef = React19.useRef(null);
6283
+ const isHorizontalSheet = side === "left" || side === "right";
6284
+ const canResize = resizable && size !== "full";
6275
6285
  React19.useEffect(() => {
6276
6286
  setMounted(true);
6277
6287
  }, []);
@@ -6318,6 +6328,68 @@ var Sheet = ({
6318
6328
  const handleClose = () => {
6319
6329
  onOpenChange(false);
6320
6330
  };
6331
+ const clampResizeSize = React19.useCallback((nextSize) => {
6332
+ const viewportSize = isHorizontalSheet ? window.innerWidth : window.innerHeight;
6333
+ const resolvedMaxSize = maxSize ?? Math.round(viewportSize * 0.9);
6334
+ return Math.min(Math.max(nextSize, minSize), resolvedMaxSize);
6335
+ }, [isHorizontalSheet, maxSize, minSize]);
6336
+ const endResize = React19.useCallback(() => {
6337
+ if (!resizeStateRef.current) return;
6338
+ resizeStateRef.current = null;
6339
+ setIsResizing(false);
6340
+ document.body.style.cursor = "";
6341
+ document.body.style.userSelect = "";
6342
+ }, []);
6343
+ const handleResizePointerMove = React19.useCallback((event) => {
6344
+ const resizeState = resizeStateRef.current;
6345
+ if (!resizeState || event.pointerId !== resizeState.pointerId) return;
6346
+ const delta = isHorizontalSheet ? side === "right" ? resizeState.startClientX - event.clientX : event.clientX - resizeState.startClientX : side === "bottom" ? resizeState.startClientY - event.clientY : event.clientY - resizeState.startClientY;
6347
+ const nextSize = clampResizeSize(Math.round(resizeState.startSize + delta));
6348
+ setSheetSize(nextSize);
6349
+ onResize?.(nextSize);
6350
+ }, [clampResizeSize, isHorizontalSheet, onResize, side]);
6351
+ const handleResizePointerUp = React19.useCallback((event) => {
6352
+ const resizeState = resizeStateRef.current;
6353
+ if (!resizeState || event.pointerId !== resizeState.pointerId) return;
6354
+ endResize();
6355
+ }, [endResize]);
6356
+ React19.useEffect(() => {
6357
+ if (!isResizing) return void 0;
6358
+ window.addEventListener("pointermove", handleResizePointerMove);
6359
+ window.addEventListener("pointerup", handleResizePointerUp);
6360
+ window.addEventListener("pointercancel", handleResizePointerUp);
6361
+ return () => {
6362
+ window.removeEventListener("pointermove", handleResizePointerMove);
6363
+ window.removeEventListener("pointerup", handleResizePointerUp);
6364
+ window.removeEventListener("pointercancel", handleResizePointerUp);
6365
+ };
6366
+ }, [handleResizePointerMove, handleResizePointerUp, isResizing]);
6367
+ React19.useEffect(() => {
6368
+ if (!open) endResize();
6369
+ }, [endResize, open]);
6370
+ React19.useEffect(() => endResize, [endResize]);
6371
+ const handleResizePointerDown = (event) => {
6372
+ if (!canResize || !sheetRef.current) return;
6373
+ const rect = sheetRef.current.getBoundingClientRect();
6374
+ const startSize = isHorizontalSheet ? rect.width : rect.height;
6375
+ resizeStateRef.current = {
6376
+ pointerId: event.pointerId,
6377
+ startClientX: event.clientX,
6378
+ startClientY: event.clientY,
6379
+ startSize
6380
+ };
6381
+ setIsResizing(true);
6382
+ event.currentTarget.setPointerCapture(event.pointerId);
6383
+ document.body.style.cursor = isHorizontalSheet ? "col-resize" : "row-resize";
6384
+ document.body.style.userSelect = "none";
6385
+ event.preventDefault();
6386
+ event.stopPropagation();
6387
+ };
6388
+ const sheetInlineStyle = {
6389
+ transform: open && !isAnimating ? "translate(0, 0)" : side === "right" ? "translateX(100%)" : side === "left" ? "translateX(-100%)" : side === "top" ? "translateY(-100%)" : "translateY(100%)",
6390
+ transition: "transform 300ms cubic-bezier(0.4, 0, 0.2, 1)",
6391
+ ...sheetSize !== null ? isHorizontalSheet ? { width: `${sheetSize}px` } : { height: `${sheetSize}px` } : {}
6392
+ };
6321
6393
  if (!mounted || !open && !isVisible) return null;
6322
6394
  const sheetContent = /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "fixed inset-0 z-50", children: [
6323
6395
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
@@ -6335,6 +6407,7 @@ var Sheet = ({
6335
6407
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
6336
6408
  "div",
6337
6409
  {
6410
+ ref: sheetRef,
6338
6411
  className: cn(
6339
6412
  "fixed flex flex-col bg-background text-foreground shadow-2xl",
6340
6413
  "border-border/50 transition-all duration-300 ease-out",
@@ -6349,11 +6422,28 @@ var Sheet = ({
6349
6422
  open && !isAnimating ? animationStyles[side].animate : animationStyles[side].initial,
6350
6423
  className
6351
6424
  ),
6352
- style: {
6353
- transform: open && !isAnimating ? "translate(0, 0)" : side === "right" ? "translateX(100%)" : side === "left" ? "translateX(-100%)" : side === "top" ? "translateY(-100%)" : "translateY(100%)",
6354
- transition: "transform 300ms cubic-bezier(0.4, 0, 0.2, 1)"
6355
- },
6425
+ style: sheetInlineStyle,
6356
6426
  children: [
6427
+ canResize && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
6428
+ "button",
6429
+ {
6430
+ type: "button",
6431
+ "aria-label": "Resize sheet",
6432
+ className: cn(
6433
+ "absolute z-10 bg-transparent outline-none transition-colors",
6434
+ "after:absolute after:rounded-full after:bg-border after:opacity-0 after:transition-opacity hover:after:opacity-100 focus-visible:after:opacity-100",
6435
+ isHorizontalSheet ? "top-0 h-full w-3 cursor-col-resize after:top-1/2 after:h-12 after:w-1 after:-translate-y-1/2" : "left-0 h-3 w-full cursor-row-resize after:left-1/2 after:h-1 after:w-12 after:-translate-x-1/2",
6436
+ side === "right" && "-left-1.5 after:left-1/2",
6437
+ side === "left" && "-right-1.5 after:right-1/2",
6438
+ side === "bottom" && "-top-1.5 after:top-1/2",
6439
+ side === "top" && "-bottom-1.5 after:bottom-1/2"
6440
+ ),
6441
+ onPointerDown: handleResizePointerDown,
6442
+ onPointerMove: (event) => handleResizePointerMove(event.nativeEvent),
6443
+ onPointerUp: (event) => handleResizePointerUp(event.nativeEvent),
6444
+ onPointerCancel: (event) => handleResizePointerUp(event.nativeEvent)
6445
+ }
6446
+ ),
6357
6447
  (title || description || header || showClose) && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "shrink-0 border-b border-border/50", children: header || /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between p-4", children: [
6358
6448
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex-1", children: [
6359
6449
  title && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "text-lg font-semibold text-foreground", children: title }),
@@ -21540,6 +21630,7 @@ function DataTableHeader({
21540
21630
  enableHeaderAutoFit,
21541
21631
  getStickyHeaderClass,
21542
21632
  getStickyHeaderCellStyle,
21633
+ sortByLabel,
21543
21634
  t
21544
21635
  }) {
21545
21636
  const renderFilterControl = import_react30.default.useCallback(
@@ -21616,18 +21707,20 @@ function DataTableHeader({
21616
21707
  const isRightAlign = col.align === "right" || !col.align && headerAlign === "right";
21617
21708
  const isCenterAlign = col.align === "center" || !col.align && headerAlign === "center";
21618
21709
  const columnLabel = getColumnLabel(col.title) || col.key;
21710
+ const sortByText = sortByLabel ?? "Sort by";
21711
+ const sortLabel = `${sortByText} ${columnLabel}`;
21619
21712
  const titleContent = /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { className: "flex items-center gap-1", children: [
21620
21713
  /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: cn("font-medium whitespace-nowrap select-text", headerTitleClass), children: col.title }),
21621
21714
  col.sortable && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
21622
21715
  Tooltip,
21623
21716
  {
21624
21717
  placement: "top",
21625
- content: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: "text-xs font-medium", children: `Sort by ${columnLabel}` }),
21718
+ content: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: "text-xs font-medium", children: sortLabel }),
21626
21719
  children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
21627
21720
  "button",
21628
21721
  {
21629
21722
  type: "button",
21630
- title: `Sort by ${columnLabel}`,
21723
+ title: sortLabel,
21631
21724
  className: cn(
21632
21725
  "p-1 rounded-lg transition-all duration-200 hover:bg-accent",
21633
21726
  sort?.key === col.key ? "opacity-100 bg-accent" : "opacity-60 hover:opacity-100"
@@ -21640,7 +21733,7 @@ function DataTableHeader({
21640
21733
  return null;
21641
21734
  });
21642
21735
  },
21643
- "aria-label": `Sort by ${columnLabel}`,
21736
+ "aria-label": sortLabel,
21644
21737
  children: /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("svg", { viewBox: "0 0 20 20", fill: "none", className: cn("inline-block", sortIconClass), children: [
21645
21738
  /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
21646
21739
  "path",
@@ -22747,6 +22840,7 @@ function DataTable({
22747
22840
  enableHeaderAutoFit,
22748
22841
  getStickyHeaderClass,
22749
22842
  getStickyHeaderCellStyle,
22843
+ sortByLabel: labels?.sortBy,
22750
22844
  t
22751
22845
  }
22752
22846
  ) }),