tablero 1.0.0

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":["../packages/core/tableState.ts","../packages/core/columns.ts","../packages/core/sorting.ts","../packages/core/filtering.ts","../packages/core/pagination.ts","../packages/react/useDataTable.ts"],"names":[],"mappings":"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","file":"react.mjs","sourcesContent":["/**\r\n * Table state management\r\n * \r\n * Core state shape and management utilities for data tables.\r\n * Supports both controlled and uncontrolled state patterns.\r\n */\r\n\r\nimport type { SortState } from './sorting';\r\nimport type { PaginationState } from './pagination';\r\nimport type { FilterState } from './filtering';\r\n\r\n/**\r\n * Core table state interface\r\n * \r\n * Designed to be extensible for:\r\n * - Server-side mode (via mode: 'server' | 'client')\r\n * - Multi-sort (sorting can be extended to array)\r\n * - URL sync (state can be serialized/deserialized)\r\n */\r\nexport interface TableState {\r\n /** Sorting state - single column for now, extensible to array for multi-sort */\r\n sorting: SortState;\r\n \r\n /** Pagination state */\r\n pagination: PaginationState;\r\n \r\n /** Filtering state */\r\n filtering: FilterState;\r\n \r\n /** Column visibility state - maps column ID to visibility */\r\n columnVisibility: Record<string, boolean>;\r\n \r\n /** Column order - array of column IDs */\r\n columnOrder: string[];\r\n \r\n // TODO: Add server-side mode support\r\n // mode?: 'client' | 'server';\r\n \r\n // TODO: Add URL sync support\r\n // syncToUrl?: boolean;\r\n}\r\n\r\n/**\r\n * Initial table state with defaults\r\n */\r\nexport function createInitialTableState(columnIds: string[]): TableState {\r\n return {\r\n sorting: {\r\n columnId: null,\r\n direction: null,\r\n },\r\n pagination: {\r\n pageIndex: 0,\r\n pageSize: 10,\r\n },\r\n filtering: {\r\n globalFilter: '',\r\n columnFilters: {},\r\n },\r\n columnVisibility: columnIds.reduce((acc, id) => {\r\n acc[id] = true;\r\n return acc;\r\n }, {} as Record<string, boolean>),\r\n columnOrder: [...columnIds],\r\n };\r\n}\r\n\r\n/**\r\n * Update table state immutably\r\n * Returns a new state object with the update applied\r\n */\r\nexport function updateTableState<T extends TableState>(\r\n state: T,\r\n updates: Partial<TableState>\r\n): T {\r\n return {\r\n ...state,\r\n ...updates,\r\n };\r\n}\r\n\r\n/**\r\n * Update sorting state\r\n */\r\nexport function updateSorting(\r\n state: TableState,\r\n sorting: SortState\r\n): TableState {\r\n return updateTableState(state, { sorting });\r\n}\r\n\r\n/**\r\n * Update pagination state\r\n */\r\nexport function updatePagination(\r\n state: TableState,\r\n pagination: Partial<PaginationState>\r\n): TableState {\r\n return updateTableState(state, {\r\n pagination: {\r\n ...state.pagination,\r\n ...pagination,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Update filtering state\r\n */\r\nexport function updateFiltering(\r\n state: TableState,\r\n filtering: Partial<FilterState>\r\n): TableState {\r\n return updateTableState(state, {\r\n filtering: {\r\n ...state.filtering,\r\n ...filtering,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Update column visibility\r\n */\r\nexport function updateColumnVisibility(\r\n state: TableState,\r\n columnId: string,\r\n visible: boolean\r\n): TableState {\r\n return updateTableState(state, {\r\n columnVisibility: {\r\n ...state.columnVisibility,\r\n [columnId]: visible,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Update column order\r\n */\r\nexport function updateColumnOrder(\r\n state: TableState,\r\n columnOrder: string[]\r\n): TableState {\r\n return updateTableState(state, { columnOrder });\r\n}\r\n\r\n/**\r\n * Controlled state handler type\r\n * Used when state is managed externally\r\n */\r\nexport type TableStateHandler = {\r\n state: TableState;\r\n setState: (state: TableState | ((prev: TableState) => TableState)) => void;\r\n};\r\n\r\n/**\r\n * Uncontrolled state handler type\r\n * Used when state is managed internally\r\n */\r\nexport type UncontrolledTableState = {\r\n initialState?: Partial<TableState>;\r\n onStateChange?: (state: TableState) => void;\r\n};\r\n\r\n/**\r\n * Check if state is controlled\r\n */\r\nexport function isControlledState(\r\n handler: TableStateHandler | UncontrolledTableState\r\n): handler is TableStateHandler {\r\n return 'state' in handler && 'setState' in handler;\r\n}\r\n","/**\r\n * Column definitions and utilities\r\n *\r\n * Type-safe column definition API with extensibility for:\r\n * - Custom JSX renderers (via renderCell, renderHeader)\r\n * - Grouped headers (via parentId)\r\n * - Metadata extension (via meta)\r\n */\r\n\r\n/**\r\n * Filter type configuration\r\n *\r\n * TODO: Extend to support more filter types:\r\n * - 'number' | 'date' | 'select' | 'range'\r\n */\r\nexport type FilterType = \"text\" | \"none\";\r\n\r\n/**\r\n * Column accessor function type\r\n * Extracts a value from a data item\r\n */\r\nexport type AccessorFn<TData, TValue> = (data: TData) => TValue;\r\n\r\n/**\r\n * Column accessor - either a key path or a function\r\n */\r\nexport type ColumnAccessor<TData, TValue> =\r\n | keyof TData\r\n | AccessorFn<TData, TValue>;\r\n\r\n/**\r\n * Base column definition\r\n *\r\n * This is the serializable part of the column definition.\r\n * Renderers and other runtime functions are kept separate for serialization.\r\n *\r\n * TODO: Add support for:\r\n * - renderCell: (value: TValue, row: TData) => React.ReactNode\r\n * - renderHeader: () => React.ReactNode\r\n * - parentId?: string (for grouped headers)\r\n * - meta?: Record<string, unknown> (for extensible metadata)\r\n */\r\nexport interface ColumnDef<TData, TValue = unknown> {\r\n /** Unique column identifier - must be stable */\r\n id: string;\r\n\r\n /** Column header label */\r\n header?: string;\r\n\r\n /** Whether column is sortable */\r\n sortable?: boolean;\r\n\r\n /** Filter type for this column */\r\n filter?: FilterType;\r\n\r\n /** Column width in pixels */\r\n width?: number;\r\n\r\n /** Minimum column width */\r\n minWidth?: number;\r\n\r\n /** Maximum column width */\r\n maxWidth?: number;\r\n\r\n /** Whether column is visible by default */\r\n visible?: boolean;\r\n\r\n /** Column alignment */\r\n align?: \"left\" | \"center\" | \"right\";\r\n\r\n /** Accessor function or key path to extract value */\r\n accessor?: ColumnAccessor<TData, TValue>;\r\n\r\n /** Custom metadata for extensibility */\r\n meta?: Record<string, unknown>;\r\n\r\n // TODO: Add grouped header support\r\n // parentId?: string;\r\n\r\n // TODO: Add custom renderers (will be separate from serializable definition)\r\n // renderCell?: (value: TValue, row: TData) => React.ReactNode;\r\n // renderHeader?: () => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Runtime column representation\r\n * Includes the definition plus computed properties\r\n */\r\nexport interface Column<TData> {\r\n /** Column definition */\r\n def: ColumnDef<TData>;\r\n\r\n /** Column ID (stable identifier) */\r\n id: string;\r\n\r\n /** Column header label */\r\n header: string;\r\n\r\n /** Whether column is sortable */\r\n sortable: boolean;\r\n\r\n /** Filter type */\r\n filter: FilterType;\r\n\r\n /** Column width */\r\n width?: number;\r\n\r\n /** Column alignment */\r\n align: \"left\" | \"center\" | \"right\";\r\n\r\n /** Accessor function to extract value from data */\r\n accessor: AccessorFn<TData, unknown>;\r\n}\r\n\r\n/**\r\n * Column definition builder options\r\n */\r\nexport interface ColumnOptions<TData, TValue> {\r\n header?: string;\r\n sortable?: boolean;\r\n filter?: FilterType;\r\n width?: number;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n visible?: boolean;\r\n align?: \"left\" | \"center\" | \"right\";\r\n accessor?: ColumnAccessor<TData, TValue>;\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Create a column definition from a key\r\n *\r\n * @param key - Column key (must exist on TData)\r\n * @param options - Column configuration options\r\n * @returns Column definition\r\n */\r\nexport function col<TData, TKey extends keyof TData>(\r\n key: TKey,\r\n options?: ColumnOptions<TData, TData[TKey]>\r\n): ColumnDef<TData, TData[TKey]> {\r\n return {\r\n id: String(key),\r\n header: options?.header ?? String(key),\r\n sortable: options?.sortable ?? false,\r\n filter: options?.filter ?? \"none\",\r\n width: options?.width,\r\n minWidth: options?.minWidth,\r\n maxWidth: options?.maxWidth,\r\n visible: options?.visible ?? true,\r\n align: options?.align ?? \"left\",\r\n accessor: options?.accessor ?? key,\r\n meta: options?.meta,\r\n };\r\n}\r\n\r\n/**\r\n * Create a column definition with a custom accessor\r\n *\r\n * @param id - Unique column identifier\r\n * @param options - Column configuration options (must include accessor)\r\n * @returns Column definition\r\n */\r\nexport function colWithAccessor<TData, TValue>(\r\n id: string,\r\n options: ColumnOptions<TData, TValue> & {\r\n accessor: ColumnAccessor<TData, TValue>;\r\n }\r\n): ColumnDef<TData, TValue> {\r\n return {\r\n id,\r\n header: options.header ?? id,\r\n sortable: options.sortable ?? false,\r\n filter: options.filter ?? \"none\",\r\n width: options.width,\r\n minWidth: options.minWidth,\r\n maxWidth: options.maxWidth,\r\n visible: options.visible ?? true,\r\n align: options.align ?? \"left\",\r\n accessor: options.accessor,\r\n meta: options.meta,\r\n };\r\n}\r\n\r\n/**\r\n * Type-safe column definition array builder\r\n *\r\n * Provides type inference and validation for column definitions.\r\n *\r\n * @example\r\n * ```ts\r\n * const columns = defineColumns<User>()([\r\n * col(\"name\", { header: \"Name\", sortable: true }),\r\n * col(\"email\", { header: \"Email\", filter: \"text\" }),\r\n * ]);\r\n * ```\r\n */\r\nexport function defineColumns<TData>() {\r\n return <TColumns extends readonly ColumnDef<TData>[]>(\r\n columns: TColumns\r\n ): TColumns => columns;\r\n}\r\n\r\n/**\r\n * Normalize column accessor to a function\r\n */\r\nexport function normalizeAccessor<TData, TValue>(\r\n accessor: ColumnAccessor<TData, TValue>\r\n): AccessorFn<TData, TValue> {\r\n if (typeof accessor === \"function\") {\r\n return accessor as AccessorFn<TData, TValue>;\r\n }\r\n\r\n // Key path accessor\r\n return (data: TData) => {\r\n return (data as Record<string, unknown>)[String(accessor)] as TValue;\r\n };\r\n}\r\n\r\n/**\r\n * Convert column definition to runtime column\r\n */\r\nexport function createColumn<TData>(def: ColumnDef<TData>): Column<TData> {\r\n const accessor = def.accessor\r\n ? normalizeAccessor(def.accessor)\r\n : () => undefined;\r\n\r\n return {\r\n def,\r\n id: def.id,\r\n header: def.header ?? def.id,\r\n sortable: def.sortable ?? false,\r\n filter: def.filter ?? \"none\",\r\n width: def.width,\r\n align: def.align ?? \"left\",\r\n accessor,\r\n };\r\n}\r\n\r\n/**\r\n * Convert array of column definitions to runtime columns\r\n */\r\nexport function createColumns<TData>(\r\n definitions: readonly ColumnDef<TData>[]\r\n): Column<TData>[] {\r\n return definitions.map(createColumn);\r\n}\r\n\r\n/**\r\n * Get column by ID\r\n */\r\nexport function getColumnById<TData>(\r\n columns: Column<TData>[],\r\n id: string\r\n): Column<TData> | undefined {\r\n return columns.find((col) => col.id === id);\r\n}\r\n\r\n/**\r\n * Get visible columns\r\n */\r\nexport function getVisibleColumns<TData>(\r\n columns: Column<TData>[],\r\n visibility: Record<string, boolean>\r\n): Column<TData>[] {\r\n return columns.filter((col) => visibility[col.id] !== false);\r\n}\r\n\r\n/**\r\n * Get columns in specified order\r\n */\r\nexport function getOrderedColumns<TData>(\r\n columns: Column<TData>[],\r\n order: string[]\r\n): Column<TData>[] {\r\n const columnMap = new Map(columns.map((col) => [col.id, col]));\r\n const ordered: Column<TData>[] = [];\r\n\r\n // Add columns in specified order\r\n for (const id of order) {\r\n const col = columnMap.get(id);\r\n if (col) {\r\n ordered.push(col);\r\n columnMap.delete(id);\r\n }\r\n }\r\n\r\n // Add any remaining columns not in order\r\n ordered.push(...columnMap.values());\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Extract column IDs from definitions\r\n */\r\nexport function getColumnIds<TData>(\r\n definitions: readonly ColumnDef<TData>[]\r\n): string[] {\r\n return definitions.map((def) => def.id);\r\n}\r\n\r\n/**\r\n * Validate column definitions\r\n * Ensures all columns have unique IDs\r\n */\r\nexport function validateColumns<TData>(\r\n definitions: readonly ColumnDef<TData>[]\r\n): { valid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n const ids = new Set<string>();\r\n\r\n for (const def of definitions) {\r\n if (!def.id || def.id.trim() === \"\") {\r\n errors.push(`Column definition missing required 'id' field`);\r\n continue;\r\n }\r\n\r\n if (ids.has(def.id)) {\r\n errors.push(`Duplicate column ID: ${def.id}`);\r\n }\r\n\r\n ids.add(def.id);\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n","/**\r\n * Sorting functionality\r\n * \r\n * Single-column sorting implementation, extensible to multi-column sorting.\r\n */\r\n\r\n/**\r\n * Sort direction type\r\n */\r\nexport type SortDirection = 'asc' | 'desc' | null;\r\n\r\n/**\r\n * Sort state for single-column sorting\r\n * \r\n * TODO: Extend to multi-column sorting:\r\n * - Change to: sorting: Array<{ columnId: string; direction: 'asc' | 'desc' }>\r\n * - Add priority/order for multi-sort\r\n */\r\nexport interface SortState {\r\n /** Column ID to sort by, null if no sorting */\r\n columnId: string | null;\r\n \r\n /** Sort direction, null if no sorting */\r\n direction: SortDirection;\r\n}\r\n\r\n/**\r\n * Create initial sort state\r\n */\r\nexport function createInitialSortState(): SortState {\r\n return {\r\n columnId: null,\r\n direction: null,\r\n };\r\n}\r\n\r\n/**\r\n * Toggle sort state for a column\r\n * Cycles through: none -> asc -> desc -> none\r\n */\r\nexport function toggleSort(\r\n currentState: SortState,\r\n columnId: string\r\n): SortState {\r\n if (currentState.columnId === columnId) {\r\n // Same column - cycle direction\r\n if (currentState.direction === 'asc') {\r\n return { columnId, direction: 'desc' };\r\n }\r\n if (currentState.direction === 'desc') {\r\n return { columnId: null, direction: null };\r\n }\r\n }\r\n \r\n // New column or no current sort - start with ascending\r\n return { columnId, direction: 'asc' };\r\n}\r\n\r\n/**\r\n * Set sort state explicitly\r\n */\r\nexport function setSort(\r\n columnId: string | null,\r\n direction: SortDirection\r\n): SortState {\r\n return {\r\n columnId,\r\n direction,\r\n };\r\n}\r\n\r\n/**\r\n * Clear sort state\r\n */\r\nexport function clearSort(): SortState {\r\n return createInitialSortState();\r\n}\r\n\r\n/**\r\n * Type guard to check if sorting is active\r\n */\r\nexport function isSortActive(state: SortState): boolean {\r\n return state.columnId !== null && state.direction !== null;\r\n}\r\n\r\n/**\r\n * Value comparator function type\r\n */\r\nexport type CompareFn<T = unknown> = (a: T, b: T) => number;\r\n\r\n/**\r\n * Default comparator for primitive values\r\n */\r\nexport function defaultCompare(a: unknown, b: unknown): number {\r\n if (a === b) return 0;\r\n if (a === null || a === undefined) return 1;\r\n if (b === null || b === undefined) return -1;\r\n \r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return a - b;\r\n }\r\n \r\n if (typeof a === 'string' && typeof b === 'string') {\r\n return a.localeCompare(b);\r\n }\r\n \r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() - b.getTime();\r\n }\r\n \r\n // Fallback to string comparison\r\n return String(a).localeCompare(String(b));\r\n}\r\n\r\n/**\r\n * Create a sorted comparator function\r\n */\r\nexport function createComparator<T>(\r\n direction: 'asc' | 'desc',\r\n compareFn: CompareFn<T> = defaultCompare as CompareFn<T>\r\n): CompareFn<T> {\r\n return (a: T, b: T) => {\r\n const result = compareFn(a, b);\r\n return direction === 'asc' ? result : -result;\r\n };\r\n}\r\n\r\n/**\r\n * Sort data array based on sort state\r\n * \r\n * @param data - Array of data items\r\n * @param sortState - Current sort state\r\n * @param getValue - Function to extract value from data item for the sorted column\r\n * @param compareFn - Optional custom comparator function\r\n * @returns New sorted array (immutable)\r\n */\r\nexport function applySort<T>(\r\n data: T[],\r\n sortState: SortState,\r\n getValue: (item: T, columnId: string) => unknown,\r\n compareFn?: CompareFn<unknown>\r\n): T[] {\r\n if (!isSortActive(sortState) || !sortState.columnId) {\r\n return [...data];\r\n }\r\n \r\n const comparator = createComparator(\r\n sortState.direction!,\r\n compareFn || defaultCompare\r\n );\r\n \r\n return [...data].sort((a, b) => {\r\n const valueA = getValue(a, sortState.columnId!);\r\n const valueB = getValue(b, sortState.columnId!);\r\n return comparator(valueA, valueB);\r\n });\r\n}\r\n","/**\r\n * Filtering functionality\r\n * \r\n * Basic text filtering implementation, extensible to advanced filtering.\r\n */\r\n\r\n/**\r\n * Filter state\r\n * \r\n * TODO: Extend to support:\r\n * - Advanced filter types (number range, date range, etc.)\r\n * - Filter operators (equals, contains, greater than, etc.)\r\n * - Column-specific filter configurations\r\n */\r\nexport interface FilterState {\r\n /** Global text filter applied across all columns */\r\n globalFilter: string;\r\n \r\n /** Column-specific filters - maps column ID to filter value */\r\n columnFilters: Record<string, string>;\r\n \r\n // TODO: Add filter operators\r\n // filterOperators?: Record<string, FilterOperator>;\r\n \r\n // TODO: Add filter mode (AND/OR)\r\n // filterMode?: 'and' | 'or';\r\n}\r\n\r\n/**\r\n * Create initial filter state\r\n */\r\nexport function createInitialFilterState(): FilterState {\r\n return {\r\n globalFilter: '',\r\n columnFilters: {},\r\n };\r\n}\r\n\r\n/**\r\n * Set global filter\r\n */\r\nexport function setGlobalFilter(filter: string): FilterState {\r\n return {\r\n globalFilter: filter,\r\n columnFilters: {},\r\n };\r\n}\r\n\r\n/**\r\n * Set column filter\r\n */\r\nexport function setColumnFilter(\r\n state: FilterState,\r\n columnId: string,\r\n filter: string\r\n): FilterState {\r\n return {\r\n ...state,\r\n columnFilters: {\r\n ...state.columnFilters,\r\n [columnId]: filter,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Clear column filter\r\n */\r\nexport function clearColumnFilter(\r\n state: FilterState,\r\n columnId: string\r\n): FilterState {\r\n const { [columnId]: _, ...restFilters } = state.columnFilters;\r\n return {\r\n ...state,\r\n columnFilters: restFilters,\r\n };\r\n}\r\n\r\n/**\r\n * Clear all filters\r\n */\r\nexport function clearAllFilters(): FilterState {\r\n return createInitialFilterState();\r\n}\r\n\r\n/**\r\n * Check if any filter is active\r\n */\r\nexport function isFilterActive(state: FilterState): boolean {\r\n return (\r\n state.globalFilter.trim() !== '' ||\r\n Object.values(state.columnFilters).some((filter) => filter.trim() !== '')\r\n );\r\n}\r\n\r\n/**\r\n * Value matcher function type\r\n */\r\nexport type MatchFn = (value: unknown, filter: string) => boolean;\r\n\r\n/**\r\n * Default text matcher - case-insensitive substring match\r\n */\r\nexport function defaultMatch(value: unknown, filter: string): boolean {\r\n if (!filter.trim()) return true;\r\n \r\n const normalizedFilter = filter.toLowerCase().trim();\r\n const normalizedValue = String(value ?? '').toLowerCase();\r\n \r\n return normalizedValue.includes(normalizedFilter);\r\n}\r\n\r\n/**\r\n * Apply filters to data array\r\n * \r\n * @param data - Array of data items\r\n * @param filterState - Current filter state\r\n * @param getValue - Function to extract value from data item for a column\r\n * @param matchFn - Optional custom matcher function\r\n * @returns Filtered data array (immutable)\r\n */\r\nexport function applyFilters<T>(\r\n data: T[],\r\n filterState: FilterState,\r\n getValue: (item: T, columnId: string) => unknown,\r\n matchFn: MatchFn = defaultMatch\r\n): T[] {\r\n if (!isFilterActive(filterState)) {\r\n return [...data];\r\n }\r\n \r\n return data.filter((item) => {\r\n // Apply global filter - checks all columns\r\n if (filterState.globalFilter.trim()) {\r\n const matchesGlobal = Object.keys(filterState.columnFilters).length === 0\r\n ? // If no column filters, check all columns for global filter\r\n Object.values(item as Record<string, unknown>).some((value) =>\r\n matchFn(value, filterState.globalFilter)\r\n )\r\n : // If column filters exist, global filter is ignored (TODO: make configurable)\r\n true;\r\n \r\n if (!matchesGlobal) return false;\r\n }\r\n \r\n // Apply column-specific filters\r\n for (const [columnId, filterValue] of Object.entries(filterState.columnFilters)) {\r\n if (filterValue.trim()) {\r\n const value = getValue(item, columnId);\r\n if (!matchFn(value, filterValue)) {\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * Get active filter count\r\n */\r\nexport function getActiveFilterCount(state: FilterState): number {\r\n let count = 0;\r\n \r\n if (state.globalFilter.trim()) {\r\n count++;\r\n }\r\n \r\n count += Object.values(state.columnFilters).filter((f) => f.trim() !== '').length;\r\n \r\n return count;\r\n}\r\n","/**\r\n * Pagination functionality\r\n * \r\n * Client-side pagination implementation.\r\n */\r\n\r\n/**\r\n * Pagination state\r\n */\r\nexport interface PaginationState {\r\n /** Current page index (0-based) */\r\n pageIndex: number;\r\n \r\n /** Number of items per page */\r\n pageSize: number;\r\n \r\n // TODO: Add server-side pagination support\r\n // totalCount?: number; // For server-side mode\r\n // pageCount?: number; // For server-side mode\r\n}\r\n\r\n/**\r\n * Create initial pagination state\r\n */\r\nexport function createInitialPaginationState(\r\n pageSize: number = 10\r\n): PaginationState {\r\n return {\r\n pageIndex: 0,\r\n pageSize,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate total number of pages\r\n */\r\nexport function getPageCount(\r\n totalItems: number,\r\n pageSize: number\r\n): number {\r\n if (pageSize <= 0) return 0;\r\n return Math.ceil(totalItems / pageSize);\r\n}\r\n\r\n/**\r\n * Get the start index of the current page\r\n */\r\nexport function getPageStartIndex(\r\n pageIndex: number,\r\n pageSize: number\r\n): number {\r\n return pageIndex * pageSize;\r\n}\r\n\r\n/**\r\n * Get the end index of the current page (exclusive)\r\n */\r\nexport function getPageEndIndex(\r\n pageIndex: number,\r\n pageSize: number,\r\n totalItems: number\r\n): number {\r\n return Math.min(getPageStartIndex(pageIndex, pageSize) + pageSize, totalItems);\r\n}\r\n\r\n/**\r\n * Check if page index is valid\r\n */\r\nexport function isValidPageIndex(\r\n pageIndex: number,\r\n totalPages: number\r\n): boolean {\r\n return pageIndex >= 0 && pageIndex < totalPages;\r\n}\r\n\r\n/**\r\n * Clamp page index to valid range\r\n */\r\nexport function clampPageIndex(\r\n pageIndex: number,\r\n totalPages: number\r\n): number {\r\n if (totalPages === 0) return 0;\r\n return Math.max(0, Math.min(pageIndex, totalPages - 1));\r\n}\r\n\r\n/**\r\n * Go to next page\r\n */\r\nexport function goToNextPage(\r\n state: PaginationState,\r\n totalPages: number\r\n): PaginationState {\r\n const nextIndex = clampPageIndex(state.pageIndex + 1, totalPages);\r\n return {\r\n ...state,\r\n pageIndex: nextIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Go to previous page\r\n */\r\nexport function goToPreviousPage(\r\n state: PaginationState,\r\n totalPages: number\r\n): PaginationState {\r\n const prevIndex = clampPageIndex(state.pageIndex - 1, totalPages);\r\n return {\r\n ...state,\r\n pageIndex: prevIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Go to specific page\r\n */\r\nexport function goToPage(\r\n state: PaginationState,\r\n pageIndex: number,\r\n totalPages: number\r\n): PaginationState {\r\n return {\r\n ...state,\r\n pageIndex: clampPageIndex(pageIndex, totalPages),\r\n };\r\n}\r\n\r\n/**\r\n * Change page size\r\n */\r\nexport function setPageSize(\r\n state: PaginationState,\r\n pageSize: number,\r\n totalItems: number\r\n): PaginationState {\r\n const totalPages = getPageCount(totalItems, pageSize);\r\n const clampedPageIndex = clampPageIndex(state.pageIndex, totalPages);\r\n \r\n return {\r\n pageIndex: clampedPageIndex,\r\n pageSize,\r\n };\r\n}\r\n\r\n/**\r\n * Get paginated slice of data\r\n * \r\n * @param data - Full data array\r\n * @param pagination - Pagination state\r\n * @returns Paginated data slice\r\n */\r\nexport function getPaginatedData<T>(\r\n data: T[],\r\n pagination: PaginationState\r\n): T[] {\r\n const start = getPageStartIndex(pagination.pageIndex, pagination.pageSize);\r\n const end = getPageEndIndex(\r\n pagination.pageIndex,\r\n pagination.pageSize,\r\n data.length\r\n );\r\n \r\n return data.slice(start, end);\r\n}\r\n\r\n/**\r\n * Check if there is a next page\r\n */\r\nexport function hasNextPage(\r\n pageIndex: number,\r\n totalPages: number\r\n): boolean {\r\n return pageIndex < totalPages - 1;\r\n}\r\n\r\n/**\r\n * Check if there is a previous page\r\n */\r\nexport function hasPreviousPage(pageIndex: number): boolean {\r\n return pageIndex > 0;\r\n}\r\n","/**\r\n * React hook for data table functionality\r\n *\r\n * Bridges core table logic to React components.\r\n * Supports both controlled and uncontrolled state patterns.\r\n */\r\n\r\nimport { useMemo, useCallback, useState } from \"react\";\r\nimport type { TableState, TableStateHandler, UncontrolledTableState } from \"../core/tableState\";\r\nimport {\r\n createInitialTableState,\r\n updateSorting,\r\n updatePagination,\r\n updateFiltering,\r\n updateColumnVisibility,\r\n updateColumnOrder,\r\n isControlledState,\r\n} from \"../core/tableState\";\r\nimport type { ColumnDef, Column } from \"../core/columns\";\r\nimport {\r\n createColumns,\r\n getVisibleColumns,\r\n getOrderedColumns,\r\n getColumnIds,\r\n} from \"../core/columns\";\r\nimport { applySort, toggleSort, setSort, clearSort } from \"../core/sorting\";\r\nimport {\r\n applyFilters,\r\n setGlobalFilter,\r\n setColumnFilter,\r\n clearColumnFilter,\r\n clearAllFilters,\r\n} from \"../core/filtering\";\r\nimport {\r\n getPaginatedData,\r\n getPageCount,\r\n hasNextPage,\r\n hasPreviousPage,\r\n goToNextPage,\r\n goToPreviousPage,\r\n goToPage as goToPageUtil,\r\n setPageSize as setPageSizeUtil,\r\n} from \"../core/pagination\";\r\n\r\n/**\r\n * Hook configuration options\r\n */\r\nexport interface UseDataTableOptions<TData> {\r\n /** Data array to display */\r\n data: TData[];\r\n\r\n /** Column definitions */\r\n columns: readonly ColumnDef<TData>[];\r\n\r\n /** Initial page size (default: 10) */\r\n pageSize?: number;\r\n\r\n /** Controlled or uncontrolled state configuration */\r\n state?: TableStateHandler | UncontrolledTableState;\r\n\r\n // TODO: Add server-side mode support\r\n // mode?: 'client' | 'server';\r\n // serverState?: ServerState;\r\n\r\n // TODO: Add custom comparator for sorting\r\n // compareFn?: CompareFn<unknown>;\r\n\r\n // TODO: Add custom matcher for filtering\r\n // matchFn?: MatchFn;\r\n}\r\n\r\n/**\r\n * Table instance API returned by useDataTable\r\n */\r\nexport interface TableInstance<TData> {\r\n /** Current table state */\r\n state: TableState;\r\n\r\n /** Runtime columns (with normalized accessors) */\r\n columns: Column<TData>[];\r\n\r\n /** Visible columns in current order */\r\n visibleColumns: Column<TData>[];\r\n\r\n /** Original data array */\r\n data: TData[];\r\n\r\n /** Filtered data (after applying filters) */\r\n filteredData: TData[];\r\n\r\n /** Sorted data (after applying sorting) */\r\n sortedData: TData[];\r\n\r\n /** Paginated data (final data to display) */\r\n paginatedData: TData[];\r\n\r\n /** Total number of items after filtering */\r\n filteredRowCount: number;\r\n\r\n /** Total number of pages */\r\n pageCount: number;\r\n\r\n /** Current page index */\r\n pageIndex: number;\r\n\r\n /** Current page size */\r\n pageSize: number;\r\n\r\n /** Whether there is a next page */\r\n hasNextPage: boolean;\r\n\r\n /** Whether there is a previous page */\r\n hasPreviousPage: boolean;\r\n\r\n /** Sorting handlers */\r\n sorting: {\r\n /** Current sort state */\r\n state: TableState[\"sorting\"];\r\n /** Toggle sort for a column */\r\n toggle: (columnId: string) => void;\r\n /** Set sort explicitly */\r\n set: (columnId: string | null, direction: \"asc\" | \"desc\" | null) => void;\r\n /** Clear sort */\r\n clear: () => void;\r\n };\r\n\r\n /** Pagination handlers */\r\n pagination: {\r\n /** Current pagination state */\r\n state: TableState[\"pagination\"];\r\n /** Go to next page */\r\n nextPage: () => void;\r\n /** Go to previous page */\r\n previousPage: () => void;\r\n /** Go to specific page */\r\n goToPage: (pageIndex: number) => void;\r\n /** Set page size */\r\n setPageSize: (pageSize: number) => void;\r\n };\r\n\r\n /** Filtering handlers */\r\n filtering: {\r\n /** Current filter state */\r\n state: TableState[\"filtering\"];\r\n /** Set global filter */\r\n setGlobalFilter: (filter: string) => void;\r\n /** Set column filter */\r\n setColumnFilter: (columnId: string, filter: string) => void;\r\n /** Clear column filter */\r\n clearColumnFilter: (columnId: string) => void;\r\n /** Clear all filters */\r\n clearAllFilters: () => void;\r\n };\r\n\r\n /** Column management handlers */\r\n columnManagement: {\r\n /** Toggle column visibility */\r\n toggleVisibility: (columnId: string) => void;\r\n /** Set column visibility */\r\n setVisibility: (columnId: string, visible: boolean) => void;\r\n /** Reorder columns */\r\n reorder: (columnOrder: string[]) => void;\r\n };\r\n}\r\n\r\n/**\r\n * useDataTable hook\r\n *\r\n * Provides a complete table instance with state management,\r\n * data transformations, and event handlers.\r\n *\r\n * @example\r\n * ```tsx\r\n * const table = useDataTable({\r\n * data: users,\r\n * columns: userColumns,\r\n * pageSize: 10,\r\n * });\r\n * ```\r\n */\r\nexport function useDataTable<TData>(\r\n options: UseDataTableOptions<TData>\r\n): TableInstance<TData> {\r\n const { data, columns: columnDefs, pageSize: initialPageSize = 10, state } = options;\r\n\r\n // Determine if state is controlled\r\n const isControlled = state && isControlledState(state);\r\n\r\n // Initialize state (controlled or uncontrolled)\r\n const [internalState, setInternalState] = useState<TableState>(() => {\r\n const columnIds = getColumnIds(columnDefs);\r\n const baseState = createInitialTableState(columnIds);\r\n\r\n if (isControlled) {\r\n return state.state;\r\n }\r\n\r\n const uncontrolledState = state as UncontrolledTableState | undefined;\r\n const initialState = uncontrolledState?.initialState;\r\n\r\n return {\r\n ...baseState,\r\n pagination: {\r\n ...baseState.pagination,\r\n pageSize: initialPageSize,\r\n ...initialState?.pagination,\r\n },\r\n ...initialState,\r\n };\r\n });\r\n\r\n // Use controlled state if provided, otherwise use internal state\r\n const currentState = isControlled ? state.state : internalState;\r\n\r\n // State update handler\r\n const updateState = useCallback(\r\n (updater: TableState | ((prev: TableState) => TableState)) => {\r\n const newState = typeof updater === \"function\" ? updater(currentState) : updater;\r\n\r\n if (isControlled) {\r\n state.setState(newState);\r\n } else {\r\n setInternalState(newState);\r\n // Call onStateChange callback if provided\r\n const uncontrolledState = state as UncontrolledTableState | undefined;\r\n uncontrolledState?.onStateChange?.(newState);\r\n }\r\n },\r\n [currentState, isControlled, state]\r\n );\r\n\r\n // Create runtime columns (memoized)\r\n const columns = useMemo(() => {\r\n return createColumns(columnDefs);\r\n }, [columnDefs]);\r\n\r\n // Get visible columns in order (memoized)\r\n const visibleColumns = useMemo(() => {\r\n const visible = getVisibleColumns(columns, currentState.columnVisibility);\r\n return getOrderedColumns(visible, currentState.columnOrder);\r\n }, [columns, currentState.columnVisibility, currentState.columnOrder]);\r\n\r\n // Create value accessor function (memoized)\r\n const getValue = useCallback(\r\n (item: TData, columnId: string): unknown => {\r\n const column = columns.find((col) => col.id === columnId);\r\n if (!column) return undefined;\r\n return column.accessor(item);\r\n },\r\n [columns]\r\n );\r\n\r\n // Apply filters (memoized)\r\n const filteredData = useMemo(() => {\r\n return applyFilters(data, currentState.filtering, getValue);\r\n }, [data, currentState.filtering, getValue]);\r\n\r\n // Apply sorting (memoized)\r\n const sortedData = useMemo(() => {\r\n if (!currentState.sorting.columnId) {\r\n return filteredData;\r\n }\r\n return applySort(filteredData, currentState.sorting, getValue);\r\n }, [filteredData, currentState.sorting, getValue]);\r\n\r\n // Apply pagination (memoized)\r\n const paginatedData = useMemo(() => {\r\n return getPaginatedData(sortedData, currentState.pagination);\r\n }, [sortedData, currentState.pagination]);\r\n\r\n // Computed values (memoized)\r\n const filteredRowCount = filteredData.length;\r\n const pageCount = useMemo(() => {\r\n return getPageCount(filteredRowCount, currentState.pagination.pageSize);\r\n }, [filteredRowCount, currentState.pagination.pageSize]);\r\n\r\n const hasNext = useMemo(() => {\r\n return hasNextPage(currentState.pagination.pageIndex, pageCount);\r\n }, [currentState.pagination.pageIndex, pageCount]);\r\n\r\n const hasPrev = useMemo(() => {\r\n return hasPreviousPage(currentState.pagination.pageIndex);\r\n }, [currentState.pagination.pageIndex]);\r\n\r\n // Sorting handlers (stable references)\r\n const handleToggleSort = useCallback(\r\n (columnId: string) => {\r\n const newSorting = toggleSort(currentState.sorting, columnId);\r\n updateState((prev) => updateSorting(prev, newSorting));\r\n },\r\n [currentState.sorting, updateState]\r\n );\r\n\r\n const handleSetSort = useCallback(\r\n (columnId: string | null, direction: \"asc\" | \"desc\" | null) => {\r\n const newSorting = setSort(columnId, direction);\r\n updateState((prev) => updateSorting(prev, newSorting));\r\n },\r\n [updateState]\r\n );\r\n\r\n const handleClearSort = useCallback(() => {\r\n const newSorting = clearSort();\r\n updateState((prev) => updateSorting(prev, newSorting));\r\n }, [updateState]);\r\n\r\n // Pagination handlers (stable references)\r\n const handleNextPage = useCallback(() => {\r\n const newPagination = goToNextPage(currentState.pagination, pageCount);\r\n updateState((prev) => updatePagination(prev, newPagination));\r\n }, [currentState.pagination, pageCount, updateState]);\r\n\r\n const handlePreviousPage = useCallback(() => {\r\n const newPagination = goToPreviousPage(currentState.pagination, pageCount);\r\n updateState((prev) => updatePagination(prev, newPagination));\r\n }, [currentState.pagination, pageCount, updateState]);\r\n\r\n const handleGoToPage = useCallback(\r\n (pageIndex: number) => {\r\n const newPagination = goToPageUtil(currentState.pagination, pageIndex, pageCount);\r\n updateState((prev) => updatePagination(prev, newPagination));\r\n },\r\n [currentState.pagination, pageCount, updateState]\r\n );\r\n\r\n const handleSetPageSize = useCallback(\r\n (pageSize: number) => {\r\n const newPagination = setPageSizeUtil(\r\n currentState.pagination,\r\n pageSize,\r\n filteredRowCount\r\n );\r\n updateState((prev) => updatePagination(prev, newPagination));\r\n },\r\n [currentState.pagination, filteredRowCount, updateState]\r\n );\r\n\r\n // Filtering handlers (stable references)\r\n const handleSetGlobalFilter = useCallback(\r\n (filter: string) => {\r\n const newFiltering = setGlobalFilter(filter);\r\n updateState((prev) => updateFiltering(prev, newFiltering));\r\n },\r\n [updateState]\r\n );\r\n\r\n const handleSetColumnFilter = useCallback(\r\n (columnId: string, filter: string) => {\r\n const newFiltering = setColumnFilter(currentState.filtering, columnId, filter);\r\n updateState((prev) => updateFiltering(prev, newFiltering));\r\n },\r\n [currentState.filtering, updateState]\r\n );\r\n\r\n const handleClearColumnFilter = useCallback(\r\n (columnId: string) => {\r\n const newFiltering = clearColumnFilter(currentState.filtering, columnId);\r\n updateState((prev) => updateFiltering(prev, newFiltering));\r\n },\r\n [currentState.filtering, updateState]\r\n );\r\n\r\n const handleClearAllFilters = useCallback(() => {\r\n const newFiltering = clearAllFilters();\r\n updateState((prev) => updateFiltering(prev, newFiltering));\r\n }, [updateState]);\r\n\r\n // Column management handlers (stable references)\r\n const toggleColumnVisibility = useCallback(\r\n (columnId: string) => {\r\n const currentVisibility = currentState.columnVisibility[columnId] ?? true;\r\n updateState((prev) => updateColumnVisibility(prev, columnId, !currentVisibility));\r\n },\r\n [currentState.columnVisibility, updateState]\r\n );\r\n\r\n const setColumnVisibility = useCallback(\r\n (columnId: string, visible: boolean) => {\r\n updateState((prev) => updateColumnVisibility(prev, columnId, visible));\r\n },\r\n [updateState]\r\n );\r\n\r\n const reorderColumns = useCallback(\r\n (columnOrder: string[]) => {\r\n updateState((prev) => updateColumnOrder(prev, columnOrder));\r\n },\r\n [updateState]\r\n );\r\n\r\n // Return stable table instance API\r\n return useMemo(\r\n () => ({\r\n state: currentState,\r\n columns,\r\n visibleColumns,\r\n data,\r\n filteredData,\r\n sortedData,\r\n paginatedData,\r\n filteredRowCount,\r\n pageCount,\r\n pageIndex: currentState.pagination.pageIndex,\r\n pageSize: currentState.pagination.pageSize,\r\n hasNextPage: hasNext,\r\n hasPreviousPage: hasPrev,\r\n sorting: {\r\n state: currentState.sorting,\r\n toggle: handleToggleSort,\r\n set: handleSetSort,\r\n clear: handleClearSort,\r\n },\r\n pagination: {\r\n state: currentState.pagination,\r\n nextPage: handleNextPage,\r\n previousPage: handlePreviousPage,\r\n goToPage: handleGoToPage,\r\n setPageSize: handleSetPageSize,\r\n },\r\n filtering: {\r\n state: currentState.filtering,\r\n setGlobalFilter: handleSetGlobalFilter,\r\n setColumnFilter: handleSetColumnFilter,\r\n clearColumnFilter: handleClearColumnFilter,\r\n clearAllFilters: handleClearAllFilters,\r\n },\r\n columnManagement: {\r\n toggleVisibility: toggleColumnVisibility,\r\n setVisibility: setColumnVisibility,\r\n reorder: reorderColumns,\r\n },\r\n }),\r\n [\r\n currentState,\r\n columns,\r\n visibleColumns,\r\n data,\r\n filteredData,\r\n sortedData,\r\n paginatedData,\r\n filteredRowCount,\r\n pageCount,\r\n hasNext,\r\n hasPrev,\r\n handleToggleSort,\r\n handleSetSort,\r\n handleClearSort,\r\n handleNextPage,\r\n handlePreviousPage,\r\n handleGoToPage,\r\n handleSetPageSize,\r\n handleSetGlobalFilter,\r\n handleSetColumnFilter,\r\n handleClearColumnFilter,\r\n handleClearAllFilters,\r\n toggleColumnVisibility,\r\n setColumnVisibility,\r\n reorderColumns,\r\n ]\r\n );\r\n}\r\n"]}
package/dist/ui.d.mts ADDED
@@ -0,0 +1,160 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Column, SortState } from './core.mjs';
3
+ import React from 'react';
4
+ import { TableInstance } from './react.mjs';
5
+
6
+ interface DataTableSlots<TData> {
7
+ /** Loading state component */
8
+ loader?: React.ComponentType;
9
+ /** Empty state component */
10
+ empty?: React.ComponentType<{
11
+ columns: Column<TData>[];
12
+ }>;
13
+ /** Error state component */
14
+ error?: React.ComponentType<{
15
+ error: Error | string;
16
+ }>;
17
+ }
18
+ interface DataTableProps<TData> {
19
+ /** Table instance from useDataTable hook */
20
+ table: TableInstance<TData>;
21
+ /** Custom slots for loading/empty/error states */
22
+ slots?: DataTableSlots<TData>;
23
+ /** Custom cell renderer */
24
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
25
+ /** Custom header renderer */
26
+ renderHeader?: (column: Column<TData>, sortState: SortState) => React.ReactNode;
27
+ /** Custom row renderer */
28
+ renderRow?: (row: TData, index: number, cells: React.ReactNode[]) => React.ReactNode;
29
+ /** Row key extractor */
30
+ getRowKey?: (row: TData, index: number) => string | number;
31
+ /** Whether header is sticky */
32
+ stickyHeader?: boolean;
33
+ /** Whether first column is sticky */
34
+ stickyFirstColumn?: boolean;
35
+ /** Enable column resizing */
36
+ enableResizing?: boolean;
37
+ /** Maximum height for vertical scrolling (in pixels) */
38
+ maxHeight?: number | string;
39
+ /** Whether to show borders (default: true) */
40
+ bordered?: boolean;
41
+ /** Additional className */
42
+ className?: string;
43
+ /** Loading state */
44
+ isLoading?: boolean;
45
+ /** Error state */
46
+ error?: Error | string | null;
47
+ }
48
+ /**
49
+ * DataTable component
50
+ *
51
+ * Main table component that renders a complete data table with all features.
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * const table = useDataTable({ data, columns });
56
+ *
57
+ * <DataTable
58
+ * table={table}
59
+ * stickyHeader
60
+ * stickyFirstColumn
61
+ * enableResizing
62
+ * maxHeight={400}
63
+ * bordered
64
+ * slots={{
65
+ * loader: () => <div>Loading...</div>,
66
+ * empty: () => <div>No data</div>,
67
+ * }}
68
+ * />
69
+ * ```
70
+ */
71
+ declare function DataTable<TData>({ table, slots, renderCell, renderHeader, renderRow, getRowKey, stickyHeader, stickyFirstColumn, enableResizing, maxHeight, bordered, className, isLoading, error, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
72
+
73
+ interface TableHeaderProps<TData> {
74
+ /** Visible columns */
75
+ columns: Column<TData>[];
76
+ /** Current sort state */
77
+ sortState: SortState;
78
+ /** Sort toggle handler */
79
+ onSort: (columnId: string) => void;
80
+ /** Column resize handler */
81
+ onResize?: (columnId: string, width: number) => void;
82
+ /** Custom header renderer */
83
+ renderHeader?: (column: Column<TData>, sortState: SortState) => React.ReactNode;
84
+ /** Whether header is sticky */
85
+ sticky?: boolean;
86
+ /** Whether first column is sticky */
87
+ stickyFirstColumn?: boolean;
88
+ /** Whether borders are enabled */
89
+ bordered?: boolean;
90
+ /** Additional className */
91
+ className?: string;
92
+ }
93
+ /**
94
+ * TableHeader component
95
+ *
96
+ * Renders table header row with sortable columns and resizing support.
97
+ */
98
+ declare function TableHeader<TData>({ columns, sortState, onSort, onResize, renderHeader, sticky, stickyFirstColumn, bordered, className, }: TableHeaderProps<TData>): react_jsx_runtime.JSX.Element;
99
+
100
+ interface TableBodyProps<TData> {
101
+ /** Data rows to render */
102
+ data: TData[];
103
+ /** Visible columns */
104
+ columns: Column<TData>[];
105
+ /** Row key extractor */
106
+ getRowKey?: (row: TData, index: number) => string | number;
107
+ /** Custom cell renderer */
108
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
109
+ /** Custom row renderer */
110
+ renderRow?: (row: TData, index: number, cells: React.ReactNode[]) => React.ReactNode;
111
+ /** Whether first column is sticky */
112
+ stickyFirstColumn?: boolean;
113
+ /** Loading state */
114
+ isLoading?: boolean;
115
+ /** Error state */
116
+ error?: Error | string | null;
117
+ /** Empty state component */
118
+ emptyComponent?: React.ComponentType<{
119
+ columns: Column<TData>[];
120
+ }>;
121
+ /** Loading state component */
122
+ loadingComponent?: React.ComponentType;
123
+ /** Error state component */
124
+ errorComponent?: React.ComponentType<{
125
+ error: Error | string;
126
+ }>;
127
+ /** Whether borders are enabled */
128
+ bordered?: boolean;
129
+ /** Additional className */
130
+ className?: string;
131
+ }
132
+ /**
133
+ * TableBody component
134
+ *
135
+ * Renders table body rows with support for loading, error, and empty states.
136
+ */
137
+ declare function TableBody<TData>({ data, columns, getRowKey, renderCell, renderRow, stickyFirstColumn, isLoading, error, emptyComponent: EmptyComponent, loadingComponent: LoadingComponent, errorComponent: ErrorComponent, bordered, className, }: TableBodyProps<TData>): react_jsx_runtime.JSX.Element;
138
+
139
+ interface TableCellProps<TData> {
140
+ /** Column definition */
141
+ column: Column<TData>;
142
+ /** Data row */
143
+ row: TData;
144
+ /** Row index */
145
+ rowIndex: number;
146
+ /** Column index */
147
+ columnIndex: number;
148
+ /** Custom cell renderer */
149
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
150
+ /** Additional className */
151
+ className?: string;
152
+ }
153
+ /**
154
+ * TableCell component
155
+ *
156
+ * Renders a single table cell with proper alignment and styling.
157
+ */
158
+ declare function TableCell<TData>({ column, row, rowIndex, columnIndex, renderCell, className, }: TableCellProps<TData>): react_jsx_runtime.JSX.Element;
159
+
160
+ export { DataTable, type DataTableProps, type DataTableSlots, TableBody, type TableBodyProps, TableCell, type TableCellProps, TableHeader, type TableHeaderProps };
package/dist/ui.d.ts ADDED
@@ -0,0 +1,160 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Column, SortState } from './core.js';
3
+ import React from 'react';
4
+ import { TableInstance } from './react.js';
5
+
6
+ interface DataTableSlots<TData> {
7
+ /** Loading state component */
8
+ loader?: React.ComponentType;
9
+ /** Empty state component */
10
+ empty?: React.ComponentType<{
11
+ columns: Column<TData>[];
12
+ }>;
13
+ /** Error state component */
14
+ error?: React.ComponentType<{
15
+ error: Error | string;
16
+ }>;
17
+ }
18
+ interface DataTableProps<TData> {
19
+ /** Table instance from useDataTable hook */
20
+ table: TableInstance<TData>;
21
+ /** Custom slots for loading/empty/error states */
22
+ slots?: DataTableSlots<TData>;
23
+ /** Custom cell renderer */
24
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
25
+ /** Custom header renderer */
26
+ renderHeader?: (column: Column<TData>, sortState: SortState) => React.ReactNode;
27
+ /** Custom row renderer */
28
+ renderRow?: (row: TData, index: number, cells: React.ReactNode[]) => React.ReactNode;
29
+ /** Row key extractor */
30
+ getRowKey?: (row: TData, index: number) => string | number;
31
+ /** Whether header is sticky */
32
+ stickyHeader?: boolean;
33
+ /** Whether first column is sticky */
34
+ stickyFirstColumn?: boolean;
35
+ /** Enable column resizing */
36
+ enableResizing?: boolean;
37
+ /** Maximum height for vertical scrolling (in pixels) */
38
+ maxHeight?: number | string;
39
+ /** Whether to show borders (default: true) */
40
+ bordered?: boolean;
41
+ /** Additional className */
42
+ className?: string;
43
+ /** Loading state */
44
+ isLoading?: boolean;
45
+ /** Error state */
46
+ error?: Error | string | null;
47
+ }
48
+ /**
49
+ * DataTable component
50
+ *
51
+ * Main table component that renders a complete data table with all features.
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * const table = useDataTable({ data, columns });
56
+ *
57
+ * <DataTable
58
+ * table={table}
59
+ * stickyHeader
60
+ * stickyFirstColumn
61
+ * enableResizing
62
+ * maxHeight={400}
63
+ * bordered
64
+ * slots={{
65
+ * loader: () => <div>Loading...</div>,
66
+ * empty: () => <div>No data</div>,
67
+ * }}
68
+ * />
69
+ * ```
70
+ */
71
+ declare function DataTable<TData>({ table, slots, renderCell, renderHeader, renderRow, getRowKey, stickyHeader, stickyFirstColumn, enableResizing, maxHeight, bordered, className, isLoading, error, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
72
+
73
+ interface TableHeaderProps<TData> {
74
+ /** Visible columns */
75
+ columns: Column<TData>[];
76
+ /** Current sort state */
77
+ sortState: SortState;
78
+ /** Sort toggle handler */
79
+ onSort: (columnId: string) => void;
80
+ /** Column resize handler */
81
+ onResize?: (columnId: string, width: number) => void;
82
+ /** Custom header renderer */
83
+ renderHeader?: (column: Column<TData>, sortState: SortState) => React.ReactNode;
84
+ /** Whether header is sticky */
85
+ sticky?: boolean;
86
+ /** Whether first column is sticky */
87
+ stickyFirstColumn?: boolean;
88
+ /** Whether borders are enabled */
89
+ bordered?: boolean;
90
+ /** Additional className */
91
+ className?: string;
92
+ }
93
+ /**
94
+ * TableHeader component
95
+ *
96
+ * Renders table header row with sortable columns and resizing support.
97
+ */
98
+ declare function TableHeader<TData>({ columns, sortState, onSort, onResize, renderHeader, sticky, stickyFirstColumn, bordered, className, }: TableHeaderProps<TData>): react_jsx_runtime.JSX.Element;
99
+
100
+ interface TableBodyProps<TData> {
101
+ /** Data rows to render */
102
+ data: TData[];
103
+ /** Visible columns */
104
+ columns: Column<TData>[];
105
+ /** Row key extractor */
106
+ getRowKey?: (row: TData, index: number) => string | number;
107
+ /** Custom cell renderer */
108
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
109
+ /** Custom row renderer */
110
+ renderRow?: (row: TData, index: number, cells: React.ReactNode[]) => React.ReactNode;
111
+ /** Whether first column is sticky */
112
+ stickyFirstColumn?: boolean;
113
+ /** Loading state */
114
+ isLoading?: boolean;
115
+ /** Error state */
116
+ error?: Error | string | null;
117
+ /** Empty state component */
118
+ emptyComponent?: React.ComponentType<{
119
+ columns: Column<TData>[];
120
+ }>;
121
+ /** Loading state component */
122
+ loadingComponent?: React.ComponentType;
123
+ /** Error state component */
124
+ errorComponent?: React.ComponentType<{
125
+ error: Error | string;
126
+ }>;
127
+ /** Whether borders are enabled */
128
+ bordered?: boolean;
129
+ /** Additional className */
130
+ className?: string;
131
+ }
132
+ /**
133
+ * TableBody component
134
+ *
135
+ * Renders table body rows with support for loading, error, and empty states.
136
+ */
137
+ declare function TableBody<TData>({ data, columns, getRowKey, renderCell, renderRow, stickyFirstColumn, isLoading, error, emptyComponent: EmptyComponent, loadingComponent: LoadingComponent, errorComponent: ErrorComponent, bordered, className, }: TableBodyProps<TData>): react_jsx_runtime.JSX.Element;
138
+
139
+ interface TableCellProps<TData> {
140
+ /** Column definition */
141
+ column: Column<TData>;
142
+ /** Data row */
143
+ row: TData;
144
+ /** Row index */
145
+ rowIndex: number;
146
+ /** Column index */
147
+ columnIndex: number;
148
+ /** Custom cell renderer */
149
+ renderCell?: (value: unknown, row: TData, column: Column<TData>) => React.ReactNode;
150
+ /** Additional className */
151
+ className?: string;
152
+ }
153
+ /**
154
+ * TableCell component
155
+ *
156
+ * Renders a single table cell with proper alignment and styling.
157
+ */
158
+ declare function TableCell<TData>({ column, row, rowIndex, columnIndex, renderCell, className, }: TableCellProps<TData>): react_jsx_runtime.JSX.Element;
159
+
160
+ export { DataTable, type DataTableProps, type DataTableSlots, TableBody, type TableBodyProps, TableCell, type TableCellProps, TableHeader, type TableHeaderProps };