@underverse-ui/underverse 1.0.91 → 1.0.92

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
@@ -780,6 +780,8 @@ interface OverlayScrollbarBehavior {
780
780
  autoHideDelay: number;
781
781
  dragScroll: boolean;
782
782
  clickScroll: boolean;
783
+ overflowX: "hidden" | "visible" | "scroll" | "visible-hidden" | "visible-scroll";
784
+ overflowY: "hidden" | "visible" | "scroll" | "visible-hidden" | "visible-scroll";
783
785
  exclude: string;
784
786
  }
785
787
 
@@ -790,7 +792,7 @@ interface OverlayScrollbarProviderProps extends Partial<OverlayScrollbarBehavior
790
792
  }
791
793
  interface UseOverlayScrollbarTargetOptions extends Partial<OverlayScrollbarBehavior> {
792
794
  }
793
- declare function OverlayScrollbarProvider({ enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, exclude, selector, children, }?: OverlayScrollbarProviderProps): react_jsx_runtime.JSX.Element;
795
+ declare function OverlayScrollbarProvider({ enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, overflowX, overflowY, exclude, selector, children, }?: OverlayScrollbarProviderProps): react_jsx_runtime.JSX.Element;
794
796
  declare function useOverlayScrollbarTarget<T extends HTMLElement>(targetRef: React__default.RefObject<T | null>, options?: UseOverlayScrollbarTargetOptions): void;
795
797
 
