infinity-ui-elements 1.5.1-beta.1 → 1.5.1-beta.3
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/README.md +826 -223
- package/dist/components/Table/DetailPanel.d.ts +10 -0
- package/dist/components/Table/DetailPanel.d.ts.map +1 -0
- package/dist/components/Table/Table.d.ts +9 -65
- package/dist/components/Table/Table.d.ts.map +1 -1
- package/dist/components/Table/Table.refactored.d.ts +39 -0
- package/dist/components/Table/Table.refactored.d.ts.map +1 -0
- package/dist/components/Table/Table.stories.d.ts +2 -0
- package/dist/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/components/Table/TableBody.d.ts +18 -0
- package/dist/components/Table/TableBody.d.ts.map +1 -0
- package/dist/components/Table/TableCellTypes.d.ts +32 -0
- package/dist/components/Table/TableCellTypes.d.ts.map +1 -0
- package/dist/components/Table/TableDetailPanel.d.ts +25 -0
- package/dist/components/Table/TableDetailPanel.d.ts.map +1 -0
- package/dist/components/Table/TableHeader.d.ts +18 -0
- package/dist/components/Table/TableHeader.d.ts.map +1 -0
- package/dist/components/Table/index.d.ts +3 -0
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/Table/tableHelpers.d.ts +7 -0
- package/dist/components/Table/tableHelpers.d.ts.map +1 -0
- package/dist/components/Table/tableVariants.d.ts +12 -0
- package/dist/components/Table/tableVariants.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.esm.js +191 -38
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +196 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/icons.d.ts +1 -0
- package/dist/lib/icons.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -798,6 +798,9 @@ const iconRegistry = {
|
|
|
798
798
|
// Alias: check points to the same icon as tick
|
|
799
799
|
check: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
800
800
|
<path d="M10.364 15.1924L19.5564 6L20.9706 7.41421L10.364 18.0208L4 11.6569L5.41422 10.2427L10.364 15.1924Z" fill="#081416"/>
|
|
801
|
+
</svg>`,
|
|
802
|
+
add: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
|
|
803
|
+
<path d="M12.9 11.0999L21 11.0997V12.8997L12.9 12.8999V21H11.1V12.8999L3.00004 12.9001L3 11.1001L11.1 11.0999L11.0999 3.00001L12.8999 3L12.9 11.0999Z" fill="#081416"/>
|
|
801
804
|
</svg>`,
|
|
802
805
|
};
|
|
803
806
|
const Icon = ({ name, size = 24, className = "", style = {}, ...props }) => {
|
|
@@ -2710,69 +2713,219 @@ const tableHeaderVariants = classVarianceAuthority.cva("text-body-medium-regular
|
|
|
2710
2713
|
size: "medium",
|
|
2711
2714
|
},
|
|
2712
2715
|
});
|
|
2713
|
-
const tableCellVariants = classVarianceAuthority.cva("text-body-medium-regular border-b border-surface-outline-neutral-muted text-surface-ink-neutral-normal", {
|
|
2716
|
+
const tableCellVariants = classVarianceAuthority.cva("text-body-medium-regular border-b border-surface-outline-neutral-muted text-surface-ink-neutral-normal transition-colors duration-150", {
|
|
2714
2717
|
variants: {
|
|
2715
2718
|
size: {
|
|
2716
2719
|
small: "px-3 py-2 h-[40px]",
|
|
2717
|
-
medium: "px-4 py-3 h-[
|
|
2720
|
+
medium: "px-4 py-3 h-[72px]",
|
|
2718
2721
|
large: "px-6 py-4 h-[56px]",
|
|
2719
2722
|
},
|
|
2723
|
+
state: {
|
|
2724
|
+
default: "",
|
|
2725
|
+
focus: "",
|
|
2726
|
+
// focus:
|
|
2727
|
+
// "outline outline-2 outline-action-outline-primary-default outline-offset-[-2px]",
|
|
2728
|
+
},
|
|
2720
2729
|
},
|
|
2721
2730
|
defaultVariants: {
|
|
2722
2731
|
size: "medium",
|
|
2732
|
+
state: "default",
|
|
2723
2733
|
},
|
|
2724
2734
|
});
|
|
2725
|
-
|
|
2735
|
+
|
|
2736
|
+
function TableHeader({ headerGroups, enableRowSelection, enableSelectAll, showHeaderBackground, stickyHeader, size, headerClassName, isDetailPanelOpen, visibleHeadersCount, onToggleAllRows, isAllRowsSelected, isSomeRowsSelected, }) {
|
|
2737
|
+
return (jsxRuntime.jsx("thead", { className: cn(showHeaderBackground && "bg-surface-fill-neutral-moderate", stickyHeader && "sticky top-0 z-10"), children: headerGroups.map((headerGroup) => (jsxRuntime.jsxs("tr", { children: [enableRowSelection && enableSelectAll && (jsxRuntime.jsx("th", { className: cn(tableHeaderVariants({ size }), showHeaderBackground && "bg-surface-fill-neutral-moderate", "w-10 rounded-tl-xlarge rounded-bl-xlarge", headerClassName), children: jsxRuntime.jsx(Checkbox, { checked: isAllRowsSelected, isIndeterminate: isSomeRowsSelected, onChange: onToggleAllRows, "aria-label": "Select all rows" }) })), headerGroup.headers.map((header, index) => {
|
|
2738
|
+
const shouldHideColumn = isDetailPanelOpen && index >= visibleHeadersCount;
|
|
2739
|
+
const isLastVisibleColumn = isDetailPanelOpen
|
|
2740
|
+
? index === visibleHeadersCount - 1
|
|
2741
|
+
: index === headerGroup.headers.length - 1;
|
|
2742
|
+
return (jsxRuntime.jsx("th", { className: cn(tableHeaderVariants({ size }), showHeaderBackground &&
|
|
2743
|
+
"bg-surface-fill-neutral-moderate border-none", !enableRowSelection &&
|
|
2744
|
+
index === 0 &&
|
|
2745
|
+
"rounded-tl-xlarge rounded-bl-xlarge", isLastVisibleColumn && "rounded-tr-xlarge rounded-br-xlarge", header.column.columnDef.meta?.headerClassName, headerClassName, "transition-all duration-300 ease-in-out", shouldHideColumn
|
|
2746
|
+
? "opacity-0 translate-x-8 pointer-events-none"
|
|
2747
|
+
: "opacity-100 translate-x-0"), style: {
|
|
2748
|
+
width: header.getSize(),
|
|
2749
|
+
minWidth: header.column.columnDef.minSize,
|
|
2750
|
+
maxWidth: header.column.columnDef.maxSize,
|
|
2751
|
+
}, children: header.isPlaceholder ? null : (jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2", header.column.getCanSort() && "cursor-pointer select-none"), onClick: header.column.getToggleSortingHandler(), children: [reactTable.flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanSort() && (jsxRuntime.jsx("span", { className: "text-surface-ink-neutral-muted", children: {
|
|
2752
|
+
asc: "↑",
|
|
2753
|
+
desc: "↓",
|
|
2754
|
+
}[header.column.getIsSorted()] ?? "↕" }))] })) }, header.id));
|
|
2755
|
+
})] }, headerGroup.id))) }));
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
function TableBody({ rows, enableRowSelection, size, variant, showRowHover, cellClassName, isDetailPanelOpen, visibleHeadersCount, effectiveSelectedRowId, onRowClick, getRowClassName, handleRowClick, }) {
|
|
2759
|
+
const [focusedCell, setFocusedCell] = React__namespace.useState(null);
|
|
2760
|
+
const [hoveredRow, setHoveredRow] = React__namespace.useState(null);
|
|
2761
|
+
return (jsxRuntime.jsx("tbody", { className: "bg-surface-fill-neutral-intense", children: rows.map((row) => {
|
|
2762
|
+
const isRowSelected = row.id === effectiveSelectedRowId;
|
|
2763
|
+
const isRowHovered = hoveredRow === row.id;
|
|
2764
|
+
const handleClick = () => handleRowClick(row.original, row.id);
|
|
2765
|
+
return (jsxRuntime.jsxs("tr", { className: cn(variant === "striped" &&
|
|
2766
|
+
row.index % 2 === 1 &&
|
|
2767
|
+
"bg-surface-fill-neutral-moderate", onRowClick && "cursor-pointer", isRowSelected && "bg-action-fill-primary-faded", isRowHovered &&
|
|
2768
|
+
showRowHover &&
|
|
2769
|
+
"bg-surface-fill-neutral-moderate", getRowClassName(row.original)), onClick: handleClick, onMouseEnter: () => setHoveredRow(row.id), onMouseLeave: () => setHoveredRow(null), children: [enableRowSelection && (jsxRuntime.jsx("td", { className: cn(tableCellVariants({ size }), "w-10", cellClassName), children: jsxRuntime.jsx(Checkbox, { checked: row.getIsSelected(), isIndeterminate: row.getIsSomeSelected(), onChange: row.getToggleSelectedHandler(), onClick: (e) => e.stopPropagation(), "aria-label": `Select row ${row.id}` }) })), row.getVisibleCells().map((cell, cellIndex) => {
|
|
2770
|
+
const shouldHideColumn = isDetailPanelOpen && cellIndex >= visibleHeadersCount;
|
|
2771
|
+
const isCellFocused = focusedCell?.rowId === row.id &&
|
|
2772
|
+
focusedCell?.cellId === cell.id;
|
|
2773
|
+
const cellState = isCellFocused ? "focus" : "default";
|
|
2774
|
+
return (jsxRuntime.jsx("td", { className: cn(tableCellVariants({ size, state: cellState }), cell.column.columnDef.meta?.cellClassName, cellClassName, "transition-all duration-300 ease-in-out", shouldHideColumn
|
|
2775
|
+
? "opacity-0 translate-x-8 pointer-events-none"
|
|
2776
|
+
: "opacity-100 translate-x-0"), style: {
|
|
2777
|
+
width: cell.column.getSize(),
|
|
2778
|
+
minWidth: cell.column.columnDef.minSize,
|
|
2779
|
+
maxWidth: cell.column.columnDef.maxSize,
|
|
2780
|
+
}, tabIndex: 0, onFocus: () => setFocusedCell({ rowId: row.id, cellId: cell.id }), onBlur: () => setFocusedCell(null), children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
|
|
2781
|
+
})] }, row.id));
|
|
2782
|
+
}) }));
|
|
2783
|
+
}
|
|
2784
|
+
|
|
2785
|
+
function DetailPanel({ isOpen, content, data, onClose, }) {
|
|
2786
|
+
return (jsxRuntime.jsx("div", { className: cn("absolute top-0 right-0 h-full z-20 transition-all duration-300 ease-in-out", isOpen
|
|
2787
|
+
? "translate-x-0 opacity-100"
|
|
2788
|
+
: "translate-x-full opacity-0 pointer-events-none"), style: { width: "332px", paddingLeft: "12px" }, children: jsxRuntime.jsx("div", { className: "w-full h-full bg-white border border-surface-outline-neutral-muted rounded-tr-xlarge rounded-br-xlarge overflow-hidden", children: jsxRuntime.jsx("div", { className: "w-full h-full overflow-auto", children: data && (jsxRuntime.jsxs("div", { className: "relative h-full", children: [jsxRuntime.jsx("button", { onClick: (e) => {
|
|
2789
|
+
e.stopPropagation();
|
|
2790
|
+
onClose();
|
|
2791
|
+
}, className: "absolute top-4 right-4 z-10 p-2 rounded-medium hover:bg-surface-fill-neutral-faded transition-colors", "aria-label": "Close detail panel", children: jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", className: "text-surface-ink-neutral-muted", children: jsxRuntime.jsx("path", { d: "M12 4L4 12M4 4l8 8", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }), content(data)] })) }) }) }));
|
|
2792
|
+
}
|
|
2793
|
+
|
|
2794
|
+
function renderDefaultLoadingState({ colSpan }) {
|
|
2795
|
+
return (jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: colSpan, className: "text-center py-12 text-surface-ink-neutral-muted", children: jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2", children: [jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-action-fill-primary-default" }), jsxRuntime.jsx("span", { children: "Loading..." })] }) }) }));
|
|
2796
|
+
}
|
|
2797
|
+
function renderDefaultEmptyState({ colSpan }) {
|
|
2798
|
+
return (jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: colSpan, className: "text-center py-12 text-surface-ink-neutral-muted", children: "No data available" }) }));
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
// ==================== Component ====================
|
|
2802
|
+
function TableComponent({ className, wrapperClassName, containerClassName, variant, size = "medium", table, enableRowSelection = false, enableSelectAll = false, isLoading = false, loadingComponent, emptyComponent, enableHorizontalScroll = false, stickyHeader = false, maxHeight, showRowHover = true, onRowClick, rowClassName, headerClassName, cellClassName, showHeaderBackground = true, detailPanel, hideColumnsOnDetailOpen = 3, selectedRowId, onRowSelectionChange, ...props }, ref) {
|
|
2803
|
+
// ==================== State ====================
|
|
2804
|
+
const [internalSelectedRowId, setInternalSelectedRowId] = React__namespace.useState(null);
|
|
2805
|
+
const selectedRowIdRef = React__namespace.useRef(null);
|
|
2806
|
+
const effectiveSelectedRowId = selectedRowId !== undefined ? selectedRowId : internalSelectedRowId;
|
|
2807
|
+
const isDetailPanelOpen = Boolean(effectiveSelectedRowId);
|
|
2808
|
+
// ==================== Effects ====================
|
|
2809
|
+
// Keep ref in sync
|
|
2810
|
+
React__namespace.useEffect(() => {
|
|
2811
|
+
selectedRowIdRef.current = effectiveSelectedRowId;
|
|
2812
|
+
}, [effectiveSelectedRowId]);
|
|
2813
|
+
// Clear selection if selected row is not in current data
|
|
2814
|
+
React__namespace.useEffect(() => {
|
|
2815
|
+
if (effectiveSelectedRowId) {
|
|
2816
|
+
const rowExists = table
|
|
2817
|
+
.getRowModel()
|
|
2818
|
+
.rows.some((r) => r.id === effectiveSelectedRowId);
|
|
2819
|
+
if (!rowExists) {
|
|
2820
|
+
if (selectedRowId === undefined) {
|
|
2821
|
+
setInternalSelectedRowId(null);
|
|
2822
|
+
}
|
|
2823
|
+
if (onRowSelectionChange) {
|
|
2824
|
+
onRowSelectionChange(null);
|
|
2825
|
+
}
|
|
2826
|
+
}
|
|
2827
|
+
}
|
|
2828
|
+
}, [
|
|
2829
|
+
table.getRowModel().rows,
|
|
2830
|
+
effectiveSelectedRowId,
|
|
2831
|
+
selectedRowId,
|
|
2832
|
+
onRowSelectionChange,
|
|
2833
|
+
]);
|
|
2834
|
+
// ==================== Computed Values ====================
|
|
2726
2835
|
const hasData = table.getRowModel().rows?.length > 0;
|
|
2727
|
-
const
|
|
2836
|
+
const headerGroups = table.getHeaderGroups();
|
|
2837
|
+
const headers = headerGroups[0]?.headers || [];
|
|
2838
|
+
const visibleHeadersCount = React__namespace.useMemo(() => {
|
|
2839
|
+
return isDetailPanelOpen
|
|
2840
|
+
? headers.length - hideColumnsOnDetailOpen
|
|
2841
|
+
: headers.length;
|
|
2842
|
+
}, [isDetailPanelOpen, headers.length, hideColumnsOnDetailOpen]);
|
|
2843
|
+
// ==================== Callbacks ====================
|
|
2844
|
+
const getRowClassName = React__namespace.useCallback((row) => {
|
|
2728
2845
|
if (typeof rowClassName === "function") {
|
|
2729
2846
|
return rowClassName(row);
|
|
2730
2847
|
}
|
|
2731
2848
|
return rowClassName || "";
|
|
2849
|
+
}, [rowClassName]);
|
|
2850
|
+
const handleRowClickInternal = React__namespace.useCallback((row, rowId) => {
|
|
2851
|
+
const currentSelectedId = selectedRowIdRef.current;
|
|
2852
|
+
const newSelectedId = currentSelectedId === rowId ? null : rowId;
|
|
2853
|
+
if (selectedRowId === undefined) {
|
|
2854
|
+
setInternalSelectedRowId(newSelectedId);
|
|
2855
|
+
}
|
|
2856
|
+
if (onRowSelectionChange) {
|
|
2857
|
+
onRowSelectionChange(newSelectedId);
|
|
2858
|
+
}
|
|
2859
|
+
if (onRowClick) {
|
|
2860
|
+
onRowClick(row);
|
|
2861
|
+
}
|
|
2862
|
+
}, [selectedRowId, onRowSelectionChange, onRowClick]);
|
|
2863
|
+
const getSelectedRowData = () => {
|
|
2864
|
+
if (!effectiveSelectedRowId)
|
|
2865
|
+
return null;
|
|
2866
|
+
const row = table
|
|
2867
|
+
.getRowModel()
|
|
2868
|
+
.rows.find((r) => r.id === effectiveSelectedRowId);
|
|
2869
|
+
return row ? row.original : null;
|
|
2870
|
+
};
|
|
2871
|
+
const handleDetailPanelClose = () => {
|
|
2872
|
+
if (selectedRowId === undefined) {
|
|
2873
|
+
setInternalSelectedRowId(null);
|
|
2874
|
+
}
|
|
2875
|
+
if (onRowSelectionChange) {
|
|
2876
|
+
onRowSelectionChange(null);
|
|
2877
|
+
}
|
|
2732
2878
|
};
|
|
2879
|
+
// ==================== Render Helpers ====================
|
|
2733
2880
|
const renderLoadingState = () => {
|
|
2734
|
-
if (loadingComponent)
|
|
2881
|
+
if (loadingComponent)
|
|
2735
2882
|
return loadingComponent;
|
|
2736
|
-
}
|
|
2737
|
-
return (jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: table.getAllColumns().length, className: "text-center py-12 text-surface-ink-neutral-muted", children: jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2", children: [jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-action-fill-primary-default" }), jsxRuntime.jsx("span", { children: "Loading..." })] }) }) }));
|
|
2883
|
+
return renderDefaultLoadingState({ colSpan: table.getAllColumns().length });
|
|
2738
2884
|
};
|
|
2739
2885
|
const renderEmptyState = () => {
|
|
2740
|
-
if (emptyComponent)
|
|
2886
|
+
if (emptyComponent)
|
|
2741
2887
|
return emptyComponent;
|
|
2742
|
-
}
|
|
2743
|
-
return (jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: table.getAllColumns().length, className: "text-center py-12 text-surface-ink-neutral-muted", children: "No data available" }) }));
|
|
2888
|
+
return renderDefaultEmptyState({ colSpan: table.getAllColumns().length });
|
|
2744
2889
|
};
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
"bg-surface-fill-neutral-moderate border-none",
|
|
2748
|
-
// Apply rounded corners to first and last headers
|
|
2749
|
-
!enableRowSelection &&
|
|
2750
|
-
index === 0 &&
|
|
2751
|
-
"rounded-tl-xlarge rounded-bl-xlarge", index === headerGroup.headers.length - 1 &&
|
|
2752
|
-
"rounded-tr-xlarge rounded-br-xlarge", header.column.columnDef.meta?.headerClassName, headerClassName), style: {
|
|
2753
|
-
width: header.getSize(),
|
|
2754
|
-
minWidth: header.column.columnDef.minSize,
|
|
2755
|
-
maxWidth: header.column.columnDef.maxSize,
|
|
2756
|
-
}, children: header.isPlaceholder ? null : (jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2", header.column.getCanSort() &&
|
|
2757
|
-
"cursor-pointer select-none"), onClick: header.column.getToggleSortingHandler(), children: [reactTable.flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanSort() && (jsxRuntime.jsx("span", { className: "text-surface-ink-neutral-muted", children: {
|
|
2758
|
-
asc: "↑",
|
|
2759
|
-
desc: "↓",
|
|
2760
|
-
}[header.column.getIsSorted()] ?? "↕" }))] })) }, header.id)))] }, headerGroup.id))) }), jsxRuntime.jsx("tbody", { className: "bg-surface-fill-neutral-intense", children: isLoading
|
|
2761
|
-
? renderLoadingState()
|
|
2762
|
-
: !hasData
|
|
2763
|
-
? renderEmptyState()
|
|
2764
|
-
: table.getRowModel().rows.map((row) => (jsxRuntime.jsxs("tr", { className: cn(variant === "striped" &&
|
|
2765
|
-
row.index % 2 === 1 &&
|
|
2766
|
-
"bg-surface-fill-neutral-moderate", showRowHover && "hover:bg-surface-fill-neutral-moderate", onRowClick && "cursor-pointer", getRowClassName(row.original)), onClick: () => onRowClick?.(row.original), children: [enableRowSelection && (jsxRuntime.jsx("td", { className: cn(tableCellVariants({ size }), "w-10", cellClassName), children: jsxRuntime.jsx(Checkbox, { checked: row.getIsSelected(), isIndeterminate: row.getIsSomeSelected(), onChange: row.getToggleSelectedHandler(), onClick: (e) => e.stopPropagation(), "aria-label": `Select row ${row.id}` }) })), row.getVisibleCells().map((cell) => (jsxRuntime.jsx("td", { className: cn(tableCellVariants({ size }), cell.column.columnDef.meta?.cellClassName, cellClassName), style: {
|
|
2767
|
-
width: cell.column.getSize(),
|
|
2768
|
-
minWidth: cell.column.columnDef.minSize,
|
|
2769
|
-
maxWidth: cell.column.columnDef.maxSize,
|
|
2770
|
-
}, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id)))] }, row.id))) })] }) }) }));
|
|
2890
|
+
// ==================== Render ====================
|
|
2891
|
+
return (jsxRuntime.jsx("div", { ref: ref, className: cn("w-full", wrapperClassName), ...props, children: jsxRuntime.jsxs("div", { className: cn("relative overflow-x-hidden", maxHeight && "overflow-y-auto", containerClassName), style: maxHeight ? { maxHeight } : undefined, children: [jsxRuntime.jsxs("table", { className: cn(tableVariants({ variant, size }), className), children: [jsxRuntime.jsx(TableHeader, { headerGroups: headerGroups, enableRowSelection: enableRowSelection, enableSelectAll: enableSelectAll, showHeaderBackground: showHeaderBackground, stickyHeader: stickyHeader, size: size || "medium", headerClassName: headerClassName, isDetailPanelOpen: isDetailPanelOpen, visibleHeadersCount: visibleHeadersCount, onToggleAllRows: (e) => table.getToggleAllRowsSelectedHandler()(e), isAllRowsSelected: table.getIsAllRowsSelected(), isSomeRowsSelected: table.getIsSomeRowsSelected() }), isLoading ? (jsxRuntime.jsx("tbody", { children: renderLoadingState() })) : !hasData ? (jsxRuntime.jsx("tbody", { children: renderEmptyState() })) : (jsxRuntime.jsx(TableBody, { rows: table.getRowModel().rows, enableRowSelection: enableRowSelection, size: size || "medium", variant: variant || "default", showRowHover: showRowHover, cellClassName: cellClassName, isDetailPanelOpen: isDetailPanelOpen, visibleHeadersCount: visibleHeadersCount, effectiveSelectedRowId: effectiveSelectedRowId, onRowClick: onRowClick, getRowClassName: getRowClassName, handleRowClick: handleRowClickInternal }))] }), detailPanel && (jsxRuntime.jsx(DetailPanel, { isOpen: isDetailPanelOpen, content: detailPanel, data: getSelectedRowData(), onClose: handleDetailPanelClose }))] }) }));
|
|
2771
2892
|
}
|
|
2772
|
-
//
|
|
2893
|
+
// ==================== Export ====================
|
|
2773
2894
|
const Table = React__namespace.forwardRef(TableComponent);
|
|
2774
2895
|
Table.displayName = "Table";
|
|
2775
2896
|
|
|
2897
|
+
const TableDetailPanel = React__namespace.forwardRef(({ isOpen, onClose, children, className, width = "400px" }, ref) => {
|
|
2898
|
+
return (jsxRuntime.jsx("div", { ref: ref, className: cn("absolute top-0 right-0 h-full bg-white border border-surface-outline-neutral-muted transition-transform duration-300 ease-in-out overflow-auto", isOpen ? "translate-x-0" : "translate-x-full", className), style: { width }, children: children }));
|
|
2899
|
+
});
|
|
2900
|
+
TableDetailPanel.displayName = "TableDetailPanel";
|
|
2901
|
+
|
|
2902
|
+
function NumberCell({ value, currency, subtitle, className, }) {
|
|
2903
|
+
return (jsxRuntime.jsxs("div", { className: cn("flex flex-col", className), children: [jsxRuntime.jsxs("div", { className: "text-body-medium-medium text-surface-ink-neutral-normal", children: [currency, " ", value.toLocaleString("en-IN", {
|
|
2904
|
+
minimumFractionDigits: 2,
|
|
2905
|
+
maximumFractionDigits: 2,
|
|
2906
|
+
})] }), subtitle && (jsxRuntime.jsx("div", { className: "text-body-small-regular text-surface-ink-neutral-muted", children: subtitle }))] }));
|
|
2907
|
+
}
|
|
2908
|
+
function IconCell({ icon, background = "neutral", className, }) {
|
|
2909
|
+
const backgrounds = {
|
|
2910
|
+
neutral: "bg-surface-fill-neutral-faded",
|
|
2911
|
+
primary: "bg-action-fill-primary-faded",
|
|
2912
|
+
success: "bg-action-fill-positive-faded",
|
|
2913
|
+
warning: "bg-action-fill-warning-faded",
|
|
2914
|
+
danger: "bg-action-fill-negative-faded",
|
|
2915
|
+
};
|
|
2916
|
+
return (jsxRuntime.jsx("div", { className: cn("inline-flex items-center justify-center w-10 h-10 rounded-medium", backgrounds[background], className), children: icon }));
|
|
2917
|
+
}
|
|
2918
|
+
// ==================== Spacer Cell ====================
|
|
2919
|
+
function SpacerCell() {
|
|
2920
|
+
return jsxRuntime.jsx("div", { className: "w-full h-full" });
|
|
2921
|
+
}
|
|
2922
|
+
function SlotCell({ onDragStart, onDragEnd, className }) {
|
|
2923
|
+
return (jsxRuntime.jsx("div", { draggable: true, onDragStart: onDragStart, onDragEnd: onDragEnd, className: cn("flex items-center justify-center cursor-grab active:cursor-grabbing", className), children: jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", className: "text-surface-ink-neutral-muted", children: [jsxRuntime.jsx("path", { d: "M6 4C6 3.44772 5.55228 3 5 3C4.44772 3 4 3.44772 4 4C4 4.55228 4.44772 5 5 5C5.55228 5 6 4.55228 6 4Z", fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M6 8C6 7.44772 5.55228 7 5 7C4.44772 7 4 7.44772 4 8C4 8.55228 4.44772 9 5 9C5.55228 9 6 8.55228 6 8Z", fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M6 12C6 11.4477 5.55228 11 5 11C4.44772 11 4 11.4477 4 12C4 12.5523 4.44772 13 5 13C5.55228 13 6 12.5523 6 12Z", fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M12 4C12 3.44772 11.5523 3 11 3C10.4477 3 10 3.44772 10 4C10 4.55228 10.4477 5 11 5C11.5523 5 12 4.55228 12 4Z", fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M12 8C12 7.44772 11.5523 7 11 7C10.4477 7 10 7.44772 10 8C10 8.55228 10.4477 9 11 9C11.5523 9 12 8.55228 12 8Z", fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M12 12C12 11.4477 11.5523 11 11 11C10.4477 11 10 11.4477 10 12C10 12.5523 10.4477 13 11 13C11.5523 13 12 12.5523 12 12Z", fill: "currentColor" })] }) }));
|
|
2924
|
+
}
|
|
2925
|
+
function AvatarCell({ name, initials, avatar, subtitle, color = "a1", className, }) {
|
|
2926
|
+
return (jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", className), children: [avatar ? (jsxRuntime.jsx("img", { src: avatar, alt: name, className: "w-10 h-10 rounded-full object-cover" })) : (jsxRuntime.jsx("div", { className: cn("w-10 h-10 rounded-full flex items-center justify-center text-body-medium-medium", `bg-${color}`), children: initials || name.charAt(0).toUpperCase() })), jsxRuntime.jsxs("div", { className: "flex flex-col", children: [jsxRuntime.jsx("div", { className: "text-body-medium-medium text-surface-ink-neutral-normal", children: name }), subtitle && (jsxRuntime.jsx("div", { className: "text-body-small-regular text-surface-ink-neutral-muted", children: subtitle }))] })] }));
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2776
2929
|
const tabItemVariants = classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 relative cursor-pointer", {
|
|
2777
2930
|
variants: {
|
|
2778
2931
|
variant: {
|
|
@@ -2976,6 +3129,7 @@ const TextArea = React__namespace.forwardRef(({ label, helperText, errorText, su
|
|
|
2976
3129
|
TextArea.displayName = "TextArea";
|
|
2977
3130
|
|
|
2978
3131
|
exports.Avatar = Avatar;
|
|
3132
|
+
exports.AvatarCell = AvatarCell;
|
|
2979
3133
|
exports.Badge = Badge;
|
|
2980
3134
|
exports.Button = Button;
|
|
2981
3135
|
exports.ButtonGroup = ButtonGroup;
|
|
@@ -2987,16 +3141,21 @@ exports.DropdownMenu = DropdownMenu;
|
|
|
2987
3141
|
exports.FormFooter = FormFooter;
|
|
2988
3142
|
exports.FormHeader = FormHeader;
|
|
2989
3143
|
exports.Icon = Icon;
|
|
3144
|
+
exports.IconCell = IconCell;
|
|
2990
3145
|
exports.Link = Link;
|
|
2991
3146
|
exports.ListItem = ListItem;
|
|
2992
3147
|
exports.Modal = Modal;
|
|
3148
|
+
exports.NumberCell = NumberCell;
|
|
2993
3149
|
exports.Pagination = Pagination;
|
|
2994
3150
|
exports.Radio = Radio;
|
|
2995
3151
|
exports.SearchableDropdown = SearchableDropdown;
|
|
2996
3152
|
exports.Select = Select;
|
|
3153
|
+
exports.SlotCell = SlotCell;
|
|
3154
|
+
exports.SpacerCell = SpacerCell;
|
|
2997
3155
|
exports.Switch = Switch;
|
|
2998
3156
|
exports.TabItem = TabItem;
|
|
2999
3157
|
exports.Table = Table;
|
|
3158
|
+
exports.TableDetailPanel = TableDetailPanel;
|
|
3000
3159
|
exports.Tabs = Tabs;
|
|
3001
3160
|
exports.Text = Text;
|
|
3002
3161
|
exports.TextArea = TextArea;
|