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.
Files changed (31) hide show
  1. package/README.md +826 -223
  2. package/dist/components/Table/DetailPanel.d.ts +10 -0
  3. package/dist/components/Table/DetailPanel.d.ts.map +1 -0
  4. package/dist/components/Table/Table.d.ts +9 -65
  5. package/dist/components/Table/Table.d.ts.map +1 -1
  6. package/dist/components/Table/Table.refactored.d.ts +39 -0
  7. package/dist/components/Table/Table.refactored.d.ts.map +1 -0
  8. package/dist/components/Table/Table.stories.d.ts +2 -0
  9. package/dist/components/Table/Table.stories.d.ts.map +1 -1
  10. package/dist/components/Table/TableBody.d.ts +18 -0
  11. package/dist/components/Table/TableBody.d.ts.map +1 -0
  12. package/dist/components/Table/TableCellTypes.d.ts +32 -0
  13. package/dist/components/Table/TableCellTypes.d.ts.map +1 -0
  14. package/dist/components/Table/TableDetailPanel.d.ts +25 -0
  15. package/dist/components/Table/TableDetailPanel.d.ts.map +1 -0
  16. package/dist/components/Table/TableHeader.d.ts +18 -0
  17. package/dist/components/Table/TableHeader.d.ts.map +1 -0
  18. package/dist/components/Table/index.d.ts +3 -0
  19. package/dist/components/Table/index.d.ts.map +1 -1
  20. package/dist/components/Table/tableHelpers.d.ts +7 -0
  21. package/dist/components/Table/tableHelpers.d.ts.map +1 -0
  22. package/dist/components/Table/tableVariants.d.ts +12 -0
  23. package/dist/components/Table/tableVariants.d.ts.map +1 -0
  24. package/dist/index.css +1 -1
  25. package/dist/index.esm.js +191 -38
  26. package/dist/index.esm.js.map +1 -1
  27. package/dist/index.js +196 -37
  28. package/dist/index.js.map +1 -1
  29. package/dist/lib/icons.d.ts +1 -0
  30. package/dist/lib/icons.d.ts.map +1 -1
  31. 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-[48px]",
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
- function TableComponent({ className, wrapperClassName, containerClassName, variant, size, table, enableRowSelection = false, enableSelectAll = false, isLoading = false, loadingComponent, emptyComponent, enableHorizontalScroll = false, stickyHeader = false, maxHeight, showRowHover = true, onRowClick, rowClassName, headerClassName, cellClassName, showHeaderBackground = true, ...props }, ref) {
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 getRowClassName = (row) => {
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
- return (jsxRuntime.jsx("div", { ref: ref, className: cn("w-full", wrapperClassName), ...props, children: jsxRuntime.jsx("div", { className: cn("relative", enableHorizontalScroll && "overflow-x-auto", maxHeight && "overflow-y-auto", containerClassName), style: maxHeight ? { maxHeight } : undefined, children: jsxRuntime.jsxs("table", { className: cn(tableVariants({ variant, size }), className), children: [jsxRuntime.jsx("thead", { className: cn(showHeaderBackground && "bg-surface-fill-neutral-moderate", stickyHeader && "sticky top-0 z-10"), children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs("tr", { children: [enableRowSelection && enableSelectAll && (jsxRuntime.jsx("th", { className: cn(tableHeaderVariants({ size }), showHeaderBackground &&
2746
- "bg-surface-fill-neutral-moderate", "w-10 rounded-tl-xlarge rounded-bl-xlarge", headerClassName), children: jsxRuntime.jsx(Checkbox, { checked: table.getIsAllRowsSelected(), isIndeterminate: table.getIsSomeRowsSelected(), onChange: table.getToggleAllRowsSelectedHandler(), "aria-label": "Select all rows" }) })), headerGroup.headers.map((header, index) => (jsxRuntime.jsx("th", { className: cn(tableHeaderVariants({ size }), showHeaderBackground &&
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
- // Use React.forwardRef with generic type
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;