@underverse-ui/underverse 1.0.90 → 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
  }
@@ -16236,6 +16252,25 @@ Slider.displayName = "Slider";
16236
16252
  import { Dot as Dot2, Maximize2, Pause, Play, RotateCcw, RotateCw, Volume2, VolumeX } from "lucide-react";
16237
16253
  import React42 from "react";
16238
16254
  import { Fragment as Fragment15, jsx as jsx48, jsxs as jsxs38 } from "react/jsx-runtime";
16255
+ function resolveKeyboardEventElement(target) {
16256
+ if (target instanceof Element) return target;
16257
+ if (target instanceof Node) return target.parentElement;
16258
+ return null;
16259
+ }
16260
+ function isEditableKeyboardTarget(target) {
16261
+ const element = resolveKeyboardEventElement(target);
16262
+ if (!element) return false;
16263
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
16264
+ return true;
16265
+ }
16266
+ if (element instanceof HTMLElement && element.isContentEditable) {
16267
+ return true;
16268
+ }
16269
+ if (element.closest?.('[contenteditable=""],[contenteditable="true"],[contenteditable="plaintext-only"]') || element.closest?.('[role="textbox"]')) {
16270
+ return true;
16271
+ }
16272
+ return false;
16273
+ }
16239
16274
  function OverlayControls({
16240
16275
  mode,
16241
16276
  value,
@@ -16334,7 +16369,7 @@ function OverlayControls({
16334
16369
  React42.useEffect(() => {
16335
16370
  if (!enableKeyboardShortcuts) return;
16336
16371
  const handleKeyDown2 = (e) => {
16337
- if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
16372
+ if (isEditableKeyboardTarget(e.target)) return;
16338
16373
  switch (e.key) {
16339
16374
  case " ":
16340
16375
  case "k":
@@ -20774,7 +20809,7 @@ var LoadingBar = ({
20774
20809
  // src/components/Table.tsx
20775
20810
  import React52 from "react";
20776
20811
  import { jsx as jsx62, jsxs as jsxs51 } from "react/jsx-runtime";
20777
- var TABLE_BASE_CLASS = "w-full caption-bottom text-sm";
20812
+ var TABLE_BASE_CLASS = "w-full border-collapse caption-bottom text-sm";
20778
20813
  var TABLE_CONTAINER_BASE_CLASS = [
20779
20814
  "relative w-full overflow-auto",
20780
20815
  "rounded-2xl md:rounded-3xl border border-border/50",
@@ -21209,6 +21244,7 @@ function DataTableHeader({
21209
21244
  const prevCol = prevCell?.column;
21210
21245
  const isAfterFixedLeft = prevCol?.fixed === "left";
21211
21246
  const showBorderLeft = columnDividers && cellIndex > 0 && !isAfterFixedLeft && !col.fixed;
21247
+ const isLastCell = cellIndex === row.length - 1;
21212
21248
  return /* @__PURE__ */ jsxs53(
21213
21249
  TableHead,
21214
21250
  {
@@ -21248,7 +21284,8 @@ function DataTableHeader({
21248
21284
  onAutoFitColumn?.(col.key);
21249
21285
  },
21250
21286
  className: cn(
21251
- "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",
21252
21289
  "cursor-col-resize select-none bg-transparent",
21253
21290
  "after:absolute after:inset-y-2 after:right-0.8 after:w-px after:bg-border/0 after:transition-colors",
21254
21291
  "hover:after:bg-primary/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary"
@@ -22019,6 +22056,7 @@ function DataTable({
22019
22056
  storageKey,
22020
22057
  stickyHeader = true,
22021
22058
  maxHeight = 500,
22059
+ horizontalMode = "auto",
22022
22060
  overflowHidden = true,
22023
22061
  useOverlayScrollbar = false,
22024
22062
  enableHeaderAutoFit = true,
@@ -22092,6 +22130,10 @@ function DataTable({
22092
22130
  total
22093
22131
  });
22094
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";
22095
22137
  const getRowKey = (row, idx) => {
22096
22138
  if (!rowKey) return String(idx);
22097
22139
  if (typeof rowKey === "function") return String(rowKey(row));
@@ -22099,7 +22141,10 @@ function DataTable({
22099
22141
  };
22100
22142
  const viewportRef = React62.useRef(null);
22101
22143
  const tableRef = React62.useRef(null);
22102
- useOverlayScrollbarTarget(viewportRef, { enabled: useOverlayScrollbar });
22144
+ useOverlayScrollbarTarget(viewportRef, {
22145
+ enabled: useOverlayScrollbar,
22146
+ overflowX: overlayOverflowX
22147
+ });
22103
22148
  const autoFitColumn = React62.useCallback((columnKey) => {
22104
22149
  const tableElement = tableRef.current;
22105
22150
  if (!tableElement) return;
@@ -22161,7 +22206,7 @@ function DataTable({
22161
22206
  "div",
22162
22207
  {
22163
22208
  ref: viewportRef,
22164
- className: cn("w-full overflow-x-auto", stickyHeader && "overflow-y-auto"),
22209
+ className: cn("w-full", viewportOverflowXClass, stickyHeader && "overflow-y-auto"),
22165
22210
  style: stickyHeader ? { maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight } : void 0,
22166
22211
  children: /* @__PURE__ */ jsxs56(
22167
22212
  Table,
@@ -22169,10 +22214,10 @@ function DataTable({
22169
22214
  ref: tableRef,
22170
22215
  disableContainer: true,
22171
22216
  className: cn(
22172
- "table-fixed",
22217
+ shouldUseFixedLayout ? "table-fixed" : "table-auto",
22173
22218
  stickyHeader && ["[&_thead]:sticky", "[&_thead]:top-0", "[&_thead]:z-20", "[&_thead]:shadow-[0_1px_3px_rgba(0,0,0,0.1)]"]
22174
22219
  ),
22175
- style: { minWidth: totalColumnsWidth > 0 ? `${totalColumnsWidth}px` : void 0 },
22220
+ style: { minWidth: shouldForceHorizontalScroll && totalColumnsWidth > 0 ? `${totalColumnsWidth}px` : void 0 },
22176
22221
  children: [
22177
22222
  /* @__PURE__ */ jsx67(TableHeader, { children: /* @__PURE__ */ jsx67(
22178
22223
  DataTableHeader,