@superdangerous/app-framework 4.16.35 → 4.16.37

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../data-table/hooks/usePagination.ts","../data-table/hooks/useColumnVisibility.ts","../data-table/hooks/useResizableColumns.ts","../data-table/hooks/useColumnOrder.ts","../src/utils/cn.ts","../components/base/table.tsx","../components/base/tooltip.tsx","../components/base/button.tsx","../components/base/select.tsx","../data-table/components/Pagination.tsx","../data-table/components/DataTable.tsx","../components/base/input.tsx","../components/base/popover.tsx","../data-table/components/PaginationControls.tsx","../data-table/components/DataTablePage.tsx","../components/base/card.tsx","../data-table/components/BatchActionsBar.tsx","../components/base/dropdown-menu.tsx","../data-table/components/ColumnVisibility.tsx","../data-table/components/TableFilters.tsx","../components/base/checkbox.tsx","../data-table/components/MultiSelectFilter.tsx"],"names":["DEFAULT_PAGE_SIZE","PAGE_SIZE_OPTIONS","usePagination","data","initialPageSize","storageKey","state","setState","useState","stored","page","pageSize","totalPages","useMemo","useEffect","prev","startIndex","endIndex","paginatedData","setPage","useCallback","newPage","setPageSize","newSize","nextPage","prevPage","firstPage","lastPage","useColumnVisibility","columns","fullStorageKey","visibleColumns","setVisibleColumns","defaults","col","parsed","merged","e","isColumnVisible","columnId","c","toggleColumn","showAllColumns","allVisible","hideAllColumns","onlyLocked","DEFAULT_MIN_WIDTH","DEFAULT_WIDTH","DRAG_THRESHOLD","useResizableColumns","tableId","effectiveStorageKey","getDefaultWidths","acc","startXRef","useRef","startWidthRef","activeColumnRef","hasDraggedRef","columnsRef","getColumnConfig","key","handlersRef","diff","config","minWidth","maxWidth","newWidth","widthsRef","startResize","columnKey","clientX","getResizeHandleProps","getColumnStyle","currentWidth","totalWidth","sum","getTableStyle","resetToDefaults","useColumnOrder","defaultOrder","columnOrder","setColumnOrder","storedSet","defaultSet","validStored","missingColumns","result","missing","defaultIndex","insertAt","i","moveColumn","fromIndex","toIndex","newOrder","removed","moveColumnById","direction","currentIndex","newIndex","resetOrder","getOrderedColumns","columnMap","id","useColumnDragDrop","lockedColumns","dragState","setDragState","handleDragStart","handleDragOver","targetIndex","rect","midpoint","dropIndex","handleDrop","handleDragEnd","getDragHandleProps","showDropIndicator","cn","inputs","twMerge","clsx","Table","G","className","props","ref","jsx","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","TooltipProvider","ee","TooltipContent","st","sideOffset","buttonVariants","cva","Button","dt","variant","size","asChild","Slot","Select","x","SelectValue","SelectTrigger","q","children","jsxs","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","Check","SelectSeparator","Pagination","totalItems","canGoNext","canGoPrev","pageSizeOptions","onPageChange","onPageSizeChange","onNextPage","onPrevPage","onFirstPage","onLastPage","getPageNumbers","pages","halfShow","startPage","endPage","v","ChevronsLeft","ChevronLeft","pageNum","idx","ChevronRight","ChevronsRight","DataTable","getRowId","selectable","selectedIds","onSelectionChange","onRowClick","onRowContextMenu","sortField","sortOrder","onSort","actionsColumn","actionsColumnWidth","externalPagination","hidePagination","rowClassName","enableHeaderContextMenu","defaultColumnOrder","loading","emptyState","columnSizeConfig","configs","columnVisibilityConfig","order","columnVisibility","internalPagination","pagination","headerContextMenu","setHeaderContextMenu","handleHeaderContextMenu","close","isAllSelected","item","isSomeSelected","selected","toggleSelection","itemId","next","selectAll","ids","clearSelection","getSortIcon","field","ArrowUpDown","getColumnDef","renderHeaderContent","headerProps","Fragment","colKey","el","Loader2","rowId","isSelected","cellProps","column","visible","isLocked","Eye","EyeOff","Input","ft","type","Popover","_","PopoverTrigger","PopoverContent","bt","align","PaginationControls","_setPage","DataTablePage","title","description","titleExtra","search","onSearchChange","searchPlaceholder","filters","activeFilterCount","onClearFilters","actions","beforeTable","loadingComponent","showPagination","Search","X","Filter","filter","Card","BatchActionsBar","selectedCount","onClear","itemLabel","label","DropdownMenu","P","DropdownMenuTrigger","DropdownMenuSubTrigger","J","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","ColumnVisibility","visibleCount","toggleableColumns","Columns3","TableFilters","popoverWidth","f","Checkbox","Rt","Pe","MultiSelectFilter","options","onChange","maxHeight","showBulkActions","handleToggle","value","newSelected","handleSelectAll","o","handleClear","gridCols","allSelected","noneSelected","option"],"mappings":"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","file":"data-table.js","sourcesContent":["import { useState, useMemo, useCallback, useEffect } from 'react';\n\ninterface UsePaginationOptions<T> {\n data: T[];\n pageSize?: number;\n storageKey?: string;\n}\n\ninterface PaginationState {\n page: number;\n pageSize: number;\n}\n\ninterface UsePaginationResult<T> {\n // Paginated data\n paginatedData: T[];\n\n // Current state\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n\n // Navigation\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n firstPage: () => void;\n lastPage: () => void;\n\n // Info\n startIndex: number;\n endIndex: number;\n canGoNext: boolean;\n canGoPrev: boolean;\n\n // Page size options\n pageSizeOptions: number[];\n}\n\nconst DEFAULT_PAGE_SIZE = 25;\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\nexport function usePagination<T>({\n data,\n pageSize: initialPageSize = DEFAULT_PAGE_SIZE,\n storageKey,\n}: UsePaginationOptions<T>): UsePaginationResult<T> {\n // Initialize state from localStorage if available\n const [state, setState] = useState<PaginationState>(() => {\n if (storageKey) {\n try {\n const stored = localStorage.getItem(`pagination-${storageKey}`);\n if (stored) {\n const parsed = JSON.parse(stored);\n return {\n page: 1, // Always start on first page\n pageSize: parsed.pageSize || initialPageSize,\n };\n }\n } catch {\n // Ignore localStorage errors\n }\n }\n return {\n page: 1,\n pageSize: initialPageSize,\n };\n });\n\n const { page, pageSize } = state;\n\n // Calculate total pages\n const totalPages = useMemo(\n () => Math.max(1, Math.ceil(data.length / pageSize)),\n [data.length, pageSize]\n );\n\n // Reset to first page if current page is out of bounds\n useEffect(() => {\n if (page > totalPages) {\n setState((prev) => ({ ...prev, page: Math.max(1, totalPages) }));\n }\n }, [totalPages, page]);\n\n // Persist pageSize to localStorage\n useEffect(() => {\n if (storageKey) {\n try {\n localStorage.setItem(\n `pagination-${storageKey}`,\n JSON.stringify({ pageSize })\n );\n } catch {\n // Ignore localStorage errors\n }\n }\n }, [pageSize, storageKey]);\n\n // Calculate start and end indices\n const startIndex = (page - 1) * pageSize;\n const endIndex = Math.min(startIndex + pageSize, data.length);\n\n // Get paginated data\n const paginatedData = useMemo(\n () => data.slice(startIndex, endIndex),\n [data, startIndex, endIndex]\n );\n\n // Navigation functions\n const setPage = useCallback((newPage: number) => {\n setState((prev) => ({\n ...prev,\n page: Math.max(1, Math.min(newPage, totalPages)),\n }));\n }, [totalPages]);\n\n const setPageSize = useCallback((newSize: number) => {\n setState({\n page: 1, // Reset to first page when changing page size\n pageSize: newSize,\n });\n }, []);\n\n const nextPage = useCallback(() => {\n setPage(page + 1);\n }, [page, setPage]);\n\n const prevPage = useCallback(() => {\n setPage(page - 1);\n }, [page, setPage]);\n\n const firstPage = useCallback(() => {\n setPage(1);\n }, [setPage]);\n\n const lastPage = useCallback(() => {\n setPage(totalPages);\n }, [totalPages, setPage]);\n\n return {\n paginatedData,\n page,\n pageSize,\n totalPages,\n totalItems: data.length,\n setPage,\n setPageSize,\n nextPage,\n prevPage,\n firstPage,\n lastPage,\n startIndex: startIndex + 1, // 1-indexed for display\n endIndex,\n canGoNext: page < totalPages,\n canGoPrev: page > 1,\n pageSizeOptions: PAGE_SIZE_OPTIONS,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\n\nexport interface ColumnConfig {\n id: string;\n label: string;\n defaultVisible?: boolean;\n locked?: boolean; // If true, column cannot be hidden\n}\n\nexport interface ColumnVisibilityState {\n [key: string]: boolean;\n}\n\ninterface UseColumnVisibilityOptions {\n columns: ColumnConfig[];\n storageKey: string;\n}\n\ninterface UseColumnVisibilityReturn {\n visibleColumns: ColumnVisibilityState;\n isColumnVisible: (columnId: string) => boolean;\n toggleColumn: (columnId: string) => void;\n showAllColumns: () => void;\n hideAllColumns: () => void;\n columns: ColumnConfig[];\n}\n\nexport function useColumnVisibility({\n columns,\n storageKey,\n}: UseColumnVisibilityOptions): UseColumnVisibilityReturn {\n const fullStorageKey = `column-visibility-${storageKey}`;\n\n // Initialize state from localStorage or defaults (with SSR guard)\n const [visibleColumns, setVisibleColumns] = useState<ColumnVisibilityState>(() => {\n // Default state\n const defaults: ColumnVisibilityState = {};\n columns.forEach(col => {\n defaults[col.id] = col.defaultVisible !== false;\n });\n\n // SSR guard - localStorage is not available on server\n if (typeof window === 'undefined') {\n return defaults;\n }\n\n try {\n const stored = localStorage.getItem(fullStorageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n // Merge with defaults to handle new columns\n const merged: ColumnVisibilityState = {};\n columns.forEach(col => {\n if (col.locked) {\n merged[col.id] = true;\n } else if (parsed[col.id] !== undefined) {\n merged[col.id] = parsed[col.id];\n } else {\n merged[col.id] = col.defaultVisible !== false;\n }\n });\n return merged;\n }\n } catch (e) {\n console.error('Error loading column visibility state:', e);\n }\n\n return defaults;\n });\n\n // Persist to localStorage (with SSR guard)\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(fullStorageKey, JSON.stringify(visibleColumns));\n } catch (e) {\n console.error('Error saving column visibility state:', e);\n }\n }, [visibleColumns, fullStorageKey]);\n\n const isColumnVisible = useCallback(\n (columnId: string): boolean => {\n const col = columns.find(c => c.id === columnId);\n if (col?.locked) return true;\n return visibleColumns[columnId] !== false;\n },\n [visibleColumns, columns]\n );\n\n const toggleColumn = useCallback(\n (columnId: string) => {\n const col = columns.find(c => c.id === columnId);\n if (col?.locked) return; // Cannot toggle locked columns\n\n setVisibleColumns(prev => ({\n ...prev,\n [columnId]: !prev[columnId],\n }));\n },\n [columns]\n );\n\n const showAllColumns = useCallback(() => {\n const allVisible: ColumnVisibilityState = {};\n columns.forEach(col => {\n allVisible[col.id] = true;\n });\n setVisibleColumns(allVisible);\n }, [columns]);\n\n const hideAllColumns = useCallback(() => {\n const onlyLocked: ColumnVisibilityState = {};\n columns.forEach(col => {\n onlyLocked[col.id] = col.locked === true;\n });\n setVisibleColumns(onlyLocked);\n }, [columns]);\n\n return {\n visibleColumns,\n isColumnVisible,\n toggleColumn,\n showAllColumns,\n hideAllColumns,\n columns,\n };\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\n\ninterface ColumnConfig {\n key: string;\n minWidth?: number;\n maxWidth?: number;\n defaultWidth?: number;\n}\n\ninterface UseResizableColumnsOptions {\n tableId: string;\n columns: ColumnConfig[];\n storageKey?: string;\n}\n\ninterface ResizableColumnState {\n widths: Record<string, number>;\n isResizing: boolean;\n resizingColumn: string | null;\n}\n\nexport interface ResizableColumnResult {\n widths: Record<string, number>;\n isResizing: boolean;\n totalWidth: number;\n getResizeHandleProps: (columnKey: string) => {\n onPointerDown: (e: React.PointerEvent) => void;\n onMouseDown: (e: React.MouseEvent) => void;\n draggable: boolean;\n onDragStart: (e: React.DragEvent) => void;\n className: string;\n 'data-resizing': boolean;\n };\n getColumnStyle: (columnKey: string) => React.CSSProperties;\n getTableStyle: () => React.CSSProperties;\n resetToDefaults: () => void;\n}\n\nconst DEFAULT_MIN_WIDTH = 50;\nconst DEFAULT_WIDTH = 150;\nconst DRAG_THRESHOLD = 3; // Minimum pixels before resize activates\n\nexport function useResizableColumns({\n tableId,\n columns,\n storageKey,\n}: UseResizableColumnsOptions): ResizableColumnResult {\n const effectiveStorageKey = storageKey || `table-columns-${tableId}`;\n\n // Get default widths from column config\n const getDefaultWidths = useCallback(() => {\n return columns.reduce((acc, col) => {\n acc[col.key] = col.defaultWidth || DEFAULT_WIDTH;\n return acc;\n }, {} as Record<string, number>);\n }, [columns]);\n\n // Initialize widths from localStorage or defaults\n const [state, setState] = useState<ResizableColumnState>(() => {\n try {\n const stored = localStorage.getItem(effectiveStorageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n // Merge with defaults in case new columns were added\n const defaults = getDefaultWidths();\n return {\n widths: { ...defaults, ...parsed },\n isResizing: false,\n resizingColumn: null,\n };\n }\n } catch {\n // Ignore localStorage errors\n }\n return {\n widths: getDefaultWidths(),\n isResizing: false,\n resizingColumn: null,\n };\n });\n\n // Refs for resize handling - these are stable across renders\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n const activeColumnRef = useRef<string | null>(null);\n const hasDraggedRef = useRef<boolean>(false);\n const columnsRef = useRef(columns);\n\n // Keep columnsRef up to date\n useEffect(() => {\n columnsRef.current = columns;\n }, [columns]);\n\n // Get column config by key - uses ref for stable reference\n const getColumnConfig = useCallback(\n (key: string) => columnsRef.current.find((c) => c.key === key),\n []\n );\n\n // Persist widths to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(effectiveStorageKey, JSON.stringify(state.widths));\n } catch {\n // Ignore localStorage errors\n }\n }, [state.widths, effectiveStorageKey]);\n\n // Stable event handlers using refs - these don't change between renders\n const handlersRef = useRef<{\n onPointerMove: (e: PointerEvent) => void;\n onPointerUp: (e: PointerEvent) => void;\n } | null>(null);\n\n // Initialize handlers once\n if (!handlersRef.current) {\n handlersRef.current = {\n onPointerMove: (e: PointerEvent) => {\n if (!activeColumnRef.current) return;\n\n const diff = e.clientX - startXRef.current;\n\n // Check if we've exceeded the drag threshold\n if (!hasDraggedRef.current) {\n if (Math.abs(diff) < DRAG_THRESHOLD) {\n return; // Not yet dragging\n }\n // Now we're actually dragging - set the resizing state\n hasDraggedRef.current = true;\n setState((prev) => ({\n ...prev,\n isResizing: true,\n resizingColumn: activeColumnRef.current,\n }));\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n const config = getColumnConfig(activeColumnRef.current);\n const minWidth = config?.minWidth || DEFAULT_MIN_WIDTH;\n const maxWidth = config?.maxWidth;\n\n let newWidth = Math.max(minWidth, startWidthRef.current + diff);\n if (maxWidth) {\n newWidth = Math.min(maxWidth, newWidth);\n }\n\n setState((prev) => ({\n ...prev,\n widths: {\n ...prev.widths,\n [activeColumnRef.current!]: newWidth,\n },\n }));\n },\n\n onPointerUp: () => {\n activeColumnRef.current = null;\n hasDraggedRef.current = false;\n setState((prev) => ({\n ...prev,\n isResizing: false,\n resizingColumn: null,\n }));\n\n // Remove listeners using the same stable references\n document.removeEventListener('pointermove', handlersRef.current!.onPointerMove);\n document.removeEventListener('pointerup', handlersRef.current!.onPointerUp);\n document.removeEventListener('pointercancel', handlersRef.current!.onPointerUp);\n\n // Remove cursor override\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n },\n };\n }\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (handlersRef.current) {\n document.removeEventListener('pointermove', handlersRef.current.onPointerMove);\n document.removeEventListener('pointerup', handlersRef.current.onPointerUp);\n document.removeEventListener('pointercancel', handlersRef.current.onPointerUp);\n }\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, []);\n\n // Ref to access current widths without causing re-renders\n const widthsRef = useRef(state.widths);\n useEffect(() => {\n widthsRef.current = state.widths;\n }, [state.widths]);\n\n // Start resize - uses stable handler refs\n const startResize = useCallback(\n (columnKey: string, clientX: number) => {\n startXRef.current = clientX;\n startWidthRef.current = widthsRef.current[columnKey] || DEFAULT_WIDTH;\n activeColumnRef.current = columnKey;\n hasDraggedRef.current = false;\n\n // Add listeners using stable references - use pointer events consistently\n document.addEventListener('pointermove', handlersRef.current!.onPointerMove);\n document.addEventListener('pointerup', handlersRef.current!.onPointerUp);\n document.addEventListener('pointercancel', handlersRef.current!.onPointerUp);\n },\n []\n );\n\n // Get resize handle props for a column\n const getResizeHandleProps = useCallback(\n (columnKey: string) => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startResize(columnKey, e.clientX);\n },\n // Prevent other events from interfering\n onMouseDown: (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n },\n draggable: false,\n onDragStart: (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n },\n className: 'resize-handle',\n 'data-resizing': state.resizingColumn === columnKey,\n }),\n [startResize, state.resizingColumn]\n );\n\n // Get column style with width\n const getColumnStyle = useCallback(\n (columnKey: string): React.CSSProperties => {\n const currentWidth = state.widths[columnKey] || DEFAULT_WIDTH;\n const config = getColumnConfig(columnKey);\n const minWidth = config?.minWidth || DEFAULT_MIN_WIDTH;\n return {\n width: currentWidth,\n minWidth: minWidth, // Use configured min width, not current width\n position: 'relative',\n };\n },\n [state.widths, getColumnConfig]\n );\n\n // Calculate total table width from all columns\n const totalWidth = columns.reduce((sum, col) => {\n return sum + (state.widths[col.key] || col.defaultWidth || DEFAULT_WIDTH);\n }, 0);\n\n // Get table style\n const getTableStyle = useCallback(\n (): React.CSSProperties => ({\n minWidth: totalWidth,\n }),\n [totalWidth]\n );\n\n // Reset all columns to default widths\n const resetToDefaults = useCallback(() => {\n setState((prev) => ({\n ...prev,\n widths: getDefaultWidths(),\n }));\n }, [getDefaultWidths]);\n\n return {\n widths: state.widths,\n isResizing: state.isResizing,\n totalWidth,\n getResizeHandleProps,\n getColumnStyle,\n getTableStyle,\n resetToDefaults,\n };\n}\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface ColumnOrderConfig {\n id: string;\n label: string;\n locked?: boolean; // Locked columns can't be moved\n}\n\ninterface UseColumnOrderOptions {\n storageKey: string;\n defaultOrder: string[];\n}\n\ninterface UseColumnOrderReturn {\n columnOrder: string[];\n moveColumn: (fromIndex: number, toIndex: number) => void;\n moveColumnById: (columnId: string, direction: 'left' | 'right') => void;\n resetOrder: () => void;\n getOrderedColumns: <T extends { id: string }>(columns: T[]) => T[];\n}\n\n/**\n * Hook for managing column order with localStorage persistence\n */\nexport function useColumnOrder({\n storageKey,\n defaultOrder,\n}: UseColumnOrderOptions): UseColumnOrderReturn {\n const [columnOrder, setColumnOrder] = useState<string[]>(() => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n const storedSet = new Set(parsed);\n const defaultSet = new Set(defaultOrder);\n\n // Remove old columns that aren't in default anymore\n const validStored = parsed.filter((col: string) => defaultSet.has(col));\n\n // Find missing columns and insert them at their default positions\n const missingColumns = defaultOrder.filter(col => !storedSet.has(col));\n\n if (missingColumns.length > 0) {\n // Build new order by inserting missing columns at their default positions\n const result = [...validStored];\n for (const missing of missingColumns) {\n const defaultIndex = defaultOrder.indexOf(missing);\n // Find the best insertion point based on surrounding columns in default order\n let insertAt = result.length;\n for (let i = 0; i < result.length; i++) {\n const currentDefaultIndex = defaultOrder.indexOf(result[i]);\n if (currentDefaultIndex > defaultIndex) {\n insertAt = i;\n break;\n }\n }\n result.splice(insertAt, 0, missing);\n }\n return result;\n }\n\n return validStored.length > 0 ? validStored : defaultOrder;\n }\n } catch (e) {\n console.warn('Failed to load column order from localStorage:', e);\n }\n return defaultOrder;\n });\n\n // Persist to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(columnOrder));\n } catch (e) {\n console.warn('Failed to save column order to localStorage:', e);\n }\n }, [storageKey, columnOrder]);\n\n const moveColumn = useCallback((fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) return;\n\n setColumnOrder(prev => {\n const newOrder = [...prev];\n const [removed] = newOrder.splice(fromIndex, 1);\n if (removed !== undefined) {\n newOrder.splice(toIndex, 0, removed);\n }\n return newOrder;\n });\n }, []);\n\n const moveColumnById = useCallback((columnId: string, direction: 'left' | 'right') => {\n setColumnOrder(prev => {\n const currentIndex = prev.indexOf(columnId);\n if (currentIndex === -1) return prev;\n\n const newIndex = direction === 'left'\n ? Math.max(0, currentIndex - 1)\n : Math.min(prev.length - 1, currentIndex + 1);\n\n if (currentIndex === newIndex) return prev;\n\n const newOrder = [...prev];\n const [removed] = newOrder.splice(currentIndex, 1);\n if (removed !== undefined) {\n newOrder.splice(newIndex, 0, removed);\n }\n return newOrder;\n });\n }, []);\n\n const resetOrder = useCallback(() => {\n setColumnOrder(defaultOrder);\n }, [defaultOrder]);\n\n const getOrderedColumns = useCallback(<T extends { id: string }>(columns: T[]): T[] => {\n const columnMap = new Map(columns.map(col => [col.id, col]));\n return columnOrder\n .map(id => columnMap.get(id))\n .filter((col): col is T => col !== undefined);\n }, [columnOrder]);\n\n return {\n columnOrder,\n moveColumn,\n moveColumnById,\n resetOrder,\n getOrderedColumns,\n };\n}\n\n/**\n * Drag and drop helpers for column reordering\n */\nexport interface DragState {\n isDragging: boolean;\n draggedId: string | null;\n dropIndex: number | null; // Index where the column will be inserted\n}\n\nexport function useColumnDragDrop(\n columnOrder: string[],\n moveColumn: (from: number, to: number) => void,\n lockedColumns: string[] = []\n) {\n const [dragState, setDragState] = useState<DragState>({\n isDragging: false,\n draggedId: null,\n dropIndex: null,\n });\n\n const handleDragStart = useCallback((columnId: string) => {\n if (lockedColumns.includes(columnId)) return;\n setDragState({\n isDragging: true,\n draggedId: columnId,\n dropIndex: null,\n });\n }, [lockedColumns]);\n\n const handleDragOver = useCallback((columnId: string, e: React.DragEvent) => {\n if (lockedColumns.includes(columnId)) return;\n\n const targetIndex = columnOrder.indexOf(columnId);\n if (targetIndex === -1) return;\n\n // Determine drop index based on mouse position relative to column center\n const rect = e.currentTarget.getBoundingClientRect();\n const midpoint = rect.left + rect.width / 2;\n const dropIndex = e.clientX < midpoint ? targetIndex : targetIndex + 1;\n\n setDragState(prev => ({\n ...prev,\n dropIndex,\n }));\n }, [lockedColumns, columnOrder]);\n\n const handleDrop = useCallback(() => {\n if (!dragState.draggedId || dragState.dropIndex === null) {\n setDragState({ isDragging: false, draggedId: null, dropIndex: null });\n return;\n }\n\n const fromIndex = columnOrder.indexOf(dragState.draggedId);\n let toIndex = dragState.dropIndex;\n\n // Adjust if moving from before the drop position\n if (fromIndex < toIndex) {\n toIndex = toIndex - 1;\n }\n\n if (fromIndex !== -1 && toIndex !== -1 && fromIndex !== toIndex) {\n moveColumn(fromIndex, toIndex);\n }\n\n setDragState({ isDragging: false, draggedId: null, dropIndex: null });\n }, [dragState.draggedId, dragState.dropIndex, columnOrder, moveColumn]);\n\n const handleDragEnd = useCallback(() => {\n setDragState({ isDragging: false, draggedId: null, dropIndex: null });\n }, []);\n\n const getDragHandleProps = useCallback((columnId: string) => ({\n draggable: !lockedColumns.includes(columnId),\n onDragStart: (e: React.DragEvent) => {\n if (lockedColumns.includes(columnId)) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.effectAllowed = 'move';\n handleDragStart(columnId);\n },\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n handleDragOver(columnId, e);\n },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault();\n handleDrop();\n },\n onDragEnd: handleDragEnd,\n }), [lockedColumns, handleDragStart, handleDragOver, handleDrop, handleDragEnd]);\n\n // Helper to check if drop indicator should show on the left of a column\n const showDropIndicator = useCallback((columnId: string) => {\n if (!dragState.isDragging || dragState.dropIndex === null) return false;\n const columnIndex = columnOrder.indexOf(columnId);\n return columnIndex === dragState.dropIndex;\n }, [dragState.isDragging, dragState.dropIndex, columnOrder]);\n\n return {\n dragState,\n getDragHandleProps,\n showDropIndicator,\n };\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes with proper precedence\n * Uses clsx for conditional classes and tailwind-merge to resolve conflicts\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from \"react\"\n\nimport { cn } from \"../../src/utils/cn\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cn } from \"../../src/utils/cn\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../src/utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../../src/utils/cn\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}","import {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from 'lucide-react';\nimport { Button } from '../../components/base/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../components/base/select';\nimport { cn } from '../../src/utils/cn';\n\ninterface PaginationProps {\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n startIndex: number;\n endIndex: number;\n canGoNext: boolean;\n canGoPrev: boolean;\n pageSizeOptions: number[];\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onNextPage: () => void;\n onPrevPage: () => void;\n onFirstPage: () => void;\n onLastPage: () => void;\n className?: string;\n}\n\nexport function Pagination({\n page,\n pageSize,\n totalPages,\n totalItems,\n startIndex,\n endIndex,\n canGoNext,\n canGoPrev,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n onNextPage,\n onPrevPage,\n onFirstPage,\n onLastPage,\n className,\n}: PaginationProps) {\n // Generate page numbers to show\n const getPageNumbers = () => {\n const pages: (number | 'ellipsis')[] = [];\n const showPages = 5; // Max pages to show\n const halfShow = Math.floor(showPages / 2);\n\n let startPage = Math.max(1, page - halfShow);\n let endPage = Math.min(totalPages, page + halfShow);\n\n // Adjust range if near edges\n if (page <= halfShow) {\n endPage = Math.min(totalPages, showPages);\n }\n if (page > totalPages - halfShow) {\n startPage = Math.max(1, totalPages - showPages + 1);\n }\n\n // Add first page and ellipsis if needed\n if (startPage > 1) {\n pages.push(1);\n if (startPage > 2) {\n pages.push('ellipsis');\n }\n }\n\n // Add middle pages\n for (let i = startPage; i <= endPage; i++) {\n if (i !== 1 && i !== totalPages) {\n pages.push(i);\n }\n }\n\n // Add ellipsis and last page if needed\n if (endPage < totalPages) {\n if (endPage < totalPages - 1) {\n pages.push('ellipsis');\n }\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n if (totalItems === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'flex flex-col sm:flex-row items-center justify-between gap-4 px-2 py-3',\n className\n )}\n >\n {/* Items info */}\n <div className=\"text-sm text-muted-foreground\">\n Showing {startIndex} to {endIndex} of {totalItems} items\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center gap-4\">\n {/* Page size selector */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">Per page:</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => onPageSizeChange(Number(v))}\n >\n <SelectTrigger className=\"w-20 h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Page navigation */}\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onFirstPage}\n disabled={!canGoPrev}\n title=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onPrevPage}\n disabled={!canGoPrev}\n title=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n {/* Page numbers */}\n <div className=\"flex items-center gap-1\">\n {getPageNumbers().map((pageNum, idx) =>\n pageNum === 'ellipsis' ? (\n <span key={`ellipsis-${idx}`} className=\"px-2 text-muted-foreground\">\n ...\n </span>\n ) : (\n <Button\n key={pageNum}\n variant={page === pageNum ? 'default' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onPageChange(pageNum)}\n >\n {pageNum}\n </Button>\n )\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onNextPage}\n disabled={!canGoNext}\n title=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onLastPage}\n disabled={!canGoNext}\n title=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { useMemo, useCallback, useState, useEffect } from 'react';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../components/base/table';\nimport { TooltipProvider } from '../../components/base/tooltip';\nimport { ChevronUp, ChevronDown, ArrowUpDown, Loader2, Check, Eye, EyeOff } from 'lucide-react';\nimport { cn } from '../../src/utils/cn';\nimport { useResizableColumns } from '../hooks/useResizableColumns';\nimport { useColumnVisibility } from '../hooks/useColumnVisibility';\nimport { useColumnOrder, useColumnDragDrop } from '../hooks/useColumnOrder';\nimport { usePagination } from '../hooks/usePagination';\nimport { Pagination } from './Pagination';\nimport type {\n DataTableProps,\n ColumnDef,\n ColumnConfigCompat,\n ColumnSizeConfig,\n} from './types';\n\n/**\n * DataTable - Generic data table with full feature set\n *\n * Features:\n * - Column resizing (drag handles)\n * - Column reordering (drag-drop)\n * - Column visibility toggle\n * - Row selection with checkboxes\n * - Sorting\n * - Pagination\n * - Sticky actions column\n * - Context menu support\n * - Header context menu for column visibility\n */\nexport function DataTable<T>({\n data,\n columns,\n storageKey,\n getRowId,\n selectable = false,\n selectedIds,\n onSelectionChange,\n onRowClick,\n onRowContextMenu,\n sortField,\n sortOrder,\n onSort,\n actionsColumn,\n actionsColumnWidth = 80,\n pageSize = 25,\n pagination: externalPagination,\n hidePagination = false,\n className,\n rowClassName,\n enableHeaderContextMenu = true,\n lockedColumns = [],\n defaultColumnOrder,\n loading = false,\n emptyState,\n}: DataTableProps<T>) {\n // Build column configs for hooks\n const columnSizeConfig = useMemo<ColumnSizeConfig[]>(() => {\n const configs: ColumnSizeConfig[] = [];\n\n if (selectable) {\n configs.push({ key: 'select', defaultWidth: 40, minWidth: 40 });\n }\n\n columns.forEach((col) => {\n configs.push({\n key: col.id,\n defaultWidth: col.width?.default ?? 150,\n minWidth: col.width?.min ?? 80,\n maxWidth: col.width?.max,\n });\n });\n\n if (actionsColumn) {\n configs.push({ key: 'actions', defaultWidth: actionsColumnWidth, minWidth: 60 });\n }\n\n return configs;\n }, [columns, selectable, actionsColumn, actionsColumnWidth]);\n\n const columnVisibilityConfig = useMemo<ColumnConfigCompat[]>(() => {\n return columns.map((col) => ({\n id: col.id,\n label: typeof col.header === 'string' ? col.header : col.id,\n defaultVisible: col.visibility?.default ?? true,\n locked: col.visibility?.locked,\n }));\n }, [columns]);\n\n const defaultOrder = useMemo(() => {\n if (defaultColumnOrder) return defaultColumnOrder;\n const order: string[] = [];\n if (selectable) order.push('select');\n columns.forEach((col) => order.push(col.id));\n if (actionsColumn) order.push('actions');\n return order;\n }, [defaultColumnOrder, columns, selectable, actionsColumn]);\n\n // Initialize hooks\n const {\n getResizeHandleProps,\n getColumnStyle,\n getTableStyle,\n } = useResizableColumns({\n tableId: storageKey,\n columns: columnSizeConfig,\n });\n\n const columnVisibility = useColumnVisibility({\n columns: columnVisibilityConfig,\n storageKey,\n });\n\n const { columnOrder, moveColumn } = useColumnOrder({\n storageKey: `${storageKey}-order`,\n defaultOrder,\n });\n\n const { dragState, getDragHandleProps, showDropIndicator } = useColumnDragDrop(\n columnOrder,\n moveColumn,\n [...lockedColumns, 'select', 'actions']\n );\n\n // Use external pagination if provided, otherwise use internal\n const internalPagination = usePagination({\n data,\n pageSize,\n storageKey,\n });\n\n const pagination = externalPagination || internalPagination;\n\n // Header context menu state\n const [headerContextMenu, setHeaderContextMenu] = useState<{ x: number; y: number } | null>(null);\n\n const handleHeaderContextMenu = useCallback((e: React.MouseEvent) => {\n if (!enableHeaderContextMenu) return;\n e.preventDefault();\n setHeaderContextMenu({ x: e.clientX, y: e.clientY });\n }, [enableHeaderContextMenu]);\n\n // Close header context menu on click outside\n useEffect(() => {\n if (!headerContextMenu) return;\n const close = () => setHeaderContextMenu(null);\n window.addEventListener('click', close);\n return () => {\n window.removeEventListener('click', close);\n };\n }, [headerContextMenu]);\n\n // Selection helpers\n const isAllSelected = useMemo(() => {\n if (!selectable || !selectedIds || pagination.paginatedData.length === 0) return false;\n return pagination.paginatedData.every((item) => selectedIds.has(getRowId(item)));\n }, [selectable, selectedIds, pagination.paginatedData, getRowId]);\n\n const isSomeSelected = useMemo(() => {\n if (!selectable || !selectedIds) return false;\n const selected = pagination.paginatedData.filter((item) => selectedIds.has(getRowId(item)));\n return selected.length > 0 && selected.length < pagination.paginatedData.length;\n }, [selectable, selectedIds, pagination.paginatedData, getRowId]);\n\n const toggleSelection = useCallback((itemId: string) => {\n if (!onSelectionChange || !selectedIds) return;\n const next = new Set(selectedIds);\n if (next.has(itemId)) {\n next.delete(itemId);\n } else {\n next.add(itemId);\n }\n onSelectionChange(next);\n }, [selectedIds, onSelectionChange]);\n\n const selectAll = useCallback(() => {\n if (!onSelectionChange) return;\n const ids = new Set(pagination.paginatedData.map(getRowId));\n onSelectionChange(ids);\n }, [pagination.paginatedData, getRowId, onSelectionChange]);\n\n const clearSelection = useCallback(() => {\n if (!onSelectionChange) return;\n onSelectionChange(new Set());\n }, [onSelectionChange]);\n\n // Get sort icon\n const getSortIcon = useCallback((field: string) => {\n if (sortField !== field) {\n return <ArrowUpDown className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n }\n return sortOrder === 'asc'\n ? <ChevronUp className=\"h-3.5 w-3.5\" />\n : <ChevronDown className=\"h-3.5 w-3.5\" />;\n }, [sortField, sortOrder]);\n\n // Find column def by id\n const getColumnDef = useCallback((id: string): ColumnDef<T> | undefined => {\n return columns.find((col) => col.id === id);\n }, [columns]);\n\n // Render header cell content\n const renderHeaderContent = useCallback((col: ColumnDef<T>) => {\n const headerProps = {\n columnId: col.id,\n isSorted: sortField === col.sortKey,\n sortDirection: sortField === col.sortKey ? sortOrder : undefined,\n };\n\n if (typeof col.header === 'function') {\n return col.header(headerProps);\n }\n\n if (col.sortKey && onSort) {\n return (\n <button\n onClick={() => onSort(col.sortKey!)}\n className={cn(\n 'flex items-center gap-1 hover:text-foreground transition-colors',\n sortField === col.sortKey && 'text-foreground font-medium'\n )}\n >\n {col.header}\n {getSortIcon(col.sortKey)}\n </button>\n );\n }\n\n return col.header;\n }, [sortField, sortOrder, onSort, getSortIcon]);\n\n return (\n <TooltipProvider>\n <>\n {/* Table with scroll container and border - supports both horizontal and vertical scroll with sticky header */}\n <div className=\"overflow-auto border rounded-lg h-full\">\n <Table\n style={getTableStyle()}\n className={cn('resizable-table sticky-actions-table', className)}\n >\n <TableHeader className=\"sticky top-0 z-20 bg-muted\">\n <TableRow onContextMenu={handleHeaderContextMenu} className=\"border-t-0\">\n {columnOrder.map((colKey) => {\n // Select column (sticky on left)\n if (colKey === 'select' && selectable) {\n return (\n <TableHead\n key=\"select\"\n className=\"sticky-select-header w-10 sticky left-0 z-20 bg-muted relative after:absolute after:right-0 after:top-0 after:bottom-0 after:w-px after:bg-border\"\n >\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(el) => {\n if (el) el.indeterminate = isSomeSelected;\n }}\n onChange={(e) => e.target.checked ? selectAll() : clearSelection()}\n className=\"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary cursor-pointer\"\n title={isAllSelected ? 'Deselect all' : 'Select all visible'}\n />\n </TableHead>\n );\n }\n\n // Data columns\n const col = getColumnDef(colKey);\n if (!col) return null;\n if (!columnVisibility.isColumnVisible(colKey)) return null;\n\n return (\n <TableHead\n key={colKey}\n style={getColumnStyle(colKey)}\n {...getDragHandleProps(colKey)}\n className={cn(\n 'cursor-grab relative',\n dragState.draggedId === colKey && 'column-dragging opacity-50',\n showDropIndicator(colKey) && 'drop-indicator'\n )}\n >\n {renderHeaderContent(col)}\n <div {...getResizeHandleProps(colKey)} />\n </TableHead>\n );\n })}\n\n {/* Actions column header */}\n {actionsColumn && (\n <TableHead\n key=\"actions\"\n className=\"sticky right-0 z-20 bg-muted text-center relative before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border\"\n style={{ width: actionsColumnWidth, minWidth: actionsColumnWidth, maxWidth: actionsColumnWidth }}\n >\n Actions\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell\n colSpan={columnOrder.length + (actionsColumn ? 1 : 0)}\n className=\"!p-0 h-32\"\n >\n <div className=\"sticky left-0 w-screen max-w-full h-full bg-background flex justify-center items-center\">\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n Loading...\n </div>\n </div>\n </TableCell>\n </TableRow>\n ) : pagination.paginatedData.length === 0 ? null : (\n pagination.paginatedData.map((item) => {\n const rowId = getRowId(item);\n const isSelected = selectedIds?.has(rowId) ?? false;\n\n return (\n <TableRow\n key={rowId}\n className={cn(\n 'group cursor-pointer bg-background hover:bg-muted transition-none',\n isSelected && 'bg-primary/5',\n rowClassName?.(item)\n )}\n onClick={() => onRowClick?.(item)}\n onContextMenu={(e) => {\n if (onRowContextMenu) {\n e.preventDefault();\n onRowContextMenu(item, { x: e.clientX, y: e.clientY });\n }\n }}\n >\n {columnOrder.map((colKey) => {\n // Select cell (sticky on left)\n if (colKey === 'select' && selectable) {\n return (\n <TableCell\n key=\"select\"\n className={cn(\n 'sticky-select-cell w-10 sticky left-0 z-10 relative after:absolute after:right-0 after:top-0 after:bottom-0 after:w-px after:bg-border',\n 'bg-background group-hover:bg-muted',\n isSelected && 'bg-primary/5 group-hover:bg-primary/10'\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => toggleSelection(rowId)}\n className=\"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary cursor-pointer\"\n />\n </TableCell>\n );\n }\n\n // Data cells\n const col = getColumnDef(colKey);\n if (!col) return null;\n if (!columnVisibility.isColumnVisible(colKey)) return null;\n\n const cellProps = {\n columnId: colKey,\n isDragging: dragState.draggedId === colKey,\n };\n\n return (\n <TableCell\n key={colKey}\n style={getColumnStyle(colKey)}\n className={cn(\n col.className,\n dragState.draggedId === colKey && 'column-dragging'\n )}\n >\n {col.cell(item, cellProps)}\n </TableCell>\n );\n })}\n\n {/* Actions cell */}\n {actionsColumn && (\n <TableCell\n key=\"actions\"\n className={cn(\n 'sticky right-0 z-10 text-center relative before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border',\n 'bg-background group-hover:bg-muted',\n isSelected && 'bg-primary/5 group-hover:bg-primary/10'\n )}\n style={{ width: actionsColumnWidth, minWidth: actionsColumnWidth, maxWidth: actionsColumnWidth }}\n onClick={(e) => e.stopPropagation()}\n >\n {actionsColumn(item)}\n </TableCell>\n )}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Empty state - rendered outside table for proper positioning */}\n {!loading && pagination.paginatedData.length === 0 && (\n <div className=\"empty-state-container flex-1 flex items-center justify-center bg-background\">\n {emptyState || <span className=\"block text-center text-muted-foreground py-8\">No data</span>}\n </div>\n )}\n\n {/* Pagination (hidden when using external pagination controls) */}\n {!hidePagination && !loading && pagination.totalPages > 1 && (\n <Pagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n totalItems={pagination.totalItems}\n totalPages={pagination.totalPages}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n canGoPrev={pagination.canGoPrev}\n canGoNext={pagination.canGoNext}\n onPageChange={pagination.setPage}\n onPageSizeChange={pagination.setPageSize}\n onNextPage={pagination.nextPage}\n onPrevPage={pagination.prevPage}\n onFirstPage={'firstPage' in pagination ? (pagination as { firstPage: () => void }).firstPage : () => pagination.setPage(1)}\n onLastPage={'lastPage' in pagination ? (pagination as { lastPage: () => void }).lastPage : () => pagination.setPage(pagination.totalPages)}\n pageSizeOptions={pagination.pageSizeOptions}\n />\n )}\n\n {/* Header Context Menu for Column Visibility */}\n {headerContextMenu && (\n <div\n className=\"fixed z-50 min-w-[200px] overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n style={{\n top: headerContextMenu.y,\n left: headerContextMenu.x,\n maxHeight: `calc(100vh - ${headerContextMenu.y}px - 20px)`,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n Toggle columns\n </div>\n <div className=\"h-px bg-border my-1\" />\n {columnVisibility.columns.map(column => {\n const visible = columnVisibility.isColumnVisible(column.id);\n const isLocked = column.locked === true;\n return (\n <button\n key={column.id}\n onClick={() => !isLocked && columnVisibility.toggleColumn(column.id)}\n disabled={isLocked}\n className={cn(\n 'flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent',\n isLocked && 'opacity-50 cursor-not-allowed'\n )}\n >\n <div className=\"w-4 h-4 flex items-center justify-center\">\n {visible && <Check className=\"h-3.5 w-3.5 text-primary\" />}\n </div>\n <span className=\"flex-1 text-left\">{column.label}</span>\n {isLocked && <span className=\"text-xs text-muted-foreground\">Required</span>}\n </button>\n );\n })}\n <div className=\"h-px bg-border my-1\" />\n <button\n onClick={() => columnVisibility.showAllColumns()}\n className=\"flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent\"\n >\n <Eye className=\"h-4 w-4\" />\n Show All\n </button>\n <button\n onClick={() => columnVisibility.hideAllColumns()}\n className=\"flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent\"\n >\n <EyeOff className=\"h-4 w-4\" />\n Hide Optional\n </button>\n </div>\n )}\n </>\n </TooltipProvider>\n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../src/utils/cn\"\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }","import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"../../src/utils/cn\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }","/**\n * PaginationControls - Compact inline pagination for table headers\n *\n * A condensed version of pagination controls designed to sit alongside\n * search/filter controls in a table header bar.\n */\n\nimport {\n ChevronLeft,\n ChevronRight,\n} from 'lucide-react';\nimport { Button } from '../../components/base/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../components/base/select';\nimport { cn } from '../../src/utils/cn';\n\nexport interface PaginationControlsProps {\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n startIndex: number;\n endIndex: number;\n canGoNext: boolean;\n canGoPrev: boolean;\n pageSizeOptions: number[];\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n className?: string;\n}\n\nexport function PaginationControls({\n page,\n pageSize,\n totalPages,\n totalItems,\n startIndex,\n endIndex,\n canGoNext,\n canGoPrev,\n pageSizeOptions,\n setPage: _setPage,\n setPageSize,\n nextPage,\n prevPage,\n className,\n}: PaginationControlsProps) {\n // Note: setPage is included for API compatibility with usePagination but not used\n // as this component only provides prev/next navigation\n void _setPage;\n if (totalItems === 0) {\n return null;\n }\n\n return (\n <div className={cn('flex items-center gap-3 text-sm', className)}>\n {/* Page size selector - hidden on small screens */}\n <div className=\"hidden md:flex items-center gap-1.5\">\n <span className=\"text-muted-foreground hidden lg:inline\">Rows:</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => setPageSize(Number(v))}\n >\n <SelectTrigger className=\"w-16 h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Page navigation - always visible when there are multiple pages */}\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={prevPage}\n disabled={!canGoPrev}\n title=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n {/* Page indicator - hidden on very small screens */}\n <span className=\"hidden sm:inline px-2 text-muted-foreground tabular-nums min-w-[60px] text-center\">\n {page} / {totalPages}\n </span>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={nextPage}\n disabled={!canGoNext}\n title=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {/* Items info - hidden on smaller screens */}\n <span className=\"text-muted-foreground whitespace-nowrap hidden lg:inline\">\n Showing {startIndex}–{endIndex} of {totalItems}\n </span>\n </div>\n );\n}\n","/**\n * DataTablePage - Full-height data table layout with integrated header\n *\n * This component provides a desktop-app style layout where:\n * - The header contains search, filters, action buttons, AND pagination controls\n * - The data table fills the available vertical space between header and footer\n * - Pagination controls appear inline in the header (right side)\n *\n * Usage:\n * ```tsx\n * <DataTablePage\n * title=\"Issues\"\n * description=\"Review and manage detected code issues\"\n * search={searchTerm}\n * onSearchChange={setSearchTerm}\n * searchPlaceholder=\"Search issues...\"\n * filters={filterOptions}\n * activeFilterCount={countActiveFilters}\n * onClearFilters={clearFilters}\n * pagination={pagination}\n * actions={<>\n * <Button>Refresh</Button>\n * <Button>Export</Button>\n * </>}\n * >\n * <DataTable ... hidePagination />\n * </DataTablePage>\n * ```\n */\n\nimport React from 'react';\nimport { Search, Filter, X } from 'lucide-react';\nimport { Input } from '../../components/base/input';\nimport { Button } from '../../components/base/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../components/base/popover';\nimport { cn } from '../../src/utils/cn';\nimport { PaginationControls, type PaginationControlsProps } from './PaginationControls';\n\nexport interface FilterOption {\n id: string;\n label: string;\n render: () => React.ReactNode;\n}\n\nexport interface DataTablePageProps {\n /** Page title */\n title: string;\n /** Page description */\n description?: string;\n /** Search term */\n search?: string;\n /** Search change handler */\n onSearchChange?: (value: string) => void;\n /** Search placeholder text */\n searchPlaceholder?: string;\n /** Filter options for popover */\n filters?: FilterOption[];\n /** Number of active filters */\n activeFilterCount?: number;\n /** Clear all filters handler */\n onClearFilters?: () => void;\n /** Pagination props from usePagination hook */\n pagination?: PaginationControlsProps;\n /** Extra content to render next to the title (e.g. HelpTooltip) */\n titleExtra?: React.ReactNode;\n /** Action buttons to show in the header */\n actions?: React.ReactNode;\n /** Content before the table (e.g., BatchActionsBar) */\n beforeTable?: React.ReactNode;\n /** The DataTable component */\n children: React.ReactNode;\n /** Additional class for the container */\n className?: string;\n /** Whether to show a loading state */\n loading?: boolean;\n /** Loading component to show */\n loadingComponent?: React.ReactNode;\n}\n\nexport function DataTablePage({\n title,\n description,\n titleExtra,\n search,\n onSearchChange,\n searchPlaceholder = 'Search...',\n filters,\n activeFilterCount = 0,\n onClearFilters,\n pagination,\n actions,\n beforeTable,\n children,\n className,\n loading,\n loadingComponent,\n}: DataTablePageProps) {\n // Always show pagination controls when pagination is provided (for row count selector)\n const showPagination = pagination && pagination.totalItems > 0;\n\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header - has horizontal padding */}\n <div className=\"data-table-page-header flex-shrink-0 space-y-4 pb-4\">\n {/* Title */}\n <div>\n <div className=\"group flex items-center gap-2\">\n <h1 className=\"text-3xl font-bold\">{title}</h1>\n {titleExtra}\n </div>\n {description && (\n <p className=\"text-muted-foreground\">{description}</p>\n )}\n </div>\n\n {/* Controls Row: Search | Filters | Pagination | Spacer | Actions */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n {/* Search Input - responsive width */}\n {onSearchChange !== undefined && (\n <div className=\"relative w-full sm:w-auto sm:min-w-[200px] sm:max-w-xs\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-10\" />\n <Input\n placeholder={searchPlaceholder}\n value={search || ''}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"pl-9 h-9\"\n />\n {search && (\n <button\n type=\"button\"\n onClick={() => onSearchChange('')}\n className=\"absolute right-2 top-1/2 transform -translate-y-1/2 p-1 rounded-sm hover:bg-muted\"\n >\n <X className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n )}\n </div>\n )}\n\n {/* Filters Popover */}\n {filters && filters.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2 h-9\">\n <Filter className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Filters</span>\n {activeFilterCount > 0 && (\n <span className=\"rounded-full bg-primary text-primary-foreground px-2 py-0.5 text-xs font-medium\">\n {activeFilterCount}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 overflow-y-auto\"\n align=\"start\"\n collisionPadding={16}\n style={{ maxHeight: 'var(--radix-popover-content-available-height)' }}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"font-medium text-sm\">Filters</h4>\n {activeFilterCount > 0 && onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearFilters}\n className=\"h-auto p-0 text-xs text-destructive hover:text-destructive\"\n >\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"space-y-3\">\n {filters.map((filter) => (\n <div key={filter.id} className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {filter.label}\n </label>\n {filter.render()}\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Clear filters button (visible when filters are active) */}\n {activeFilterCount > 0 && onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearFilters}\n className=\"h-9 gap-1.5 text-muted-foreground hover:text-foreground\"\n title=\"Clear filters\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Clear</span>\n </Button>\n )}\n\n {/* Pagination Controls (after filters) */}\n {showPagination && (\n <PaginationControls {...pagination} />\n )}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Action buttons (right side) - never wrap */}\n {actions && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n </div>\n\n {/* Before Table Content (e.g., BatchActionsBar) - with padding */}\n {beforeTable && (\n <div className=\"px-6 pb-2\">\n {beforeTable}\n </div>\n )}\n\n {/* Table Container - edge to edge, scrolls both directions */}\n <div className=\"relative flex-1 min-h-0\">\n <div className=\"data-table-scroll-container h-full\">\n {loading ? (\n loadingComponent || (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-muted-foreground\">Loading...</div>\n </div>\n )\n ) : (\n children\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Simple Card Component\n */\n\n\nimport { cn } from '../../src/utils/cn';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport function Card({ children, className, ...props }: CardProps) {\n return (\n <div \n className={cn(\n \"bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function CardHeader({ children, className, ...props }: CardProps) {\n return (\n <div \n className={cn(\"px-6 py-4 border-b border-gray-200 dark:border-gray-700\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function CardContent({ children, className, ...props }: CardProps) {\n return (\n <div className={cn(\"px-6 py-4\", className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport function CardTitle({ children, className, ...props }: CardProps) {\n return (\n <h3 className={cn(\"text-lg font-semibold\", className)} {...props}>\n {children}\n </h3>\n );\n}","import { type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { Card } from '../../components/base/card';\nimport { Button } from '../../components/base/button';\nimport { cn } from '../../src/utils/cn';\n\nexport interface BatchActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Callback to clear selection */\n onClear: () => void;\n /** Action buttons to display on the right side */\n children: ReactNode;\n /** Label for the selected items (default: \"item\"/\"items\") */\n itemLabel?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * A horizontal bar that appears when items are selected,\n * showing the count and providing batch action buttons.\n */\nexport function BatchActionsBar({\n selectedCount,\n onClear,\n children,\n itemLabel,\n className,\n}: BatchActionsBarProps) {\n if (selectedCount === 0) return null;\n\n const label = itemLabel ?? (selectedCount === 1 ? 'item' : 'items');\n\n return (\n <Card className={cn(\"p-3 bg-primary/5 border-primary/20\", className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"font-medium text-sm\" role=\"status\" aria-live=\"polite\">\n {selectedCount} {label} selected\n </span>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClear} aria-label=\"Clear selection\">\n <X className=\"h-4 w-4 mr-1\" aria-hidden=\"true\" />\n Clear\n </Button>\n </div>\n <div className=\"flex items-center gap-2\" role=\"group\" aria-label=\"Batch actions\">\n {children}\n </div>\n </div>\n </Card>\n );\n}\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport { cn } from \"../../src/utils/cn\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};","import { Columns3, Check, Eye, EyeOff } from 'lucide-react';\nimport { Button } from '../../components/base/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../components/base/dropdown-menu';\nimport { cn } from '../../src/utils/cn';\nimport type { ColumnConfig } from '../hooks/useColumnVisibility';\n\ninterface ColumnVisibilityProps {\n columns: ColumnConfig[];\n isColumnVisible: (columnId: string) => boolean;\n toggleColumn: (columnId: string) => void;\n showAllColumns: () => void;\n hideAllColumns: () => void;\n}\n\nexport function ColumnVisibility({\n columns,\n isColumnVisible,\n toggleColumn,\n showAllColumns,\n hideAllColumns,\n}: ColumnVisibilityProps) {\n const visibleCount = columns.filter(c => isColumnVisible(c.id)).length;\n const toggleableColumns = columns.filter(c => !c.locked);\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Columns3 className=\"h-4 w-4\" />\n Columns\n <span className=\"text-muted-foreground text-xs\">\n ({visibleCount}/{columns.length})\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel className=\"font-normal text-xs text-muted-foreground\">\n Toggle columns\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n\n {columns.map(column => {\n const visible = isColumnVisible(column.id);\n const isLocked = column.locked === true;\n\n return (\n <DropdownMenuItem\n key={column.id}\n onClick={(e) => {\n e.preventDefault();\n if (!isLocked) {\n toggleColumn(column.id);\n }\n }}\n className={cn(\n 'gap-2 cursor-pointer',\n isLocked && 'opacity-50 cursor-not-allowed'\n )}\n disabled={isLocked}\n >\n <div className=\"w-4 h-4 flex items-center justify-center\">\n {visible ? (\n <Check className=\"h-3.5 w-3.5 text-primary\" />\n ) : (\n <div className=\"h-3.5 w-3.5\" />\n )}\n </div>\n <span className=\"flex-1\">{column.label}</span>\n {isLocked && (\n <span className=\"text-xs text-muted-foreground\">Required</span>\n )}\n </DropdownMenuItem>\n );\n })}\n\n {toggleableColumns.length > 1 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={(e) => {\n e.preventDefault();\n showAllColumns();\n }}\n className=\"gap-2 cursor-pointer\"\n >\n <Eye className=\"h-4 w-4\" />\n Show All\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={(e) => {\n e.preventDefault();\n hideAllColumns();\n }}\n className=\"gap-2 cursor-pointer\"\n >\n <EyeOff className=\"h-4 w-4\" />\n Hide Optional\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import React from 'react';\nimport { Search, Filter, X } from 'lucide-react';\nimport { Input } from '../../components/base/input';\nimport { Button } from '../../components/base/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../components/base/popover';\nimport { cn } from '../../src/utils/cn';\n\nexport interface FilterOption {\n id: string;\n label: string;\n render: () => React.ReactNode;\n /** Filter type - 'multi' filters get more horizontal space */\n type?: 'single' | 'multi';\n}\n\nexport interface TableFiltersProps {\n search?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n filters?: FilterOption[];\n activeFilterCount?: number;\n onClearFilters?: () => void;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * TableFilters - Compact filter controls for data tables\n *\n * Features:\n * - Search input\n * - Popover filter menu with badge showing active count\n * - Clear all filters button\n * - Custom filter components via render prop\n * - Children slot for additional action buttons\n */\nexport function TableFilters({\n search,\n onSearchChange,\n searchPlaceholder = 'Search...',\n filters,\n activeFilterCount = 0,\n onClearFilters,\n className,\n children,\n}: TableFiltersProps) {\n // Check if any filter needs wider layout (multi-select filters)\n const hasMultiFilters = filters?.some(f => f.type === 'multi');\n const popoverWidth = hasMultiFilters ? 'w-[420px]' : 'w-80';\n\n return (\n <div className={cn('flex items-center gap-3 flex-wrap', className)}>\n {/* Search Input */}\n {onSearchChange !== undefined && (\n <div className=\"relative flex-1 min-w-[200px] max-w-xs\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-10\" />\n <Input\n placeholder={searchPlaceholder}\n value={search || ''}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"pl-9 h-9\"\n />\n {search && (\n <button\n type=\"button\"\n onClick={() => onSearchChange('')}\n className=\"absolute right-2 top-1/2 transform -translate-y-1/2 p-1 rounded-sm hover:bg-muted\"\n >\n <X className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n )}\n </div>\n )}\n\n {/* Filters Popover */}\n {filters && filters.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2 h-9\">\n <Filter className=\"h-4 w-4\" />\n Filters\n {activeFilterCount > 0 && (\n <span className=\"ml-1 rounded-full bg-primary text-primary-foreground px-2 py-0.5 text-xs font-medium\">\n {activeFilterCount}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(popoverWidth, 'overflow-y-auto')}\n align=\"start\"\n collisionPadding={16}\n style={{ maxHeight: 'var(--radix-popover-content-available-height)' }}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"font-medium text-sm\">Filters</h4>\n {activeFilterCount > 0 && onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearFilters}\n className=\"h-auto p-0 text-xs text-destructive hover:text-destructive\"\n >\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"space-y-4\">\n {filters.map((filter) => (\n <div key={filter.id} className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {filter.label}\n </label>\n {filter.render()}\n </div>\n ))}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Clear filters button (visible when filters are active, outside popover) */}\n {activeFilterCount > 0 && onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearFilters}\n className=\"h-9 gap-1.5 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n Clear\n </Button>\n )}\n\n {/* Spacer to push children to the right */}\n <div className=\"flex-1\" />\n\n {/* Custom children (e.g., export button, create button, etc.) */}\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../src/utils/cn\";\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };","import React from 'react';\nimport { Checkbox } from '../../components/base/checkbox';\nimport { Button } from '../../components/base/button';\nimport { cn } from '../../src/utils/cn';\n\nexport interface MultiSelectOption<T extends string = string> {\n /** Unique value for this option */\n value: T;\n /** Display label */\n label: string;\n /** Optional custom render for the label (e.g., with icon/flag) */\n render?: () => React.ReactNode;\n}\n\nexport interface MultiSelectFilterProps<T extends string = string> {\n /** Available options to select from */\n options: MultiSelectOption<T>[];\n /** Currently selected values */\n selected: Set<T>;\n /** Called when selection changes */\n onChange: (selected: Set<T>) => void;\n /** Maximum height before scrolling (default: 200px) */\n maxHeight?: number;\n /** Number of columns for grid layout (default: 2) */\n columns?: 1 | 2 | 3;\n /** Show select all / clear buttons */\n showBulkActions?: boolean;\n /** Optional className for the container */\n className?: string;\n}\n\n/**\n * MultiSelectFilter - A checkbox-based multi-select filter component\n *\n * Designed to work with the TableFilters popover for filtering data tables.\n * Supports custom rendering per option (for flags, badges, icons, etc.)\n */\nexport function MultiSelectFilter<T extends string = string>({\n options,\n selected,\n onChange,\n maxHeight = 200,\n columns = 2,\n showBulkActions = true,\n className,\n}: MultiSelectFilterProps<T>) {\n const handleToggle = (value: T) => {\n const newSelected = new Set(selected);\n if (newSelected.has(value)) {\n newSelected.delete(value);\n } else {\n newSelected.add(value);\n }\n onChange(newSelected);\n };\n\n const handleSelectAll = () => {\n onChange(new Set(options.map(o => o.value)));\n };\n\n const handleClear = () => {\n onChange(new Set());\n };\n\n const gridCols = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n };\n\n const allSelected = options.length > 0 && selected.size === options.length;\n const noneSelected = selected.size === 0;\n\n return (\n <div className={cn('space-y-2', className)}>\n {/* Bulk action buttons */}\n {showBulkActions && options.length > 3 && (\n <div className=\"flex items-center gap-2 text-xs\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleSelectAll}\n disabled={allSelected}\n className=\"h-6 px-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n Select all\n </Button>\n <span className=\"text-muted-foreground\">·</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClear}\n disabled={noneSelected}\n className=\"h-6 px-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n Clear\n </Button>\n {selected.size > 0 && (\n <>\n <span className=\"text-muted-foreground\">·</span>\n <span className=\"text-muted-foreground\">\n {selected.size} selected\n </span>\n </>\n )}\n </div>\n )}\n\n {/* Options grid */}\n <div\n className={cn('overflow-y-auto', options.length > 6 && 'pr-1')}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n <div className={cn('grid gap-1', gridCols[columns])}>\n {options.map((option) => (\n <label\n key={option.value}\n className={cn(\n 'flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer',\n 'hover:bg-muted/50 transition-colors',\n selected.has(option.value) && 'bg-muted/30'\n )}\n >\n <Checkbox\n checked={selected.has(option.value)}\n onCheckedChange={() => handleToggle(option.value)}\n className=\"h-3.5 w-3.5\"\n />\n {option.render ? (\n <span className=\"flex items-center gap-1.5 text-sm truncate\">\n {option.render()}\n </span>\n ) : (\n <span className=\"text-sm truncate\">{option.label}</span>\n )}\n </label>\n ))}\n </div>\n </div>\n\n {/* Empty state */}\n {options.length === 0 && (\n <div className=\"text-sm text-muted-foreground text-center py-2\">\n No options available\n </div>\n )}\n </div>\n );\n}\n\nexport default MultiSelectFilter;\n"]}
@@ -0,0 +1,2 @@
1
+ import*as G from'react';import {useState,useMemo,useEffect,useCallback,useRef}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import*as ee from'@radix-ui/react-tooltip';import {ChevronDown,ChevronUp,Check,ChevronRight,Circle,ChevronsLeft,ChevronLeft,ChevronsRight,ArrowUpDown,Loader2,Eye,EyeOff,Search,X,Filter,Columns3}from'lucide-react';import {Slot}from'@radix-ui/react-slot';import {cva}from'class-variance-authority';import*as x from'@radix-ui/react-select';import*as _ from'@radix-ui/react-popover';import*as P from'@radix-ui/react-dropdown-menu';import*as Pe from'@radix-ui/react-checkbox';var Ft=25,Gt=[10,25,50,100];function Ne({data:e,pageSize:t=Ft,storageKey:o}){let[r,m]=useState(()=>{if(o)try{let b=localStorage.getItem(`pagination-${o}`);if(b)return {page:1,pageSize:JSON.parse(b).pageSize||t}}catch{}return {page:1,pageSize:t}}),{page:c,pageSize:f}=r,u=useMemo(()=>Math.max(1,Math.ceil(e.length/f)),[e.length,f]);useEffect(()=>{c>u&&m(b=>({...b,page:Math.max(1,u)}));},[u,c]),useEffect(()=>{if(o)try{localStorage.setItem(`pagination-${o}`,JSON.stringify({pageSize:f}));}catch{}},[f,o]);let g=(c-1)*f,a=Math.min(g+f,e.length),l=useMemo(()=>e.slice(g,a),[e,g,a]),s=useCallback(b=>{m(T=>({...T,page:Math.max(1,Math.min(b,u))}));},[u]),p=useCallback(b=>{m({page:1,pageSize:b});},[]),d=useCallback(()=>{s(c+1);},[c,s]),v=useCallback(()=>{s(c-1);},[c,s]),k=useCallback(()=>{s(1);},[s]),B=useCallback(()=>{s(u);},[u,s]);return {paginatedData:l,page:c,pageSize:f,totalPages:u,totalItems:e.length,setPage:s,setPageSize:p,nextPage:d,prevPage:v,firstPage:k,lastPage:B,startIndex:g+1,endIndex:a,canGoNext:c<u,canGoPrev:c>1,pageSizeOptions:Gt}}function Re({columns:e,storageKey:t}){let o=`column-visibility-${t}`,[r,m]=useState(()=>{let a={};if(e.forEach(l=>{a[l.id]=l.defaultVisible!==false;}),typeof window>"u")return a;try{let l=localStorage.getItem(o);if(l){let s=JSON.parse(l),p={};return e.forEach(d=>{d.locked?p[d.id]=!0:s[d.id]!==void 0?p[d.id]=s[d.id]:p[d.id]=d.defaultVisible!==!1;}),p}}catch(l){console.error("Error loading column visibility state:",l);}return a});useEffect(()=>{if(!(typeof window>"u"))try{localStorage.setItem(o,JSON.stringify(r));}catch(a){console.error("Error saving column visibility state:",a);}},[r,o]);let c=useCallback(a=>e.find(s=>s.id===a)?.locked?true:r[a]!==false,[r,e]),f=useCallback(a=>{e.find(s=>s.id===a)?.locked||m(s=>({...s,[a]:!s[a]}));},[e]),u=useCallback(()=>{let a={};e.forEach(l=>{a[l.id]=true;}),m(a);},[e]),g=useCallback(()=>{let a={};e.forEach(l=>{a[l.id]=l.locked===true;}),m(a);},[e]);return {visibleColumns:r,isColumnVisible:c,toggleColumn:f,showAllColumns:u,hideAllColumns:g,columns:e}}var it=50,De=150,$t=3;function Me({tableId:e,columns:t,storageKey:o}){let r=o||`table-columns-${e}`,m=useCallback(()=>t.reduce((y,h)=>(y[h.key]=h.defaultWidth||De,y),{}),[t]),[c,f]=useState(()=>{try{let y=localStorage.getItem(r);if(y){let h=JSON.parse(y);return {widths:{...m(),...h},isResizing:!1,resizingColumn:null}}}catch{}return {widths:m(),isResizing:false,resizingColumn:null}}),u=useRef(0),g=useRef(0),a=useRef(null),l=useRef(false),s=useRef(t);useEffect(()=>{s.current=t;},[t]);let p=useCallback(y=>s.current.find(h=>h.key===y),[]);useEffect(()=>{try{localStorage.setItem(r,JSON.stringify(c.widths));}catch{}},[c.widths,r]);let d=useRef(null);d.current||(d.current={onPointerMove:y=>{if(!a.current)return;let h=y.clientX-u.current;if(!l.current){if(Math.abs(h)<$t)return;l.current=true,f(re=>({...re,isResizing:true,resizingColumn:a.current})),document.body.style.cursor="col-resize",document.body.style.userSelect="none";}let oe=p(a.current),de=oe?.minWidth||it,we=oe?.maxWidth,me=Math.max(de,g.current+h);we&&(me=Math.min(we,me)),f(re=>({...re,widths:{...re.widths,[a.current]:me}}));},onPointerUp:()=>{a.current=null,l.current=false,f(y=>({...y,isResizing:false,resizingColumn:null})),document.removeEventListener("pointermove",d.current.onPointerMove),document.removeEventListener("pointerup",d.current.onPointerUp),document.removeEventListener("pointercancel",d.current.onPointerUp),document.body.style.cursor="",document.body.style.userSelect="";}}),useEffect(()=>()=>{d.current&&(document.removeEventListener("pointermove",d.current.onPointerMove),document.removeEventListener("pointerup",d.current.onPointerUp),document.removeEventListener("pointercancel",d.current.onPointerUp)),document.body.style.cursor="",document.body.style.userSelect="";},[]);let v=useRef(c.widths);useEffect(()=>{v.current=c.widths;},[c.widths]);let k=useCallback((y,h)=>{u.current=h,g.current=v.current[y]||De,a.current=y,l.current=false,document.addEventListener("pointermove",d.current.onPointerMove),document.addEventListener("pointerup",d.current.onPointerUp),document.addEventListener("pointercancel",d.current.onPointerUp);},[]),B=useCallback(y=>({onPointerDown:h=>{h.preventDefault(),h.stopPropagation(),k(y,h.clientX);},onMouseDown:h=>{h.preventDefault(),h.stopPropagation();},draggable:false,onDragStart:h=>{h.preventDefault(),h.stopPropagation();},className:"resize-handle","data-resizing":c.resizingColumn===y}),[k,c.resizingColumn]),b=useCallback(y=>{let h=c.widths[y]||De,de=p(y)?.minWidth||it;return {width:h,minWidth:de,position:"relative"}},[c.widths,p]),T=t.reduce((y,h)=>y+(c.widths[h.key]||h.defaultWidth||De),0),W=useCallback(()=>({minWidth:T}),[T]),$=useCallback(()=>{f(y=>({...y,widths:m()}));},[m]);return {widths:c.widths,isResizing:c.isResizing,totalWidth:T,getResizeHandleProps:B,getColumnStyle:b,getTableStyle:W,resetToDefaults:$}}function ke({storageKey:e,defaultOrder:t}){let[o,r]=useState(()=>{try{let g=localStorage.getItem(e);if(g){let a=JSON.parse(g),l=new Set(a),s=new Set(t),p=a.filter(v=>s.has(v)),d=t.filter(v=>!l.has(v));if(d.length>0){let v=[...p];for(let k of d){let B=t.indexOf(k),b=v.length;for(let T=0;T<v.length;T++)if(t.indexOf(v[T])>B){b=T;break}v.splice(b,0,k);}return v}return p.length>0?p:t}}catch(g){console.warn("Failed to load column order from localStorage:",g);}return t});useEffect(()=>{try{localStorage.setItem(e,JSON.stringify(o));}catch(g){console.warn("Failed to save column order to localStorage:",g);}},[e,o]);let m=useCallback((g,a)=>{g!==a&&r(l=>{let s=[...l],[p]=s.splice(g,1);return p!==void 0&&s.splice(a,0,p),s});},[]),c=useCallback((g,a)=>{r(l=>{let s=l.indexOf(g);if(s===-1)return l;let p=a==="left"?Math.max(0,s-1):Math.min(l.length-1,s+1);if(s===p)return l;let d=[...l],[v]=d.splice(s,1);return v!==void 0&&d.splice(p,0,v),d});},[]),f=useCallback(()=>{r(t);},[t]),u=useCallback(g=>{let a=new Map(g.map(l=>[l.id,l]));return o.map(l=>a.get(l)).filter(l=>l!==void 0)},[o]);return {columnOrder:o,moveColumn:m,moveColumnById:c,resetOrder:f,getOrderedColumns:u}}function Ie(e,t,o=[]){let[r,m]=useState({isDragging:false,draggedId:null,dropIndex:null}),c=useCallback(s=>{o.includes(s)||m({isDragging:true,draggedId:s,dropIndex:null});},[o]),f=useCallback((s,p)=>{if(o.includes(s))return;let d=e.indexOf(s);if(d===-1)return;let v=p.currentTarget.getBoundingClientRect(),k=v.left+v.width/2,B=p.clientX<k?d:d+1;m(b=>({...b,dropIndex:B}));},[o,e]),u=useCallback(()=>{if(!r.draggedId||r.dropIndex===null){m({isDragging:false,draggedId:null,dropIndex:null});return}let s=e.indexOf(r.draggedId),p=r.dropIndex;s<p&&(p=p-1),s!==-1&&p!==-1&&s!==p&&t(s,p),m({isDragging:false,draggedId:null,dropIndex:null});},[r.draggedId,r.dropIndex,e,t]),g=useCallback(()=>{m({isDragging:false,draggedId:null,dropIndex:null});},[]),a=useCallback(s=>({draggable:!o.includes(s),onDragStart:p=>{if(o.includes(s)){p.preventDefault();return}p.dataTransfer.effectAllowed="move",c(s);},onDragOver:p=>{p.preventDefault(),p.dataTransfer.dropEffect="move",f(s,p);},onDrop:p=>{p.preventDefault(),u();},onDragEnd:g}),[o,c,f,u,g]),l=useCallback(s=>!r.isDragging||r.dropIndex===null?false:e.indexOf(s)===r.dropIndex,[r.isDragging,r.dropIndex,e]);return {dragState:r,getDragHandleProps:a,showDropIndicator:l}}function i(...e){return twMerge(clsx(e))}var Fe=G.forwardRef(({className:e,...t},o)=>jsx("div",{className:"relative w-full overflow-auto",children:jsx("table",{ref:o,className:i("w-full caption-bottom text-sm",e),...t})}));Fe.displayName="Table";var Ge=G.forwardRef(({className:e,...t},o)=>jsx("thead",{ref:o,className:i("[&_tr]:border-b",e),...t}));Ge.displayName="TableHeader";var _e=G.forwardRef(({className:e,...t},o)=>jsx("tbody",{ref:o,className:i("[&_tr:last-child]:border-0",e),...t}));_e.displayName="TableBody";var jt=G.forwardRef(({className:e,...t},o)=>jsx("tfoot",{ref:o,className:i("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...t}));jt.displayName="TableFooter";var ce=G.forwardRef(({className:e,...t},o)=>jsx("tr",{ref:o,className:i("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",e),...t}));ce.displayName="TableRow";var pe=G.forwardRef(({className:e,...t},o)=>jsx("th",{ref:o,className:i("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",e),...t}));pe.displayName="TableHead";var ae=G.forwardRef(({className:e,...t},o)=>jsx("td",{ref:o,className:i("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));ae.displayName="TableCell";var Qt=G.forwardRef(({className:e,...t},o)=>jsx("caption",{ref:o,className:i("mt-4 text-sm text-muted-foreground",e),...t}));Qt.displayName="TableCaption";var lt=ee.Provider;var Kt=G.forwardRef(({className:e,sideOffset:t=4,...o},r)=>jsx(ee.Content,{ref:r,sideOffset:t,className:i("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...o}));Kt.displayName=ee.Content.displayName;var ro=cva("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),S=G.forwardRef(({className:e,variant:t,size:o,asChild:r=false,...m},c)=>jsx(r?Slot:"button",{className:i(ro({variant:t,size:o,className:e})),ref:c,...m}));S.displayName="Button";var ze=x.Root;var Ee=x.Value,ue=G.forwardRef(({className:e,children:t,...o},r)=>jsxs(x.Trigger,{ref:r,className:i("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",e),...o,children:[t,jsx(x.Icon,{asChild:true,children:jsx(ChevronDown,{className:"h-4 w-4 opacity-50"})})]}));ue.displayName=x.Trigger.displayName;var ct=G.forwardRef(({className:e,...t},o)=>jsx(x.ScrollUpButton,{ref:o,className:i("flex cursor-default items-center justify-center py-1",e),...t,children:jsx(ChevronUp,{className:"h-4 w-4"})}));ct.displayName=x.ScrollUpButton.displayName;var pt=G.forwardRef(({className:e,...t},o)=>jsx(x.ScrollDownButton,{ref:o,className:i("flex cursor-default items-center justify-center py-1",e),...t,children:jsx(ChevronDown,{className:"h-4 w-4"})}));pt.displayName=x.ScrollDownButton.displayName;var fe=G.forwardRef(({className:e,children:t,position:o="popper",...r},m)=>jsx(x.Portal,{children:jsxs(x.Content,{ref:m,className:i("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",o==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:o,...r,children:[jsx(ct,{}),jsx(x.Viewport,{className:i("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t}),jsx(pt,{})]})}));fe.displayName=x.Content.displayName;var so=G.forwardRef(({className:e,...t},o)=>jsx(x.Label,{ref:o,className:i("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...t}));so.displayName=x.Label.displayName;var ge=G.forwardRef(({className:e,children:t,...o},r)=>jsxs(x.Item,{ref:r,className:i("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...o,children:[jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(x.ItemIndicator,{children:jsx(Check,{className:"h-4 w-4"})})}),jsx(x.ItemText,{children:t})]}));ge.displayName=x.Item.displayName;var lo=G.forwardRef(({className:e,...t},o)=>jsx(x.Separator,{ref:o,className:i("-mx-1 my-1 h-px bg-muted",e),...t}));lo.displayName=x.Separator.displayName;function Le({page:e,pageSize:t,totalPages:o,totalItems:r,startIndex:m,endIndex:c,canGoNext:f,canGoPrev:u,pageSizeOptions:g,onPageChange:a,onPageSizeChange:l,onNextPage:s,onPrevPage:p,onFirstPage:d,onLastPage:v,className:k}){let B=()=>{let b=[],W=Math.floor(2.5),$=Math.max(1,e-W),y=Math.min(o,e+W);e<=W&&(y=Math.min(o,5)),e>o-W&&($=Math.max(1,o-5+1)),$>1&&(b.push(1),$>2&&b.push("ellipsis"));for(let h=$;h<=y;h++)h!==1&&h!==o&&b.push(h);return y<o&&(y<o-1&&b.push("ellipsis"),b.push(o)),b};return r===0?null:jsxs("div",{className:i("flex flex-col sm:flex-row items-center justify-between gap-4 px-2 py-3",k),children:[jsxs("div",{className:"text-sm text-muted-foreground",children:["Showing ",m," to ",c," of ",r," items"]}),jsxs("div",{className:"flex items-center gap-4",children:[jsxs("div",{className:"flex items-center gap-2",children:[jsx("span",{className:"text-sm text-muted-foreground",children:"Per page:"}),jsxs(ze,{value:String(t),onValueChange:b=>l(Number(b)),children:[jsx(ue,{className:"w-20 h-8",children:jsx(Ee,{})}),jsx(fe,{children:g.map(b=>jsx(ge,{value:String(b),children:b},b))})]})]}),jsxs("div",{className:"flex items-center gap-1",children:[jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:d,disabled:!u,title:"First page",children:jsx(ChevronsLeft,{className:"h-4 w-4"})}),jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:p,disabled:!u,title:"Previous page",children:jsx(ChevronLeft,{className:"h-4 w-4"})}),jsx("div",{className:"flex items-center gap-1",children:B().map((b,T)=>b==="ellipsis"?jsx("span",{className:"px-2 text-muted-foreground",children:"..."},`ellipsis-${T}`):jsx(S,{variant:e===b?"default":"outline",size:"icon",className:"h-8 w-8",onClick:()=>a(b),children:b},b))}),jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:s,disabled:!f,title:"Next page",children:jsx(ChevronRight,{className:"h-4 w-4"})}),jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:v,disabled:!f,title:"Last page",children:jsx(ChevronsRight,{className:"h-4 w-4"})})]})]})]})}function ut({data:e,columns:t,storageKey:o,getRowId:r,selectable:m=false,selectedIds:c,onSelectionChange:f,onRowClick:u,onRowContextMenu:g,sortField:a,sortOrder:l,onSort:s,actionsColumn:p,actionsColumnWidth:d=80,pageSize:v=25,pagination:k,hidePagination:B=false,className:b,rowClassName:T,enableHeaderContextMenu:W=true,lockedColumns:$=[],defaultColumnOrder:y,loading:h=false,emptyState:oe}){let de=useMemo(()=>{let n=[];return m&&n.push({key:"select",defaultWidth:40,minWidth:40}),t.forEach(N=>{n.push({key:N.id,defaultWidth:N.width?.default??150,minWidth:N.width?.min??80,maxWidth:N.width?.max});}),p&&n.push({key:"actions",defaultWidth:d,minWidth:60}),n},[t,m,p,d]),we=useMemo(()=>t.map(n=>({id:n.id,label:typeof n.header=="string"?n.header:n.id,defaultVisible:n.visibility?.default??true,locked:n.visibility?.locked})),[t]),me=useMemo(()=>{if(y)return y;let n=[];return m&&n.push("select"),t.forEach(N=>n.push(N.id)),p&&n.push("actions"),n},[y,t,m,p]),{getResizeHandleProps:re,getColumnStyle:Qe,getTableStyle:Dt}=Me({tableId:o,columns:de}),j=Re({columns:we,storageKey:o}),{columnOrder:Ce,moveColumn:Mt}=ke({storageKey:`${o}-order`,defaultOrder:me}),{dragState:Ae,getDragHandleProps:kt,showDropIndicator:It}=Ie(Ce,Mt,[...$,"select","actions"]),zt=Ne({data:e,pageSize:v,storageKey:o}),w=k||zt,[ne,Ke]=useState(null),Et=useCallback(n=>{W&&(n.preventDefault(),Ke({x:n.clientX,y:n.clientY}));},[W]);useEffect(()=>{if(!ne)return;let n=()=>Ke(null);return window.addEventListener("click",n),()=>{window.removeEventListener("click",n);}},[ne]);let et=useMemo(()=>!m||!c||w.paginatedData.length===0?false:w.paginatedData.every(n=>c.has(r(n))),[m,c,w.paginatedData,r]),Lt=useMemo(()=>{if(!m||!c)return false;let n=w.paginatedData.filter(N=>c.has(r(N)));return n.length>0&&n.length<w.paginatedData.length},[m,c,w.paginatedData,r]),Bt=useCallback(n=>{if(!f||!c)return;let N=new Set(c);N.has(n)?N.delete(n):N.add(n),f(N);},[c,f]),Ht=useCallback(()=>{if(!f)return;let n=new Set(w.paginatedData.map(r));f(n);},[w.paginatedData,r,f]),Ot=useCallback(()=>{f&&f(new Set);},[f]),tt=useCallback(n=>a!==n?jsx(ArrowUpDown,{className:"h-3.5 w-3.5 text-muted-foreground"}):l==="asc"?jsx(ChevronUp,{className:"h-3.5 w-3.5"}):jsx(ChevronDown,{className:"h-3.5 w-3.5"}),[a,l]),ot=useCallback(n=>t.find(N=>N.id===n),[t]),Vt=useCallback(n=>{let N={columnId:n.id,isSorted:a===n.sortKey,sortDirection:a===n.sortKey?l:void 0};return typeof n.header=="function"?n.header(N):n.sortKey&&s?jsxs("button",{onClick:()=>s(n.sortKey),className:i("flex items-center gap-1 hover:text-foreground transition-colors",a===n.sortKey&&"text-foreground font-medium"),children:[n.header,tt(n.sortKey)]}):n.header},[a,l,s,tt]);return jsx(lt,{children:jsxs(Fragment,{children:[jsx("div",{className:"overflow-auto border rounded-lg h-full",children:jsxs(Fe,{style:Dt(),className:i("resizable-table sticky-actions-table",b),children:[jsx(Ge,{className:"sticky top-0 z-20 bg-muted",children:jsxs(ce,{onContextMenu:Et,className:"border-t-0",children:[Ce.map(n=>{if(n==="select"&&m)return jsx(pe,{className:"sticky-select-header w-10 sticky left-0 z-20 bg-muted relative after:absolute after:right-0 after:top-0 after:bottom-0 after:w-px after:bg-border",children:jsx("input",{type:"checkbox",checked:et,ref:I=>{I&&(I.indeterminate=Lt);},onChange:I=>I.target.checked?Ht():Ot(),className:"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary cursor-pointer",title:et?"Deselect all":"Select all visible"})},"select");let N=ot(n);return !N||!j.isColumnVisible(n)?null:jsxs(pe,{style:Qe(n),...kt(n),className:i("cursor-grab relative",Ae.draggedId===n&&"column-dragging opacity-50",It(n)&&"drop-indicator"),children:[Vt(N),jsx("div",{...re(n)})]},n)}),p&&jsx(pe,{className:"sticky right-0 z-20 bg-muted text-center relative before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border",style:{width:d,minWidth:d,maxWidth:d},children:"Actions"},"actions")]})}),jsx(_e,{children:h?jsx(ce,{children:jsx(ae,{colSpan:Ce.length+(p?1:0),className:"!p-0 h-32",children:jsx("div",{className:"sticky left-0 w-screen max-w-full h-full bg-background flex justify-center items-center",children:jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[jsx(Loader2,{className:"h-5 w-5 animate-spin"}),"Loading..."]})})})}):w.paginatedData.length===0?null:w.paginatedData.map(n=>{let N=r(n),I=c?.has(N)??false;return jsxs(ce,{className:i("group cursor-pointer bg-background hover:bg-muted transition-none",I&&"bg-primary/5",T?.(n)),onClick:()=>u?.(n),onContextMenu:z=>{g&&(z.preventDefault(),g(n,{x:z.clientX,y:z.clientY}));},children:[Ce.map(z=>{if(z==="select"&&m)return jsx(ae,{className:i("sticky-select-cell w-10 sticky left-0 z-10 relative after:absolute after:right-0 after:top-0 after:bottom-0 after:w-px after:bg-border","bg-background group-hover:bg-muted",I&&"bg-primary/5 group-hover:bg-primary/10"),onClick:At=>At.stopPropagation(),children:jsx("input",{type:"checkbox",checked:I,onChange:()=>Bt(N),className:"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary cursor-pointer"})},"select");let Ue=ot(z);if(!Ue||!j.isColumnVisible(z))return null;let Wt={columnId:z,isDragging:Ae.draggedId===z};return jsx(ae,{style:Qe(z),className:i(Ue.className,Ae.draggedId===z&&"column-dragging"),children:Ue.cell(n,Wt)},z)}),p&&jsx(ae,{className:i("sticky right-0 z-10 text-center relative before:absolute before:left-0 before:top-0 before:bottom-0 before:w-px before:bg-border","bg-background group-hover:bg-muted",I&&"bg-primary/5 group-hover:bg-primary/10"),style:{width:d,minWidth:d,maxWidth:d},onClick:z=>z.stopPropagation(),children:p(n)},"actions")]},N)})})]})}),!h&&w.paginatedData.length===0&&jsx("div",{className:"empty-state-container flex-1 flex items-center justify-center bg-background",children:oe||jsx("span",{className:"block text-center text-muted-foreground py-8",children:"No data"})}),!B&&!h&&w.totalPages>1&&jsx(Le,{page:w.page,pageSize:w.pageSize,totalItems:w.totalItems,totalPages:w.totalPages,startIndex:w.startIndex,endIndex:w.endIndex,canGoPrev:w.canGoPrev,canGoNext:w.canGoNext,onPageChange:w.setPage,onPageSizeChange:w.setPageSize,onNextPage:w.nextPage,onPrevPage:w.prevPage,onFirstPage:"firstPage"in w?w.firstPage:()=>w.setPage(1),onLastPage:"lastPage"in w?w.lastPage:()=>w.setPage(w.totalPages),pageSizeOptions:w.pageSizeOptions}),ne&&jsxs("div",{className:"fixed z-50 min-w-[200px] overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95",style:{top:ne.y,left:ne.x,maxHeight:`calc(100vh - ${ne.y}px - 20px)`},onClick:n=>n.stopPropagation(),children:[jsx("div",{className:"px-2 py-1.5 text-xs font-medium text-muted-foreground",children:"Toggle columns"}),jsx("div",{className:"h-px bg-border my-1"}),j.columns.map(n=>{let N=j.isColumnVisible(n.id),I=n.locked===true;return jsxs("button",{onClick:()=>!I&&j.toggleColumn(n.id),disabled:I,className:i("flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent",I&&"opacity-50 cursor-not-allowed"),children:[jsx("div",{className:"w-4 h-4 flex items-center justify-center",children:N&&jsx(Check,{className:"h-3.5 w-3.5 text-primary"})}),jsx("span",{className:"flex-1 text-left",children:n.label}),I&&jsx("span",{className:"text-xs text-muted-foreground",children:"Required"})]},n.id)}),jsx("div",{className:"h-px bg-border my-1"}),jsxs("button",{onClick:()=>j.showAllColumns(),className:"flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent",children:[jsx(Eye,{className:"h-4 w-4"}),"Show All"]}),jsxs("button",{onClick:()=>j.hideAllColumns(),className:"flex items-center gap-2 w-full px-2 py-1.5 text-sm rounded-sm hover:bg-accent",children:[jsx(EyeOff,{className:"h-4 w-4"}),"Hide Optional"]})]})]})})}var ve=G.forwardRef(({className:e,type:t,...o},r)=>jsx("input",{type:t,className:i("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...o}));ve.displayName="Input";var Be=_.Root,He=_.Trigger,he=G.forwardRef(({className:e,align:t="center",sideOffset:o=4,...r},m)=>jsx(_.Portal,{children:jsx(_.Content,{ref:m,align:t,sideOffset:o,className:i("z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));he.displayName=_.Content.displayName;function Oe({page:e,pageSize:t,totalPages:o,totalItems:r,startIndex:m,endIndex:c,canGoNext:f,canGoPrev:u,pageSizeOptions:g,setPage:a,setPageSize:l,nextPage:s,prevPage:p,className:d}){return r===0?null:jsxs("div",{className:i("flex items-center gap-3 text-sm",d),children:[jsxs("div",{className:"hidden md:flex items-center gap-1.5",children:[jsx("span",{className:"text-muted-foreground hidden lg:inline",children:"Rows:"}),jsxs(ze,{value:String(t),onValueChange:v=>l(Number(v)),children:[jsx(ue,{className:"w-16 h-8 text-xs",children:jsx(Ee,{})}),jsx(fe,{children:g.map(v=>jsx(ge,{value:String(v),children:v},v))})]})]}),o>1&&jsxs("div",{className:"flex items-center gap-1",children:[jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:p,disabled:!u,title:"Previous page",children:jsx(ChevronLeft,{className:"h-4 w-4"})}),jsxs("span",{className:"hidden sm:inline px-2 text-muted-foreground tabular-nums min-w-[60px] text-center",children:[e," / ",o]}),jsx(S,{variant:"outline",size:"icon",className:"h-8 w-8",onClick:s,disabled:!f,title:"Next page",children:jsx(ChevronRight,{className:"h-4 w-4"})})]}),jsxs("span",{className:"text-muted-foreground whitespace-nowrap hidden lg:inline",children:["Showing ",m,"\u2013",c," of ",r]})]})}function ht({title:e,description:t,titleExtra:o,search:r,onSearchChange:m,searchPlaceholder:c="Search...",filters:f,activeFilterCount:u=0,onClearFilters:g,pagination:a,actions:l,beforeTable:s,children:p,className:d,loading:v,loadingComponent:k}){let B=a&&a.totalItems>0;return jsxs("div",{className:i("flex flex-col h-full",d),children:[jsxs("div",{className:"data-table-page-header flex-shrink-0 space-y-4 pb-4",children:[jsxs("div",{children:[jsxs("div",{className:"group flex items-center gap-2",children:[jsx("h1",{className:"text-3xl font-bold",children:e}),o]}),t&&jsx("p",{className:"text-muted-foreground",children:t})]}),jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[m!==void 0&&jsxs("div",{className:"relative w-full sm:w-auto sm:min-w-[200px] sm:max-w-xs",children:[jsx(Search,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-10"}),jsx(ve,{placeholder:c,value:r||"",onChange:b=>m(b.target.value),className:"pl-9 h-9"}),r&&jsx("button",{type:"button",onClick:()=>m(""),className:"absolute right-2 top-1/2 transform -translate-y-1/2 p-1 rounded-sm hover:bg-muted",children:jsx(X,{className:"h-3 w-3 text-muted-foreground"})})]}),f&&f.length>0&&jsxs(Be,{children:[jsx(He,{asChild:true,children:jsxs(S,{variant:"outline",size:"sm",className:"gap-2 h-9",children:[jsx(Filter,{className:"h-4 w-4"}),jsx("span",{className:"hidden sm:inline",children:"Filters"}),u>0&&jsx("span",{className:"rounded-full bg-primary text-primary-foreground px-2 py-0.5 text-xs font-medium",children:u})]})}),jsx(he,{className:"w-80 overflow-y-auto",align:"start",collisionPadding:16,style:{maxHeight:"var(--radix-popover-content-available-height)"},children:jsxs("div",{className:"space-y-4",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("h4",{className:"font-medium text-sm",children:"Filters"}),u>0&&g&&jsx(S,{variant:"ghost",size:"sm",onClick:g,className:"h-auto p-0 text-xs text-destructive hover:text-destructive",children:"Clear all"})]}),jsx("div",{className:"space-y-3",children:f.map(b=>jsxs("div",{className:"space-y-1.5",children:[jsx("label",{className:"text-xs font-medium text-muted-foreground",children:b.label}),b.render()]},b.id))})]})})]}),u>0&&g&&jsxs(S,{variant:"ghost",size:"sm",onClick:g,className:"h-9 gap-1.5 text-muted-foreground hover:text-foreground",title:"Clear filters",children:[jsx(X,{className:"h-4 w-4"}),jsx("span",{className:"hidden sm:inline",children:"Clear"})]}),B&&jsx(Oe,{...a}),jsx("div",{className:"flex-1"}),l&&jsx("div",{className:"flex items-center gap-2 flex-shrink-0",children:l})]})]}),s&&jsx("div",{className:"px-6 pb-2",children:s}),jsx("div",{className:"relative flex-1 min-h-0",children:jsx("div",{className:"data-table-scroll-container h-full",children:v?k||jsx("div",{className:"flex items-center justify-center h-full",children:jsx("div",{className:"text-muted-foreground",children:"Loading..."})}):p})})]})}function xt({children:e,className:t,...o}){return jsx("div",{className:i("bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700",t),...o,children:e})}function Pt({selectedCount:e,onClear:t,children:o,itemLabel:r,className:m}){if(e===0)return null;let c=r??(e===1?"item":"items");return jsx(xt,{className:i("p-3 bg-primary/5 border-primary/20",m),children:jsxs("div",{className:"flex items-center justify-between",children:[jsxs("div",{className:"flex items-center gap-3",children:[jsxs("span",{className:"font-medium text-sm",role:"status","aria-live":"polite",children:[e," ",c," selected"]}),jsxs(S,{variant:"ghost",size:"sm",onClick:t,"aria-label":"Clear selection",children:[jsx(X,{className:"h-4 w-4 mr-1","aria-hidden":"true"}),"Clear"]})]}),jsx("div",{className:"flex items-center gap-2",role:"group","aria-label":"Batch actions",children:o})]})})}var yt=P.Root,wt=P.Trigger;var Lo=G.forwardRef(({className:e,inset:t,children:o,...r},m)=>jsxs(P.SubTrigger,{ref:m,className:i("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",t&&"pl-8",e),...r,children:[o,jsx(ChevronRight,{className:"ml-auto h-4 w-4"})]}));Lo.displayName=P.SubTrigger.displayName;var Bo=G.forwardRef(({className:e,...t},o)=>jsx(P.SubContent,{ref:o,className:i("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));Bo.displayName=P.SubContent.displayName;var $e=G.forwardRef(({className:e,sideOffset:t=4,...o},r)=>jsx(P.Portal,{children:jsx(P.Content,{ref:r,sideOffset:t,className:i("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...o})}));$e.displayName=P.Content.displayName;var xe=G.forwardRef(({className:e,inset:t,...o},r)=>jsx(P.Item,{ref:r,className:i("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",t&&"pl-8",e),...o}));xe.displayName=P.Item.displayName;var Ho=G.forwardRef(({className:e,children:t,checked:o,...r},m)=>jsxs(P.CheckboxItem,{ref:m,className:i("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:o,...r,children:[jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(P.ItemIndicator,{children:jsx(Check,{className:"h-4 w-4"})})}),t]}));Ho.displayName=P.CheckboxItem.displayName;var Oo=G.forwardRef(({className:e,children:t,...o},r)=>jsxs(P.RadioItem,{ref:r,className:i("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...o,children:[jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:jsx(P.ItemIndicator,{children:jsx(Circle,{className:"h-2 w-2 fill-current"})})}),t]}));Oo.displayName=P.RadioItem.displayName;var qe=G.forwardRef(({className:e,inset:t,...o},r)=>jsx(P.Label,{ref:r,className:i("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...o}));qe.displayName=P.Label.displayName;var We=G.forwardRef(({className:e,...t},o)=>jsx(P.Separator,{ref:o,className:i("-mx-1 my-1 h-px bg-muted",e),...t}));We.displayName=P.Separator.displayName;function Ct({columns:e,isColumnVisible:t,toggleColumn:o,showAllColumns:r,hideAllColumns:m}){let c=e.filter(u=>t(u.id)).length,f=e.filter(u=>!u.locked);return jsxs(yt,{children:[jsx(wt,{asChild:true,children:jsxs(S,{variant:"outline",size:"sm",className:"gap-2",children:[jsx(Columns3,{className:"h-4 w-4"}),"Columns",jsxs("span",{className:"text-muted-foreground text-xs",children:["(",c,"/",e.length,")"]})]})}),jsxs($e,{align:"end",className:"w-48",children:[jsx(qe,{className:"font-normal text-xs text-muted-foreground",children:"Toggle columns"}),jsx(We,{}),e.map(u=>{let g=t(u.id),a=u.locked===true;return jsxs(xe,{onClick:l=>{l.preventDefault(),a||o(u.id);},className:i("gap-2 cursor-pointer",a&&"opacity-50 cursor-not-allowed"),disabled:a,children:[jsx("div",{className:"w-4 h-4 flex items-center justify-center",children:g?jsx(Check,{className:"h-3.5 w-3.5 text-primary"}):jsx("div",{className:"h-3.5 w-3.5"})}),jsx("span",{className:"flex-1",children:u.label}),a&&jsx("span",{className:"text-xs text-muted-foreground",children:"Required"})]},u.id)}),f.length>1&&jsxs(Fragment,{children:[jsx(We,{}),jsxs(xe,{onClick:u=>{u.preventDefault(),r();},className:"gap-2 cursor-pointer",children:[jsx(Eye,{className:"h-4 w-4"}),"Show All"]}),jsxs(xe,{onClick:u=>{u.preventDefault(),m();},className:"gap-2 cursor-pointer",children:[jsx(EyeOff,{className:"h-4 w-4"}),"Hide Optional"]})]})]})]})}function St({search:e,onSearchChange:t,searchPlaceholder:o="Search...",filters:r,activeFilterCount:m=0,onClearFilters:c,className:f,children:u}){let a=r?.some(l=>l.type==="multi")?"w-[420px]":"w-80";return jsxs("div",{className:i("flex items-center gap-3 flex-wrap",f),children:[t!==void 0&&jsxs("div",{className:"relative flex-1 min-w-[200px] max-w-xs",children:[jsx(Search,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-10"}),jsx(ve,{placeholder:o,value:e||"",onChange:l=>t(l.target.value),className:"pl-9 h-9"}),e&&jsx("button",{type:"button",onClick:()=>t(""),className:"absolute right-2 top-1/2 transform -translate-y-1/2 p-1 rounded-sm hover:bg-muted",children:jsx(X,{className:"h-3 w-3 text-muted-foreground"})})]}),r&&r.length>0&&jsxs(Be,{children:[jsx(He,{asChild:true,children:jsxs(S,{variant:"outline",size:"sm",className:"gap-2 h-9",children:[jsx(Filter,{className:"h-4 w-4"}),"Filters",m>0&&jsx("span",{className:"ml-1 rounded-full bg-primary text-primary-foreground px-2 py-0.5 text-xs font-medium",children:m})]})}),jsx(he,{className:i(a,"overflow-y-auto"),align:"start",collisionPadding:16,style:{maxHeight:"var(--radix-popover-content-available-height)"},children:jsxs("div",{className:"space-y-4",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("h4",{className:"font-medium text-sm",children:"Filters"}),m>0&&c&&jsx(S,{variant:"ghost",size:"sm",onClick:c,className:"h-auto p-0 text-xs text-destructive hover:text-destructive",children:"Clear all"})]}),jsx("div",{className:"space-y-4",children:r.map(l=>jsxs("div",{className:"space-y-1.5",children:[jsx("label",{className:"text-xs font-medium text-muted-foreground",children:l.label}),l.render()]},l.id))})]})})]}),m>0&&c&&jsxs(S,{variant:"ghost",size:"sm",onClick:c,className:"h-9 gap-1.5 text-muted-foreground hover:text-foreground",children:[jsx(X,{className:"h-4 w-4"}),"Clear"]}),jsx("div",{className:"flex-1"}),u]})}var je=G.forwardRef(({className:e,...t},o)=>jsx(Pe.Root,{ref:o,className:i("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:jsx(Pe.Indicator,{className:i("flex items-center justify-center text-current"),children:jsx(Check,{className:"h-4 w-4"})})}));je.displayName=Pe.Root.displayName;function Tt({options:e,selected:t,onChange:o,maxHeight:r=200,columns:m=2,showBulkActions:c=true,className:f}){let u=d=>{let v=new Set(t);v.has(d)?v.delete(d):v.add(d),o(v);},g=()=>{o(new Set(e.map(d=>d.value)));},a=()=>{o(new Set);},l={1:"grid-cols-1",2:"grid-cols-2",3:"grid-cols-3"},s=e.length>0&&t.size===e.length,p=t.size===0;return jsxs("div",{className:i("space-y-2",f),children:[c&&e.length>3&&jsxs("div",{className:"flex items-center gap-2 text-xs",children:[jsx(S,{type:"button",variant:"ghost",size:"sm",onClick:g,disabled:s,className:"h-6 px-2 text-xs text-muted-foreground hover:text-foreground",children:"Select all"}),jsx("span",{className:"text-muted-foreground",children:"\xB7"}),jsx(S,{type:"button",variant:"ghost",size:"sm",onClick:a,disabled:p,className:"h-6 px-2 text-xs text-muted-foreground hover:text-foreground",children:"Clear"}),t.size>0&&jsxs(Fragment,{children:[jsx("span",{className:"text-muted-foreground",children:"\xB7"}),jsxs("span",{className:"text-muted-foreground",children:[t.size," selected"]})]})]}),jsx("div",{className:i("overflow-y-auto",e.length>6&&"pr-1"),style:{maxHeight:`${r}px`},children:jsx("div",{className:i("grid gap-1",l[m]),children:e.map(d=>jsxs("label",{className:i("flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer","hover:bg-muted/50 transition-colors",t.has(d.value)&&"bg-muted/30"),children:[jsx(je,{checked:t.has(d.value),onCheckedChange:()=>u(d.value),className:"h-3.5 w-3.5"}),d.render?jsx("span",{className:"flex items-center gap-1.5 text-sm truncate",children:d.render()}):jsx("span",{className:"text-sm truncate",children:d.label})]},d.value))})}),e.length===0&&jsx("div",{className:"text-sm text-muted-foreground text-center py-2",children:"No options available"})]})}export{Pt as BatchActionsBar,Ct as ColumnVisibility,ut as DataTable,ht as DataTablePage,Tt as MultiSelectFilter,Le as Pagination,Oe as PaginationControls,St as TableFilters,Ie as useColumnDragDrop,ke as useColumnOrder,Re as useColumnVisibility,Ne as usePagination,Me as useResizableColumns};//# sourceMappingURL=data-table.mjs.map
2
+ //# sourceMappingURL=data-table.mjs.map