796
798
  interface OverlayScrollAreaProps extends React__default.HTMLAttributes<HTMLDivElement> {
@@ -2249,6 +2251,7 @@ declare const loading: LoadingManager;
2249
2251
  type FilterType = "text" | "select" | "date";
2250
2252
  type DataTableSize = "sm" | "md" | "lg";
2251
2253
  type DataTableDensity = "compact" | "normal" | "comfortable";
2254
+ type DataTableHorizontalMode = "auto" | "scroll" | "fit";
2252
2255
  type DataTableColumn<T> = {
2253
2256
  key: string;
2254
2257
  title: React__default.ReactNode;
@@ -2324,6 +2327,13 @@ interface DataTableProps<T> {
2324
2327
  stickyHeader?: boolean;
2325
2328
  /** Chiều cao tối đa của bảng khi bật stickyHeader (mặc định: 500px) */
2326
2329
  maxHeight?: number | string;
2330
+ /**
2331
+ * Horizontal sizing strategy for the table viewport.
2332
+ * - "auto": default, prefer fitting the container and only scroll when content truly overflows
2333
+ * - "scroll": preserve explicit column widths and force horizontal scrolling via min-width aggregation
2334
+ * - "fit": use fixed table layout and suppress horizontal scrolling
2335
+ */
2336
+ horizontalMode?: DataTableHorizontalMode;
2327
2337
  /** Clip overflow của outer wrapper. Tắt khi cần cho phép shadow/focus ring tràn ra ngoài. */
2328
2338
  overflowHidden?: boolean;
2329
2339
  /** Enable OverlayScrollbars on table viewport. Default: false */
@@ -2333,7 +2343,7 @@ interface DataTableProps<T> {
2333
2343
  labels?: DataTableLabels;
2334
2344
  }
2335
2345
 
2336
- declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, size, enableColumnVisibilityToggle, enableDensityToggle, enableHeaderAlignToggle, striped, columnDividers, className, storageKey, stickyHeader, maxHeight, overflowHidden, useOverlayScrollbar, enableHeaderAutoFit, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
2346
+ declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, size, enableColumnVisibilityToggle, enableDensityToggle, enableHeaderAlignToggle, striped, columnDividers, className, storageKey, stickyHeader, maxHeight, horizontalMode, overflowHidden, useOverlayScrollbar, enableHeaderAutoFit, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
2337
2347
 
2338
2348
  interface TableProps extends React__default.HTMLAttributes<HTMLTableElement> {
2339
2349
  containerClassName?: string;
package/dist/index.d.ts CHANGED
@@ -780,6 +780,8 @@ interface OverlayScrollbarBehavior {
780
780
  autoHideDelay: number;
781
781
  dragScroll: boolean;
782
782
  clickScroll: boolean;
783
+ overflowX: "hidden" | "visible" | "scroll" | "visible-hidden" | "visible-scroll";
784
+ overflowY: "hidden" | "visible" | "scroll" | "visible-hidden" | "visible-scroll";
783
785
  exclude: string;
784
786
  }
785
787
 
@@ -790,7 +792,7 @@ interface OverlayScrollbarProviderProps extends Partial<OverlayScrollbarBehavior
790
792
  }
791
793
  interface UseOverlayScrollbarTargetOptions extends Partial<OverlayScrollbarBehavior> {
792
794
  }
793
- declare function OverlayScrollbarProvider({ enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, exclude, selector, children, }?: OverlayScrollbarProviderProps): react_jsx_runtime.JSX.Element;
795
+ declare function OverlayScrollbarProvider({ enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, overflowX, overflowY, exclude, selector, children, }?: OverlayScrollbarProviderProps): react_jsx_runtime.JSX.Element;
794
796
  declare function useOverlayScrollbarTarget<T extends HTMLElement>(targetRef: React__default.RefObject<T | null>, options?: UseOverlayScrollbarTargetOptions): void;
795
797
 
796
798
  interface OverlayScrollAreaProps extends React__default.HTMLAttributes<HTMLDivElement> {
@@ -2249,6 +2251,7 @@ declare const loading: LoadingManager;
2249
2251
  type FilterType = "text" | "select" | "date";
2250
2252
  type DataTableSize = "sm" | "md" | "lg";
2251
2253
  type DataTableDensity = "compact" | "normal" | "comfortable";
2254
+ type DataTableHorizontalMode = "auto" | "scroll" | "fit";
2252
2255
  type DataTableColumn<T> = {
2253
2256
  key: string;
2254
2257
  title: React__default.ReactNode;
@@ -2324,6 +2327,13 @@ interface DataTableProps<T> {
2324
2327
  stickyHeader?: boolean;
2325
2328
  /** Chiều cao tối đa của bảng khi bật stickyHeader (mặc định: 500px) */
2326
2329
  maxHeight?: number | string;
2330
+ /**
2331
+ * Horizontal sizing strategy for the table viewport.
2332
+ * - "auto": default, prefer fitting the container and only scroll when content truly overflows
2333
+ * - "scroll": preserve explicit column widths and force horizontal scrolling via min-width aggregation
2334
+ * - "fit": use fixed table layout and suppress horizontal scrolling
2335
+ */
2336
+ horizontalMode?: DataTableHorizontalMode;
2327
2337
  /** Clip overflow của outer wrapper. Tắt khi cần cho phép shadow/focus ring tràn ra ngoài. */
2328
2338
  overflowHidden?: boolean;
2329
2339
  /** Enable OverlayScrollbars on table viewport. Default: false */
@@ -2333,7 +2343,7 @@ interface DataTableProps<T> {
2333
2343
  labels?: DataTableLabels;
2334
2344
  }
2335
2345
 
2336
- declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, size, enableColumnVisibilityToggle, enableDensityToggle, enableHeaderAlignToggle, striped, columnDividers, className, storageKey, stickyHeader, maxHeight, overflowHidden, useOverlayScrollbar, enableHeaderAutoFit, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
2346
+ declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, size, enableColumnVisibilityToggle, enableDensityToggle, enableHeaderAlignToggle, striped, columnDividers, className, storageKey, stickyHeader, maxHeight, horizontalMode, overflowHidden, useOverlayScrollbar, enableHeaderAutoFit, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
2337
2347
 
2338
2348
  interface TableProps extends React__default.HTMLAttributes<HTMLTableElement> {
2339
2349
  containerClassName?: string;
package/dist/index.js CHANGED
@@ -1879,6 +1879,8 @@ var DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR = {
1879
1879
  autoHideDelay: 600,
1880
1880
  dragScroll: true,
1881
1881
  clickScroll: false,
1882
+ overflowX: "scroll",
1883
+ overflowY: "scroll",
1882
1884
  exclude: DEFAULT_OVERLAY_SCROLLBAR_EXCLUDE
1883
1885
  };
1884
1886
  function resolveOverlayScrollbarBehavior(overrides = {}) {
@@ -1889,6 +1891,10 @@ function resolveOverlayScrollbarBehavior(overrides = {}) {
1889
1891
  }
1890
1892
  function buildOverlayScrollbarOptions(config) {
1891
1893
  return {
1894
+ overflow: {
1895
+ x: config.overflowX,
1896
+ y: config.overflowY
1897
+ },
1892
1898
  scrollbars: {
1893
1899
  theme: config.theme,
1894
1900
  visibility: config.visibility,
@@ -2033,6 +2039,8 @@ function OverlayScrollbarProvider({
2033
2039
  autoHideDelay = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.autoHideDelay,
2034
2040
  dragScroll = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.dragScroll,
2035
2041
  clickScroll = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.clickScroll,
2042
+ overflowX = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.overflowX,
2043
+ overflowY = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.overflowY,
2036
2044
  exclude = DEFAULT_OVERLAY_SCROLLBAR_BEHAVIOR.exclude,
2037
2045
  selector,
2038
2046
  children
@@ -2046,9 +2054,11 @@ function OverlayScrollbarProvider({
2046
2054
  autoHideDelay,
2047
2055
  dragScroll,
2048
2056
  clickScroll,
2057
+ overflowX,
2058
+ overflowY,
2049
2059
  exclude
2050
2060
  }),
2051
- [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, exclude]
2061
+ [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, overflowX, overflowY, exclude]
2052
2062
  );
2053
2063
  void selector;
2054
2064
  return /* @__PURE__ */ jsx8(OverlayScrollbarConfigContext.Provider, { value, children: children ?? null });
@@ -2062,6 +2072,8 @@ function useOverlayScrollbarTarget(targetRef, options = {}) {
2062
2072
  const autoHideDelay = options.autoHideDelay ?? inherited.autoHideDelay;
2063
2073
  const dragScroll = options.dragScroll ?? inherited.dragScroll;
2064
2074
  const clickScroll = options.clickScroll ?? inherited.clickScroll;
2075
+ const overflowX = options.overflowX ?? inherited.overflowX;
2076
+ const overflowY = options.overflowY ?? inherited.overflowY;
2065
2077
  const exclude = options.exclude ?? inherited.exclude;
2066
2078
  const resolved = useMemo2(
2067
2079
  () => resolveOverlayScrollbarBehavior({
@@ -2072,9 +2084,11 @@ function useOverlayScrollbarTarget(targetRef, options = {}) {
2072
2084
  autoHideDelay,
2073
2085
  dragScroll,
2074
2086
  clickScroll,
2087
+ overflowX,
2088
+ overflowY,
2075
2089
  exclude
2076
2090
  }),
2077
- [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, exclude]
2091
+ [enabled, theme, visibility, autoHide, autoHideDelay, dragScroll, clickScroll, overflowX, overflowY, exclude]
2078
2092
  );
2079
2093
  useEffect2(() => {
2080
2094
  if (typeof window === "undefined") return;
@@ -2099,6 +2113,8 @@ function useOverlayScrollbarTarget(targetRef, options = {}) {
2099
2113
  resolved.autoHideDelay,
2100
2114
  resolved.dragScroll,
2101
2115
  resolved.clickScroll,
2116
+ resolved.overflowX,
2117
+ resolved.overflowY,
2102
2118
  resolved.exclude
2103
2119
  ]);
2104
2120
  }
@@ -20793,7 +20809,7 @@ var LoadingBar = ({
20793
20809
  // src/components/Table.tsx
20794
20810
  import React52 from "react";
20795
20811
  import { jsx as jsx62, jsxs as jsxs51 } from "react/jsx-runtime";
20796
- var TABLE_BASE_CLASS = "w-full caption-bottom text-sm";
20812
+ var TABLE_BASE_CLASS = "w-full border-collapse caption-bottom text-sm";
20797
20813
  var TABLE_CONTAINER_BASE_CLASS = [
20798
20814
  "relative w-full overflow-auto",
20799
20815
  "rounded-2xl md:rounded-3xl border border-border/50",
@@ -21228,6 +21244,7 @@ function DataTableHeader({
21228
21244
  const prevCol = prevCell?.column;
21229
21245
  const isAfterFixedLeft = prevCol?.fixed === "left";
21230
21246
  const showBorderLeft = columnDividers && cellIndex > 0 && !isAfterFixedLeft && !col.fixed;
21247
+ const isLastCell = cellIndex === row.length - 1;
21231
21248
  return /* @__PURE__ */ jsxs53(
21232
21249
  TableHead,
21233
21250
  {
@@ -21267,7 +21284,8 @@ function DataTableHeader({
21267
21284
  onAutoFitColumn?.(col.key);
21268
21285
  },
21269
21286
  className: cn(
21270
- "absolute inset-y-0 right-0 z-10 w-3 -mr-1",
21287
+ "absolute inset-y-0 right-0 z-10 w-3",
21288
+ !isLastCell && "-mr-1",
21271
21289
  "cursor-col-resize select-none bg-transparent",
21272
21290
  "after:absolute after:inset-y-2 after:right-0.8 after:w-px after:bg-border/0 after:transition-colors",
21273
21291
  "hover:after:bg-primary/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary"
@@ -22038,6 +22056,7 @@ function DataTable({
22038
22056
  storageKey,
22039
22057
  stickyHeader = true,
22040
22058
  maxHeight = 500,
22059
+ horizontalMode = "auto",
22041
22060
  overflowHidden = true,
22042
22061
  useOverlayScrollbar = false,
22043
22062
  enableHeaderAutoFit = true,
@@ -22111,6 +22130,10 @@ function DataTable({
22111
22130
  total
22112
22131
  });
22113
22132
  const { getStickyCellClass, getStickyColumnStyle, getStickyHeaderClass, getStickyHeaderCellStyle } = useStickyColumns(visibleColumns);
22133
+ const shouldForceHorizontalScroll = horizontalMode === "scroll";
22134
+ const shouldUseFixedLayout = horizontalMode !== "auto";
22135
+ const viewportOverflowXClass = horizontalMode === "fit" ? "overflow-x-hidden" : "overflow-x-auto";
22136
+ const overlayOverflowX = horizontalMode === "fit" ? "hidden" : "scroll";
22114
22137
  const getRowKey = (row, idx) => {
22115
22138
  if (!rowKey) return String(idx);
22116
22139
  if (typeof rowKey === "function") return String(rowKey(row));
@@ -22118,7 +22141,10 @@ function DataTable({
22118
22141
  };
22119
22142
  const viewportRef = React62.useRef(null);
22120
22143
  const tableRef = React62.useRef(null);
22121
- useOverlayScrollbarTarget(viewportRef, { enabled: useOverlayScrollbar });
22144
+ useOverlayScrollbarTarget(viewportRef, {
22145
+ enabled: useOverlayScrollbar,
22146
+ overflowX: overlayOverflowX
22147
+ });
22122
22148
  const autoFitColumn = React62.useCallback((columnKey) => {
22123
22149
  const tableElement = tableRef.current;
22124
22150
  if (!tableElement) return;
@@ -22180,7 +22206,7 @@ function DataTable({
22180
22206
  "div",
22181
22207
  {
22182
22208
  ref: viewportRef,
22183
- className: cn("w-full overflow-x-auto", stickyHeader && "overflow-y-auto"),
22209
+ className: cn("w-full", viewportOverflowXClass, stickyHeader && "overflow-y-auto"),
22184
22210
  style: stickyHeader ? { maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight } : void 0,
22185
22211
  children: /* @__PURE__ */ jsxs56(
22186
22212
  Table,
@@ -22188,10 +22214,10 @@ function DataTable({
22188
22214
  ref: tableRef,
22189
22215
  disableContainer: true,
22190
22216
  className: cn(
22191
- "table-fixed",
22217
+ shouldUseFixedLayout ? "table-fixed" : "table-auto",
22192
22218
  stickyHeader && ["[&_thead]:sticky", "[&_thead]:top-0", "[&_thead]:z-20", "[&_thead]:shadow-[0_1px_3px_rgba(0,0,0,0.1)]"]
22193
22219
  ),
22194
- style: { minWidth: totalColumnsWidth > 0 ? `${totalColumnsWidth}px` : void 0 },
22220
+ style: { minWidth: shouldForceHorizontalScroll && totalColumnsWidth > 0 ? `${totalColumnsWidth}px` : void 0 },
22195
22221
  children: [
22196
22222
  /* @__PURE__ */ jsx67(TableHeader, { children: /* @__PURE__ */ jsx67(
22197
22223
  DataTableHeader,