@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/api-reference.json +1 -1
- package/dist/index.cjs +54 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +54 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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, {
|
|
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
|
|
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,
|