@rowakit/table 0.3.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/column-helpers.ts","../src/components/SmartTable.tsx","../src/index.ts"],"names":["actions","jsx","jsxs","useState","useRef","useEffect","totalPages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Column helper factory functions\r\n *\r\n * These helpers provide a clean, type-safe API for defining table columns.\r\n * They reduce boilerplate and enforce conventions while maintaining flexibility\r\n * through the `col.custom` escape hatch.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type {\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n ActionDef,\r\n BadgeTone,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// HELPER OPTIONS\r\n// ============================================================================\r\n\r\ninterface TextOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional formatter function */\r\n format?: (value: unknown) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface DateOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional date formatter function */\r\n format?: (value: Date | string | number) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BooleanOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional boolean formatter function */\r\n format?: (value: boolean) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BadgeOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Value-to-badge mapping */\r\n map?: Record<string, { label: string; tone: BadgeTone }>;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface NumberOptions<T = unknown> {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Formatting options: Intl.NumberFormatOptions or custom formatter */\r\n format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COLUMN HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Create a text column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.text('name')\r\n * col.text('email', { header: 'Email Address', sortable: true })\r\n * col.text('status', { format: (val) => val.toUpperCase() })\r\n * ```\r\n */\r\nfunction text<T>(\r\n field: keyof T & string,\r\n options?: TextOptions\r\n): TextColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'text',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a date column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.date('createdAt')\r\n * col.date('updatedAt', { header: 'Last Modified', sortable: true })\r\n * col.date('birthday', {\r\n * format: (date) => new Date(date).toLocaleDateString()\r\n * })\r\n * ```\r\n */\r\nfunction date<T>(\r\n field: keyof T & string,\r\n options?: DateOptions\r\n): DateColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'date',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a boolean column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.boolean('active')\r\n * col.boolean('isPublished', { header: 'Published', sortable: true })\r\n * col.boolean('enabled', {\r\n * format: (val) => val ? 'Yes' : 'No'\r\n * })\r\n * ```\r\n */\r\nfunction boolean<T>(\r\n field: keyof T & string,\r\n options?: BooleanOptions\r\n): BooleanColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'boolean',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a badge column definition for status/enum fields.\r\n *\r\n * @example\r\n * ```ts\r\n * col.badge('status')\r\n * col.badge('status', {\r\n * map: {\r\n * active: { label: 'Active', tone: 'success' },\r\n * paused: { label: 'Paused', tone: 'warning' },\r\n * disabled: { label: 'Disabled', tone: 'danger' }\r\n * }\r\n * })\r\n * ```\r\n */\r\nfunction badge<T>(\r\n field: keyof T & string,\r\n options?: BadgeOptions\r\n): BadgeColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'badge',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n map: options?.map,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a number column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.number('amount')\r\n * col.number('price', {\r\n * format: { style: 'currency', currency: 'USD' }\r\n * })\r\n * col.number('count', {\r\n * format: (val, row) => `${val} items`\r\n * })\r\n * ```\r\n */\r\nfunction number<T>(\r\n field: keyof T & string,\r\n options?: NumberOptions<T>\r\n): NumberColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'number',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create an actions column definition.\r\n *\r\n * The actions column displays a set of actions (buttons/links) that can be\r\n * performed on each row.\r\n *\r\n * @example\r\n * ```ts\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => editUser(row) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (row) => deleteUser(row) }\r\n * ])\r\n * ```\r\n */\r\nfunction actions<T>(actions: ActionDef<T>[]): ActionsColumnDef<T> {\r\n return {\r\n id: 'actions',\r\n kind: 'actions',\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Create a custom column definition with full rendering control.\r\n *\r\n * This is the escape hatch for any column that doesn't fit the standard types.\r\n * Use this for badges, avatars, complex formatting, or any custom UI.\r\n *\r\n * @example\r\n * ```ts\r\n * col.custom({\r\n * id: 'avatar',\r\n * header: 'User',\r\n * render: (row) => <img src={row.avatar} alt={row.name} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'price',\r\n * field: 'price',\r\n * render: (row) => <Money amount={row.price} currency={row.currency} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'status',\r\n * render: (row) => (\r\n * <Badge color={row.status === 'active' ? 'green' : 'gray'}>\r\n * {row.status}\r\n * </Badge>\r\n * )\r\n * })\r\n * ```\r\n */\r\nfunction custom<T>(\r\n field: keyof T & string,\r\n render: (row: T) => ReactNode\r\n): CustomColumnDef<T>;\r\nfunction custom<T>(options: {\r\n /** Unique column identifier */\r\n id: string;\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Optional field name for sorting/filtering */\r\n field?: keyof T & string;\r\n /** Render function for cell content */\r\n render: (row: T) => ReactNode;\r\n}): CustomColumnDef<T>;\r\nfunction custom<T>(\r\n arg1:\r\n | (keyof T & string)\r\n | {\r\n id: string;\r\n header?: string;\r\n field?: keyof T & string;\r\n render: (row: T) => ReactNode;\r\n },\r\n arg2?: (row: T) => ReactNode\r\n): CustomColumnDef<T> {\r\n if (typeof arg1 === 'string') {\r\n if (typeof arg2 !== 'function') {\r\n throw new Error('col.custom(field, render): render must be a function');\r\n }\r\n\r\n return {\r\n id: arg1,\r\n kind: 'custom',\r\n field: arg1,\r\n render: arg2,\r\n };\r\n }\r\n\r\n return {\r\n id: arg1.id,\r\n kind: 'custom',\r\n header: arg1.header,\r\n field: arg1.field,\r\n render: arg1.render,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\n/**\r\n * Column helper factory object.\r\n *\r\n * Provides convenient helper functions for creating column definitions.\r\n *\r\n * @example\r\n * ```tsx\r\n * import { col } from '@rowakit/table';\r\n *\r\n * const columns = [\r\n * col.text('name', { sortable: true }),\r\n * col.date('createdAt'),\r\n * col.boolean('active'),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => {} }\r\n * ]),\r\n * col.custom({ id: 'badge', render: (row) => <Badge>{row.status}</Badge> })\r\n * ];\r\n * ```\r\n */\r\nexport const col = {\r\n text,\r\n date,\r\n boolean,\r\n badge,\r\n number,\r\n actions,\r\n custom,\r\n} as const;\r\n","/**\r\n * RowaKit Table Component\r\n *\r\n * Core table rendering component that maps columns to table cells.\r\n * Handles all column types: text, date, boolean, actions, and custom.\r\n * Includes data fetching state machine with loading/error/empty states.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Fetcher, ColumnDef, FetcherQuery, ActionDef, FilterValue, ActionsColumnDef } from '../types';\r\n\r\n// ============================================================================\r\n// COMPONENT PROPS\r\n// ============================================================================\r\n\r\nexport interface SmartTableProps<T> {\r\n /** Server-side data fetcher function */\r\n fetcher: Fetcher<T>;\r\n\r\n /** Array of column definitions */\r\n columns: ColumnDef<T>[];\r\n\r\n /** Available page size options (default: [10, 20, 50]) */\r\n pageSizeOptions?: number[];\r\n\r\n /** Initial page size (default: 20) */\r\n defaultPageSize?: number;\r\n\r\n /** Function or field name to extract row key (default: uses 'id' field) */\r\n rowKey?: keyof T | ((row: T) => string | number);\r\n\r\n /** Optional CSS class name for the table container */\r\n className?: string;\r\n\r\n /** Enable filters (default: false) */\r\n enableFilters?: boolean;\r\n\r\n /** Stage C: Enable column resizing (default: false) */\r\n enableColumnResizing?: boolean;\r\n\r\n /** Stage C: Sync table state to URL query string (default: false) */\r\n syncToUrl?: boolean;\r\n\r\n /** Stage C: Enable saved views feature (default: false) */\r\n enableSavedViews?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// STATE MANAGEMENT\r\n// ============================================================================\r\n\r\ntype FetchState = 'idle' | 'loading' | 'success' | 'empty' | 'error';\r\n\r\ninterface DataState<T> {\r\n state: FetchState;\r\n items: T[];\r\n total: number;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Confirmation state for actions that require confirmation.\r\n */\r\ninterface ConfirmState<T> {\r\n action: ActionDef<T>;\r\n row: T;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Extract unique key from a row.\r\n */\r\nfunction getRowKey<T>(row: T, rowKey?: keyof T | ((row: T) => string | number)): string | number {\r\n if (typeof rowKey === 'function') {\r\n return rowKey(row);\r\n }\r\n if (rowKey) {\r\n return String(row[rowKey]);\r\n }\r\n // Fallback to 'id' field if available\r\n if (row && typeof row === 'object' && 'id' in row) {\r\n return String(row.id);\r\n }\r\n // Last resort: use object reference (not ideal but safe)\r\n return String(row);\r\n}\r\n\r\n/**\r\n * Get header label for a column.\r\n */\r\nfunction getHeaderLabel<T>(column: ColumnDef<T>): string {\r\n return column.header ?? column.id;\r\n}\r\n\r\n/**\r\n * Render cell content based on column kind.\r\n */\r\nfunction renderCell<T>(\r\n column: ColumnDef<T>,\r\n row: T,\r\n isLoading: boolean,\r\n setConfirmState: (state: ConfirmState<T> | null) => void\r\n): ReactNode {\r\n switch (column.kind) {\r\n case 'text': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value);\r\n }\r\n return String(value ?? '');\r\n }\r\n\r\n case 'date': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value as Date | string | number);\r\n }\r\n // Default date formatting\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n return '';\r\n }\r\n\r\n case 'boolean': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(Boolean(value));\r\n }\r\n // Default boolean formatting\r\n return value ? 'Yes' : 'No';\r\n }\r\n\r\n case 'badge': {\r\n const value = row[column.field];\r\n const valueStr = String(value ?? '');\r\n \r\n // Look up mapping\r\n const mapped = column.map?.[valueStr];\r\n const label = mapped?.label ?? valueStr;\r\n const tone = mapped?.tone ?? 'neutral';\r\n \r\n return (\r\n <span className={`rowakit-badge rowakit-badge-${tone}`}>\r\n {label}\r\n </span>\r\n );\r\n }\r\n\r\n case 'number': {\r\n const value = row[column.field];\r\n const numValue = Number(value ?? 0);\r\n \r\n if (column.format) {\r\n if (typeof column.format === 'function') {\r\n return column.format(numValue, row);\r\n }\r\n // Intl.NumberFormatOptions\r\n return new Intl.NumberFormat(undefined, column.format).format(numValue);\r\n }\r\n \r\n // Default number formatting\r\n return numValue.toLocaleString();\r\n }\r\n\r\n case 'actions': {\r\n const columnWithActions = column as ActionsColumnDef<T>;\r\n // Safety check: ensure actions is an array\r\n if (!Array.isArray(columnWithActions.actions)) {\r\n return null;\r\n }\r\n return (\r\n <div className=\"rowakit-table-actions\">\r\n {columnWithActions.actions.map((action) => {\r\n const isDisabled =\r\n isLoading ||\r\n action.disabled === true ||\r\n (typeof action.disabled === 'function' && action.disabled(row));\r\n\r\n const handleClick = () => {\r\n if (isDisabled || action.loading) {\r\n return;\r\n }\r\n\r\n // If action requires confirmation, show modal\r\n if (action.confirm) {\r\n setConfirmState({ action, row });\r\n } else {\r\n // Execute action directly\r\n void action.onClick(row);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n key={action.id}\r\n onClick={handleClick}\r\n disabled={isDisabled || action.loading}\r\n type=\"button\"\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n >\r\n {action.icon && typeof action.icon === 'string' ? (\r\n <span>{action.icon}</span>\r\n ) : (\r\n action.icon\r\n )}\r\n {action.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n case 'custom': {\r\n return column.render(row);\r\n }\r\n\r\n default: {\r\n // Exhaustive check\r\n const _exhaustive: never = column;\r\n return _exhaustive;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * RowaKitTable - Server-side table component for internal/business apps.\r\n *\r\n * This component renders a table with headers and body based on column definitions.\r\n * It handles all column types (text, date, boolean, actions, custom) and provides\r\n * a clean API for defining table structure.\r\n *\r\n * Features:\r\n * - Automatic data fetching on mount and query changes\r\n * - Loading, error, and empty states\r\n * - Stale request handling\r\n * - Retry on error\r\n *\r\n * @example\r\n * ```tsx\r\n * import { RowaKitTable, col } from '@rowakit/table';\r\n *\r\n * interface User {\r\n * id: string;\r\n * name: string;\r\n * email: string;\r\n * createdAt: Date;\r\n * active: boolean;\r\n * }\r\n *\r\n * const fetchUsers: Fetcher<User> = async (query) => {\r\n * const response = await fetch(`/api/users?page=${query.page}&pageSize=${query.pageSize}`);\r\n * return response.json();\r\n * };\r\n *\r\n * function UsersTable() {\r\n * return (\r\n * <RowaKitTable\r\n * fetcher={fetchUsers}\r\n * columns={[\r\n * col.text('name', { header: 'Name', sortable: true }),\r\n * col.text('email', { header: 'Email' }),\r\n * col.date('createdAt', { header: 'Created' }),\r\n * col.boolean('active', { header: 'Active' }),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (user) => editUser(user) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (user) => deleteUser(user) }\r\n * ])\r\n * ]}\r\n * defaultPageSize={20}\r\n * rowKey=\"id\"\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function RowaKitTable<T>({\r\n fetcher,\r\n columns,\r\n defaultPageSize = 20,\r\n pageSizeOptions = [10, 20, 50],\r\n rowKey,\r\n className = '',\r\n enableFilters = false,\r\n enableColumnResizing = false,\r\n syncToUrl = false,\r\n enableSavedViews = false,\r\n}: SmartTableProps<T>) {\r\n // State management\r\n const [dataState, setDataState] = useState<DataState<T>>({\r\n state: 'idle',\r\n items: [],\r\n total: 0,\r\n });\r\n\r\n const [query, setQuery] = useState<FetcherQuery>({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n\r\n // Filter state (field -> FilterValue)\r\n const [filters, setFilters] = useState<Record<string, FilterValue | undefined>>({});\r\n\r\n // Stage C: Column widths for resizing\r\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\r\n\r\n // Stage C: Refs for resize optimization\r\n const resizeRafRef = useRef<number | null>(null);\r\n const resizePendingRef = useRef<{ colId: string; width: number } | null>(null);\r\n const tableRef = useRef<HTMLTableElement | null>(null);\r\n\r\n // Stage C: Saved views\r\n const [savedViews, setSavedViews] = useState<Array<{\r\n name: string;\r\n state: {\r\n page: number;\r\n pageSize: number;\r\n sort?: { field: string; direction: 'asc' | 'desc' };\r\n filters?: Record<string, FilterValue | undefined>;\r\n columnWidths?: Record<string, number>;\r\n };\r\n }>>([]);\r\n\r\n // Confirmation state for actions that require confirmation\r\n const [confirmState, setConfirmState] = useState<ConfirmState<T> | null>(null);\r\n\r\n // Request tracking to ignore stale responses\r\n const requestIdRef = useRef(0);\r\n\r\n // Stage C: Sync to URL on query changes\r\n useEffect(() => {\r\n if (!syncToUrl) return;\r\n\r\n const params = new URLSearchParams();\r\n params.set('page', String(query.page));\r\n params.set('pageSize', String(query.pageSize));\r\n \r\n if (query.sort) {\r\n params.set('sortField', query.sort.field);\r\n params.set('sortDirection', query.sort.direction);\r\n }\r\n \r\n if (query.filters && Object.keys(query.filters).length > 0) {\r\n params.set('filters', JSON.stringify(query.filters));\r\n }\r\n \r\n if (enableColumnResizing && Object.keys(columnWidths).length > 0) {\r\n params.set('columnWidths', JSON.stringify(columnWidths));\r\n }\r\n\r\n window.history.replaceState(null, '', `?${params.toString()}`);\r\n }, [query, columnWidths, syncToUrl, enableColumnResizing]);\r\n\r\n // Stage C: Load from URL on mount\r\n useEffect(() => {\r\n if (!syncToUrl) return;\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const page = parseInt(params.get('page') ?? '1', 10);\r\n const pageSize = parseInt(params.get('pageSize') ?? String(defaultPageSize), 10);\r\n const sortField = params.get('sortField');\r\n const sortDirection = params.get('sortDirection') as 'asc' | 'desc' | null;\r\n const filtersStr = params.get('filters');\r\n const columnWidthsStr = params.get('columnWidths');\r\n\r\n const newQuery: FetcherQuery = {\r\n page: Math.max(1, page),\r\n pageSize: Math.max(1, pageSize),\r\n };\r\n\r\n if (sortField && sortDirection) {\r\n newQuery.sort = { field: sortField, direction: sortDirection };\r\n }\r\n\r\n if (filtersStr) {\r\n try {\r\n const parsedFilters = JSON.parse(filtersStr);\r\n if (parsedFilters && typeof parsedFilters === 'object') {\r\n setFilters(parsedFilters as Record<string, FilterValue | undefined>);\r\n newQuery.filters = parsedFilters;\r\n }\r\n } catch {\r\n // Ignore invalid filters\r\n }\r\n }\r\n\r\n if (enableColumnResizing && columnWidthsStr) {\r\n try {\r\n setColumnWidths(JSON.parse(columnWidthsStr));\r\n } catch {\r\n // Ignore invalid column widths\r\n }\r\n }\r\n\r\n setQuery(newQuery);\r\n }, [syncToUrl, defaultPageSize, enableColumnResizing]); // Only on mount\r\n\r\n // Sync filters to query (and reset page to 1 when filters change)\r\n useEffect(() => {\r\n if (!enableFilters) return;\r\n\r\n // Build filters object, excluding undefined values\r\n const activeFilters: Record<string, FilterValue> = {};\r\n let hasFilters = false;\r\n \r\n for (const [field, value] of Object.entries(filters)) {\r\n if (value !== undefined) {\r\n activeFilters[field] = value;\r\n hasFilters = true;\r\n }\r\n }\r\n\r\n // Per spec: filters must be undefined when empty (not {})\r\n const filtersToSend = hasFilters ? activeFilters : undefined;\r\n\r\n setQuery((prev) => ({\r\n ...prev,\r\n filters: filtersToSend,\r\n page: 1, // Reset page to 1 when filters change\r\n }));\r\n }, [filters, enableFilters]);\r\n\r\n // Fetch data effect\r\n useEffect(() => {\r\n const currentRequestId = ++requestIdRef.current;\r\n\r\n setDataState((prev) => ({ ...prev, state: 'loading' }));\r\n\r\n fetcher(query)\r\n .then((result) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n if (result.items.length === 0) {\r\n setDataState({\r\n state: 'empty',\r\n items: [],\r\n total: result.total,\r\n });\r\n } else {\r\n setDataState({\r\n state: 'success',\r\n items: result.items,\r\n total: result.total,\r\n });\r\n }\r\n })\r\n .catch((error: unknown) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n setDataState({\r\n state: 'error',\r\n items: [],\r\n total: 0,\r\n error: error instanceof Error ? error.message : 'Failed to load data',\r\n });\r\n });\r\n }, [fetcher, query]);\r\n\r\n // Retry handler\r\n const handleRetry = () => {\r\n // Force re-fetch by updating query reference\r\n setQuery({ ...query });\r\n };\r\n\r\n // Pagination handlers\r\n const handlePreviousPage = () => {\r\n if (query.page > 1) {\r\n setQuery((prev) => ({ ...prev, page: prev.page - 1 }));\r\n }\r\n };\r\n\r\n const handleNextPage = () => {\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n if (query.page < totalPages) {\r\n setQuery((prev) => ({ ...prev, page: prev.page + 1 }));\r\n }\r\n };\r\n\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setQuery({ ...query, pageSize: newPageSize, page: 1 });\r\n };\r\n\r\n // Sorting handler\r\n const handleSort = (field: string) => {\r\n setQuery((prev) => {\r\n // If sorting by a different field, start with ascending\r\n if (prev.sort?.field !== field) {\r\n return { ...prev, sort: { field, direction: 'asc' }, page: 1 };\r\n }\r\n\r\n // Toggle sort direction for the same field\r\n if (prev.sort.direction === 'asc') {\r\n return { ...prev, sort: { field, direction: 'desc' }, page: 1 };\r\n }\r\n\r\n // Remove sort (back to unsorted)\r\n const { sort: _sort, ...rest } = prev;\r\n return { ...rest, page: 1 };\r\n });\r\n };\r\n\r\n // Get sort indicator for a column\r\n const getSortIndicator = (field: string): string => {\r\n if (!query.sort || query.sort.field !== field) {\r\n return '';\r\n }\r\n return query.sort.direction === 'asc' ? ' ↑' : ' ↓';\r\n };\r\n\r\n // Stage C: Schedule column width update (RAF throttle)\r\n const scheduleColumnWidthUpdate = (colId: string, width: number) => {\r\n resizePendingRef.current = { colId, width };\r\n\r\n if (resizeRafRef.current != null) return;\r\n\r\n resizeRafRef.current = requestAnimationFrame(() => {\r\n resizeRafRef.current = null;\r\n\r\n const pending = resizePendingRef.current;\r\n if (!pending) return;\r\n\r\n handleColumnResize(pending.colId, pending.width);\r\n });\r\n };\r\n\r\n // Stage C: Column resize handler\r\n const handleColumnResize = (columnId: string, newWidth: number) => {\r\n // Enforce minimum width\r\n const minWidth = columns.find(c => c.id === columnId)?.minWidth ?? 80;\r\n const maxWidth = columns.find(c => c.id === columnId)?.maxWidth;\r\n \r\n let finalWidth = Math.max(minWidth, newWidth);\r\n if (maxWidth) {\r\n finalWidth = Math.min(finalWidth, maxWidth);\r\n }\r\n\r\n setColumnWidths((prev) => ({\r\n ...prev,\r\n [columnId]: finalWidth,\r\n }));\r\n };\r\n\r\n // Stage C: Column resize drag handler\r\n const startColumnResize = (e: React.MouseEvent<HTMLDivElement>, columnId: string) => {\r\n e.preventDefault();\r\n const startX = e.clientX;\r\n const th = (e.currentTarget.parentElement as HTMLTableCellElement);\r\n \r\n // Get the actual width of current column\r\n // (either from state if resized, or from offsetWidth if auto)\r\n let startWidth = columnWidths[columnId] ?? th.offsetWidth;\r\n\r\n // If current column is too small (< 80px), use a minimum base width\r\n // to ensure we always have enough space to drag comfortably\r\n const MIN_DRAG_WIDTH = 80;\r\n if (startWidth < MIN_DRAG_WIDTH) {\r\n // Try to get a usable width from next column or use fallback\r\n const nextTh = th.nextElementSibling as HTMLTableCellElement | null;\r\n if (nextTh && nextTh.offsetWidth >= 50) {\r\n startWidth = nextTh.offsetWidth;\r\n } else {\r\n // Fallback: use 100px as a comfortable base for dragging\r\n startWidth = 100;\r\n }\r\n }\r\n\r\n // Prevent text selection during drag\r\n document.body.classList.add('rowakit-resizing');\r\n\r\n const handleMouseMove = (moveEvent: MouseEvent) => {\r\n const delta = moveEvent.clientX - startX;\r\n const newWidth = startWidth + delta;\r\n // Use RAF throttle for smooth performance\r\n scheduleColumnWidthUpdate(columnId, newWidth);\r\n };\r\n\r\n const handleMouseUp = () => {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n // Re-enable text selection\r\n document.body.classList.remove('rowakit-resizing');\r\n };\r\n\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n };\r\n\r\n // Stage C: Double-click to auto-fit content\r\n const handleColumnResizeDoubleClick = (columnId: string) => {\r\n const tableEl = tableRef.current;\r\n if (!tableEl) return;\r\n\r\n const th = tableEl.querySelector(`th[data-col-id=\"${columnId}\"]`) as HTMLTableCellElement | null;\r\n if (!th) return;\r\n\r\n const tds = Array.from(tableEl.querySelectorAll(`td[data-col-id=\"${columnId}\"]`)) as HTMLTableCellElement[];\r\n\r\n const headerW = th.scrollWidth;\r\n const cellsMaxW = tds.reduce((max, td) => Math.max(max, td.scrollWidth), 0);\r\n\r\n const padding = 24; // buffer for padding + sort icon\r\n const raw = Math.max(headerW, cellsMaxW) + padding;\r\n\r\n const minW = columns.find(c => c.id === columnId)?.minWidth ?? 80;\r\n const maxW = columns.find(c => c.id === columnId)?.maxWidth ?? 600; // maxAutoFitWidth default\r\n\r\n const finalW = Math.max(minW, Math.min(raw, maxW));\r\n\r\n setColumnWidths(prev => ({ ...prev, [columnId]: finalW }));\r\n };\r\n\r\n // Stage C: Saved views handlers\r\n const saveCurrentView = (name: string) => {\r\n const viewState = {\r\n page: query.page,\r\n pageSize: query.pageSize,\r\n sort: query.sort,\r\n filters: query.filters,\r\n columnWidths: enableColumnResizing ? columnWidths : undefined,\r\n };\r\n\r\n setSavedViews((prev) => {\r\n const filtered = prev.filter((v) => v.name !== name);\r\n return [...filtered, { name, state: viewState }];\r\n });\r\n\r\n // Store in localStorage if available\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n try {\r\n localStorage.setItem(`rowakit-view-${name}`, JSON.stringify(viewState));\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n }\r\n };\r\n\r\n const loadSavedView = (name: string) => {\r\n const view = savedViews.find((v) => v.name === name);\r\n if (!view) return;\r\n\r\n const { state } = view;\r\n setQuery({\r\n page: state.page,\r\n pageSize: state.pageSize,\r\n sort: state.sort,\r\n filters: state.filters,\r\n });\r\n\r\n // Also update the filters state to keep input fields in sync\r\n setFilters(state.filters ?? {});\r\n\r\n if (state.columnWidths && enableColumnResizing) {\r\n setColumnWidths(state.columnWidths);\r\n }\r\n };\r\n\r\n const deleteSavedView = (name: string) => {\r\n setSavedViews((prev) => prev.filter((v) => v.name !== name));\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n try {\r\n localStorage.removeItem(`rowakit-view-${name}`);\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n }\r\n };\r\n\r\n const resetTableState = () => {\r\n setQuery({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n setFilters({});\r\n setColumnWidths({});\r\n };\r\n\r\n // Helper function to apply filterTransform to filter values for number columns\r\n const transformFilterValueForColumn = (\r\n column: ColumnDef<T> | undefined,\r\n value: FilterValue | undefined,\r\n ): FilterValue | undefined => {\r\n if (!value || column?.kind !== 'number') {\r\n return value;\r\n }\r\n\r\n const numberColumn = column as ColumnDef<T> & {\r\n filterTransform?: (input: number) => number;\r\n };\r\n\r\n if (!numberColumn.filterTransform) {\r\n return value;\r\n }\r\n\r\n if (value.op === 'equals' && typeof value.value === 'number') {\r\n return {\r\n ...value,\r\n value: numberColumn.filterTransform(value.value),\r\n };\r\n }\r\n\r\n if (value.op === 'range' && typeof value.value === 'object') {\r\n const { from, to } = value.value;\r\n return {\r\n op: 'range',\r\n value: {\r\n from:\r\n from !== undefined && typeof from === 'number'\r\n ? numberColumn.filterTransform(from)\r\n : from,\r\n to:\r\n to !== undefined && typeof to === 'number'\r\n ? numberColumn.filterTransform(to)\r\n : to,\r\n },\r\n };\r\n }\r\n\r\n return value;\r\n };\r\n\r\n // Filter handlers\r\n const handleFilterChange = (field: string, value: FilterValue | undefined) => {\r\n // Stage C: Apply filter transform if defined\r\n const column = columns.find(c => c.id === field);\r\n const transformedValue = transformFilterValueForColumn(column, value);\r\n\r\n setFilters((prev) => ({\r\n ...prev,\r\n [field]: transformedValue,\r\n }));\r\n };\r\n\r\n const handleClearFilter = (field: string) => {\r\n setFilters((prev) => {\r\n const newFilters = { ...prev };\r\n delete newFilters[field];\r\n return newFilters;\r\n });\r\n };\r\n\r\n const handleClearAllFilters = () => {\r\n setFilters({});\r\n };\r\n\r\n const isLoading = dataState.state === 'loading';\r\n const isError = dataState.state === 'error';\r\n const isEmpty = dataState.state === 'empty';\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n const canGoPrevious = query.page > 1 && !isLoading;\r\n const canGoNext = query.page < totalPages && !isLoading;\r\n\r\n const hasActiveFilters = enableFilters && Object.values(filters).some(v => v !== undefined);\r\n\r\n return (\r\n <div className={`rowakit-table${className ? ` ${className}` : ''}`}>\r\n {enableSavedViews && (\r\n <div className=\"rowakit-saved-views-group\">\r\n <button\r\n onClick={() => {\r\n // NOTE: This uses window.prompt as a simple placeholder UI for naming saved views.\r\n // In production applications, replace this with a proper non-blocking modal dialog\r\n // component that provides better styling, accessibility, and user experience.\r\n const name = typeof window !== 'undefined' ? window.prompt('Enter view name:') : null;\r\n if (name) {\r\n saveCurrentView(name);\r\n }\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Save View\r\n </button>\r\n {savedViews.map((view) => (\r\n <div key={view.name} className=\"rowakit-saved-view-item\">\r\n <button\r\n onClick={() => loadSavedView(view.name)}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n {view.name}\r\n </button>\r\n <button\r\n onClick={() => deleteSavedView(view.name)}\r\n className=\"rowakit-saved-view-button rowakit-saved-view-button-delete\"\r\n type=\"button\"\r\n title=\"Delete this view\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n {(hasActiveFilters || query.page > 1 || query.sort) && (\r\n <button\r\n onClick={resetTableState}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Reset\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {hasActiveFilters && (\r\n <div className=\"rowakit-table-filter-controls\">\r\n <button\r\n onClick={handleClearAllFilters}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Clear all filters\r\n </button>\r\n </div>\r\n )}\r\n <table ref={tableRef}>\r\n <thead>\r\n <tr>\r\n {columns.map((column) => {\r\n const isSortable = column.kind !== 'actions' && \r\n (column.kind === 'custom' ? false : column.sortable === true);\r\n const field = column.kind === 'actions' ? '' : \r\n column.kind === 'custom' ? column.field : \r\n column.field;\r\n\r\n const isResizable = enableColumnResizing && column.kind !== 'actions';\r\n // Use resized width first, then fall back to column.width definition\r\n const actualWidth = columnWidths[column.id] ?? column.width;\r\n\r\n return (\r\n <th\r\n key={column.id}\r\n data-col-id={column.id}\r\n onClick={isSortable ? () => handleSort(String(field)) : undefined}\r\n role={isSortable ? 'button' : undefined}\r\n tabIndex={isSortable ? 0 : undefined}\r\n onKeyDown={isSortable ? (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleSort(String(field));\r\n }\r\n } : undefined}\r\n aria-sort={\r\n isSortable && query.sort?.field === String(field)\r\n ? query.sort.direction === 'asc' ? 'ascending' : 'descending'\r\n : undefined\r\n }\r\n style={{\r\n width: actualWidth ? `${actualWidth}px` : undefined,\r\n textAlign: column.align,\r\n position: isResizable ? 'relative' : undefined,\r\n }}\r\n // Note: truncate styling is disabled when column is resizable to prevent\r\n // conflicts with the resize handle and to allow dynamic width adjustments\r\n className={column.truncate && !isResizable ? 'rowakit-cell-truncate' : undefined}\r\n >\r\n {getHeaderLabel(column)}{isSortable && getSortIndicator(String(field))}\r\n {isResizable && (\r\n <div\r\n className=\"rowakit-column-resize-handle\"\r\n onMouseDown={(e) => startColumnResize(e, column.id)}\r\n onDoubleClick={() => handleColumnResizeDoubleClick(column.id)}\r\n title=\"Drag to resize | Double-click to auto-fit content\"\r\n />\r\n )}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n {enableFilters && (\r\n <tr className=\"rowakit-table-filter-row\">\r\n {columns.map((column) => {\r\n const field = column.kind === 'actions' || column.kind === 'custom' ? '' : String(column.field);\r\n const canFilter = field && column.kind !== 'actions';\r\n \r\n if (!canFilter) {\r\n return <th key={column.id}></th>;\r\n }\r\n\r\n const filterValue = filters[field];\r\n\r\n // Badge column: select with options\r\n if (column.kind === 'badge') {\r\n const options = column.map ? Object.keys(column.map) : [];\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={filterValue?.op === 'equals' ? String(filterValue.value ?? '') : ''}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {opt}\r\n </option>\r\n ))}\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Boolean column: select with True/False/All\r\n if (column.kind === 'boolean') {\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={\r\n filterValue?.op === 'equals' && typeof filterValue.value === 'boolean'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value: value === 'true' });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n <option value=\"true\">True</option>\r\n <option value=\"false\">False</option>\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Date column: from/to inputs\r\n if (column.kind === 'date') {\r\n const fromValue = filterValue?.op === 'range' ? filterValue.value.from ?? '' : '';\r\n const toValue = filterValue?.op === 'range' ? filterValue.value.to ?? '' : '';\r\n \r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-date-range\">\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"From\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value || undefined;\r\n const to = toValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"To\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value || undefined;\r\n const from = fromValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n\r\n // Text/Number column: text or number input\r\n const isNumberColumn = column.kind === 'number';\r\n \r\n // Stage C: Number column can use range filter\r\n if (isNumberColumn) {\r\n const fromValue = filterValue?.op === 'range' ? String(filterValue.value.from ?? '') : \r\n filterValue?.op === 'equals' && typeof filterValue.value === 'number' ? String(filterValue.value) : '';\r\n const toValue = filterValue?.op === 'range' ? String(filterValue.value.to ?? '') : '';\r\n \r\n // If there's an equals filter, show simple input; otherwise show range\r\n const showRangeUI = !filterValue || filterValue.op === 'range';\r\n \r\n if (showRangeUI) {\r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-number-range\">\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Min\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value ? Number(e.target.value) : undefined;\r\n const to = toValue ? Number(toValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Max\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value ? Number(e.target.value) : undefined;\r\n const from = fromValue ? Number(fromValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n }\r\n\r\n // Regular text/number input\r\n return (\r\n <th key={column.id}>\r\n <input\r\n type={isNumberColumn ? 'number' : 'text'}\r\n className=\"rowakit-filter-input\"\r\n placeholder={`Filter ${getHeaderLabel(column)}...`}\r\n value={\r\n filterValue?.op === 'contains'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'string'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'number'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const rawValue = e.target.value;\r\n if (rawValue === '') {\r\n handleClearFilter(field);\r\n } else if (isNumberColumn) {\r\n const numValue = Number(rawValue);\r\n if (!isNaN(numValue)) {\r\n // Send the parsed numeric value, not the string\r\n handleFilterChange(field, { op: 'equals', value: numValue } as FilterValue);\r\n } else {\r\n // Invalid numeric input: clear the filter to avoid confusing UX\r\n handleClearFilter(field);\r\n }\r\n } else {\r\n // Text: use \"contains\"\r\n handleFilterChange(field, { op: 'contains', value: rawValue } as FilterValue);\r\n }\r\n }}\r\n />\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n )}\r\n </thead>\r\n <tbody>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-loading\">\r\n <div className=\"rowakit-table-loading-spinner\"></div>\r\n <span>Loading...</span>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isError && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-error\">\r\n <div className=\"rowakit-table-error-message\">\r\n {dataState.error ?? 'An error occurred'}\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"rowakit-button rowakit-button-primary\"\r\n type=\"button\"\r\n >\r\n Retry\r\n </button>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isEmpty && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-empty\">\r\n No data\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {dataState.state === 'success' &&\r\n dataState.items.map((row) => {\r\n const key = getRowKey(row, rowKey);\r\n return (\r\n <tr key={key}>\r\n {columns.map((column) => {\r\n const cellClass = [\r\n column.kind === 'number' ? 'rowakit-cell-number' : '',\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n ].filter(Boolean).join(' ') || undefined;\r\n \r\n // Only apply width if user has manually resized this column\r\n const actualWidth = columnWidths[column.id];\r\n \r\n return (\r\n <td \r\n key={column.id}\r\n data-col-id={column.id}\r\n className={cellClass}\r\n style={{\r\n width: actualWidth ? `${actualWidth}px` : undefined,\r\n textAlign: column.align || (column.kind === 'number' ? 'right' : undefined),\r\n }}\r\n >\r\n {renderCell(column, row, isLoading, setConfirmState)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n {dataState.total > 0 && (\r\n <div className=\"rowakit-table-pagination\">\r\n {/* Left: Page size selector */}\r\n <div className=\"rowakit-table-pagination-left\">\r\n <label htmlFor=\"page-size\">\r\n Rows per page:\r\n </label>\r\n <select\r\n id=\"page-size\"\r\n value={query.pageSize}\r\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\r\n disabled={isLoading}\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Center: Page info */}\r\n <div className=\"rowakit-table-pagination-center\">\r\n Page {query.page} of {totalPages} ({dataState.total} total)\r\n </div>\r\n\r\n {/* Right: Previous/Next buttons */}\r\n <div className=\"rowakit-table-pagination-right\">\r\n <button\r\n onClick={handlePreviousPage}\r\n disabled={!canGoPrevious}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Previous page\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n onClick={handleNextPage}\r\n disabled={!canGoNext}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Next page\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirmation Modal */}\r\n {confirmState && (\r\n <div\r\n className=\"rowakit-modal-backdrop\"\r\n onClick={() => setConfirmState(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"confirm-dialog-title\"\r\n >\r\n <div className=\"rowakit-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h2 id=\"confirm-dialog-title\" className=\"rowakit-modal-title\">\r\n Confirm Action\r\n </h2>\r\n <p className=\"rowakit-modal-content\">\r\n Are you sure you want to {confirmState.action.label.toLowerCase()}? This action cannot be\r\n undone.\r\n </p>\r\n <div className=\"rowakit-modal-actions\">\r\n <button\r\n onClick={() => setConfirmState(null)}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n void confirmState.action.onClick(confirmState.row);\r\n setConfirmState(null);\r\n }}\r\n className=\"rowakit-button rowakit-button-danger\"\r\n type=\"button\"\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.\r\n */\r\nexport const SmartTable = RowaKitTable;\r\n","/**\r\n * @rowakit/table\r\n *\r\n * Opinionated, server-side-first table component for internal/business apps.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Core types\r\nexport type {\r\n // Fetcher types\r\n Fetcher,\r\n FetcherQuery,\r\n FetcherResult,\r\n FilterValue,\r\n Filters,\r\n // Column types\r\n ColumnDef,\r\n ColumnKind,\r\n BaseColumnDef,\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n BadgeTone,\r\n // Action types\r\n ActionDef,\r\n} from './types';\r\n\r\n// Column helper factory\r\nexport { col } from './column-helpers';\r\n\r\n// Components\r\nexport { RowaKitTable, SmartTable } from './components/SmartTable';\r\nexport type { SmartTableProps } from './components/SmartTable';\r\n\r\nexport const VERSION = '0.1.0';\r\n"]}
1
+ {"version":3,"sources":["../src/column-helpers.ts","../src/hooks/useColumnResizing.ts","../src/hooks/useFetcherState.ts","../src/hooks/useSavedViews.ts","../src/hooks/useSortingState.ts","../src/hooks/useUrlSync.ts","../src/hooks/useFocusTrap.ts","../src/components/RowSelectionColumn.tsx","../src/components/BulkActionBar.tsx","../src/components/ExportButton.tsx","../src/state/selection.ts","../src/components/SmartTable.tsx","../src/index.ts"],"names":["actions","useState","useRef","useEffect","useMemo","newSorts","jsx","jsxs","totalPages","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Column helper factory functions\r\n *\r\n * These helpers provide a clean, type-safe API for defining table columns.\r\n * They reduce boilerplate and enforce conventions while maintaining flexibility\r\n * through the `col.custom` escape hatch.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type {\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n ActionDef,\r\n BadgeTone,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// HELPER OPTIONS\r\n// ============================================================================\r\n\r\ninterface TextOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional formatter function */\r\n format?: (value: unknown) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface DateOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional date formatter function */\r\n format?: (value: Date | string | number) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BooleanOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional boolean formatter function */\r\n format?: (value: boolean) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BadgeOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Value-to-badge mapping */\r\n map?: Record<string, { label: string; tone: BadgeTone }>;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface NumberOptions<T = unknown> {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Formatting options: Intl.NumberFormatOptions or custom formatter */\r\n format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COLUMN HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Create a text column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.text('name')\r\n * col.text('email', { header: 'Email Address', sortable: true })\r\n * col.text('status', { format: (val) => val.toUpperCase() })\r\n * ```\r\n */\r\nfunction text<T>(\r\n field: keyof T & string,\r\n options?: TextOptions\r\n): TextColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'text',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a date column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.date('createdAt')\r\n * col.date('updatedAt', { header: 'Last Modified', sortable: true })\r\n * col.date('birthday', {\r\n * format: (date) => new Date(date).toLocaleDateString()\r\n * })\r\n * ```\r\n */\r\nfunction date<T>(\r\n field: keyof T & string,\r\n options?: DateOptions\r\n): DateColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'date',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a boolean column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.boolean('active')\r\n * col.boolean('isPublished', { header: 'Published', sortable: true })\r\n * col.boolean('enabled', {\r\n * format: (val) => val ? 'Yes' : 'No'\r\n * })\r\n * ```\r\n */\r\nfunction boolean<T>(\r\n field: keyof T & string,\r\n options?: BooleanOptions\r\n): BooleanColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'boolean',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a badge column definition for status/enum fields.\r\n *\r\n * @example\r\n * ```ts\r\n * col.badge('status')\r\n * col.badge('status', {\r\n * map: {\r\n * active: { label: 'Active', tone: 'success' },\r\n * paused: { label: 'Paused', tone: 'warning' },\r\n * disabled: { label: 'Disabled', tone: 'danger' }\r\n * }\r\n * })\r\n * ```\r\n */\r\nfunction badge<T>(\r\n field: keyof T & string,\r\n options?: BadgeOptions\r\n): BadgeColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'badge',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n map: options?.map,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a number column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.number('amount')\r\n * col.number('price', {\r\n * format: { style: 'currency', currency: 'USD' }\r\n * })\r\n * col.number('count', {\r\n * format: (val, row) => `${val} items`\r\n * })\r\n * ```\r\n */\r\nfunction number<T>(\r\n field: keyof T & string,\r\n options?: NumberOptions<T>\r\n): NumberColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'number',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create an actions column definition.\r\n *\r\n * The actions column displays a set of actions (buttons/links) that can be\r\n * performed on each row.\r\n *\r\n * @example\r\n * ```ts\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => editUser(row) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (row) => deleteUser(row) }\r\n * ])\r\n * ```\r\n */\r\nfunction actions<T>(actions: ActionDef<T>[]): ActionsColumnDef<T> {\r\n return {\r\n id: 'actions',\r\n kind: 'actions',\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Create a custom column definition with full rendering control.\r\n *\r\n * This is the escape hatch for any column that doesn't fit the standard types.\r\n * Use this for badges, avatars, complex formatting, or any custom UI.\r\n *\r\n * @example\r\n * ```ts\r\n * col.custom({\r\n * id: 'avatar',\r\n * header: 'User',\r\n * render: (row) => <img src={row.avatar} alt={row.name} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'price',\r\n * field: 'price',\r\n * render: (row) => <Money amount={row.price} currency={row.currency} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'status',\r\n * render: (row) => (\r\n * <Badge color={row.status === 'active' ? 'green' : 'gray'}>\r\n * {row.status}\r\n * </Badge>\r\n * )\r\n * })\r\n * ```\r\n */\r\nfunction custom<T>(\r\n field: keyof T & string,\r\n render: (row: T) => ReactNode\r\n): CustomColumnDef<T>;\r\nfunction custom<T>(options: {\r\n /** Unique column identifier */\r\n id: string;\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Optional field name for sorting/filtering */\r\n field?: keyof T & string;\r\n /** Render function for cell content */\r\n render: (row: T) => ReactNode;\r\n}): CustomColumnDef<T>;\r\nfunction custom<T>(\r\n arg1:\r\n | (keyof T & string)\r\n | {\r\n id: string;\r\n header?: string;\r\n field?: keyof T & string;\r\n render: (row: T) => ReactNode;\r\n },\r\n arg2?: (row: T) => ReactNode\r\n): CustomColumnDef<T> {\r\n if (typeof arg1 === 'string') {\r\n if (typeof arg2 !== 'function') {\r\n throw new Error('col.custom(field, render): render must be a function');\r\n }\r\n\r\n return {\r\n id: arg1,\r\n kind: 'custom',\r\n field: arg1,\r\n render: arg2,\r\n };\r\n }\r\n\r\n return {\r\n id: arg1.id,\r\n kind: 'custom',\r\n header: arg1.header,\r\n field: arg1.field,\r\n render: arg1.render,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\n/**\r\n * Column helper factory object.\r\n *\r\n * Provides convenient helper functions for creating column definitions.\r\n *\r\n * @example\r\n * ```tsx\r\n * import { col } from '@rowakit/table';\r\n *\r\n * const columns = [\r\n * col.text('name', { sortable: true }),\r\n * col.date('createdAt'),\r\n * col.boolean('active'),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => {} }\r\n * ]),\r\n * col.custom({ id: 'badge', render: (row) => <Badge>{row.status}</Badge> })\r\n * ];\r\n * ```\r\n */\r\nexport const col = {\r\n text,\r\n date,\r\n boolean,\r\n badge,\r\n number,\r\n actions,\r\n custom,\r\n} as const;\r\n","import { useRef, useState } from 'react';\r\nimport type { ColumnDef } from '../types';\r\n\r\nexport function useColumnResizing<T>(columns: ColumnDef<T>[]) {\r\n\tconst [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\r\n\r\n\tconst resizeRafRef = useRef<number | null>(null);\r\n\tconst resizePendingRef = useRef<{ colId: string; width: number } | null>(null);\r\n\tconst tableRef = useRef<HTMLTableElement | null>(null);\r\n\r\n\tconst isResizingRef = useRef(false);\r\n\tconst lastResizeEndTsRef = useRef(0);\r\n\tconst resizingColIdRef = useRef<string | null>(null);\r\n\r\n\tconst scheduleColumnWidthUpdate = (colId: string, width: number) => {\r\n\t\tresizePendingRef.current = { colId, width };\r\n\t\tif (resizeRafRef.current != null) return;\r\n\r\n\t\tresizeRafRef.current = requestAnimationFrame(() => {\r\n\t\t\tresizeRafRef.current = null;\r\n\t\t\tconst pending = resizePendingRef.current;\r\n\t\t\tif (!pending) return;\r\n\t\t\thandleColumnResize(pending.colId, pending.width);\r\n\t\t});\r\n\t};\r\n\r\n\tconst handleColumnResize = (columnId: string, newWidth: number) => {\r\n\t\tconst minWidth = columns.find((c) => c.id === columnId)?.minWidth ?? 80;\r\n\t\tconst maxWidth = columns.find((c) => c.id === columnId)?.maxWidth;\r\n\r\n\t\tlet finalWidth = Math.max(minWidth, newWidth);\r\n\t\tif (maxWidth) {\r\n\t\t\tfinalWidth = Math.min(finalWidth, maxWidth);\r\n\t\t}\r\n\r\n\t\tif (columnWidths[columnId] === finalWidth) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetColumnWidths((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\t[columnId]: finalWidth,\r\n\t\t}));\r\n\t};\r\n\r\n\tconst autoFitColumnWidth = (columnId: string) => {\r\n\t\tconst tableEl = tableRef.current;\r\n\t\tif (!tableEl) return;\r\n\r\n\t\tconst th = tableEl.querySelector(`th[data-col-id=\"${columnId}\"]`) as HTMLTableCellElement | null;\r\n\t\tif (!th) return;\r\n\r\n\t\tconst tds = Array.from(\r\n\t\t\ttableEl.querySelectorAll(`td[data-col-id=\"${columnId}\"]`),\r\n\t\t) as HTMLTableCellElement[];\r\n\r\n\t\tconst headerW = th.scrollWidth;\r\n\t\tconst cellsMaxW = tds.reduce((max, td) => Math.max(max, td.scrollWidth), 0);\r\n\r\n\t\tconst padding = 24;\r\n\t\tconst raw = Math.max(headerW, cellsMaxW) + padding;\r\n\r\n\t\tconst colDef = columns.find((c) => c.id === columnId);\r\n\t\tconst minW = colDef?.minWidth ?? 80;\r\n\t\tconst maxW = colDef?.maxWidth ?? 600;\r\n\r\n\t\tconst finalW = Math.max(minW, Math.min(raw, maxW));\r\n\t\tsetColumnWidths((prev) => ({ ...prev, [columnId]: finalW }));\r\n\t};\r\n\r\n\tconst startColumnResize = (e: React.PointerEvent<HTMLDivElement>, columnId: string) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\r\n\t\tif (e.detail === 2) {\r\n\t\t\tautoFitColumnWidth(columnId);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (e.pointerType === 'mouse' && e.buttons !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst target = e.currentTarget;\r\n\t\tconst pointerId = e.pointerId;\r\n\r\n\t\ttry {\r\n\t\t\ttarget.setPointerCapture(pointerId);\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\r\n\t\tisResizingRef.current = true;\r\n\t\tresizingColIdRef.current = columnId;\r\n\r\n\t\tconst startX = e.clientX;\r\n\t\tconst th = target.parentElement as HTMLTableCellElement;\r\n\r\n\t\tlet startWidth = columnWidths[columnId] ?? th.offsetWidth;\r\n\r\n\t\tconst MIN_DRAG_WIDTH = 80;\r\n\t\tif (startWidth < MIN_DRAG_WIDTH) {\r\n\t\t\tconst nextTh = th.nextElementSibling as HTMLTableCellElement | null;\r\n\t\t\tif (nextTh && nextTh.offsetWidth >= 50) {\r\n\t\t\t\tstartWidth = nextTh.offsetWidth;\r\n\t\t\t} else {\r\n\t\t\t\tstartWidth = 100;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdocument.body.classList.add('rowakit-resizing');\r\n\r\n\t\tconst handlePointerMove = (moveEvent: PointerEvent) => {\r\n\t\t\tconst delta = moveEvent.clientX - startX;\r\n\t\t\tconst newWidth = startWidth + delta;\r\n\t\t\tscheduleColumnWidthUpdate(columnId, newWidth);\r\n\t\t};\r\n\r\n\t\tconst cleanupResize = () => {\r\n\t\t\ttarget.removeEventListener('pointermove', handlePointerMove);\r\n\t\t\ttarget.removeEventListener('pointerup', handlePointerUp);\r\n\t\t\ttarget.removeEventListener('pointercancel', handlePointerCancel);\r\n\r\n\t\t\tdocument.body.classList.remove('rowakit-resizing');\r\n\r\n\t\t\tisResizingRef.current = false;\r\n\t\t\tresizingColIdRef.current = null;\r\n\t\t\tlastResizeEndTsRef.current = Date.now();\r\n\r\n\t\t\ttry {\r\n\t\t\t\ttarget.releasePointerCapture(pointerId);\r\n\t\t\t} catch {\r\n\t\t\t\t// ignore\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst handlePointerUp = () => {\r\n\t\t\tcleanupResize();\r\n\t\t};\r\n\r\n\t\tconst handlePointerCancel = () => {\r\n\t\t\tcleanupResize();\r\n\t\t};\r\n\r\n\t\ttarget.addEventListener('pointermove', handlePointerMove);\r\n\t\ttarget.addEventListener('pointerup', handlePointerUp);\r\n\t\ttarget.addEventListener('pointercancel', handlePointerCancel);\r\n\t};\r\n\r\n\tconst handleColumnResizeDoubleClick = (e: React.MouseEvent<HTMLDivElement>, columnId: string) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tautoFitColumnWidth(columnId);\r\n\t};\r\n\r\n\treturn {\r\n\t\ttableRef,\r\n\t\tcolumnWidths,\r\n\t\tsetColumnWidths,\r\n\t\tstartColumnResize,\r\n\t\thandleColumnResizeDoubleClick,\r\n\t\tisResizingRef,\r\n\t\tlastResizeEndTsRef,\r\n\t\tresizingColIdRef,\r\n\t};\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport type { Fetcher, FetcherQuery } from '../types';\r\n\r\ntype FetchState = 'idle' | 'loading' | 'success' | 'empty' | 'error';\r\n\r\nexport interface DataState<T> {\r\n\tstate: FetchState;\r\n\titems: T[];\r\n\ttotal: number;\r\n\terror?: string;\r\n}\r\n\r\nexport function useFetcherState<T>(\r\n\tfetcher: Fetcher<T>,\r\n\tquery: FetcherQuery,\r\n\tsetQuery: (next: FetcherQuery) => void,\r\n) {\r\n\tconst [dataState, setDataState] = useState<DataState<T>>({\r\n\t\tstate: 'idle',\r\n\t\titems: [],\r\n\t\ttotal: 0,\r\n\t});\r\n\r\n\tconst requestIdRef = useRef(0);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst currentRequestId = ++requestIdRef.current;\r\n\r\n\t\tsetDataState((prev) => ({ ...prev, state: 'loading' }));\r\n\r\n\t\tfetcher(query)\r\n\t\t\t.then((result) => {\r\n\t\t\t\tif (currentRequestId !== requestIdRef.current) return;\r\n\r\n\t\t\t\tif (result.items.length === 0) {\r\n\t\t\t\t\tsetDataState({\r\n\t\t\t\t\t\tstate: 'empty',\r\n\t\t\t\t\t\titems: [],\r\n\t\t\t\t\t\ttotal: result.total,\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetDataState({\r\n\t\t\t\t\tstate: 'success',\r\n\t\t\t\t\titems: result.items,\r\n\t\t\t\t\ttotal: result.total,\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t\t.catch((error: unknown) => {\r\n\t\t\t\tif (currentRequestId !== requestIdRef.current) return;\r\n\r\n\t\t\t\tsetDataState({\r\n\t\t\t\t\tstate: 'error',\r\n\t\t\t\t\titems: [],\r\n\t\t\t\t\ttotal: 0,\r\n\t\t\t\t\terror: error instanceof Error ? error.message : 'Failed to load data',\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t}, [fetcher, query]);\r\n\r\n\tconst handleRetry = () => {\r\n\t\tsetQuery({ ...query });\r\n\t};\r\n\r\n\treturn {\r\n\t\tdataState,\r\n\t\tsetDataState,\r\n\t\thandleRetry,\r\n\t\tisLoading: dataState.state === 'loading',\r\n\t\tisError: dataState.state === 'error',\r\n\t\tisEmpty: dataState.state === 'empty',\r\n\t};\r\n}\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport type { FetcherQuery, FilterValue } from '../types';\r\n\r\ninterface SavedViewsIndex {\r\n\tname: string;\r\n\tupdatedAt: number;\r\n}\r\n\r\ninterface SavedViewState {\r\n\tpage: number;\r\n\tpageSize: number;\r\n\tsort?: { field: string; direction: 'asc' | 'desc' };\r\n\tfilters?: Record<string, FilterValue | undefined>;\r\n\tcolumnWidths?: Record<string, number>;\r\n}\r\n\r\nexport interface SavedViewEntry {\r\n\tname: string;\r\n\tstate: SavedViewState;\r\n}\r\n\r\nfunction validateViewName(name: string): { valid: boolean; error?: string } {\r\n\tconst trimmed = name.trim();\r\n\r\n\tif (trimmed.length === 0) {\r\n\t\treturn { valid: false, error: 'Name cannot be empty' };\r\n\t}\r\n\r\n\tif (trimmed.length > 40) {\r\n\t\treturn { valid: false, error: 'Name cannot exceed 40 characters' };\r\n\t}\r\n\r\n\t// eslint-disable-next-line no-control-regex\r\n\tconst invalidChars = /[/\\\\?%*:|\"<>\\x00-\\x1f\\x7f]/;\r\n\tif (invalidChars.test(trimmed)) {\r\n\t\treturn { valid: false, error: 'Name contains invalid characters' };\r\n\t}\r\n\r\n\treturn { valid: true };\r\n}\r\n\r\nfunction getSavedViewsIndex(): SavedViewsIndex[] {\r\n\tif (typeof window === 'undefined' || !window.localStorage) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst indexStr = localStorage.getItem('rowakit-views-index');\r\n\t\tif (indexStr) {\r\n\t\t\tconst index = JSON.parse(indexStr) as SavedViewsIndex[];\r\n\t\t\tif (Array.isArray(index)) {\r\n\t\t\t\treturn index;\r\n\t\t\t}\r\n\t\t}\r\n\t} catch {\r\n\t\t// ignore\r\n\t}\r\n\r\n\tconst rebuilt: SavedViewsIndex[] = [];\r\n\ttry {\r\n\t\tfor (let i = 0; i < localStorage.length; i++) {\r\n\t\t\tconst key = localStorage.key(i);\r\n\t\t\tif (key?.startsWith('rowakit-view-')) {\r\n\t\t\t\tconst name = key.substring('rowakit-view-'.length);\r\n\t\t\t\trebuilt.push({ name, updatedAt: Date.now() });\r\n\t\t\t}\r\n\t\t}\r\n\t} catch {\r\n\t\t// ignore\r\n\t}\r\n\r\n\treturn rebuilt;\r\n}\r\n\r\nfunction setSavedViewsIndex(index: SavedViewsIndex[]): void {\r\n\tif (typeof window === 'undefined' || !window.localStorage) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttry {\r\n\t\tlocalStorage.setItem('rowakit-views-index', JSON.stringify(index));\r\n\t} catch {\r\n\t\t// ignore\r\n\t}\r\n}\r\n\r\nfunction loadSavedViewsFromStorage(): SavedViewEntry[] {\r\n\tif (typeof window === 'undefined' || !window.localStorage) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tconst index = getSavedViewsIndex();\r\n\tconst views: SavedViewEntry[] = [];\r\n\r\n\tfor (const entry of index) {\r\n\t\ttry {\r\n\t\t\tconst viewStr = localStorage.getItem(`rowakit-view-${entry.name}`);\r\n\t\t\tif (viewStr) {\r\n\t\t\t\tconst state = JSON.parse(viewStr) as SavedViewState;\r\n\t\t\t\tviews.push({ name: entry.name, state });\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\r\n\treturn views;\r\n}\r\n\r\nexport function useSavedViews(options: {\r\n\tenableSavedViews: boolean;\r\n\tenableColumnResizing: boolean;\r\n\tdefaultPageSize: number;\r\n\tquery: FetcherQuery;\r\n\tsetQuery: React.Dispatch<React.SetStateAction<FetcherQuery>>;\r\n\tsetFilters: React.Dispatch<React.SetStateAction<Record<string, FilterValue | undefined>>>;\r\n\tcolumnWidths: Record<string, number>;\r\n\tsetColumnWidths: React.Dispatch<React.SetStateAction<Record<string, number>>>;\r\n}) {\r\n\tconst [savedViews, setSavedViews] = useState<SavedViewEntry[]>([]);\r\n\r\n\tconst [showSaveViewForm, setShowSaveViewForm] = useState(false);\r\n\tconst [saveViewInput, setSaveViewInput] = useState('');\r\n\tconst [saveViewError, setSaveViewError] = useState('');\r\n\tconst [overwriteConfirmName, setOverwriteConfirmName] = useState<string | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!options.enableSavedViews) return;\r\n\t\tsetSavedViews(loadSavedViewsFromStorage());\r\n\t}, [options.enableSavedViews]);\r\n\r\n\tconst saveCurrentView = (name: string) => {\r\n\t\tconst viewState: SavedViewState = {\r\n\t\t\tpage: options.query.page,\r\n\t\t\tpageSize: options.query.pageSize,\r\n\t\t\tsort: options.query.sort,\r\n\t\t\tfilters: options.query.filters,\r\n\t\t\tcolumnWidths: options.enableColumnResizing ? options.columnWidths : undefined,\r\n\t\t};\r\n\r\n\t\tsetSavedViews((prev) => {\r\n\t\t\tconst filtered = prev.filter((v) => v.name !== name);\r\n\t\t\treturn [...filtered, { name, state: viewState }];\r\n\t\t});\r\n\r\n\t\tif (typeof window !== 'undefined' && window.localStorage) {\r\n\t\t\ttry {\r\n\t\t\t\tlocalStorage.setItem(`rowakit-view-${name}`, JSON.stringify(viewState));\r\n\t\t\t\tconst index = getSavedViewsIndex();\r\n\t\t\t\tconst filtered = index.filter((v) => v.name !== name);\r\n\t\t\t\tfiltered.push({ name, updatedAt: Date.now() });\r\n\t\t\t\tsetSavedViewsIndex(filtered);\r\n\t\t\t} catch {\r\n\t\t\t\t// ignore\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst loadSavedView = (name: string) => {\r\n\t\tconst view = savedViews.find((v) => v.name === name);\r\n\t\tif (!view) return;\r\n\r\n\t\tconst { state } = view;\r\n\t\toptions.setQuery({\r\n\t\t\tpage: state.page,\r\n\t\t\tpageSize: state.pageSize,\r\n\t\t\tsort: state.sort,\r\n\t\t\tfilters: state.filters,\r\n\t\t});\r\n\r\n\t\toptions.setFilters(state.filters ?? {});\r\n\r\n\t\tif (state.columnWidths && options.enableColumnResizing) {\r\n\t\t\toptions.setColumnWidths(state.columnWidths);\r\n\t\t}\r\n\t};\r\n\r\n\tconst deleteSavedView = (name: string) => {\r\n\t\tsetSavedViews((prev) => prev.filter((v) => v.name !== name));\r\n\r\n\t\tif (typeof window !== 'undefined' && window.localStorage) {\r\n\t\t\ttry {\r\n\t\t\t\tlocalStorage.removeItem(`rowakit-view-${name}`);\r\n\t\t\t\tconst index = getSavedViewsIndex();\r\n\t\t\t\tconst filtered = index.filter((v) => v.name !== name);\r\n\t\t\t\tsetSavedViewsIndex(filtered);\r\n\t\t\t} catch {\r\n\t\t\t\t// ignore\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst resetTableState = () => {\r\n\t\toptions.setQuery({\r\n\t\t\tpage: 1,\r\n\t\t\tpageSize: options.defaultPageSize,\r\n\t\t});\r\n\t\toptions.setFilters({});\r\n\t\toptions.setColumnWidths({});\r\n\t};\r\n\r\n\tconst shouldShowReset = useMemo(() => {\r\n\t\tif (!options.enableSavedViews) return false;\r\n\t\treturn Boolean(options.query.page > 1 || options.query.sort || (options.query.filters && Object.keys(options.query.filters).length > 0));\r\n\t}, [options.enableSavedViews, options.query.page, options.query.sort, options.query.filters]);\r\n\r\n\tconst openSaveViewForm = () => {\r\n\t\tsetShowSaveViewForm(true);\r\n\t\tsetSaveViewInput('');\r\n\t\tsetSaveViewError('');\r\n\t\tsetOverwriteConfirmName(null);\r\n\t};\r\n\r\n\tconst cancelSaveViewForm = () => {\r\n\t\tsetShowSaveViewForm(false);\r\n\t\tsetSaveViewInput('');\r\n\t\tsetSaveViewError('');\r\n\t\tsetOverwriteConfirmName(null);\r\n\t};\r\n\r\n\tconst onSaveViewInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\r\n\t\tsetSaveViewInput(e.target.value);\r\n\t\tsetSaveViewError('');\r\n\t};\r\n\r\n\tconst attemptSave = () => {\r\n\t\tconst validation = validateViewName(saveViewInput);\r\n\t\tif (!validation.valid) {\r\n\t\t\tsetSaveViewError(validation.error || 'Invalid name');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst trimmed = saveViewInput.trim();\r\n\t\tif (savedViews.some((v) => v.name === trimmed)) {\r\n\t\t\tsetOverwriteConfirmName(trimmed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsaveCurrentView(trimmed);\r\n\t\tcancelSaveViewForm();\r\n\t};\r\n\r\n\tconst onSaveViewInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (e) => {\r\n\t\tif (e.key !== 'Enter') return;\r\n\t\tattemptSave();\r\n\t};\r\n\r\n\tconst confirmOverwrite = () => {\r\n\t\tif (!overwriteConfirmName) return;\r\n\t\tsaveCurrentView(overwriteConfirmName);\r\n\t\tcancelSaveViewForm();\r\n\t};\r\n\r\n\tconst cancelOverwrite = () => {\r\n\t\tsetOverwriteConfirmName(null);\r\n\t};\r\n\r\n\treturn {\r\n\t\tsavedViews,\r\n\t\tshowSaveViewForm,\r\n\t\tsaveViewInput,\r\n\t\tsaveViewError,\r\n\t\toverwriteConfirmName,\r\n\t\topenSaveViewForm,\r\n\t\tcancelSaveViewForm,\r\n\t\tonSaveViewInputChange,\r\n\t\tonSaveViewInputKeyDown,\r\n\t\tattemptSave,\r\n\t\tconfirmOverwrite,\r\n\t\tcancelOverwrite,\r\n\t\tloadSavedView,\r\n\t\tdeleteSavedView,\r\n\t\tresetTableState,\r\n\t\tshouldShowReset,\r\n\t};\r\n}\r\n","import type { FetcherQuery, SortColumn } from '../types';\r\n\r\nexport function useSortingState(\r\n\tquery: FetcherQuery,\r\n\tsetQuery: React.Dispatch<React.SetStateAction<FetcherQuery>>,\r\n) {\r\n\tconst handleSort = (field: string, isMultiSort: boolean = false) => {\r\n\t\tsetQuery((prev): FetcherQuery => {\r\n\t\t\tconst currentSorts = prev.sorts || [];\r\n\t\t\tconst existingSort = currentSorts.find((s) => s.field === field);\r\n\r\n\t\t\t// Single sort mode (default click)\r\n\t\t\tif (!isMultiSort) {\r\n\t\t\t\tif (existingSort?.priority === 0) {\r\n\t\t\t\t\t// Toggle direction if it's the primary sort\r\n\t\t\t\t\tif (existingSort.direction === 'asc') {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t...prev,\r\n\t\t\t\t\t\t\tsorts: [{ field, direction: 'desc', priority: 0 }],\r\n\t\t\t\t\t\t\tpage: 1,\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Remove primary sort if it was descending\r\n\t\t\t\t\tconst { sorts: _removed, ...rest } = prev;\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\t...rest,\r\n\t\t\t\t\t\tpage: 1,\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\t// Set as primary sort\r\n\t\t\t\treturn {\r\n\t\t\t\t\t...prev,\r\n\t\t\t\t\tsorts: [{ field, direction: 'asc', priority: 0 }],\r\n\t\t\t\t\tpage: 1,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t// Multi sort mode (Ctrl/Cmd + click)\r\n\t\t\tif (existingSort) {\r\n\t\t\t\t// Toggle direction if shift-clicking on existing sort\r\n\t\t\t\tconst newSorts: SortColumn[] = currentSorts.map((s) => {\r\n\t\t\t\t\tif (s.field === field) {\r\n\t\t\t\t\t\tconst newDirection: 'asc' | 'desc' = s.direction === 'asc' ? 'desc' : 'asc';\r\n\t\t\t\t\t\treturn { ...s, direction: newDirection };\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn s;\r\n\t\t\t\t});\r\n\t\t\t\treturn { ...prev, sorts: newSorts, page: 1 };\r\n\t\t\t}\r\n\r\n\t\t\t// Add as secondary sort with next priority\r\n\t\t\tconst nextPriority = currentSorts.length;\r\n\t\t\tconst newSorts: SortColumn[] = [...currentSorts, { field, direction: 'asc', priority: nextPriority }];\r\n\t\t\treturn { ...prev, sorts: newSorts, page: 1 };\r\n\t\t});\r\n\t};\r\n\r\n\tconst getSortIndicator = (field: string): string => {\r\n\t\tconst sorts = query.sorts || [];\r\n\t\tconst sort = sorts.find((s) => s.field === field);\r\n\r\n\t\tif (!sort) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst directionIcon = sort.direction === 'asc' ? ' ↑' : ' ↓';\r\n\t\tconst priorityLabel = sort.priority === 0 ? '' : ` [${sort.priority + 1}]`;\r\n\t\treturn directionIcon + priorityLabel;\r\n\t};\r\n\r\n\tconst getSortPriority = (field: string): number | null => {\r\n\t\tconst sorts = query.sorts || [];\r\n\t\tconst sort = sorts.find((s) => s.field === field);\r\n\t\treturn sort ? sort.priority : null;\r\n\t};\r\n\r\n\treturn { handleSort, getSortIndicator, getSortPriority };\r\n}\r\n","import { useEffect, useRef } from 'react';\r\nimport type { ColumnDef, FetcherQuery, FilterValue, SortColumn } from '../types';\r\n\r\nfunction parseUrlState(\r\n\tparams: URLSearchParams,\r\n\tdefaultPageSize: number,\r\n\tpageSizeOptions?: number[],\r\n): {\r\n\tpage: number;\r\n\tpageSize: number;\r\n\tsort?: { field: string; direction: 'asc' | 'desc' };\r\n\tsorts?: SortColumn[];\r\n\tfilters?: Record<string, FilterValue | undefined>;\r\n\tcolumnWidths?: Record<string, number>;\r\n} {\r\n\tconst pageStr = params.get('page');\r\n\tlet page = 1;\r\n\tif (pageStr) {\r\n\t\tconst parsed = parseInt(pageStr, 10);\r\n\t\tpage = !isNaN(parsed) && parsed >= 1 ? parsed : 1;\r\n\t}\r\n\r\n\tconst pageSizeStr = params.get('pageSize');\r\n\tlet pageSize = defaultPageSize;\r\n\tif (pageSizeStr) {\r\n\t\tconst parsed = parseInt(pageSizeStr, 10);\r\n\t\tif (!isNaN(parsed) && parsed >= 1) {\r\n\t\t\tif (pageSizeOptions && pageSizeOptions.length > 0) {\r\n\t\t\t\tpageSize = pageSizeOptions.includes(parsed) ? parsed : defaultPageSize;\r\n\t\t\t} else {\r\n\t\t\t\tpageSize = parsed;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst result: {\r\n\t\tpage: number;\r\n\t\tpageSize: number;\r\n\t\tsort?: { field: string; direction: 'asc' | 'desc' };\r\n\t\tsorts?: SortColumn[];\r\n\t\tfilters?: Record<string, FilterValue | undefined>;\r\n\t\tcolumnWidths?: Record<string, number>;\r\n\t} = { page, pageSize };\r\n\r\n\t// PRD-E4: Support multi-sort via 'sorts' parameter\r\n\tconst sortsStr = params.get('sorts');\r\n\tif (sortsStr) {\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(sortsStr) as SortColumn[];\r\n\t\t\tif (Array.isArray(parsed) && parsed.every(s => typeof s.field === 'string' && (s.direction === 'asc' || s.direction === 'desc') && typeof s.priority === 'number')) {\r\n\t\t\t\tresult.sorts = parsed;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\r\n\t// Backward compatibility: single sort\r\n\tif (!result.sorts) {\r\n\t\tconst sortField = params.get('sortField');\r\n\t\tconst sortDir = params.get('sortDirection');\r\n\t\tif (sortField && (sortDir === 'asc' || sortDir === 'desc')) {\r\n\t\t\tresult.sort = { field: sortField, direction: sortDir };\r\n\t\t}\r\n\t}\r\n\r\n\tconst filtersStr = params.get('filters');\r\n\tif (filtersStr) {\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(filtersStr);\r\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n\t\t\t\tresult.filters = parsed;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\r\n\tconst widthsStr = params.get('columnWidths');\r\n\tif (widthsStr) {\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(widthsStr);\r\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n\t\t\t\tconst widths: Record<string, number> = {};\r\n\t\t\t\tfor (const [key, value] of Object.entries(parsed)) {\r\n\t\t\t\t\tif (typeof value === 'number' && value > 0) {\r\n\t\t\t\t\t\twidths[key] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (Object.keys(widths).length > 0) {\r\n\t\t\t\t\tresult.columnWidths = widths;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nfunction serializeUrlState(\r\n\tquery: FetcherQuery,\r\n\tfilters: Record<string, FilterValue | undefined>,\r\n\tcolumnWidths: Record<string, number>,\r\n\tdefaultPageSize: number,\r\n\tenableColumnResizing: boolean,\r\n): string {\r\n\tconst params = new URLSearchParams();\r\n\tparams.set('page', String(query.page));\r\n\r\n\tif (query.pageSize !== defaultPageSize) {\r\n\t\tparams.set('pageSize', String(query.pageSize));\r\n\t}\r\n\r\n\t// PRD-E4: Use 'sorts' array for multi-sort\r\n\tif (query.sorts && query.sorts.length > 0) {\r\n\t\tparams.set('sorts', JSON.stringify(query.sorts));\r\n\t} else if (query.sort) {\r\n\t\t// Backward compatibility\r\n\t\tparams.set('sortField', query.sort.field);\r\n\t\tparams.set('sortDirection', query.sort.direction);\r\n\t}\r\n\r\n\tif (filters && Object.keys(filters).length > 0) {\r\n\t\tconst nonEmptyFilters = Object.fromEntries(\r\n\t\t\tObject.entries(filters).filter(([, v]) => v !== undefined),\r\n\t\t);\r\n\t\tif (Object.keys(nonEmptyFilters).length > 0) {\r\n\t\t\tparams.set('filters', JSON.stringify(nonEmptyFilters));\r\n\t\t}\r\n\t}\r\n\r\n\tif (enableColumnResizing && Object.keys(columnWidths).length > 0) {\r\n\t\tparams.set('columnWidths', JSON.stringify(columnWidths));\r\n\t}\r\n\r\n\treturn params.toString();\r\n}\r\n\r\nexport function useUrlSync<T>({\r\n\tsyncToUrl,\r\n\tenableColumnResizing,\r\n\tdefaultPageSize,\r\n\tpageSizeOptions,\r\n\tcolumns,\r\n\tquery,\r\n\tsetQuery,\r\n\tfilters,\r\n\tsetFilters,\r\n\tcolumnWidths,\r\n\tsetColumnWidths,\r\n}: {\r\n\tsyncToUrl: boolean;\r\n\tenableColumnResizing: boolean;\r\n\tdefaultPageSize: number;\r\n\tpageSizeOptions?: number[];\r\n\tcolumns: ColumnDef<T>[];\r\n\tquery: FetcherQuery;\r\n\tsetQuery: React.Dispatch<React.SetStateAction<FetcherQuery>>;\r\n\tfilters: Record<string, FilterValue | undefined>;\r\n\tsetFilters: React.Dispatch<React.SetStateAction<Record<string, FilterValue | undefined>>>;\r\n\tcolumnWidths: Record<string, number>;\r\n\tsetColumnWidths: React.Dispatch<React.SetStateAction<Record<string, number>>>;\r\n}) {\r\n\tconst didHydrateUrlRef = useRef(false);\r\n\tconst didSkipInitialUrlSyncRef = useRef(false);\r\n\tconst urlSyncDebounceRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!syncToUrl) {\r\n\t\t\tdidSkipInitialUrlSyncRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!didSkipInitialUrlSyncRef.current) {\r\n\t\t\tdidSkipInitialUrlSyncRef.current = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (urlSyncDebounceRef.current) {\r\n\t\t\tclearTimeout(urlSyncDebounceRef.current);\r\n\t\t\turlSyncDebounceRef.current = null;\r\n\t\t}\r\n\r\n\t\tconst urlStr = serializeUrlState(query, filters, columnWidths, defaultPageSize, enableColumnResizing);\r\n\t\tconst qs = urlStr ? `?${urlStr}` : '';\r\n\t\twindow.history.replaceState(null, '', `${window.location.pathname}${qs}${window.location.hash}`);\r\n\t}, [\r\n\t\tquery,\r\n\t\tfilters,\r\n\t\tsyncToUrl,\r\n\t\tenableColumnResizing,\r\n\t\tdefaultPageSize,\r\n\t\tcolumnWidths,\r\n\t]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!syncToUrl || !enableColumnResizing) return;\r\n\t\tif (!didSkipInitialUrlSyncRef.current) return;\r\n\r\n\t\tif (urlSyncDebounceRef.current) {\r\n\t\t\tclearTimeout(urlSyncDebounceRef.current);\r\n\t\t}\r\n\r\n\t\turlSyncDebounceRef.current = setTimeout(() => {\r\n\t\t\tconst urlStr = serializeUrlState(query, filters, columnWidths, defaultPageSize, enableColumnResizing);\r\n\t\t\tconst qs = urlStr ? `?${urlStr}` : '';\r\n\t\t\twindow.history.replaceState(null, '', `${window.location.pathname}${qs}${window.location.hash}`);\r\n\t\t\turlSyncDebounceRef.current = null;\r\n\t\t}, 150);\r\n\r\n\t\treturn () => {\r\n\t\t\tif (urlSyncDebounceRef.current) {\r\n\t\t\t\tclearTimeout(urlSyncDebounceRef.current);\r\n\t\t\t\turlSyncDebounceRef.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t}, [\r\n\t\tcolumnWidths,\r\n\t\tsyncToUrl,\r\n\t\tenableColumnResizing,\r\n\t\tquery,\r\n\t\tfilters,\r\n\t\tdefaultPageSize,\r\n\t]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!syncToUrl) {\r\n\t\t\tdidHydrateUrlRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (didHydrateUrlRef.current) return;\r\n\t\tdidHydrateUrlRef.current = true;\r\n\r\n\t\tconst params = new URLSearchParams(window.location.search);\r\n\t\tconst parsed = parseUrlState(params, defaultPageSize, pageSizeOptions);\r\n\r\n\t\tsetQuery({\r\n\t\t\tpage: parsed.page,\r\n\t\t\tpageSize: parsed.pageSize,\r\n\t\t\tsort: parsed.sort,\r\n\t\t\tsorts: parsed.sorts,\r\n\t\t\tfilters: parsed.filters,\r\n\t\t});\r\n\r\n\t\tif (parsed.filters) {\r\n\t\t\tsetFilters(parsed.filters);\r\n\t\t}\r\n\r\n\t\tif (parsed.columnWidths && enableColumnResizing) {\r\n\t\t\tconst clamped: Record<string, number> = {};\r\n\t\t\tfor (const [colId, rawWidth] of Object.entries(parsed.columnWidths)) {\r\n\t\t\t\tconst widthNum = typeof rawWidth === 'number' ? rawWidth : Number(rawWidth);\r\n\t\t\t\tif (!Number.isFinite(widthNum)) continue;\r\n\r\n\t\t\t\tconst colDef = columns.find((c) => c.id === colId);\r\n\t\t\t\tif (!colDef) continue;\r\n\r\n\t\t\t\tconst minW = colDef.minWidth ?? 80;\r\n\t\t\t\tconst maxW = colDef.maxWidth;\r\n\r\n\t\t\t\tlet finalW = Math.max(minW, widthNum);\r\n\t\t\t\tif (maxW != null) {\r\n\t\t\t\t\tfinalW = Math.min(finalW, maxW);\r\n\t\t\t\t}\r\n\t\t\t\tclamped[colId] = finalW;\r\n\t\t\t}\r\n\r\n\t\t\tsetColumnWidths(clamped);\r\n\t\t}\r\n\t}, [\r\n\t\tsyncToUrl,\r\n\t\tdefaultPageSize,\r\n\t\tenableColumnResizing,\r\n\t\tpageSizeOptions,\r\n\t\tcolumns,\r\n\t\tsetQuery,\r\n\t\tsetFilters,\r\n\t\tsetColumnWidths,\r\n\t]);\r\n}\r\n","/**\r\n * useFocusTrap: A hook to trap focus within a modal/dialog element\r\n * \r\n * Ensures keyboard navigation (Tab/Shift+Tab) stays within the modal,\r\n * and ESC key can close it.\r\n */\r\n\r\nimport { useEffect, useRef } from 'react';\r\n\r\nexport interface UseFocusTrapOptions {\r\n /** Called when ESC is pressed */\r\n onEscape?: () => void;\r\n /** Whether to automatically focus first focusable element on mount */\r\n autoFocus?: boolean;\r\n}\r\n\r\nconst FOCUSABLE_SELECTORS = [\r\n 'button',\r\n '[href]',\r\n 'input',\r\n 'select',\r\n 'textarea',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n].join(',');\r\n\r\n/**\r\n * Trap focus within a modal element.\r\n * - Pressing Tab cycles through focusable elements within the modal\r\n * - Pressing Shift+Tab cycles backwards\r\n * - Pressing ESC triggers the onEscape callback\r\n * - First focusable element is focused by default on mount\r\n */\r\nexport function useFocusTrap(ref: React.RefObject<HTMLDivElement>, options: UseFocusTrapOptions = {}) {\r\n const { onEscape, autoFocus = true } = options;\r\n const firstFocusableRef = useRef<HTMLElement | null>(null);\r\n const lastFocusableRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n const modalEl = ref.current;\r\n if (!modalEl) return;\r\n\r\n // Get all focusable elements within the modal\r\n const getFocusableElements = () => {\r\n const elements = Array.from(modalEl.querySelectorAll(FOCUSABLE_SELECTORS)) as HTMLElement[];\r\n return elements.filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null);\r\n };\r\n\r\n let focusableElements = getFocusableElements();\r\n if (focusableElements.length === 0) return;\r\n\r\n firstFocusableRef.current = focusableElements[0] || null;\r\n lastFocusableRef.current = focusableElements[focusableElements.length - 1] || null;\r\n\r\n // Auto-focus first element\r\n if (autoFocus && firstFocusableRef.current) {\r\n firstFocusableRef.current.focus();\r\n }\r\n\r\n // Handle keyboard events\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n focusableElements = getFocusableElements();\r\n if (focusableElements.length === 0) return;\r\n\r\n const activeEl = document.activeElement as HTMLElement;\r\n const firstEl = focusableElements[0] || null;\r\n const lastEl = focusableElements[focusableElements.length - 1] || null;\r\n\r\n // ESC key\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n onEscape?.();\r\n return;\r\n }\r\n\r\n // TAB key\r\n if (e.key === 'Tab') {\r\n if (e.shiftKey) {\r\n // Shift+Tab: go to previous element\r\n if (activeEl === firstEl && lastEl) {\r\n e.preventDefault();\r\n lastEl.focus();\r\n }\r\n } else {\r\n // Tab: go to next element\r\n if (activeEl === lastEl && firstEl) {\r\n e.preventDefault();\r\n firstEl.focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n modalEl.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n modalEl.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [ref, onEscape, autoFocus]);\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nexport function RowSelectionHeaderCell(props: {\r\n\tchecked: boolean;\r\n\tindeterminate: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n}) {\r\n\tconst checkboxRef = useRef<HTMLInputElement | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!checkboxRef.current) return;\r\n\t\tcheckboxRef.current.indeterminate = props.indeterminate;\r\n\t}, [props.indeterminate]);\r\n\r\n\treturn (\r\n\t\t<th>\r\n\t\t\t<input\r\n\t\t\t\tref={checkboxRef}\r\n\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\taria-label=\"Select all rows\"\r\n\t\t\t\tdisabled={props.disabled}\r\n\t\t\t\tchecked={props.checked}\r\n\t\t\t\tonChange={(e) => props.onChange(e.target.checked)}\r\n\t\t\t/>\r\n\t\t</th>\r\n\t);\r\n}\r\n\r\nexport function RowSelectionCell(props: {\r\n\trowKey: string | number;\r\n\tchecked: boolean;\r\n\tdisabled?: boolean;\r\n\tonChange: (checked: boolean) => void;\r\n}) {\r\n\treturn (\r\n\t\t<td>\r\n\t\t\t<input\r\n\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\taria-label={`Select row ${props.rowKey}`}\r\n\t\t\t\tdisabled={props.disabled}\r\n\t\t\t\tchecked={props.checked}\r\n\t\t\t\tonChange={(e) => props.onChange(e.target.checked)}\r\n\t\t\t/>\r\n\t\t</td>\r\n\t);\r\n}\r\n","export interface BulkActionDef {\r\n\tid: string;\r\n\tlabel: string;\r\n\tconfirm?: {\r\n\t\ttitle: string;\r\n\t\tdescription?: string;\r\n\t};\r\n\tonClick: (selectedKeys: Array<string | number>) => void;\r\n}\r\n\r\nexport function BulkActionBar(props: {\r\n\tselectedCount: number;\r\n\tactions: BulkActionDef[];\r\n\tonActionClick: (actionId: string) => void;\r\n}) {\r\n\tif (props.selectedCount <= 0) return null;\r\n\r\n\treturn (\r\n\t\t<div className=\"rowakit-bulk-action-bar\">\r\n\t\t\t<span>{props.selectedCount} selected</span>\r\n\t\t\t{props.actions.map((action) => (\r\n\t\t\t\t<button\r\n\t\t\t\t\tkey={action.id}\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tclassName=\"rowakit-button rowakit-button-secondary\"\r\n\t\t\t\t\tonClick={() => props.onActionClick(action.id)}\r\n\t\t\t\t>\r\n\t\t\t\t\t{action.label}\r\n\t\t\t\t</button>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n","import { useState } from 'react';\r\nimport type { FetcherQuery } from '../types';\r\nimport type { Exporter } from '../types/export';\r\n\r\nfunction downloadBlob(blob: Blob, filename: string) {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') return;\r\n\r\n\tconst url = URL.createObjectURL(blob);\r\n\ttry {\r\n\t\tconst a = document.createElement('a');\r\n\t\ta.href = url;\r\n\t\ta.download = filename;\r\n\t\ta.rel = 'noopener noreferrer';\r\n\t\ta.click();\r\n\t} finally {\r\n\t\tURL.revokeObjectURL(url);\r\n\t}\r\n}\r\n\r\nfunction openUrl(url: string) {\r\n\tif (typeof window === 'undefined') return;\r\n\tif (typeof window.open === 'function') {\r\n\t\twindow.open(url, '_blank', 'noopener,noreferrer');\r\n\t\treturn;\r\n\t}\r\n\ttry {\r\n\t\twindow.location.assign(url);\r\n\t} catch {\r\n\t\t// ignore\r\n\t}\r\n}\r\n\r\nexport function ExportButton(props: {\r\n\texporter: Exporter;\r\n\tquery: FetcherQuery;\r\n}) {\r\n\tconst [isExporting, setIsExporting] = useState(false);\r\n\tconst [error, setError] = useState<string | null>(null);\r\n\r\n\tconst onClick = async () => {\r\n\t\tif (isExporting) return;\r\n\r\n\t\tsetIsExporting(true);\r\n\t\tsetError(null);\r\n\r\n\t\ttry {\r\n\t\t\tconst snapshot = { ...props.query };\r\n\t\t\tconst result = await props.exporter(snapshot);\r\n\r\n\t\t\tif (result instanceof Blob) {\r\n\t\t\t\tdownloadBlob(result, 'rowakit-export.csv');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\topenUrl(result.url);\r\n\t\t} catch (e: unknown) {\r\n\t\t\tsetError(e instanceof Error ? e.message : 'Export failed');\r\n\t\t} finally {\r\n\t\t\tsetIsExporting(false);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<div className=\"rowakit-export\">\r\n\t\t\t<button\r\n\t\t\t\ttype=\"button\"\r\n\t\t\t\tclassName=\"rowakit-button rowakit-button-secondary\"\r\n\t\t\t\tonClick={onClick}\r\n\t\t\t\tdisabled={isExporting}\r\n\t\t\t>\r\n\t\t\t\t{isExporting ? 'Exporting…' : 'Export CSV'}\r\n\t\t\t</button>\r\n\t\t\t{error && <div className=\"rowakit-export-error\">{error}</div>}\r\n\t\t</div>\r\n\t);\r\n}\r\n","export type SelectionKey = string | number;\r\n\r\nexport function toggleSelectionKey(selected: SelectionKey[], key: SelectionKey): SelectionKey[] {\r\n\tif (selected.includes(key)) {\r\n\t\treturn selected.filter((k) => k !== key);\r\n\t}\r\n\treturn [...selected, key];\r\n}\r\n\r\nexport function isAllSelected(selected: SelectionKey[], pageKeys: SelectionKey[]): boolean {\r\n\tif (pageKeys.length === 0) return false;\r\n\treturn pageKeys.every((k) => selected.includes(k));\r\n}\r\n\r\nexport function isIndeterminate(selected: SelectionKey[], pageKeys: SelectionKey[]): boolean {\r\n\tif (pageKeys.length === 0) return false;\r\n\tconst selectedCount = pageKeys.filter((k) => selected.includes(k)).length;\r\n\treturn selectedCount > 0 && selectedCount < pageKeys.length;\r\n}\r\n\r\nexport function selectAll(pageKeys: SelectionKey[]): SelectionKey[] {\r\n\treturn [...pageKeys];\r\n}\r\n\r\nexport function clearSelection(): SelectionKey[] {\r\n\treturn [];\r\n}\r\n","/**\r\n * RowaKit Table Component\r\n *\r\n * Core table rendering component that maps columns to table cells.\r\n * Handles all column types: text, date, boolean, actions, and custom.\r\n * Includes data fetching state machine with loading/error/empty states.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Fetcher, ColumnDef, FetcherQuery, ActionDef, FilterValue, ActionsColumnDef } from '../types';\r\nimport { useColumnResizing } from '../hooks/useColumnResizing';\r\nimport { useFetcherState } from '../hooks/useFetcherState';\r\nimport { useSavedViews } from '../hooks/useSavedViews';\r\nimport { useSortingState } from '../hooks/useSortingState';\r\nimport { useUrlSync } from '../hooks/useUrlSync';\r\nimport { useFocusTrap } from '../hooks/useFocusTrap';\r\nimport { RowSelectionCell, RowSelectionHeaderCell } from './RowSelectionColumn';\r\nimport { BulkActionBar } from './BulkActionBar';\r\nimport type { BulkActionDef } from './BulkActionBar';\r\nimport { ExportButton } from './ExportButton';\r\nimport type { Exporter } from '../types/export';\r\nimport {\r\n clearSelection,\r\n isAllSelected,\r\n isIndeterminate,\r\n selectAll,\r\n toggleSelectionKey,\r\n} from '../state/selection';\r\n\r\n// ============================================================================\r\n// COMPONENT PROPS\r\n// ============================================================================\r\n\r\nexport interface SmartTableProps<T> {\r\n /** Server-side data fetcher function */\r\n fetcher: Fetcher<T>;\r\n\r\n /** Array of column definitions */\r\n columns: ColumnDef<T>[];\r\n\r\n /** Available page size options (default: [10, 20, 50]) */\r\n pageSizeOptions?: number[];\r\n\r\n /** Initial page size (default: 20) */\r\n defaultPageSize?: number;\r\n\r\n /** Function or field name to extract row key (default: uses 'id' field) */\r\n rowKey?: keyof T | ((row: T) => string | number);\r\n\r\n /** Optional CSS class name for the table container */\r\n className?: string;\r\n\r\n /** Enable filters (default: false) */\r\n enableFilters?: boolean;\r\n\r\n /** Stage C: Enable column resizing (default: false) */\r\n enableColumnResizing?: boolean;\r\n\r\n /** Stage C: Sync table state to URL query string (default: false) */\r\n syncToUrl?: boolean;\r\n\r\n /** Stage C: Enable saved views feature (default: false) */\r\n enableSavedViews?: boolean;\r\n\r\n /** Stage E: Enable row selection (default: false) */\r\n enableRowSelection?: boolean;\r\n\r\n /** Stage E: Selection change callback */\r\n onSelectionChange?: (keys: Array<string | number>) => void;\r\n\r\n /** Stage E: Bulk actions based on selection */\r\n bulkActions?: BulkActionDef[];\r\n\r\n /** Stage E: Export CSV (server-triggered) */\r\n exporter?: Exporter;\r\n}\r\n\r\n/**\r\n * Confirmation state for actions that require confirmation.\r\n */\r\ninterface ConfirmState<T> {\r\n action: ActionDef<T>;\r\n row: T;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Extract unique key from a row.\r\n */\r\nfunction getRowKey<T>(row: T, rowKey?: keyof T | ((row: T) => string | number)): string | number {\r\n if (typeof rowKey === 'function') {\r\n return rowKey(row);\r\n }\r\n if (rowKey) {\r\n return String(row[rowKey]);\r\n }\r\n // Fallback to 'id' field if available\r\n if (row && typeof row === 'object' && 'id' in row) {\r\n return String(row.id);\r\n }\r\n // Last resort: use object reference (not ideal but safe)\r\n return String(row);\r\n}\r\n\r\n/**\r\n * Get header label for a column.\r\n */\r\nfunction getHeaderLabel<T>(column: ColumnDef<T>): string {\r\n return column.header ?? column.id;\r\n}\r\n\r\nfunction renderCell<T>(\r\n column: ColumnDef<T>,\r\n row: T,\r\n isLoading: boolean,\r\n setConfirmState: (state: ConfirmState<T> | null) => void\r\n): ReactNode {\r\n switch (column.kind) {\r\n case 'text': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value);\r\n }\r\n return String(value ?? '');\r\n }\r\n\r\n case 'date': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value as Date | string | number);\r\n }\r\n // Default date formatting\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n return '';\r\n }\r\n\r\n case 'boolean': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(Boolean(value));\r\n }\r\n // Default boolean formatting\r\n return value ? 'Yes' : 'No';\r\n }\r\n\r\n case 'badge': {\r\n const value = row[column.field];\r\n const valueStr = String(value ?? '');\r\n \r\n // Look up mapping\r\n const mapped = column.map?.[valueStr];\r\n const label = mapped?.label ?? valueStr;\r\n const tone = mapped?.tone ?? 'neutral';\r\n \r\n return (\r\n <span className={`rowakit-badge rowakit-badge-${tone}`}>\r\n {label}\r\n </span>\r\n );\r\n }\r\n\r\n case 'number': {\r\n const value = row[column.field];\r\n const numValue = Number(value ?? 0);\r\n \r\n if (column.format) {\r\n if (typeof column.format === 'function') {\r\n return column.format(numValue, row);\r\n }\r\n // Intl.NumberFormatOptions\r\n return new Intl.NumberFormat(undefined, column.format).format(numValue);\r\n }\r\n \r\n // Default number formatting\r\n return numValue.toLocaleString();\r\n }\r\n\r\n case 'actions': {\r\n const columnWithActions = column as ActionsColumnDef<T>;\r\n // Safety check: ensure actions is an array\r\n if (!Array.isArray(columnWithActions.actions)) {\r\n return null;\r\n }\r\n return (\r\n <div className=\"rowakit-table-actions\">\r\n {columnWithActions.actions.map((action) => {\r\n const isDisabled =\r\n isLoading ||\r\n action.disabled === true ||\r\n (typeof action.disabled === 'function' && action.disabled(row));\r\n\r\n const handleClick = () => {\r\n if (isDisabled || action.loading) {\r\n return;\r\n }\r\n\r\n // If action requires confirmation, show modal\r\n if (action.confirm) {\r\n setConfirmState({ action, row });\r\n } else {\r\n // Execute action directly\r\n void action.onClick(row);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n key={action.id}\r\n onClick={handleClick}\r\n disabled={isDisabled || action.loading}\r\n type=\"button\"\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n >\r\n {action.icon && typeof action.icon === 'string' ? (\r\n <span>{action.icon}</span>\r\n ) : (\r\n action.icon\r\n )}\r\n {action.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n case 'custom': {\r\n return column.render(row);\r\n }\r\n\r\n default: {\r\n // Exhaustive check\r\n const _exhaustive: never = column;\r\n return _exhaustive;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * RowaKitTable - Server-side table component for internal/business apps.\r\n *\r\n * This component renders a table with headers and body based on column definitions.\r\n * It handles all column types (text, date, boolean, actions, custom) and provides\r\n * a clean API for defining table structure.\r\n *\r\n * Features:\r\n * - Automatic data fetching on mount and query changes\r\n * - Loading, error, and empty states\r\n * - Stale request handling\r\n * - Retry on error\r\n *\r\n * @example\r\n * ```tsx\r\n * import { RowaKitTable, col } from '@rowakit/table';\r\n *\r\n * interface User {\r\n * id: string;\r\n * name: string;\r\n * email: string;\r\n * createdAt: Date;\r\n * active: boolean;\r\n * }\r\n *\r\n * const fetchUsers: Fetcher<User> = async (query) => {\r\n * const response = await fetch(`/api/users?page=${query.page}&pageSize=${query.pageSize}`);\r\n * return response.json();\r\n * };\r\n *\r\n * function UsersTable() {\r\n * return (\r\n * <RowaKitTable\r\n * fetcher={fetchUsers}\r\n * columns={[\r\n * col.text('name', { header: 'Name', sortable: true }),\r\n * col.text('email', { header: 'Email' }),\r\n * col.date('createdAt', { header: 'Created' }),\r\n * col.boolean('active', { header: 'Active' }),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (user) => editUser(user) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (user) => deleteUser(user) }\r\n * ])\r\n * ]}\r\n * defaultPageSize={20}\r\n * rowKey=\"id\"\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function RowaKitTable<T>({\r\n fetcher,\r\n columns,\r\n defaultPageSize = 20,\r\n pageSizeOptions = [10, 20, 50],\r\n rowKey,\r\n className = '',\r\n enableFilters = false,\r\n enableColumnResizing = false,\r\n syncToUrl = false,\r\n enableSavedViews = false,\r\n enableRowSelection = false,\r\n onSelectionChange,\r\n bulkActions,\r\n exporter,\r\n}: SmartTableProps<T>) {\r\n const [query, setQuery] = useState<FetcherQuery>({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n\r\n // Filter state (field -> FilterValue)\r\n const [filters, setFilters] = useState<Record<string, FilterValue | undefined>>({});\r\n // Confirmation state for actions that require confirmation\r\n const [confirmState, setConfirmState] = useState<ConfirmState<T> | null>(null);\r\n\r\n // Stage E: Row selection state (page-scoped)\r\n const [selectedKeys, setSelectedKeys] = useState<Array<string | number>>([]);\r\n\r\n // Stage E: Bulk action confirmation state\r\n const [bulkConfirmState, setBulkConfirmState] = useState<{\r\n action: BulkActionDef;\r\n selectedKeys: Array<string | number>;\r\n } | null>(null);\r\n\r\n // Stage E7 (a11y): Modal refs for focus trap\r\n const confirmModalRef = useRef<HTMLDivElement>(null);\r\n const bulkConfirmModalRef = useRef<HTMLDivElement>(null);\r\n\r\n const {\r\n tableRef,\r\n columnWidths,\r\n setColumnWidths,\r\n startColumnResize,\r\n handleColumnResizeDoubleClick,\r\n isResizingRef,\r\n lastResizeEndTsRef,\r\n resizingColIdRef,\r\n } = useColumnResizing(columns);\r\n\r\n useUrlSync({\r\n syncToUrl,\r\n enableColumnResizing,\r\n defaultPageSize,\r\n pageSizeOptions,\r\n columns,\r\n query,\r\n setQuery,\r\n filters,\r\n setFilters,\r\n columnWidths,\r\n setColumnWidths,\r\n });\r\n\r\n const { dataState, handleRetry, isLoading, isError, isEmpty } = useFetcherState(fetcher, query, setQuery);\r\n const { handleSort, getSortIndicator } = useSortingState(query, setQuery);\r\n\r\n const pageRowKeys = dataState.items.map((row) => getRowKey(row, rowKey));\r\n const headerChecked = isAllSelected(selectedKeys, pageRowKeys);\r\n const headerIndeterminate = isIndeterminate(selectedKeys, pageRowKeys);\r\n\r\n useEffect(() => {\r\n if (!enableRowSelection) return;\r\n setSelectedKeys(clearSelection());\r\n }, [enableRowSelection, query.page, dataState.items]);\r\n\r\n useEffect(() => {\r\n if (!enableRowSelection || !onSelectionChange) return;\r\n onSelectionChange(selectedKeys);\r\n }, [enableRowSelection, onSelectionChange, selectedKeys]);\r\n\r\n const {\r\n savedViews,\r\n showSaveViewForm,\r\n saveViewInput,\r\n saveViewError,\r\n overwriteConfirmName,\r\n openSaveViewForm,\r\n cancelSaveViewForm,\r\n onSaveViewInputChange,\r\n onSaveViewInputKeyDown,\r\n attemptSave,\r\n confirmOverwrite,\r\n cancelOverwrite,\r\n loadSavedView,\r\n deleteSavedView,\r\n resetTableState,\r\n } = useSavedViews({\r\n enableSavedViews,\r\n enableColumnResizing,\r\n defaultPageSize,\r\n query,\r\n setQuery,\r\n setFilters,\r\n columnWidths,\r\n setColumnWidths,\r\n });\r\n\r\n // Stage E7 (a11y): Apply focus trap to modals\r\n useFocusTrap(confirmModalRef, {\r\n onEscape: () => setConfirmState(null),\r\n autoFocus: true,\r\n });\r\n\r\n useFocusTrap(bulkConfirmModalRef, {\r\n onEscape: () => setBulkConfirmState(null),\r\n autoFocus: true,\r\n });\r\n\r\n // Sync filters to query (and reset page to 1 when filters change)\r\n useEffect(() => {\r\n if (!enableFilters) return;\r\n\r\n // Build filters object, excluding undefined values\r\n const activeFilters: Record<string, FilterValue> = {};\r\n let hasFilters = false;\r\n \r\n for (const [field, value] of Object.entries(filters)) {\r\n if (value !== undefined) {\r\n activeFilters[field] = value;\r\n hasFilters = true;\r\n }\r\n }\r\n\r\n // Per spec: filters must be undefined when empty (not {})\r\n const filtersToSend = hasFilters ? activeFilters : undefined;\r\n\r\n setQuery((prev) => ({\r\n ...prev,\r\n filters: filtersToSend,\r\n page: 1, // Reset page to 1 when filters change\r\n }));\r\n }, [filters, enableFilters]);\r\n\r\n // Pagination handlers\r\n const handlePreviousPage = () => {\r\n if (query.page > 1) {\r\n setQuery((prev) => ({ ...prev, page: prev.page - 1 }));\r\n }\r\n };\r\n\r\n const handleNextPage = () => {\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n if (query.page < totalPages) {\r\n setQuery((prev) => ({ ...prev, page: prev.page + 1 }));\r\n }\r\n };\r\n\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setQuery({ ...query, pageSize: newPageSize, page: 1 });\r\n };\r\n\r\n // Helper function to apply filterTransform to filter values for number columns\r\n const transformFilterValueForColumn = (\r\n column: ColumnDef<T> | undefined,\r\n value: FilterValue | undefined,\r\n ): FilterValue | undefined => {\r\n if (!value || column?.kind !== 'number') {\r\n return value;\r\n }\r\n\r\n const numberColumn = column as ColumnDef<T> & {\r\n filterTransform?: (input: number) => number;\r\n };\r\n\r\n if (!numberColumn.filterTransform) {\r\n return value;\r\n }\r\n\r\n if (value.op === 'equals' && typeof value.value === 'number') {\r\n return {\r\n ...value,\r\n value: numberColumn.filterTransform(value.value),\r\n };\r\n }\r\n\r\n if (value.op === 'range' && typeof value.value === 'object') {\r\n const { from, to } = value.value;\r\n return {\r\n op: 'range',\r\n value: {\r\n from:\r\n from !== undefined && typeof from === 'number'\r\n ? numberColumn.filterTransform(from)\r\n : from,\r\n to:\r\n to !== undefined && typeof to === 'number'\r\n ? numberColumn.filterTransform(to)\r\n : to,\r\n },\r\n };\r\n }\r\n\r\n return value;\r\n };\r\n\r\n // Filter handlers\r\n const handleFilterChange = (field: string, value: FilterValue | undefined) => {\r\n // Stage C: Apply filter transform if defined\r\n const column = columns.find(c => c.id === field);\r\n const transformedValue = transformFilterValueForColumn(column, value);\r\n\r\n setFilters((prev) => ({\r\n ...prev,\r\n [field]: transformedValue,\r\n }));\r\n };\r\n\r\n const handleClearFilter = (field: string) => {\r\n setFilters((prev) => {\r\n const newFilters = { ...prev };\r\n delete newFilters[field];\r\n return newFilters;\r\n });\r\n };\r\n\r\n const handleClearAllFilters = () => {\r\n setFilters({});\r\n };\r\n\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n const canGoPrevious = query.page > 1 && !isLoading;\r\n const canGoNext = query.page < totalPages && !isLoading;\r\n\r\n const tableColumnCount = columns.length + (enableRowSelection ? 1 : 0);\r\n\r\n const hasActiveFilters = enableFilters && Object.values(filters).some(v => v !== undefined);\r\n\r\n // PRD-03: Apply fixed layout class when resizing is enabled\r\n const containerClass = [\r\n 'rowakit-table',\r\n enableColumnResizing ? 'rowakit-layout-fixed' : '',\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <div className={containerClass}>\r\n {enableRowSelection && bulkActions && bulkActions.length > 0 && selectedKeys.length > 0 && (\r\n <BulkActionBar\r\n selectedCount={selectedKeys.length}\r\n actions={bulkActions}\r\n onActionClick={(actionId) => {\r\n const action = bulkActions.find((a) => a.id === actionId);\r\n if (!action) return;\r\n\r\n const snapshot = [...selectedKeys];\r\n\r\n if (action.confirm) {\r\n setBulkConfirmState({ action, selectedKeys: snapshot });\r\n return;\r\n }\r\n\r\n action.onClick(snapshot);\r\n }}\r\n />\r\n )}\r\n\r\n {exporter && <ExportButton exporter={exporter} query={query} />}\r\n\r\n {enableSavedViews && (\r\n <div className=\"rowakit-saved-views-group\">\r\n {!showSaveViewForm ? (\r\n <button\r\n onClick={openSaveViewForm}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Save View\r\n </button>\r\n ) : (\r\n <div className=\"rowakit-save-view-form\">\r\n {overwriteConfirmName ? (\r\n <div className=\"rowakit-save-view-confirm\">\r\n <p>View \"{overwriteConfirmName}\" already exists. Overwrite?</p>\r\n <button\r\n onClick={confirmOverwrite}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Overwrite\r\n </button>\r\n <button\r\n onClick={cancelOverwrite}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n ) : (\r\n <>\r\n <input\r\n type=\"text\"\r\n value={saveViewInput}\r\n onChange={onSaveViewInputChange}\r\n onKeyDown={onSaveViewInputKeyDown}\r\n placeholder=\"Enter view name...\"\r\n className=\"rowakit-save-view-input\"\r\n />\r\n {saveViewError && (\r\n <div className=\"rowakit-save-view-error\">{saveViewError}</div>\r\n )}\r\n <button\r\n onClick={attemptSave}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Save\r\n </button>\r\n <button\r\n onClick={cancelSaveViewForm}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n {savedViews.map((view) => (\r\n <div key={view.name} className=\"rowakit-saved-view-item\">\r\n <button\r\n onClick={() => loadSavedView(view.name)}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n {view.name}\r\n </button>\r\n <button\r\n onClick={() => deleteSavedView(view.name)}\r\n className=\"rowakit-saved-view-button rowakit-saved-view-button-delete\"\r\n type=\"button\"\r\n title=\"Delete this view\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n {(hasActiveFilters || query.page > 1 || query.sort) && (\r\n <button\r\n onClick={resetTableState}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Reset\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {hasActiveFilters && (\r\n <div className=\"rowakit-table-filter-controls\">\r\n <button\r\n onClick={handleClearAllFilters}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Clear all filters\r\n </button>\r\n </div>\r\n )}\r\n <table ref={tableRef}>\r\n <thead>\r\n <tr>\r\n {enableRowSelection && (\r\n <RowSelectionHeaderCell\r\n checked={headerChecked}\r\n indeterminate={headerIndeterminate}\r\n disabled={isLoading || pageRowKeys.length === 0}\r\n onChange={(checked) => {\r\n if (checked) {\r\n setSelectedKeys(selectAll(pageRowKeys));\r\n } else {\r\n setSelectedKeys(clearSelection());\r\n }\r\n }}\r\n />\r\n )}\r\n {columns.map((column) => {\r\n const isSortable = column.kind !== 'actions' && \r\n (column.kind === 'custom' ? false : column.sortable === true);\r\n const field = column.kind === 'actions' ? '' : \r\n column.kind === 'custom' ? column.field : \r\n column.field;\r\n\r\n const isResizable = enableColumnResizing && column.kind !== 'actions';\r\n // Use resized width first, then fall back to column.width definition\r\n const actualWidth = columnWidths[column.id] ?? column.width;\r\n\r\n return (\r\n <th\r\n key={column.id}\r\n data-col-id={column.id}\r\n onClick={isSortable ? (e) => {\r\n // PRD-01: Suppress sort if resizing or during suppression window\r\n if (isResizingRef.current) return;\r\n if (Date.now() - lastResizeEndTsRef.current < 150) return;\r\n // PRD-E4: Multi-sort support via Ctrl/Cmd + click\r\n const isMultiSort = e.ctrlKey || e.metaKey;\r\n handleSort(String(field), isMultiSort);\r\n } : undefined}\r\n role={isSortable ? 'button' : undefined}\r\n tabIndex={isSortable ? 0 : undefined}\r\n onKeyDown={isSortable ? (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n // PRD-E4: Shift for multi-sort in keyboard mode\r\n const isMultiSort = e.shiftKey;\r\n handleSort(String(field), isMultiSort);\r\n }\r\n } : undefined}\r\n aria-sort={\r\n isSortable && (query.sorts?.find(s => s.field === String(field))?.priority === 0 || query.sort?.field === String(field))\r\n ? (query.sorts?.find(s => s.field === String(field))?.direction ?? query.sort?.direction) === 'asc' ? 'ascending' : 'descending'\r\n : undefined\r\n }\r\n style={{\r\n width: actualWidth != null ? `${actualWidth}px` : undefined,\r\n textAlign: column.align,\r\n position: isResizable ? 'relative' : undefined,\r\n }}\r\n // PRD-03: Re-enable truncation for resizable columns (now safe with fixed layout)\r\n className={[\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n resizingColIdRef.current === column.id ? 'resizing' : '' // PRD-01\r\n ].filter(Boolean).join(' ') || undefined}\r\n >\r\n {getHeaderLabel(column)}{isSortable && getSortIndicator(String(field))}\r\n {isResizable && (\r\n <div\r\n className=\"rowakit-column-resize-handle\"\r\n onPointerDown={(e) => startColumnResize(e, column.id)}\r\n onDoubleClick={(e) => handleColumnResizeDoubleClick(e, column.id)}\r\n title=\"Drag to resize | Double-click to auto-fit content\"\r\n />\r\n )}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n {enableFilters && (\r\n <tr className=\"rowakit-table-filter-row\">\r\n {enableRowSelection && <th></th>}\r\n {columns.map((column) => {\r\n const field = column.kind === 'actions' || column.kind === 'custom' ? '' : String(column.field);\r\n const canFilter = field && column.kind !== 'actions';\r\n \r\n if (!canFilter) {\r\n return <th key={column.id}></th>;\r\n }\r\n\r\n const filterValue = filters[field];\r\n\r\n // Badge column: select with options\r\n if (column.kind === 'badge') {\r\n const options = column.map ? Object.keys(column.map) : [];\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={filterValue?.op === 'equals' ? String(filterValue.value ?? '') : ''}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {opt}\r\n </option>\r\n ))}\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Boolean column: select with True/False/All\r\n if (column.kind === 'boolean') {\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={\r\n filterValue?.op === 'equals' && typeof filterValue.value === 'boolean'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value: value === 'true' });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n <option value=\"true\">True</option>\r\n <option value=\"false\">False</option>\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Date column: from/to inputs\r\n if (column.kind === 'date') {\r\n const fromValue = filterValue?.op === 'range' ? filterValue.value.from ?? '' : '';\r\n const toValue = filterValue?.op === 'range' ? filterValue.value.to ?? '' : '';\r\n \r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-date-range\">\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"From\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value || undefined;\r\n const to = toValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"To\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value || undefined;\r\n const from = fromValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n\r\n // Text/Number column: text or number input\r\n const isNumberColumn = column.kind === 'number';\r\n \r\n // Stage C: Number column can use range filter\r\n if (isNumberColumn) {\r\n const fromValue = filterValue?.op === 'range' ? String(filterValue.value.from ?? '') : \r\n filterValue?.op === 'equals' && typeof filterValue.value === 'number' ? String(filterValue.value) : '';\r\n const toValue = filterValue?.op === 'range' ? String(filterValue.value.to ?? '') : '';\r\n \r\n // If there's an equals filter, show simple input; otherwise show range\r\n const showRangeUI = !filterValue || filterValue.op === 'range';\r\n \r\n if (showRangeUI) {\r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-number-range\">\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Min\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value ? Number(e.target.value) : undefined;\r\n const to = toValue ? Number(toValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Max\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value ? Number(e.target.value) : undefined;\r\n const from = fromValue ? Number(fromValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n }\r\n\r\n // Regular text/number input\r\n return (\r\n <th key={column.id}>\r\n <input\r\n type={isNumberColumn ? 'number' : 'text'}\r\n className=\"rowakit-filter-input\"\r\n placeholder={`Filter ${getHeaderLabel(column)}...`}\r\n value={\r\n filterValue?.op === 'contains'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'string'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'number'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const rawValue = e.target.value;\r\n if (rawValue === '') {\r\n handleClearFilter(field);\r\n } else if (isNumberColumn) {\r\n const numValue = Number(rawValue);\r\n if (!isNaN(numValue)) {\r\n // Send the parsed numeric value, not the string\r\n handleFilterChange(field, { op: 'equals', value: numValue } as FilterValue);\r\n } else {\r\n // Invalid numeric input: clear the filter to avoid confusing UX\r\n handleClearFilter(field);\r\n }\r\n } else {\r\n // Text: use \"contains\"\r\n handleFilterChange(field, { op: 'contains', value: rawValue } as FilterValue);\r\n }\r\n }}\r\n />\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n )}\r\n </thead>\r\n <tbody>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={tableColumnCount} className=\"rowakit-table-loading\">\r\n <div className=\"rowakit-table-loading-spinner\"></div>\r\n <span>Loading...</span>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isError && (\r\n <tr>\r\n <td colSpan={tableColumnCount} className=\"rowakit-table-error\">\r\n <div className=\"rowakit-table-error-message\">\r\n {dataState.error ?? 'An error occurred'}\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"rowakit-button rowakit-button-primary\"\r\n type=\"button\"\r\n >\r\n Retry\r\n </button>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isEmpty && (\r\n <tr>\r\n <td colSpan={tableColumnCount} className=\"rowakit-table-empty\">\r\n No data\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {dataState.state === 'success' &&\r\n dataState.items.map((row) => {\r\n const key = getRowKey(row, rowKey);\r\n return (\r\n <tr key={key}>\r\n {enableRowSelection && (\r\n <RowSelectionCell\r\n rowKey={key}\r\n disabled={isLoading}\r\n checked={selectedKeys.includes(key)}\r\n onChange={() => {\r\n setSelectedKeys((prev) => toggleSelectionKey(prev, key));\r\n }}\r\n />\r\n )}\r\n {columns.map((column) => {\r\n const cellClass = [\r\n column.kind === 'number' ? 'rowakit-cell-number' : '',\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n ].filter(Boolean).join(' ') || undefined;\r\n \r\n // PRD-03: Apply width to body cells matching header width (resized or column.width)\r\n const actualWidth = columnWidths[column.id] ?? column.width;\r\n \r\n return (\r\n <td \r\n key={column.id}\r\n data-col-id={column.id}\r\n className={cellClass}\r\n style={{\r\n width: actualWidth != null ? `${actualWidth}px` : undefined,\r\n textAlign: column.align || (column.kind === 'number' ? 'right' : undefined),\r\n }}\r\n >\r\n {renderCell(column, row, isLoading, setConfirmState)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n {dataState.total > 0 && (\r\n <div className=\"rowakit-table-pagination\">\r\n {/* Left: Page size selector */}\r\n <div className=\"rowakit-table-pagination-left\">\r\n <label htmlFor=\"page-size\">\r\n Rows per page:\r\n </label>\r\n <select\r\n id=\"page-size\"\r\n value={query.pageSize}\r\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\r\n disabled={isLoading}\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Center: Page info */}\r\n <div className=\"rowakit-table-pagination-center\">\r\n Page {query.page} of {totalPages} ({dataState.total} total)\r\n </div>\r\n\r\n {/* Right: Previous/Next buttons */}\r\n <div className=\"rowakit-table-pagination-right\">\r\n <button\r\n onClick={handlePreviousPage}\r\n disabled={!canGoPrevious}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Previous page\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n onClick={handleNextPage}\r\n disabled={!canGoNext}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Next page\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirmation Modal */}\r\n {confirmState && (\r\n <div\r\n ref={confirmModalRef}\r\n className=\"rowakit-modal-backdrop\"\r\n onClick={() => setConfirmState(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"confirm-dialog-title\"\r\n >\r\n <div className=\"rowakit-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h2 id=\"confirm-dialog-title\" className=\"rowakit-modal-title\">\r\n Confirm Action\r\n </h2>\r\n <p className=\"rowakit-modal-content\">\r\n Are you sure you want to {confirmState.action.label.toLowerCase()}? This action cannot be\r\n undone.\r\n </p>\r\n <div className=\"rowakit-modal-actions\">\r\n <button\r\n onClick={() => setConfirmState(null)}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n void confirmState.action.onClick(confirmState.row);\r\n setConfirmState(null);\r\n }}\r\n className=\"rowakit-button rowakit-button-danger\"\r\n type=\"button\"\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {bulkConfirmState && (\r\n <div\r\n ref={bulkConfirmModalRef}\r\n className=\"rowakit-modal-backdrop\"\r\n onClick={() => setBulkConfirmState(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"bulk-confirm-dialog-title\"\r\n >\r\n <div className=\"rowakit-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h2 id=\"bulk-confirm-dialog-title\" className=\"rowakit-modal-title\">\r\n {bulkConfirmState.action.confirm?.title ?? 'Confirm Action'}\r\n </h2>\r\n <p className=\"rowakit-modal-content\">\r\n {bulkConfirmState.action.confirm?.description ?? 'Are you sure you want to perform this action? This action cannot be undone.'}\r\n </p>\r\n <div className=\"rowakit-modal-actions\">\r\n <button\r\n onClick={() => setBulkConfirmState(null)}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n bulkConfirmState.action.onClick(bulkConfirmState.selectedKeys);\r\n setBulkConfirmState(null);\r\n }}\r\n className=\"rowakit-button rowakit-button-danger\"\r\n type=\"button\"\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.\r\n */\r\nexport const SmartTable = RowaKitTable;\r\n","/**\r\n * @rowakit/table\r\n *\r\n * Opinionated, server-side-first table component for internal/business apps.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Core types\r\nexport type {\r\n // Fetcher types\r\n Fetcher,\r\n FetcherQuery,\r\n FetcherResult,\r\n FilterValue,\r\n Filters,\r\n // Column types\r\n ColumnDef,\r\n ColumnKind,\r\n BaseColumnDef,\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n BadgeTone,\r\n // Action types\r\n ActionDef,\r\n} from './types';\r\n\r\n// Export types\r\nexport type { Exporter, ExporterResult } from './types/export';\r\n\r\n// Column helper factory\r\nexport { col } from './column-helpers';\r\n\r\n// Components\r\nexport { RowaKitTable, SmartTable } from './components/SmartTable';\r\nexport type { SmartTableProps } from './components/SmartTable';\r\n\r\n// Version injected at build time from package.json\r\ndeclare const __ROWAKIT_TABLE_VERSION__: string | undefined;\r\n\r\nexport const VERSION = typeof __ROWAKIT_TABLE_VERSION__ !== 'undefined' \r\n ? __ROWAKIT_TABLE_VERSION__ \r\n : '0.5.0';\r\n"]}