better-table 1.2.0 → 1.3.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.
Files changed (33) hide show
  1. package/README.md +90 -120
  2. package/dist/better-table.cjs.js +1 -1
  3. package/dist/better-table.cjs.js.map +1 -1
  4. package/dist/better-table.css +1 -1
  5. package/dist/better-table.es.js +1643 -1331
  6. package/dist/better-table.es.js.map +1 -1
  7. package/dist/components/BetterTable/__tests__/helpers/test-data.d.ts +96 -96
  8. package/dist/components/BetterTable/components/TableExpandedRow.d.ts +8 -0
  9. package/dist/components/BetterTable/components/TableRow.d.ts +2 -1
  10. package/dist/components/BetterTable/components/TableVirtualBody.d.ts +10 -0
  11. package/dist/components/BetterTable/components/index.d.ts +2 -0
  12. package/dist/components/BetterTable/constants.d.ts +20 -0
  13. package/dist/components/BetterTable/context/TableContext.d.ts +15 -80
  14. package/dist/components/BetterTable/context/TableDataContext.d.ts +18 -0
  15. package/dist/components/BetterTable/context/TableFilterContext.d.ts +17 -0
  16. package/dist/components/BetterTable/context/TablePaginationContext.d.ts +19 -0
  17. package/dist/components/BetterTable/context/TableSelectionContext.d.ts +15 -0
  18. package/dist/components/BetterTable/context/TableSortContext.d.ts +10 -0
  19. package/dist/components/BetterTable/context/TableUIContext.d.ts +33 -0
  20. package/dist/components/BetterTable/context/index.d.ts +14 -2
  21. package/dist/components/BetterTable/hooks/index.d.ts +4 -0
  22. package/dist/components/BetterTable/hooks/useColumnResize.d.ts +23 -0
  23. package/dist/components/BetterTable/hooks/useExpandableRows.d.ts +19 -0
  24. package/dist/components/BetterTable/hooks/useFocusTrap.d.ts +6 -0
  25. package/dist/components/BetterTable/hooks/useTableFilter.d.ts +3 -1
  26. package/dist/components/BetterTable/hooks/useTablePagination.d.ts +3 -1
  27. package/dist/components/BetterTable/hooks/useTableSearch.d.ts +3 -1
  28. package/dist/components/BetterTable/hooks/useTableSort.d.ts +3 -1
  29. package/dist/components/BetterTable/hooks/useVirtualization.d.ts +25 -0
  30. package/dist/components/BetterTable/index.d.ts +2 -2
  31. package/dist/components/BetterTable/types.d.ts +58 -0
  32. package/dist/index.d.ts +4 -4
  33. package/package.json +19 -14
@@ -1 +1 @@
1
- {"version":3,"file":"better-table.es.js","sources":["../src/components/BetterTable/types.ts","../src/components/BetterTable/context/TableContext.tsx","../node_modules/clsx/dist/clsx.mjs","../src/components/BetterTable/components/TableHeaderCell.tsx","../src/components/BetterTable/components/TableFloatingFilter.tsx","../src/components/BetterTable/components/TableHeader.tsx","../src/components/BetterTable/utils/getValueFromPath.ts","../src/components/BetterTable/utils/sortData.ts","../src/components/BetterTable/utils/filterData.ts","../src/components/BetterTable/components/TableCell.tsx","../src/components/BetterTable/components/TableActionOverflow.tsx","../src/components/BetterTable/components/TableActions.tsx","../src/components/BetterTable/components/TableRow.tsx","../src/components/BetterTable/components/TableBody.tsx","../src/components/BetterTable/components/TableCard.tsx","../src/components/BetterTable/components/TableCards.tsx","../src/components/BetterTable/components/TableFilterPanel.tsx","../src/components/BetterTable/components/TableColumnVisibility.tsx","../src/components/BetterTable/components/TablePagination.tsx","../src/components/BetterTable/hooks/useMediaQuery.ts","../src/components/BetterTable/components/TableToolbar.tsx","../src/components/BetterTable/components/TableEmpty.tsx","../src/components/BetterTable/components/TableLoading.tsx","../src/components/BetterTable/components/TableModal.tsx","../src/components/BetterTable/hooks/useTableSort.ts","../src/components/BetterTable/hooks/useTableFilter.ts","../src/components/BetterTable/hooks/useTablePagination.ts","../src/components/BetterTable/hooks/useTableSelection.ts","../src/components/BetterTable/hooks/useTableSearch.ts","../src/components/BetterTable/hooks/useColumnVisibility.ts","../src/components/BetterTable/components/Table.tsx"],"sourcesContent":["import { ReactNode, CSSProperties } from \"react\";\n\n/**\n * Tipo base para los datos de la tabla\n * Permite extensión con tipos específicos del usuario\n */\nexport type TableData = Record<string, unknown>;\n\n/**\n * Configuración de columna con tipado genérico\n */\nexport interface Column<T extends TableData = TableData> {\n\t/** Identificador único de la columna */\n\tid: string;\n\t/** Key para acceder al dato (soporta dot notation: 'user.profile.name') */\n\taccessor: keyof T | string;\n\t/** Texto visible en el header */\n\theader: string;\n\t/** Tipo de dato para filtrado y renderizado */\n\ttype?: \"string\" | \"number\" | \"boolean\" | \"date\" | \"custom\";\n\t/** Render personalizado de celda */\n\tcell?: (value: unknown, row: T, rowIndex: number) => ReactNode;\n\t/** Render personalizado de header */\n\theaderCell?: (column: Column<T>) => ReactNode;\n\t/** ¿Columna ordenable? */\n\tsortable?: boolean;\n\t/** ¿Columna filtrable? */\n\tfilterable?: boolean;\n\t/** Ancho de columna */\n\twidth?: string | number;\n\t/** Alineación del contenido */\n\talign?: \"left\" | \"center\" | \"right\";\n\t/** Columna oculta */\n\thidden?: boolean;\n}\n\n/**\n * Acción de fila individual\n */\nexport interface RowAction<T extends TableData = TableData> {\n\t/** Identificador único */\n\tid: string;\n\t/** Etiqueta de la acción */\n\tlabel: string;\n\t/** Icono (string, emoji, o componente) */\n\ticon?: ReactNode;\n\t/** Modo de ejecución */\n\tmode: \"callback\" | \"modal\" | \"link\";\n\t/** Callback cuando mode='callback' */\n\tonClick?: (row: T, rowIndex: number) => void;\n\t/** Componente para modal cuando mode='modal' */\n\tmodalContent?: React.ComponentType<{ data: T; onClose: () => void }>;\n\t/** URL cuando mode='link' */\n\thref?: string | ((row: T) => string);\n\t/** ¿Mostrar acción condicionalmente? */\n\tvisible?: (row: T) => boolean;\n\t/** ¿Deshabilitar acción condicionalmente? */\n\tdisabled?: (row: T) => boolean;\n\t/** Variante visual */\n\tvariant?: \"default\" | \"primary\" | \"danger\" | \"ghost\";\n}\n\n/**\n * Acción global (toolbar)\n */\nexport interface GlobalAction<T extends TableData = TableData> {\n\t/** Identificador único */\n\tid: string;\n\t/** Etiqueta del botón */\n\tlabel: string;\n\t/** Icono */\n\ticon?: ReactNode;\n\t/** Callback de ejecución */\n\tonClick: (selectedRows: T[], allData: T[]) => void;\n\t/** ¿Requiere selección de filas? */\n\trequiresSelection?: boolean;\n\t/** Variante visual */\n\tvariant?: \"default\" | \"primary\" | \"danger\";\n}\n\n/**\n * Configuración de paginación\n */\nexport interface PaginationConfig {\n\t/** Página actual (controlado) */\n\tpage?: number;\n\t/** Items por página */\n\tpageSize?: number;\n\t/** Opciones de tamaño de página */\n\tpageSizeOptions?: number[];\n\t/** Total de items (para paginación del servidor) */\n\ttotalItems?: number;\n\t/** Mostrar selector de tamaño de página */\n\tshowSizeChanger?: boolean;\n\t/** Mostrar salto a página */\n\tshowQuickJumper?: boolean;\n}\n\n/**\n * Estado de ordenamiento\n */\nexport interface SortState {\n\tcolumnId: string | null;\n\tdirection: \"asc\" | \"desc\";\n}\n\n/**\n * Estado de multi-sort (array de sort states en orden de prioridad)\n */\nexport type MultiSortState = SortState[];\n\n/**\n * Rango de fechas para filtros tipo date\n */\nexport interface DateFilterRange {\n\tfrom?: string;\n\tto?: string;\n}\n\n/**\n * Estado de filtros\n */\nexport interface FilterState {\n\t[columnId: string]: string | number | boolean | DateFilterRange | null;\n}\n\n/**\n * Personalización de estilos\n */\nexport interface TableClassNames {\n\t/** Clase CSS del contenedor */\n\tcontainer?: string;\n\t/** Clase CSS de la tabla */\n\ttable?: string;\n\t/** Clase CSS del header */\n\theader?: string;\n\t/** Clase CSS del body */\n\tbody?: string;\n\t/** Clase CSS de filas */\n\trow?: string;\n\t/** Clase CSS de celdas */\n\tcell?: string;\n\t/** Clase CSS de la paginación */\n\tpagination?: string;\n\t/** Clase CSS del toolbar */\n\ttoolbar?: string;\n}\n\n/**\n * Textos personalizables (i18n)\n */\nexport interface TableLocale {\n\tsearch?: string;\n\tsearchPlaceholder?: string;\n\tnoData?: string;\n\tloading?: string;\n\tpage?: string;\n\tof?: string;\n\titems?: string;\n\tselected?: string;\n\trowsPerPage?: string;\n\tactions?: string;\n\tsortAsc?: string;\n\tsortDesc?: string;\n\tfilterBy?: string;\n\tclearFilters?: string;\n\tdateFrom?: string;\n\tdateTo?: string;\n\tselectAll?: string;\n\tdeselectAll?: string;\n\tmoreActions?: string;\n\tclearSearch?: string;\n\tcloseModal?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tjumpToPage?: string;\n\tdetails?: string;\n\tcolumns?: string;\n\tshowAllColumns?: string;\n\thideColumn?: string;\n\tsortPriority?: string;\n\tclearSort?: string;\n}\n\n/**\n * Locale por defecto (Inglés)\n */\nexport const defaultLocale: Required<TableLocale> = {\n\tsearch: \"Search\",\n\tsearchPlaceholder: \"Search...\",\n\tnoData: \"No data\",\n\tloading: \"Loading...\",\n\tpage: \"Page\",\n\tof: \"of\",\n\titems: \"items\",\n\tselected: \"selected\",\n\trowsPerPage: \"Rows per page\",\n\tactions: \"Actions\",\n\tsortAsc: \"Sort ascending\",\n\tsortDesc: \"Sort descending\",\n\tfilterBy: \"Filter by\",\n\tclearFilters: \"Clear filters\",\n\tdateFrom: \"From\",\n\tdateTo: \"To\",\n\tselectAll: \"Select all\",\n\tdeselectAll: \"Deselect all\",\n\tmoreActions: \"More actions\",\n\tclearSearch: \"Clear search\",\n\tcloseModal: \"Close\",\n\tpreviousPage: \"Previous page\",\n\tnextPage: \"Next page\",\n\tjumpToPage: \"Go to page\",\n\tdetails: \"Details\",\n\tcolumns: \"Columns\",\n\tshowAllColumns: \"Show all\",\n\thideColumn: \"Hide column\",\n\tsortPriority: \"Sort priority\",\n\tclearSort: \"Clear sort\",\n};\n\n/**\n * Locales predefinidos\n */\nexport const locales = {\n\ten: defaultLocale,\n\tes: {\n\t\tsearch: \"Buscar\",\n\t\tsearchPlaceholder: \"Buscar...\",\n\t\tnoData: \"No hay datos\",\n\t\tloading: \"Cargando...\",\n\t\tpage: \"Página\",\n\t\tof: \"de\",\n\t\titems: \"elementos\",\n\t\tselected: \"seleccionados\",\n\t\trowsPerPage: \"Filas por página\",\n\t\tactions: \"Acciones\",\n\t\tsortAsc: \"Ordenar ascendente\",\n\t\tsortDesc: \"Ordenar descendente\",\n\t\tfilterBy: \"Filtrar por\",\n\t\tclearFilters: \"Limpiar filtros\",\n\t\tdateFrom: \"Desde\",\n\t\tdateTo: \"Hasta\",\n\t\tselectAll: \"Seleccionar todo\",\n\t\tdeselectAll: \"Deseleccionar todo\",\n\t\tmoreActions: \"Más acciones\",\n\t\tclearSearch: \"Limpiar búsqueda\",\n\t\tcloseModal: \"Cerrar\",\n\t\tpreviousPage: \"Página anterior\",\n\t\tnextPage: \"Página siguiente\",\n\t\tjumpToPage: \"Ir a página\",\n\t\tdetails: \"Detalles\",\n\t\tcolumns: \"Columnas\",\n\t\tshowAllColumns: \"Mostrar todas\",\n\t\thideColumn: \"Ocultar columna\",\n\t\tsortPriority: \"Prioridad de orden\",\n\t\tclearSort: \"Quitar orden\",\n\t} satisfies Required<TableLocale>,\n\tpt: {\n\t\tsearch: \"Pesquisar\",\n\t\tsearchPlaceholder: \"Pesquisar...\",\n\t\tnoData: \"Sem dados\",\n\t\tloading: \"Carregando...\",\n\t\tpage: \"Página\",\n\t\tof: \"de\",\n\t\titems: \"itens\",\n\t\tselected: \"selecionados\",\n\t\trowsPerPage: \"Linhas por página\",\n\t\tactions: \"Ações\",\n\t\tsortAsc: \"Ordenar ascendente\",\n\t\tsortDesc: \"Ordenar descendente\",\n\t\tfilterBy: \"Filtrar por\",\n\t\tclearFilters: \"Limpar filtros\",\n\t\tdateFrom: \"De\",\n\t\tdateTo: \"Até\",\n\t\tselectAll: \"Selecionar tudo\",\n\t\tdeselectAll: \"Desselecionar tudo\",\n\t\tmoreActions: \"Mais ações\",\n\t\tclearSearch: \"Limpar pesquisa\",\n\t\tcloseModal: \"Fechar\",\n\t\tpreviousPage: \"Página anterior\",\n\t\tnextPage: \"Próxima página\",\n\t\tjumpToPage: \"Ir para página\",\n\t\tdetails: \"Detalhes\",\n\t\tcolumns: \"Colunas\",\n\t\tshowAllColumns: \"Mostrar todas\",\n\t\thideColumn: \"Ocultar coluna\",\n\t\tsortPriority: \"Prioridade de ordem\",\n\t\tclearSort: \"Remover ordem\",\n\t} satisfies Required<TableLocale>,\n} as const;\n\n/** Claves de locales predefinidos */\nexport type LocaleKey = keyof typeof locales;\n\n/**\n * Props principales del componente BetterTable\n */\nexport interface BetterTableProps<T extends TableData = TableData> {\n\t// === Datos ===\n\t/** Array de datos a mostrar */\n\tdata: T[];\n\t/** Configuración de columnas */\n\tcolumns: Column<T>[];\n\t/** Key único para identificar filas (default: 'id') */\n\trowKey?: keyof T | ((row: T, index: number) => string);\n\n\t// === Acciones ===\n\t/** Acciones por fila */\n\trowActions?: RowAction<T>[];\n\t/** Acciones globales (toolbar) */\n\tglobalActions?: GlobalAction<T>[];\n\t/** Máximo de acciones visibles inline antes de agrupar en menú overflow (default: 3) */\n\tmaxVisibleActions?: number;\n\n\t// === Paginación ===\n\t/** Configuración de paginación (false para desactivar) */\n\tpagination?: PaginationConfig | false;\n\t/** Callback de cambio de página */\n\tonPageChange?: (page: number, pageSize: number) => void;\n\n\t// === Ordenamiento ===\n\t/** Estado de ordenamiento (controlado) */\n\tsort?: SortState;\n\t/** Callback de cambio de ordenamiento */\n\tonSortChange?: (sort: SortState) => void;\n\t/** Habilitar multi-sort (cada columna cicla: sin orden → asc → desc → sin orden, default: false) */\n\tmultiSort?: boolean;\n\t/** Estado de multi-sort (controlado) */\n\tmultiSortState?: MultiSortState;\n\t/** Callback de cambio de multi-sort */\n\tonMultiSortChange?: (sorts: MultiSortState) => void;\n\n\t// === Filtrado ===\n\t/** Modo de visualización de filtros: 'floating' (en header), 'panel' (colapsable), o 'both' (default: 'floating') */\n\tfilterMode?: \"floating\" | \"panel\" | \"both\";\n\t/** Estado de filtros (controlado) */\n\tfilters?: FilterState;\n\t/** Callback de cambio de filtros */\n\tonFilterChange?: (filters: FilterState) => void;\n\n\t// === Búsqueda Global ===\n\t/** Mostrar barra de búsqueda */\n\tsearchable?: boolean;\n\t/** Valor de búsqueda (controlado) */\n\tsearchValue?: string;\n\t/** Callback de cambio de búsqueda */\n\tonSearchChange?: (value: string) => void;\n\t/** Columnas en las que buscar (default: todas) */\n\tsearchColumns?: string[];\n\t/** Milisegundos de debounce en la búsqueda (default: 300) */\n\tsearchDebounceMs?: number;\n\n\t// === Selección ===\n\t/** Habilitar selección de filas */\n\tselectable?: boolean;\n\t/** Filas seleccionadas (controlado) */\n\tselectedRows?: T[];\n\t/** Callback de cambio de selección */\n\tonSelectionChange?: (selectedRows: T[]) => void;\n\t/** Modo de selección */\n\tselectionMode?: \"single\" | \"multiple\";\n\n\t// === Column Visibility ===\n\t/** Mostrar toggle de visibilidad de columnas en el toolbar */\n\tcolumnVisibility?: boolean;\n\t/** Estado controlado de columnas ocultas (array de column IDs) */\n\thiddenColumns?: string[];\n\t/** Callback cuando cambia la visibilidad de columnas */\n\tonColumnVisibilityChange?: (hiddenColumns: string[]) => void;\n\n\t// === Estados ===\n\t/** Estado de carga */\n\tloading?: boolean;\n\t/** Componente de loading personalizado */\n\tloadingComponent?: ReactNode;\n\t/** Componente de estado vacío personalizado */\n\temptyComponent?: ReactNode;\n\n\t// === Personalización ===\n\t/** Clases CSS personalizadas */\n\tclassNames?: TableClassNames;\n\t/** Estilos inline personalizados */\n\tstyles?: {\n\t\tcontainer?: CSSProperties;\n\t\ttable?: CSSProperties;\n\t\theader?: CSSProperties;\n\t\tbody?: CSSProperties;\n\t\trow?: CSSProperties;\n\t\tcell?: CSSProperties;\n\t};\n\t/** Textos personalizados (preset: 'en' | 'es' | 'pt', o parcial para override) */\n\tlocale?: LocaleKey | TableLocale;\n\n\t// === Características ===\n\t/** Header fijo al hacer scroll */\n\tstickyHeader?: boolean;\n\t/** Altura máxima (activa scroll interno) */\n\tmaxHeight?: string | number;\n\t/** Mostrar bordes */\n\tbordered?: boolean;\n\t/** Filas con rayas alternas */\n\tstriped?: boolean;\n\t/** Hover en filas */\n\thoverable?: boolean;\n\t/** Tamaño de la tabla */\n\tsize?: \"small\" | \"medium\" | \"large\";\n\n\t// === Callbacks ===\n\t/** Callback al hacer click en una fila */\n\tonRowClick?: (row: T, rowIndex: number) => void;\n\t/** Callback al hacer doble click en una fila */\n\tonRowDoubleClick?: (row: T, rowIndex: number) => void;\n\n\t// === Accesibilidad ===\n\t/** Descripción de la tabla para screen readers */\n\tariaLabel?: string;\n\t/** ID del elemento que describe la tabla */\n\tariaDescribedBy?: string;\n}\n","import { createContext, useContext, ReactNode } from 'react';\nimport {\n TableData,\n Column,\n SortState,\n MultiSortState,\n FilterState,\n TableLocale,\n TableClassNames,\n RowAction,\n GlobalAction,\n defaultLocale,\n} from '../types';\n\nexport interface TableContextValue<T extends TableData = TableData> {\n // Data\n data: T[];\n processedData: T[];\n columns: Column<T>[];\n visibleColumns: Column<T>[];\n rowKey: keyof T | ((row: T, index: number) => string);\n\n // Actions\n rowActions?: RowAction<T>[];\n globalActions?: GlobalAction<T>[];\n maxVisibleActions: number;\n\n // Sort\n sortState: SortState;\n handleSort: (columnId: string) => void;\n multiSortState: MultiSortState;\n isMultiSort: boolean;\n clearSort: () => void;\n\n // Column Visibility\n columnVisibilityEnabled: boolean;\n hiddenColumnIds: Set<string>;\n toggleColumn: (columnId: string) => void;\n showAllColumns: () => void;\n isColumnVisible: (columnId: string) => boolean;\n\n // Filter\n filters: FilterState;\n setFilter: (columnId: string, value: string | number | boolean | import('../types').DateFilterRange | null) => void;\n clearFilter: (columnId: string) => void;\n clearFilters: () => void;\n\n // Search\n searchValue: string;\n handleSearch: (value: string) => void;\n clearSearch: () => void;\n searchable: boolean;\n\n // Selection\n selectedRows: T[];\n isSelected: (row: T, index: number) => boolean;\n toggleRow: (row: T, index: number) => void;\n selectAll: () => void;\n deselectAll: () => void;\n isAllSelected: boolean;\n isPartiallySelected: boolean;\n selectedCount: number;\n selectable: boolean;\n selectionMode: 'single' | 'multiple';\n\n // Pagination\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n goToPage: (page: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n changePageSize: (size: number) => void;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n startIndex: number;\n endIndex: number;\n paginationEnabled: boolean;\n pageSizeOptions: number[];\n showSizeChanger: boolean;\n\n // UI State\n loading: boolean;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n\n // Styling\n locale: TableLocale;\n classNames: TableClassNames;\n size: 'small' | 'medium' | 'large';\n bordered: boolean;\n striped: boolean;\n hoverable: boolean;\n stickyHeader: boolean;\n\n // Callbacks\n onRowClick?: (row: T, rowIndex: number) => void;\n onRowDoubleClick?: (row: T, rowIndex: number) => void;\n\n // Filter panel\n filterPanelOpen: boolean;\n toggleFilterPanel: () => void;\n hasFilterableColumns: boolean;\n filterMode: 'floating' | 'panel' | 'both';\n\n // Modal\n openModal: (content: ReactNode) => void;\n closeModal: () => void;\n modalContent: ReactNode | null;\n isModalOpen: boolean;\n}\n\nconst TableContext = createContext<TableContextValue | null>(null);\n\nexport function useTableContext<T extends TableData>(): TableContextValue<T> {\n const context = useContext(TableContext);\n if (!context) {\n throw new Error('useTableContext must be used within a TableProvider');\n }\n return context as TableContextValue<T>;\n}\n\ninterface TableProviderProps<T extends TableData> {\n value: TableContextValue<T>;\n children: ReactNode;\n}\n\nexport function TableProvider<T extends TableData>({\n value,\n children,\n}: TableProviderProps<T>) {\n return (\n <TableContext.Provider value={value as TableContextValue}>\n {children}\n </TableContext.Provider>\n );\n}\n\n// Default context values para evitar undefined\nexport const defaultTableContext: Partial<TableContextValue> = {\n sortState: { columnId: null, direction: 'asc' },\n multiSortState: [],\n isMultiSort: false,\n filters: {},\n searchValue: '',\n selectedRows: [],\n isAllSelected: false,\n isPartiallySelected: false,\n page: 1,\n pageSize: 10,\n totalPages: 1,\n totalItems: 0,\n hasNextPage: false,\n hasPrevPage: false,\n startIndex: 0,\n endIndex: 0,\n loading: false,\n locale: defaultLocale,\n classNames: {},\n size: 'medium',\n bordered: false,\n striped: false,\n hoverable: true,\n columnVisibilityEnabled: false,\n stickyHeader: false,\n selectable: false,\n selectionMode: 'multiple',\n searchable: false,\n paginationEnabled: true,\n pageSizeOptions: [10, 20, 50, 100],\n showSizeChanger: false,\n isModalOpen: false,\n modalContent: null,\n filterPanelOpen: false,\n hasFilterableColumns: false,\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React, { useCallback, KeyboardEvent } from 'react';\nimport { useTableContext } from '../context';\nimport { TableData, Column } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG sort icons */\nfunction SortIdleIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" opacity=\"0.4\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" opacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" opacity=\"0.2\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\ninterface TableHeaderCellProps<T extends TableData> {\n column: Column<T>;\n}\n\nfunction TableHeaderCellInner<T extends TableData>({\n column,\n}: TableHeaderCellProps<T>) {\n const {\n sortState,\n handleSort,\n locale,\n multiSortState,\n isMultiSort,\n } = useTableContext<T>();\n\n const isSorted = sortState.columnId === column.id;\n\n // For multi-sort, check if this column is in the multi-sort array\n const multiSortIndex = isMultiSort\n ? multiSortState.findIndex((s) => s.columnId === column.id)\n : -1;\n const isInMultiSort = multiSortIndex >= 0;\n const multiSortDirection = isInMultiSort\n ? multiSortState[multiSortIndex].direction\n : null;\n const showMultiSortBadge = isMultiSort && multiSortState.length > 1 && isInMultiSort;\n\n // Determine effective sort state for this column\n const effectivelySorted = isMultiSort ? isInMultiSort : isSorted;\n const effectiveDirection = isMultiSort\n ? multiSortDirection\n : isSorted\n ? sortState.direction\n : null;\n\n const handleSortClick = useCallback(() => {\n if (column.sortable !== false) {\n handleSort(column.id);\n }\n }, [column.id, column.sortable, handleSort]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && column.sortable !== false) {\n handleSort(column.id);\n }\n },\n [column.id, column.sortable, handleSort]\n );\n\n const renderSortIcon = () => {\n if (column.sortable === false || column.type === 'custom') {\n return null;\n }\n\n const Icon = effectivelySorted\n ? effectiveDirection === 'asc'\n ? SortAscIcon\n : SortDescIcon\n : SortIdleIcon;\n\n return (\n <button\n className={clsx('bt-sort-btn', effectivelySorted && 'bt-active')}\n onClick={handleSortClick}\n aria-label={\n effectiveDirection === 'asc' ? locale.sortDesc : locale.sortAsc\n }\n type=\"button\"\n >\n <Icon />\n {showMultiSortBadge && (\n <span className=\"bt-sort-priority\" aria-label={`${locale.sortPriority} ${multiSortIndex + 1}`}>\n {multiSortIndex + 1}\n </span>\n )}\n </button>\n );\n };\n\n // Custom header cell render\n if (column.headerCell) {\n return (\n <th\n className={clsx('bt-th', column.align && `bt-align-${column.align}`)}\n style={{ width: column.width }}\n >\n {column.headerCell(column)}\n </th>\n );\n }\n\n return (\n <th\n className={clsx('bt-th', column.align && `bt-align-${column.align}`, effectivelySorted && 'bt-sorted')}\n style={{ width: column.width }}\n role=\"columnheader\"\n aria-sort={\n effectivelySorted\n ? effectiveDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n tabIndex={column.sortable !== false ? 0 : undefined}\n onKeyDown={column.sortable !== false ? handleKeyDown : undefined}\n >\n <div className=\"bt-th-content\">\n <div className=\"bt-th-header\">\n <span className=\"bt-th-title\">{column.header}</span>\n {renderSortIcon()}\n </div>\n </div>\n </th>\n );\n}\n\nexport const TableHeaderCell = React.memo(\n TableHeaderCellInner\n) as typeof TableHeaderCellInner;\n","import React, { useCallback, useMemo } from 'react';\nimport { TableData, Column, DateFilterRange } from '../types';\nimport { useTableContext } from '../context';\nimport clsx from 'clsx';\n\n/**\n * Compact filter icon (funnel) used as visual cue inside floating inputs.\n * Rendered as an inline SVG so it inherits currentColor.\n */\nconst FilterIcon = () => (\n <svg\n className=\"bt-ff-icon\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M1.5 2h13L9.5 8.5V14l-3-1.5V8.5z\" />\n </svg>\n);\n\n/**\n * Floating filter row rendered inside <thead> — one input per filterable column.\n * Reads and writes to the same filterValues state as the FilterPanel.\n */\nfunction TableFloatingFilterInner<T extends TableData>() {\n const {\n visibleColumns,\n filters,\n setFilter,\n selectable,\n selectionMode,\n rowActions,\n locale,\n stickyHeader,\n } = useTableContext<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n\n // Only render if at least one column is filterable\n const hasFilterable = visibleColumns.some(\n (col) => col.filterable !== false && col.type !== 'custom'\n );\n if (!hasFilterable) return null;\n\n return (\n <tr className={clsx('bt-tr', 'bt-floating-filter-row', stickyHeader && 'bt-sticky-filter')}>\n {/* Checkbox column spacer */}\n {selectable && selectionMode === 'multiple' && (\n <th className=\"bt-th bt-floating-filter-cell bt-checkbox-cell\" />\n )}\n {selectable && selectionMode === 'single' && (\n <th className=\"bt-th bt-floating-filter-cell bt-checkbox-cell\" />\n )}\n\n {/* One filter cell per visible column */}\n {visibleColumns.map((column) => (\n <th\n key={column.id}\n className={clsx(\n 'bt-th',\n 'bt-floating-filter-cell',\n column.align && `bt-align-${column.align}`\n )}\n style={{ width: column.width }}\n >\n {column.filterable !== false && column.type !== 'custom' ? (\n <FloatingInput\n column={column}\n value={filters[column.id]}\n setFilter={setFilter}\n locale={locale}\n />\n ) : null}\n </th>\n ))}\n\n {/* Actions column spacer */}\n {hasActions && (\n <th className=\"bt-th bt-floating-filter-cell bt-actions-cell\" />\n )}\n </tr>\n );\n}\n\n/* ──────────────────────────────────────────────\n Individual floating filter input\n ────────────────────────────────────────────── */\n\ninterface FloatingInputProps<T extends TableData> {\n column: Column<T>;\n value: string | number | boolean | DateFilterRange | null | undefined;\n setFilter: (\n columnId: string,\n value: string | number | boolean | DateFilterRange | null\n ) => void;\n locale: ReturnType<typeof useTableContext>['locale'];\n}\n\nfunction FloatingInputInner<T extends TableData>({\n column,\n value,\n setFilter,\n locale,\n}: FloatingInputProps<T>) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const v = e.target.value;\n if (column.type === 'boolean') {\n if (v === '') {\n setFilter(column.id, null);\n } else {\n setFilter(column.id, v === 'true');\n }\n } else {\n setFilter(column.id, v || null);\n }\n },\n [column.id, column.type, setFilter]\n );\n\n const handleDateChange = useCallback(\n (field: 'from' | 'to', v: string) => {\n const current = (value as DateFilterRange) ?? {};\n const newRange: DateFilterRange = { ...current, [field]: v || undefined };\n setFilter(column.id, newRange);\n },\n [column.id, value, setFilter]\n );\n\n const fieldId = `bt-ff-${column.id}`;\n\n /** Whether this filter has an active (non-empty) value */\n const isActive = useMemo(() => {\n if (value === null || value === undefined) return false;\n if (typeof value === 'object') {\n const dr = value as DateFilterRange;\n return !!(dr.from || dr.to);\n }\n return value !== '';\n }, [value]);\n\n if (column.type === 'boolean') {\n return (\n <div className={clsx('bt-ff-wrapper', isActive && 'bt-ff-active')}>\n <FilterIcon />\n <select\n id={fieldId}\n name={fieldId}\n className=\"bt-floating-filter-select\"\n value={value === null || value === undefined ? '' : String(value)}\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n >\n <option value=\"\">—</option>\n <option value=\"true\">✅</option>\n <option value=\"false\">❌</option>\n </select>\n </div>\n );\n }\n\n if (column.type === 'date') {\n const dateRange = (value as DateFilterRange) ?? {};\n return (\n <div className={clsx('bt-floating-filter-dates', isActive && 'bt-ff-active')}>\n <input\n id={`${fieldId}-from`}\n name={`${fieldId}-from`}\n type=\"date\"\n className=\"bt-floating-filter-input\"\n value={dateRange.from ?? ''}\n onChange={(e) => handleDateChange('from', e.target.value)}\n aria-label={`${locale.dateFrom} ${column.header}`}\n title={locale.dateFrom}\n />\n <span className=\"bt-ff-date-sep\">–</span>\n <input\n id={`${fieldId}-to`}\n name={`${fieldId}-to`}\n type=\"date\"\n className=\"bt-floating-filter-input\"\n value={dateRange.to ?? ''}\n onChange={(e) => handleDateChange('to', e.target.value)}\n aria-label={`${locale.dateTo} ${column.header}`}\n title={locale.dateTo}\n />\n </div>\n );\n }\n\n return (\n <div className={clsx('bt-ff-wrapper', isActive && 'bt-ff-active')}>\n <FilterIcon />\n <input\n id={fieldId}\n name={fieldId}\n type={column.type === 'number' ? 'number' : 'text'}\n className=\"bt-floating-filter-input\"\n placeholder=\"...\"\n value={value !== null && value !== undefined ? String(value) : ''}\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n />\n </div>\n );\n}\n\nconst FloatingInput = React.memo(FloatingInputInner) as typeof FloatingInputInner;\n\nexport const TableFloatingFilter = React.memo(\n TableFloatingFilterInner\n) as unknown as typeof TableFloatingFilterInner;\n","\nimport { useTableContext } from '../context';\nimport { TableData } from '../types';\nimport { TableHeaderCell } from './TableHeaderCell';\nimport { TableFloatingFilter } from './TableFloatingFilter';\nimport clsx from 'clsx';\n\nfunction TableHeaderInner<T extends TableData>() {\n const {\n visibleColumns,\n selectable,\n selectionMode,\n rowActions,\n isAllSelected,\n isPartiallySelected,\n selectAll,\n deselectAll,\n locale,\n stickyHeader,\n filterMode,\n } = useTableContext<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n\n const showFloatingFilter = filterMode === 'floating' || filterMode === 'both';\n\n const handleSelectAllChange = () => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n };\n\n return (\n <thead className={clsx('bt-thead', stickyHeader && 'bt-sticky')}>\n <tr className=\"bt-tr\">\n {selectable && (\n <th className=\"bt-th bt-checkbox-cell\">\n {selectionMode === 'multiple' && (\n <input\n id=\"bt-select-all\"\n name=\"bt-select-all\"\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={isAllSelected}\n ref={(el) => {\n if (el) {\n el.indeterminate = isPartiallySelected;\n }\n }}\n onChange={handleSelectAllChange}\n aria-label={isAllSelected ? locale.deselectAll : locale.selectAll}\n />\n )}\n </th>\n )}\n {visibleColumns.map((column) => (\n <TableHeaderCell key={column.id} column={column} />\n ))}\n {hasActions && (\n <th className=\"bt-th bt-actions-cell\">{locale.actions}</th>\n )}\n </tr>\n {showFloatingFilter && <TableFloatingFilter />}\n </thead>\n );\n}\n\nexport const TableHeader = TableHeaderInner;\n","/**\n * Accede a propiedades anidadas de un objeto usando dot notation\n * @param obj - Objeto del cual extraer el valor\n * @param path - Ruta al valor (e.g., 'user.profile.name')\n * @returns El valor encontrado o undefined\n */\nexport function getValueFromPath<T = unknown>(\n\tobj: Record<string, unknown>,\n\tpath: string,\n): T | undefined {\n\tif (!obj || !path) return undefined;\n\n\tconst keys = path.split(\".\");\n\tlet result: unknown = obj;\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeof result === \"object\") {\n\t\t\tresult = (result as Record<string, unknown>)[key];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn result as T;\n}\n","import { TableData, MultiSortState } from \"../types\";\nimport { getValueFromPath } from \"./getValueFromPath\";\n\n/**\n * Compara dos valores de una columna\n */\nfunction compareValues(\n\tvalueA: unknown,\n\tvalueB: unknown,\n\tdirection: \"asc\" | \"desc\",\n): number {\n\t// Manejar valores nulos/undefined\n\tif (valueA === null || valueA === undefined) {\n\t\treturn direction === \"asc\" ? 1 : -1;\n\t}\n\tif (valueB === null || valueB === undefined) {\n\t\treturn direction === \"asc\" ? -1 : 1;\n\t}\n\n\t// Comparar según tipo\n\tif (typeof valueA === \"string\" && typeof valueB === \"string\") {\n\t\tconst comparison = valueA.localeCompare(valueB, undefined, {\n\t\t\tsensitivity: \"base\",\n\t\t\tnumeric: true,\n\t\t});\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\tif (typeof valueA === \"number\" && typeof valueB === \"number\") {\n\t\treturn direction === \"asc\" ? valueA - valueB : valueB - valueA;\n\t}\n\n\tif (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n\t\tconst comparison = valueA === valueB ? 0 : valueA ? -1 : 1;\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\tif (valueA instanceof Date && valueB instanceof Date) {\n\t\tconst comparison = valueA.getTime() - valueB.getTime();\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\t// Fallback: convertir a string y comparar\n\tconst strA = String(valueA);\n\tconst strB = String(valueB);\n\tconst comparison = strA.localeCompare(strB);\n\treturn direction === \"asc\" ? comparison : -comparison;\n}\n\n/**\n * Ordena un array de datos por una columna específica\n * @param data - Array de datos a ordenar\n * @param columnId - ID/accessor de la columna\n * @param direction - Dirección del ordenamiento\n * @returns Array ordenado (nueva referencia)\n */\nexport function sortData<T extends TableData>(\n\tdata: T[],\n\tcolumnId: string,\n\tdirection: \"asc\" | \"desc\",\n): T[] {\n\treturn [...data].sort((a, b) => {\n\t\tconst valueA = getValueFromPath(a as Record<string, unknown>, columnId);\n\t\tconst valueB = getValueFromPath(b as Record<string, unknown>, columnId);\n\t\treturn compareValues(valueA, valueB, direction);\n\t});\n}\n\n/**\n * Ordena un array de datos por múltiples columnas (multi-sort)\n * @param data - Array de datos a ordenar\n * @param sorts - Array de estados de sort en orden de prioridad\n * @returns Array ordenado (nueva referencia)\n */\nexport function multiSortData<T extends TableData>(\n\tdata: T[],\n\tsorts: MultiSortState,\n): T[] {\n\tconst activeSorts = sorts.filter((s) => s.columnId !== null);\n\tif (activeSorts.length === 0) return data;\n\n\treturn [...data].sort((a, b) => {\n\t\tfor (const sort of activeSorts) {\n\t\t\tconst valueA = getValueFromPath(\n\t\t\t\ta as Record<string, unknown>,\n\t\t\t\tsort.columnId!,\n\t\t\t);\n\t\t\tconst valueB = getValueFromPath(\n\t\t\t\tb as Record<string, unknown>,\n\t\t\t\tsort.columnId!,\n\t\t\t);\n\t\t\tconst result = compareValues(valueA, valueB, sort.direction);\n\t\t\tif (result !== 0) return result;\n\t\t}\n\t\treturn 0;\n\t});\n}\n","import { TableData, Column, FilterState, DateFilterRange } from \"../types\";\nimport { getValueFromPath } from \"./getValueFromPath\";\n\n/**\n * Normaliza un valor a Date para comparación\n */\nfunction toDate(value: unknown): Date | null {\n\tif (value instanceof Date) return value;\n\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\tconst d = new Date(value);\n\t\treturn isNaN(d.getTime()) ? null : d;\n\t}\n\treturn null;\n}\n\n/**\n * Filtra un array de datos basado en múltiples filtros de columna\n * @param data - Array de datos a filtrar\n * @param filters - Estado de filtros por columna\n * @param columns - Configuración de columnas\n * @returns Array filtrado (nueva referencia)\n */\nexport function filterData<T extends TableData>(\n\tdata: T[],\n\tfilters: FilterState,\n\tcolumns: Column<T>[],\n): T[] {\n\tconst activeFilters = Object.entries(filters).filter(\n\t\t([, value]) => value !== null && value !== undefined && value !== \"\",\n\t);\n\n\tif (activeFilters.length === 0) {\n\t\treturn data;\n\t}\n\n\treturn data.filter((row) => {\n\t\treturn activeFilters.every(([columnId, filterValue]) => {\n\t\t\tconst column = columns.find((col) => col.id === columnId);\n\t\t\tif (!column) return true;\n\n\t\t\tconst cellValue = getValueFromPath(\n\t\t\t\trow as Record<string, unknown>,\n\t\t\t\tString(column.accessor),\n\t\t\t);\n\n\t\t\tif (cellValue === null || cellValue === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst columnType = column.type ?? \"string\";\n\n\t\t\tswitch (columnType) {\n\t\t\t\tcase \"boolean\":\n\t\t\t\t\treturn cellValue === filterValue;\n\n\t\t\t\tcase \"number\":\n\t\t\t\t\treturn String(cellValue) === String(filterValue);\n\n\t\t\t\tcase \"date\": {\n\t\t\t\t\tconst cellDate = toDate(cellValue);\n\t\t\t\t\tif (!cellDate) return false;\n\n\t\t\t\t\t// Date range filter { from?, to? }\n\t\t\t\t\tif (\n\t\t\t\t\t\tfilterValue &&\n\t\t\t\t\t\ttypeof filterValue === \"object\" &&\n\t\t\t\t\t\t(\"from\" in filterValue || \"to\" in filterValue)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst range = filterValue as DateFilterRange;\n\t\t\t\t\t\tif (range.from) {\n\t\t\t\t\t\t\tconst fromDate = toDate(range.from);\n\t\t\t\t\t\t\tif (fromDate && cellDate < fromDate) return false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (range.to) {\n\t\t\t\t\t\t\tconst toDateVal = toDate(range.to);\n\t\t\t\t\t\t\tif (toDateVal) {\n\t\t\t\t\t\t\t\t// Include the entire \"to\" day\n\t\t\t\t\t\t\t\tconst endOfDay = new Date(toDateVal);\n\t\t\t\t\t\t\t\tendOfDay.setHours(23, 59, 59, 999);\n\t\t\t\t\t\t\t\tif (cellDate > endOfDay) return false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Legacy: single date value comparison\n\t\t\t\t\tconst filterDate = toDate(filterValue);\n\t\t\t\t\tif (filterDate) {\n\t\t\t\t\t\treturn cellDate.toDateString() === filterDate.toDateString();\n\t\t\t\t\t}\n\t\t\t\t\treturn String(cellValue).includes(String(filterValue));\n\t\t\t\t}\n\n\t\t\t\tcase \"string\":\n\t\t\t\tdefault:\n\t\t\t\t\treturn String(cellValue)\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(String(filterValue).toLowerCase());\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Realiza una búsqueda global en los datos\n * @param data - Array de datos\n * @param searchValue - Valor a buscar\n * @param columns - Columnas en las que buscar\n * @param searchColumnIds - IDs de columnas específicas (opcional)\n * @returns Array filtrado\n */\nexport function searchData<T extends TableData>(\n\tdata: T[],\n\tsearchValue: string,\n\tcolumns: Column<T>[],\n\tsearchColumnIds?: string[],\n): T[] {\n\tif (!searchValue.trim()) {\n\t\treturn data;\n\t}\n\n\tconst searchLower = searchValue.toLowerCase().trim();\n\tconst columnsToSearch = searchColumnIds\n\t\t? columns.filter(\n\t\t\t\t(col) =>\n\t\t\t\t\tsearchColumnIds.includes(col.id) ||\n\t\t\t\t\tsearchColumnIds.includes(String(col.accessor)),\n\t\t\t)\n\t\t: columns.filter((col) => col.type !== \"custom\");\n\n\treturn data.filter((row) =>\n\t\tcolumnsToSearch.some((col) => {\n\t\t\tconst value = getValueFromPath(\n\t\t\t\trow as Record<string, unknown>,\n\t\t\t\tString(col.accessor),\n\t\t\t);\n\t\t\tif (value === null || value === undefined) return false;\n\t\t\treturn String(value).toLowerCase().includes(searchLower);\n\t\t}),\n\t);\n}\n","import React from 'react';\nimport { TableData, Column } from '../types';\nimport { getValueFromPath } from '../utils';\nimport clsx from 'clsx';\n\ninterface TableCellProps<T extends TableData> {\n row: T;\n column: Column<T>;\n rowIndex: number;\n}\n\nfunction TableCellInner<T extends TableData>({\n row,\n column,\n rowIndex,\n}: TableCellProps<T>) {\n const value = getValueFromPath(\n row as Record<string, unknown>,\n String(column.accessor)\n );\n\n const renderCellContent = () => {\n // Custom cell renderer\n if (column.cell) {\n return column.cell(value, row, rowIndex);\n }\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return <span className=\"bt-cell-empty\">—</span>;\n }\n\n // Type-based rendering\n switch (column.type) {\n case 'boolean':\n return value ? '✅' : '❌';\n\n case 'date':\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n // Try to parse string dates\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n\n case 'number':\n return typeof value === 'number' ? value.toLocaleString() : value;\n\n case 'string':\n default:\n return String(value);\n }\n };\n\n const content = renderCellContent();\n\n return (\n <td\n className={clsx('bt-td', column.align && `bt-align-${column.align}`)}\n style={{ width: column.width }}\n >\n {content as React.ReactNode}\n </td>\n );\n}\n\nexport const TableCell = React.memo(TableCellInner) as typeof TableCellInner;\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TableData, RowAction } from '../types';\nimport { useTableContext } from '../context';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface MenuPosition {\n top: number;\n left: number;\n openUp: boolean;\n}\n\ninterface TableActionOverflowProps<T extends TableData> {\n /** Actions to show in the dropdown */\n actions: RowAction<T>[];\n /** Row data */\n row: T;\n /** Row index */\n rowIndex: number;\n /** Handler for action clicks */\n onActionClick: (action: RowAction<T>) => void;\n /** Direction the menu opens */\n direction?: 'up' | 'down';\n}\n\nfunction TableActionOverflowInner<T extends TableData>({\n actions,\n row,\n rowIndex: _rowIndex,\n onActionClick,\n direction = 'down',\n}: TableActionOverflowProps<T>) {\n const { locale } = useTableContext<T>();\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ top: 0, left: 0, openUp: false });\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const toggle = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsOpen((prev) => {\n if (!prev && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const shouldOpenUp = direction === 'up' || spaceBelow < 200;\n\n setPosition({\n top: shouldOpenUp ? rect.top : rect.bottom,\n left: rect.right,\n openUp: shouldOpenUp,\n });\n }\n return !prev;\n });\n }, [direction]);\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n menuRef.current && !menuRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n // Close on scroll (parent containers may move)\n useEffect(() => {\n if (!isOpen) return;\n\n const handleScroll = () => setIsOpen(false);\n window.addEventListener('scroll', handleScroll, true);\n return () => window.removeEventListener('scroll', handleScroll, true);\n }, [isOpen]);\n\n // Separate danger actions to place them at the end with a separator\n const normalActions = actions.filter((a) => a.variant !== 'danger');\n const dangerActions = actions.filter((a) => a.variant === 'danger');\n const sortedActions = [...normalActions, ...dangerActions];\n const hasDangerSeparator = normalActions.length > 0 && dangerActions.length > 0;\n const dangerStartIndex = normalActions.length;\n\n const menuStyle: React.CSSProperties = position.openUp\n ? { position: 'fixed', bottom: window.innerHeight - position.top, right: window.innerWidth - position.left }\n : { position: 'fixed', top: position.top, right: window.innerWidth - position.left };\n\n return (\n <div className=\"bt-overflow-container\">\n <button\n ref={triggerRef}\n className=\"bt-action-btn bt-overflow-trigger\"\n onClick={toggle}\n aria-label={locale.moreActions}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n title={locale.moreActions}\n type=\"button\"\n >\n <span className=\"bt-overflow-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" />\n </svg>\n </span>\n </button>\n\n {isOpen && createPortal(\n <div\n ref={menuRef}\n className={clsx(\n 'bt-overflow-menu',\n position.openUp && 'bt-overflow-menu-up'\n )}\n style={menuStyle}\n role=\"menu\"\n >\n {sortedActions.map((action, index) => {\n if (action.visible && !action.visible(row)) {\n return null;\n }\n\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n const showSeparator = hasDangerSeparator && index === dangerStartIndex;\n\n return (\n <React.Fragment key={action.id}>\n {showSeparator && <div className=\"bt-overflow-separator\" role=\"separator\" />}\n {action.mode === 'link' && action.href ? (\n <a\n href={\n typeof action.href === 'function'\n ? action.href(row)\n : action.href\n }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-overflow-item',\n action.variant === 'danger' && 'bt-overflow-item-danger'\n )}\n role=\"menuitem\"\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen(false);\n }}\n >\n <span className=\"bt-overflow-item-icon\">{icon}</span>\n <span className=\"bt-overflow-item-label\">{action.label}</span>\n </a>\n ) : (\n <button\n className={clsx(\n 'bt-overflow-item',\n action.variant === 'danger' && 'bt-overflow-item-danger'\n )}\n role=\"menuitem\"\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n onActionClick(action);\n setIsOpen(false);\n }}\n type=\"button\"\n >\n <span className=\"bt-overflow-item-icon\">{icon}</span>\n <span className=\"bt-overflow-item-label\">{action.label}</span>\n </button>\n )}\n </React.Fragment>\n );\n })}\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nexport const TableActionOverflow = React.memo(\n TableActionOverflowInner\n) as typeof TableActionOverflowInner;\n","import React, { useCallback, useMemo } from 'react';\nimport { useTableContext } from '../context';\nimport { TableData, RowAction } from '../types';\nimport { TableActionOverflow } from './TableActionOverflow';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface TableActionsProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableActionsInner<T extends TableData>({\n row,\n rowIndex,\n}: TableActionsProps<T>) {\n const { rowActions, openModal, closeModal, maxVisibleActions } = useTableContext<T>();\n\n const handleActionClick = useCallback(\n (action: RowAction<T>) => {\n if (action.mode === 'callback' && action.onClick) {\n action.onClick(row, rowIndex);\n } else if (action.mode === 'modal' && action.modalContent) {\n const ModalContent = action.modalContent;\n openModal(\n <ModalContent\n data={row}\n onClose={closeModal}\n />\n );\n } else if (action.mode === 'link' && action.href) {\n const url = typeof action.href === 'function' ? action.href(row) : action.href;\n window.open(url, '_blank');\n }\n },\n [row, rowIndex, openModal, closeModal]\n );\n\n // Split visible actions into inline vs overflow\n const { inlineActions, overflowActions } = useMemo(() => {\n if (!rowActions) return { inlineActions: [], overflowActions: [] };\n\n const visible = rowActions.filter(\n (a) => !a.visible || a.visible(row)\n );\n\n if (visible.length <= maxVisibleActions) {\n return { inlineActions: visible, overflowActions: [] };\n }\n\n // Reserve one slot for the ⋯ trigger\n const inlineSlots = maxVisibleActions - 1;\n return {\n inlineActions: visible.slice(0, inlineSlots),\n overflowActions: visible.slice(inlineSlots),\n };\n }, [rowActions, maxVisibleActions, row]);\n\n if (!rowActions || rowActions.length === 0) {\n return null;\n }\n\n return (\n <td className=\"bt-td bt-actions-cell\">\n <div className=\"bt-actions-wrapper\">\n {inlineActions.map((action) => {\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n\n // Render as link if mode is 'link'\n if (action.mode === 'link' && action.href) {\n const url =\n typeof action.href === 'function' ? action.href(row) : action.href;\n return (\n <a\n key={action.id}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n aria-label={action.label}\n title={action.label}\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </a>\n );\n }\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n onClick={() => handleActionClick(action)}\n disabled={isDisabled}\n aria-label={action.label}\n title={action.label}\n type=\"button\"\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </button>\n );\n })}\n\n {overflowActions.length > 0 && (\n <TableActionOverflow\n actions={overflowActions}\n row={row}\n rowIndex={rowIndex}\n onActionClick={handleActionClick}\n direction=\"down\"\n />\n )}\n </div>\n </td>\n );\n}\n\nexport const TableActions = React.memo(\n TableActionsInner\n) as typeof TableActionsInner;\n","import React, { useCallback, KeyboardEvent } from 'react';\nimport { useTableContext } from '../context';\nimport { TableData } from '../types';\nimport { TableCell } from './TableCell';\nimport { TableActions } from './TableActions';\nimport clsx from 'clsx';\n\ninterface TableRowProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableRowInner<T extends TableData>({ row, rowIndex }: TableRowProps<T>) {\n const {\n visibleColumns,\n selectable,\n rowActions,\n isSelected,\n toggleRow,\n striped,\n hoverable,\n onRowClick,\n onRowDoubleClick,\n } = useTableContext<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n const selected = selectable && isSelected(row, rowIndex);\n const isClickable = Boolean(onRowClick);\n\n const handleRowClick = useCallback(() => {\n onRowClick?.(row, rowIndex);\n }, [row, rowIndex, onRowClick]);\n\n const handleRowDoubleClick = useCallback(() => {\n onRowDoubleClick?.(row, rowIndex);\n }, [row, rowIndex, onRowDoubleClick]);\n\n const handleCheckboxChange = useCallback(() => {\n toggleRow(row, rowIndex);\n }, [row, rowIndex, toggleRow]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && onRowClick) {\n handleRowClick();\n }\n },\n [handleRowClick, onRowClick]\n );\n\n return (\n <tr\n className={clsx(\n 'bt-tr',\n striped && 'bt-striped',\n hoverable && 'bt-hoverable',\n selected && 'bt-selected',\n isClickable && 'bt-clickable'\n )}\n onClick={isClickable ? handleRowClick : undefined}\n onDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n onKeyDown={isClickable ? handleKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n role={isClickable ? 'button' : undefined}\n aria-selected={selectable ? selected : undefined}\n >\n {selectable && (\n <td className=\"bt-td bt-checkbox-cell\">\n <input\n id={`bt-row-select-${rowIndex}`}\n name={`bt-row-select-${rowIndex}`}\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={selected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select row ${rowIndex + 1}`}\n />\n </td>\n )}\n {visibleColumns.map((column) => (\n <TableCell\n key={column.id}\n row={row}\n column={column}\n rowIndex={rowIndex}\n />\n ))}\n {hasActions && <TableActions row={row} rowIndex={rowIndex} />}\n </tr>\n );\n}\n\nexport const TableRow = React.memo(TableRowInner) as typeof TableRowInner;\n","import { useTableContext } from '../context';\nimport { TableData } from '../types';\nimport { TableRow } from './TableRow';\n\nfunction TableBodyInner<T extends TableData>() {\n const { processedData, rowKey } = useTableContext<T>();\n\n const getRowKey = (row: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(row, index);\n }\n const keyValue = row[rowKey];\n return keyValue !== undefined ? String(keyValue) : String(index);\n };\n\n return (\n <tbody className=\"bt-tbody\">\n {processedData.map((row, index) => (\n <TableRow key={getRowKey(row, index)} row={row} rowIndex={index} />\n ))}\n </tbody>\n );\n}\n\n// Export without memo to preserve generic type parameter\nexport const TableBody = TableBodyInner;\n","import React, { useCallback, useMemo, KeyboardEvent, ReactNode } from 'react';\nimport { useTableContext } from '../context';\nimport { TableData, RowAction } from '../types';\nimport { getValueFromPath } from '../utils';\nimport { TableActionOverflow } from './TableActionOverflow';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface TableCardProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableCardInner<T extends TableData>({ row, rowIndex }: TableCardProps<T>) {\n const {\n visibleColumns,\n selectable,\n rowActions,\n maxVisibleActions,\n isSelected,\n toggleRow,\n hoverable,\n onRowClick,\n openModal,\n closeModal,\n } = useTableContext<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n const selected = selectable && isSelected(row, rowIndex);\n\n // Primera columna como título\n const titleColumn = visibleColumns[0];\n const otherColumns = visibleColumns.slice(1);\n\n // Split visible actions into inline vs overflow\n const { inlineActions, overflowActions } = useMemo(() => {\n if (!rowActions) return { inlineActions: [], overflowActions: [] };\n\n const visible = rowActions.filter(\n (a) => !a.visible || a.visible(row)\n );\n\n if (visible.length <= maxVisibleActions) {\n return { inlineActions: visible, overflowActions: [] };\n }\n\n const inlineSlots = maxVisibleActions - 1;\n return {\n inlineActions: visible.slice(0, inlineSlots),\n overflowActions: visible.slice(inlineSlots),\n };\n }, [rowActions, maxVisibleActions, row]);\n\n const handleCheckboxChange = useCallback(() => {\n toggleRow(row, rowIndex);\n }, [row, rowIndex, toggleRow]);\n\n const handleCardClick = useCallback(() => {\n onRowClick?.(row, rowIndex);\n }, [row, rowIndex, onRowClick]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && onRowClick) {\n handleCardClick();\n }\n },\n [handleCardClick, onRowClick]\n );\n\n const handleActionClick = useCallback(\n (action: RowAction<T>) => {\n if (action.mode === 'callback' && action.onClick) {\n action.onClick(row, rowIndex);\n } else if (action.mode === 'modal' && action.modalContent) {\n const ModalContent = action.modalContent;\n openModal(<ModalContent data={row} onClose={closeModal} />);\n } else if (action.mode === 'link' && action.href) {\n const url = typeof action.href === 'function' ? action.href(row) : action.href;\n window.open(url, '_blank');\n }\n },\n [row, rowIndex, openModal, closeModal]\n );\n\n // Renderizar valor de celda\n const renderCellValue = (column: typeof visibleColumns[0], value: unknown): ReactNode => {\n if (column.cell) {\n return column.cell(value, row, rowIndex) as ReactNode;\n }\n\n if (value === null || value === undefined) {\n return <span className=\"bt-card-value-empty\">—</span>;\n }\n\n switch (column.type) {\n case 'boolean':\n return value ? '✅' : '❌';\n case 'date':\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n case 'number':\n return typeof value === 'number' ? value.toLocaleString() : String(value);\n default:\n return String(value);\n }\n };\n\n const titleValue = titleColumn\n ? getValueFromPath(row as Record<string, unknown>, String(titleColumn.accessor))\n : '';\n\n return (\n <div\n className={clsx(\n 'bt-card',\n hoverable && 'bt-hoverable',\n selected && 'bt-selected',\n onRowClick && 'bt-clickable'\n )}\n onClick={onRowClick ? handleCardClick : undefined}\n onKeyDown={onRowClick ? handleKeyDown : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n role={onRowClick ? 'button' : undefined}\n aria-selected={selectable ? selected : undefined}\n >\n {/* Header con checkbox y título */}\n <div className=\"bt-card-header\">\n {selectable && (\n <input\n id={`bt-card-select-${rowIndex}`}\n name={`bt-card-select-${rowIndex}`}\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={selected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select row ${rowIndex + 1}`}\n />\n )}\n <span className=\"bt-card-title\">\n {titleColumn \n ? (renderCellValue(titleColumn, titleValue) as React.ReactNode)\n : `Item ${rowIndex + 1}`}\n </span>\n </div>\n\n {/* Otras columnas */}\n {otherColumns.map((column) => {\n const value = getValueFromPath(\n row as Record<string, unknown>,\n String(column.accessor)\n );\n const cellContent = renderCellValue(column, value);\n\n return (\n <div key={column.id} className=\"bt-card-row\">\n <span className=\"bt-card-label\">{column.header}</span>\n <span className=\"bt-card-value\">{cellContent as React.ReactNode}</span>\n </div>\n );\n })}\n\n {/* Acciones */}\n {hasActions && (\n <div className=\"bt-card-actions\">\n {inlineActions.map((action) => {\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n\n if (action.mode === 'link' && action.href) {\n const url =\n typeof action.href === 'function' ? action.href(row) : action.href;\n return (\n <a\n key={action.id}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n aria-label={action.label}\n title={action.label}\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </a>\n );\n }\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleActionClick(action);\n }}\n disabled={isDisabled}\n aria-label={action.label}\n title={action.label}\n type=\"button\"\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </button>\n );\n })}\n\n {overflowActions.length > 0 && (\n <TableActionOverflow\n actions={overflowActions}\n row={row}\n rowIndex={rowIndex}\n onActionClick={handleActionClick}\n direction=\"up\"\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const TableCard = React.memo(TableCardInner) as typeof TableCardInner;\n","import { useTableContext } from '../context';\nimport { TableData } from '../types';\nimport { TableCard } from './TableCard';\n\nfunction TableCardsInner<T extends TableData>() {\n const { processedData, rowKey } = useTableContext<T>();\n\n const getRowKey = (row: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(row, index);\n }\n const keyValue = row[rowKey];\n return keyValue !== undefined ? String(keyValue) : String(index);\n };\n\n return (\n <div className=\"bt-cards\">\n {processedData.map((row, index) => (\n <TableCard key={getRowKey(row, index)} row={row} rowIndex={index} />\n ))}\n </div>\n );\n}\n\nexport const TableCards = TableCardsInner;\n","import React, { useCallback } from 'react';\nimport { TableData, Column, DateFilterRange } from '../types';\nimport { useTableContext } from '../context';\nimport clsx from 'clsx';\n\n/* Inline SVG funnel icon — matches floating filter pattern */\nfunction PanelFilterIcon() {\n return (\n <svg className=\"bt-fp-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1.5 2H10.5L7 5.87V9.5L5 8.5V5.87L1.5 2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\ninterface TableFilterPanelProps {\n open: boolean;\n}\n\nfunction TableFilterPanelInner<T extends TableData>({\n open,\n}: TableFilterPanelProps) {\n const { columns, filters, setFilter, clearFilter, clearFilters, locale } =\n useTableContext<T>();\n\n const filterableColumns = columns.filter(\n (col) => col.filterable !== false && col.type !== 'custom' && !col.hidden\n );\n\n if (!open || filterableColumns.length === 0) {\n return null;\n }\n\n const activeFilterCount = Object.keys(filters).length;\n\n return (\n <div className=\"bt-filter-panel\" role=\"region\" aria-label={locale.filterBy}>\n <div className=\"bt-filter-panel-grid\">\n {filterableColumns.map((column) => (\n <FilterField\n key={column.id}\n column={column}\n value={filters[column.id]}\n setFilter={setFilter}\n clearFilter={clearFilter}\n locale={locale}\n />\n ))}\n </div>\n\n {activeFilterCount > 0 && (\n <div className=\"bt-filter-panel-footer\">\n <button\n className=\"bt-filter-panel-clear\"\n onClick={clearFilters}\n type=\"button\"\n >\n {locale.clearFilters}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ──────────────────────────────────────────────\n Individual filter field\n ────────────────────────────────────────────── */\n\ninterface FilterFieldProps<T extends TableData> {\n column: Column<T>;\n value: string | number | boolean | DateFilterRange | null | undefined;\n setFilter: (\n columnId: string,\n value: string | number | boolean | DateFilterRange | null\n ) => void;\n clearFilter: (columnId: string) => void;\n locale: ReturnType<typeof useTableContext>['locale'];\n}\n\nfunction FilterFieldInner<T extends TableData>({\n column,\n value,\n setFilter,\n locale,\n}: FilterFieldProps<T>) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const v = e.target.value;\n if (column.type === 'boolean') {\n if (v === '') {\n setFilter(column.id, null);\n } else {\n setFilter(column.id, v === 'true');\n }\n } else {\n setFilter(column.id, v || null);\n }\n },\n [column.id, column.type, setFilter]\n );\n\n const handleDateChange = useCallback(\n (field: 'from' | 'to', v: string) => {\n const current = (value as DateFilterRange) ?? {};\n const newRange: DateFilterRange = { ...current, [field]: v || undefined };\n setFilter(column.id, newRange);\n },\n [column.id, value, setFilter]\n );\n\n const hasValue =\n value !== null && value !== undefined && value !== '';\n\n // For date: check if at least one field is set\n const isDateActive =\n hasValue &&\n typeof value === 'object' &&\n ('from' in value || 'to' in value) &&\n Boolean((value as DateFilterRange).from || (value as DateFilterRange).to);\n\n const isActive = column.type === 'date' ? isDateActive : hasValue;\n\n const renderInput = () => {\n const fieldId = `bt-filter-${column.id}`;\n\n if (column.type === 'boolean') {\n return (\n <div className={clsx('bt-fp-wrapper', isActive && 'bt-fp-active')}>\n <PanelFilterIcon />\n <select\n id={fieldId}\n name={fieldId}\n className=\"bt-filter-select\"\n value={\n value === null || value === undefined ? '' : String(value)\n }\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n >\n <option value=\"\">—</option>\n <option value=\"true\">✅</option>\n <option value=\"false\">❌</option>\n </select>\n </div>\n );\n }\n\n if (column.type === 'date') {\n const dateRange = (value as DateFilterRange) ?? {};\n return (\n <div className={clsx('bt-fp-wrapper bt-filter-field-dates', isActive && 'bt-fp-active')}>\n <input\n id={`${fieldId}-from`}\n name={`${fieldId}-from`}\n type=\"date\"\n className=\"bt-filter-input\"\n value={dateRange.from ?? ''}\n onChange={(e) => handleDateChange('from', e.target.value)}\n aria-label={`${locale.dateFrom} ${column.header}`}\n placeholder={locale.dateFrom}\n />\n <span className=\"bt-filter-field-separator\">–</span>\n <input\n id={`${fieldId}-to`}\n name={`${fieldId}-to`}\n type=\"date\"\n className=\"bt-filter-input\"\n value={dateRange.to ?? ''}\n onChange={(e) => handleDateChange('to', e.target.value)}\n aria-label={`${locale.dateTo} ${column.header}`}\n placeholder={locale.dateTo}\n />\n </div>\n );\n }\n\n return (\n <div className={clsx('bt-fp-wrapper', isActive && 'bt-fp-active')}>\n <PanelFilterIcon />\n <input\n id={fieldId}\n name={fieldId}\n type={column.type === 'number' ? 'number' : 'text'}\n className=\"bt-filter-input\"\n placeholder=\"...\"\n value={\n value !== null && value !== undefined ? String(value) : ''\n }\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n />\n </div>\n );\n };\n\n return (\n <div className={clsx('bt-filter-field', isActive && 'bt-filter-field-active')}>\n <label className=\"bt-filter-field-label\" htmlFor={`bt-filter-${column.id}`}>{column.header}</label>\n {renderInput()}\n </div>\n );\n}\n\nconst FilterField = React.memo(FilterFieldInner) as typeof FilterFieldInner;\n\nexport const TableFilterPanel = React.memo(\n TableFilterPanelInner\n) as typeof TableFilterPanelInner;\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useTableContext } from '../context';\nimport { TableData } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG icons */\nfunction ColumnsIcon() {\n return (\n <svg className=\"bt-columns-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"4\" height=\"10\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <rect x=\"8.5\" y=\"2\" width=\"4\" height=\"10\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction TableColumnVisibilityInner<T extends TableData>() {\n const {\n columns,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n locale,\n columnVisibilityEnabled,\n } = useTableContext<T>();\n\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const hiddenCount = hiddenColumnIds.size;\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [open]);\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => !prev);\n }, []);\n\n if (!columnVisibilityEnabled) return null;\n\n // Only show toggleable columns (not custom type or columns that shouldn't be toggled)\n const toggleableColumns = columns.filter((col) => col.type !== 'custom');\n\n return (\n <div className=\"bt-column-visibility\" ref={containerRef}>\n <button\n ref={buttonRef}\n className={clsx('bt-column-visibility-btn', open && 'bt-column-visibility-btn-active')}\n onClick={handleToggle}\n aria-expanded={open}\n aria-haspopup=\"true\"\n aria-label={locale.columns}\n title={locale.columns}\n type=\"button\"\n >\n <ColumnsIcon />\n <span className=\"bt-column-visibility-label\">{locale.columns}</span>\n {hiddenCount > 0 && (\n <span className=\"bt-column-visibility-badge\">{hiddenCount}</span>\n )}\n </button>\n\n {open && (\n <div className=\"bt-column-visibility-dropdown\" role=\"menu\">\n <div className=\"bt-column-visibility-header\">\n <span className=\"bt-column-visibility-title\">{locale.columns}</span>\n {hiddenCount > 0 && (\n <button\n className=\"bt-column-visibility-show-all\"\n onClick={showAllColumns}\n type=\"button\"\n >\n {locale.showAllColumns}\n </button>\n )}\n </div>\n <div className=\"bt-column-visibility-list\">\n {toggleableColumns.map((column) => {\n const visible = isColumnVisible(column.id);\n return (\n <button\n key={column.id}\n className={clsx(\n 'bt-column-visibility-item',\n !visible && 'bt-column-visibility-item-hidden'\n )}\n onClick={() => toggleColumn(column.id)}\n role=\"menuitemcheckbox\"\n aria-checked={visible}\n type=\"button\"\n >\n <span className={clsx('bt-column-visibility-check', visible && 'bt-column-visibility-check-active')}>\n {visible && <CheckIcon />}\n </span>\n <span className=\"bt-column-visibility-item-label\">{column.header}</span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const TableColumnVisibility = TableColumnVisibilityInner;\n","import React, { useMemo, useCallback } from 'react';\nimport { useTableContext } from '../context';\n\n/* Inline SVG chevron icons for pagination */\nfunction ChevronLeftIcon() {\n return (\n <svg className=\"bt-pagination-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M9 3L5 7L9 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg className=\"bt-pagination-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function TablePagination() {\n const {\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n paginationEnabled,\n pageSizeOptions,\n showSizeChanger,\n locale,\n classNames,\n } = useTableContext();\n\n const handlePageSizeChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n changePageSize(Number(e.target.value));\n },\n [changePageSize]\n );\n\n const handleQuickJump = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const value = parseInt((e.target as HTMLInputElement).value, 10);\n if (!isNaN(value) && value >= 1 && value <= totalPages) {\n goToPage(value);\n }\n }\n },\n [goToPage, totalPages]\n );\n\n // Generate page numbers to show\n const pageNumbers = useMemo(() => {\n const pages: (number | 'ellipsis')[] = [];\n const maxVisiblePages = 5;\n\n if (totalPages <= maxVisiblePages) {\n // Show all pages\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n\n if (page > 3) {\n pages.push('ellipsis');\n }\n\n // Pages around current\n const start = Math.max(2, page - 1);\n const end = Math.min(totalPages - 1, page + 1);\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n if (page < totalPages - 2) {\n pages.push('ellipsis');\n }\n\n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!paginationEnabled) {\n return null;\n }\n\n return (\n <div className={`bt-pagination ${classNames.pagination || ''}`}>\n <div className=\"bt-pagination-info\">\n {totalItems > 0\n ? `${startIndex}-${endIndex} ${locale.of} ${totalItems} ${locale.items}`\n : `0 ${locale.items}`}\n </div>\n\n <div className=\"bt-pagination-controls\">\n {showSizeChanger && (\n <div className=\"bt-page-size\">\n <label className=\"bt-page-size-label\" htmlFor=\"bt-page-size\">{locale.rowsPerPage}:</label>\n <select\n id=\"bt-page-size\"\n name=\"bt-page-size\"\n className=\"bt-page-size-select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label={locale.rowsPerPage}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n\n <button\n className=\"bt-pagination-btn\"\n onClick={prevPage}\n disabled={!hasPrevPage}\n aria-label={locale.previousPage}\n type=\"button\"\n >\n <ChevronLeftIcon />\n </button>\n\n <div className=\"bt-pagination-pages\">\n {pageNumbers.map((pageNum, idx) => {\n if (pageNum === 'ellipsis') {\n return (\n <span key={`ellipsis-${idx}`} className=\"bt-pagination-ellipsis\">\n ...\n </span>\n );\n }\n return (\n <button\n key={pageNum}\n className={`bt-pagination-btn ${page === pageNum ? 'bt-active' : ''}`}\n onClick={() => goToPage(pageNum)}\n aria-label={`${locale.page} ${pageNum}`}\n aria-current={page === pageNum ? 'page' : undefined}\n type=\"button\"\n >\n {pageNum}\n </button>\n );\n })}\n </div>\n\n <button\n className=\"bt-pagination-btn\"\n onClick={nextPage}\n disabled={!hasNextPage}\n aria-label={locale.nextPage}\n type=\"button\"\n >\n <ChevronRightIcon />\n </button>\n\n <div className=\"bt-quick-jumper\">\n <label className=\"bt-quick-jumper-label\" htmlFor=\"bt-quick-jumper\">{locale.page}:</label>\n <div className=\"bt-qj-wrapper\">\n <input\n id=\"bt-quick-jumper\"\n name=\"bt-quick-jumper\"\n key={page}\n type=\"number\"\n className=\"bt-quick-jumper-input\"\n min={1}\n max={totalPages}\n defaultValue={page}\n onKeyDown={handleQuickJump}\n aria-label={locale.jumpToPage}\n />\n <span className=\"bt-qj-hint\" aria-hidden=\"true\">↵</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\n\n/**\n * Hook that tracks a CSS media query match state.\n * SSR-safe: returns `false` during server rendering and hydrates on mount.\n *\n * @param query - CSS media query string, e.g. `'(max-width: 640px)'`\n * @returns `true` when the viewport matches the query\n */\nexport function useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState<boolean>(() => {\n\t\tif (typeof window === \"undefined\") return false;\n\t\treturn window.matchMedia(query).matches;\n\t});\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst mql = window.matchMedia(query);\n\t\t// Sync in case initial state diverged (SSR hydration)\n\t\tsetMatches(mql.matches);\n\n\t\tconst handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\t\tmql.addEventListener(\"change\", handler);\n\t\treturn () => mql.removeEventListener(\"change\", handler);\n\t}, [query]);\n\n\treturn matches;\n}\n","import React, { useCallback, useState, useRef, useEffect } from 'react';\nimport { useTableContext } from '../context';\nimport { useMediaQuery } from '../hooks/useMediaQuery';\nimport { TableColumnVisibility } from './TableColumnVisibility';\nimport { TableData } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG icons */\nfunction SearchIcon() {\n return (\n <svg className=\"bt-search-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg className=\"bt-clear-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 3L9 9M9 3L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg className=\"bt-check-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg className=\"bt-filter-toggle-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1 2.5H11L7.5 6.5V10L4.5 9V6.5L1 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction TableToolbarInner<T extends TableData>() {\n const {\n searchable,\n searchValue,\n handleSearch,\n clearSearch,\n globalActions,\n selectedRows,\n selectedCount,\n deselectAll,\n data,\n locale,\n classNames,\n selectable,\n filters,\n filterPanelOpen,\n toggleFilterPanel,\n hasFilterableColumns,\n filterMode,\n columnVisibilityEnabled,\n } = useTableContext<T>();\n\n const isMobile = useMediaQuery('(max-width: 640px)');\n const [searchExpanded, setSearchExpanded] = useState(false);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const activeFilterCount = Object.keys(filters).length;\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n handleSearch(e.target.value);\n },\n [handleSearch]\n );\n\n const toggleSearch = useCallback(() => {\n setSearchExpanded((prev) => {\n if (!prev) {\n // Focus input after expanding\n setTimeout(() => searchInputRef.current?.focus(), 50);\n } else {\n // Clear search when collapsing\n if (searchValue) clearSearch();\n }\n return !prev;\n });\n }, [searchValue, clearSearch]);\n\n // Keep search expanded if there's a value\n useEffect(() => {\n if (searchValue && !searchExpanded) {\n setSearchExpanded(true);\n }\n }, [searchValue, searchExpanded]);\n\n const showFilterPanelToggle = hasFilterableColumns && (filterMode === 'panel' || filterMode === 'both');\n\n const hasToolbar =\n searchable || showFilterPanelToggle || columnVisibilityEnabled || (globalActions && globalActions.length > 0) || (selectable && selectedCount > 0);\n\n if (!hasToolbar) {\n return null;\n }\n\n // On mobile, collapse search to icon button\n const showCollapsedSearch = isMobile && searchable && !searchExpanded;\n const showExpandedSearch = searchable && (!isMobile || searchExpanded);\n\n return (\n <div className={clsx('bt-toolbar', classNames.toolbar)}>\n <div className=\"bt-toolbar-left\">\n {showCollapsedSearch && (\n <button\n className=\"bt-search-toggle\"\n onClick={toggleSearch}\n aria-label={locale.search}\n title={locale.search}\n type=\"button\"\n >\n <SearchIcon />\n </button>\n )}\n\n {showExpandedSearch && (\n <div className={clsx('bt-search', isMobile && 'bt-search-mobile')}>\n <span className=\"bt-search-icon\"><SearchIcon /></span>\n <input\n id=\"bt-search\"\n name=\"bt-search\"\n ref={searchInputRef}\n type=\"text\"\n className=\"bt-search-input\"\n placeholder={locale.searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n aria-label={locale.search}\n />\n {(searchValue || isMobile) && (\n <button\n className=\"bt-search-clear\"\n onClick={isMobile ? toggleSearch : clearSearch}\n aria-label={locale.clearSearch}\n type=\"button\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n )}\n\n {showFilterPanelToggle && (\n <button\n className={clsx(\n 'bt-filter-toggle',\n filterPanelOpen && 'bt-filter-toggle-active'\n )}\n onClick={toggleFilterPanel}\n aria-expanded={filterPanelOpen}\n aria-label={locale.filterBy}\n title={locale.filterBy}\n type=\"button\"\n >\n <span className=\"bt-filter-toggle-icon\"><FilterIcon /></span>\n {!isMobile && <span>{locale.filterBy}</span>}\n {activeFilterCount > 0 && (\n <span className=\"bt-filter-toggle-badge\">{activeFilterCount}</span>\n )}\n </button>\n )}\n\n <TableColumnVisibility />\n\n {selectable && selectedCount > 0 && (\n <div className=\"bt-selection-info\">\n <CheckIcon />\n <span className=\"bt-selection-count\">\n {selectedCount} {isMobile ? 'sel.' : locale.selected}\n </span>\n <button\n className=\"bt-selection-clear\"\n onClick={deselectAll}\n type=\"button\"\n >\n {isMobile ? <ClearIcon /> : locale.deselectAll}\n </button>\n </div>\n )}\n </div>\n\n {globalActions && globalActions.length > 0 && (\n <div className=\"bt-toolbar-right\">\n <div className=\"bt-global-actions\">\n {globalActions.map((action) => {\n const isDisabled =\n action.requiresSelection && selectedRows.length === 0;\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-global-btn',\n action.variant && `bt-variant-${action.variant}`,\n isMobile && 'bt-global-btn-mobile'\n )}\n onClick={() => action.onClick(selectedRows, data)}\n disabled={isDisabled}\n title={action.label}\n aria-label={action.label}\n type=\"button\"\n >\n {action.icon && (\n <span className=\"bt-global-icon\">{action.icon}</span>\n )}\n {!isMobile && <span>{action.label}</span>}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const TableToolbar = TableToolbarInner;\n","import { useTableContext } from '../context';\n\n/* Inline SVG empty-box illustration */\nfunction EmptyIcon() {\n return (\n <svg className=\"bt-empty-svg\" width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <rect x=\"12\" y=\"18\" width=\"40\" height=\"32\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.3\" />\n <path d=\"M12 28H52\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" />\n <path d=\"M24 38H40\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" opacity=\"0.4\" />\n <path d=\"M28 44H36\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" opacity=\"0.25\" />\n <circle cx=\"32\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" />\n </svg>\n );\n}\n\nexport function TableEmpty() {\n const { locale, emptyComponent, visibleColumns, selectable, rowActions } =\n useTableContext();\n\n const hasActions = rowActions && rowActions.length > 0;\n const colSpan = visibleColumns.length + (selectable ? 1 : 0) + (hasActions ? 1 : 0);\n\n if (emptyComponent) {\n return (\n <tbody className=\"bt-tbody\">\n <tr className=\"bt-tr\">\n <td className=\"bt-td\" colSpan={colSpan}>\n {emptyComponent}\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody className=\"bt-tbody\">\n <tr className=\"bt-tr\">\n <td className=\"bt-td\" colSpan={colSpan}>\n <div className=\"bt-empty\">\n <div className=\"bt-empty-icon\"><EmptyIcon /></div>\n <div className=\"bt-empty-text\">{locale.noData}</div>\n </div>\n </td>\n </tr>\n </tbody>\n );\n}\n","import { useTableContext } from '../context';\n\nexport function TableLoading() {\n const { locale, loadingComponent } = useTableContext();\n\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n\n return (\n <div className=\"bt-loading\">\n <div className=\"bt-loading-spinner\" aria-hidden=\"true\" />\n <span className=\"bt-loading-text\">{locale.loading}</span>\n </div>\n );\n}\n\ninterface TableLoadingOverlayProps {\n show: boolean;\n}\n\nexport function TableLoadingOverlay({ show }: TableLoadingOverlayProps) {\n const { loadingComponent, locale } = useTableContext();\n\n if (!show) return null;\n\n return (\n <div className=\"bt-loading-overlay\" role=\"status\" aria-live=\"polite\">\n {loadingComponent || (\n <>\n <div className=\"bt-loading-spinner\" aria-hidden=\"true\" />\n <span className=\"bt-loading-text\">{locale.loading}</span>\n </>\n )}\n </div>\n );\n}\n","import React, { useEffect, useCallback } from 'react';\nimport { useTableContext } from '../context';\n\n/* Inline SVG close icon */\nfunction CloseIcon() {\n return (\n <svg className=\"bt-modal-close-svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function TableModal() {\n const { isModalOpen, modalContent, closeModal, locale } = useTableContext();\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n closeModal();\n }\n },\n [closeModal]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n }\n },\n [closeModal]\n );\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.overflow = '';\n };\n }, [isModalOpen, handleKeyDown]);\n\n if (!isModalOpen || !modalContent) {\n return null;\n }\n\n return (\n <div\n className=\"bt-modal-backdrop\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div className=\"bt-modal bt-modal-md\">\n <div className=\"bt-modal-header\">\n <h2 className=\"bt-modal-title\">{locale.details}</h2>\n <button\n className=\"bt-modal-close\"\n onClick={closeModal}\n aria-label={locale.closeModal}\n type=\"button\"\n >\n <CloseIcon />\n </button>\n </div>\n <div className=\"bt-modal-body\">{modalContent}</div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { SortState, MultiSortState, TableData } from \"../types\";\nimport { sortData, multiSortData } from \"../utils/sortData\";\n\ninterface UseTableSortOptions<T extends TableData> {\n\tdata: T[];\n\tinitialSort?: SortState;\n\tcontrolledSort?: SortState;\n\tonSortChange?: (sort: SortState) => void;\n\t/** Enable multi-sort (Shift+Click) */\n\tmultiSort?: boolean;\n\t/** Controlled multi-sort state */\n\tcontrolledMultiSort?: MultiSortState;\n\t/** Callback when multi-sort changes */\n\tonMultiSortChange?: (sorts: MultiSortState) => void;\n}\n\ninterface UseTableSortReturn<T extends TableData> {\n\tsortedData: T[];\n\tsortState: SortState;\n\thandleSort: (columnId: string) => void;\n\tclearSort: () => void;\n\t/** Multi-sort state (array of sort states in priority order) */\n\tmultiSortState: MultiSortState;\n\t/** Whether multi-sort is enabled */\n\tisMultiSort: boolean;\n}\n\nexport function useTableSort<T extends TableData>({\n\tdata,\n\tinitialSort,\n\tcontrolledSort,\n\tonSortChange,\n\tmultiSort = false,\n\tcontrolledMultiSort,\n\tonMultiSortChange,\n}: UseTableSortOptions<T>): UseTableSortReturn<T> {\n\tconst [internalSort, setInternalSort] = useState<SortState>(\n\t\tinitialSort ?? { columnId: null, direction: \"asc\" },\n\t);\n\tconst [internalMultiSort, setInternalMultiSort] = useState<MultiSortState>(\n\t\t[],\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst sortState = controlledSort ?? internalSort;\n\tconst multiSortState = controlledMultiSort ?? internalMultiSort;\n\n\tconst handleSort = useCallback(\n\t\t(columnId: string) => {\n\t\t\tif (multiSort) {\n\t\t\t\t// Multi-sort: 3-state cycle per column (unsorted → asc → desc → unsorted)\n\t\t\t\tconst existingIndex = multiSortState.findIndex(\n\t\t\t\t\t(s) => s.columnId === columnId,\n\t\t\t\t);\n\t\t\t\tlet newMultiSort: MultiSortState;\n\n\t\t\t\tif (existingIndex >= 0) {\n\t\t\t\t\tconst existing = multiSortState[existingIndex];\n\t\t\t\t\tif (existing.direction === \"asc\") {\n\t\t\t\t\t\t// asc → desc\n\t\t\t\t\t\tnewMultiSort = [...multiSortState];\n\t\t\t\t\t\tnewMultiSort[existingIndex] = {\n\t\t\t\t\t\t\tcolumnId,\n\t\t\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// desc → remove (unsorted)\n\t\t\t\t\t\tnewMultiSort = multiSortState.filter((_, i) => i !== existingIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// unsorted → asc\n\t\t\t\t\tnewMultiSort = [...multiSortState, { columnId, direction: \"asc\" }];\n\t\t\t\t}\n\n\t\t\t\tif (!controlledMultiSort) {\n\t\t\t\t\tsetInternalMultiSort(newMultiSort);\n\t\t\t\t}\n\t\t\t\tonMultiSortChange?.(newMultiSort);\n\n\t\t\t\t// Sync single sort state with primary sort\n\t\t\t\tconst primary = newMultiSort[0];\n\t\t\t\tconst newSortState: SortState = primary\n\t\t\t\t\t? { columnId: primary.columnId, direction: primary.direction }\n\t\t\t\t\t: { columnId: null, direction: \"asc\" };\n\t\t\t\tif (!controlledSort) {\n\t\t\t\t\tsetInternalSort(newSortState);\n\t\t\t\t}\n\t\t\t\tonSortChange?.(newSortState);\n\t\t\t} else {\n\t\t\t\t// Single sort: 3-state cycle (unsorted → asc → desc → unsorted)\n\t\t\t\tlet newState: SortState;\n\t\t\t\tif (sortState.columnId !== columnId) {\n\t\t\t\t\t// Different column → start asc\n\t\t\t\t\tnewState = { columnId, direction: \"asc\" };\n\t\t\t\t} else if (sortState.direction === \"asc\") {\n\t\t\t\t\t// asc → desc\n\t\t\t\t\tnewState = { columnId, direction: \"desc\" };\n\t\t\t\t} else {\n\t\t\t\t\t// desc → unsorted\n\t\t\t\t\tnewState = { columnId: null, direction: \"asc\" };\n\t\t\t\t}\n\n\t\t\t\tif (!controlledSort) {\n\t\t\t\t\tsetInternalSort(newState);\n\t\t\t\t}\n\t\t\t\tonSortChange?.(newState);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tsortState,\n\t\t\tmultiSortState,\n\t\t\tcontrolledSort,\n\t\t\tcontrolledMultiSort,\n\t\t\tonSortChange,\n\t\t\tonMultiSortChange,\n\t\t\tmultiSort,\n\t\t],\n\t);\n\n\tconst clearSort = useCallback(() => {\n\t\tconst newState: SortState = { columnId: null, direction: \"asc\" };\n\t\tif (!controlledSort) {\n\t\t\tsetInternalSort(newState);\n\t\t}\n\t\tonSortChange?.(newState);\n\n\t\tif (multiSort) {\n\t\t\tif (!controlledMultiSort) {\n\t\t\t\tsetInternalMultiSort([]);\n\t\t\t}\n\t\t\tonMultiSortChange?.([]);\n\t\t}\n\t}, [\n\t\tcontrolledSort,\n\t\tcontrolledMultiSort,\n\t\tonSortChange,\n\t\tonMultiSortChange,\n\t\tmultiSort,\n\t]);\n\n\tconst sortedData = useMemo(() => {\n\t\t// Use multi-sort if there are multiple sort states\n\t\tif (multiSort && multiSortState.length > 0) {\n\t\t\treturn multiSortData(data, multiSortState);\n\t\t}\n\t\t// Fallback to single sort\n\t\tif (!sortState.columnId) return data;\n\t\treturn sortData(data, sortState.columnId, sortState.direction);\n\t}, [data, sortState, multiSortState, multiSort]);\n\n\treturn {\n\t\tsortedData,\n\t\tsortState,\n\t\thandleSort,\n\t\tclearSort,\n\t\tmultiSortState,\n\t\tisMultiSort: multiSort,\n\t};\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { FilterState, TableData, Column, DateFilterRange } from \"../types\";\nimport { filterData } from \"../utils/filterData\";\n\ninterface UseTableFilterOptions<T extends TableData> {\n\tdata: T[];\n\tcolumns: Column<T>[];\n\tinitialFilters?: FilterState;\n\tcontrolledFilters?: FilterState;\n\tonFilterChange?: (filters: FilterState) => void;\n}\n\ninterface UseTableFilterReturn<T extends TableData> {\n\tfilteredData: T[];\n\tfilters: FilterState;\n\tsetFilter: (\n\t\tcolumnId: string,\n\t\tvalue: string | number | boolean | DateFilterRange | null,\n\t) => void;\n\tclearFilters: () => void;\n\tclearFilter: (columnId: string) => void;\n}\n\nexport function useTableFilter<T extends TableData>({\n\tdata,\n\tcolumns,\n\tinitialFilters,\n\tcontrolledFilters,\n\tonFilterChange,\n}: UseTableFilterOptions<T>): UseTableFilterReturn<T> {\n\tconst [internalFilters, setInternalFilters] = useState<FilterState>(\n\t\tinitialFilters ?? {},\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst filters = controlledFilters ?? internalFilters;\n\n\tconst setFilter = useCallback(\n\t\t(\n\t\t\tcolumnId: string,\n\t\t\tvalue: string | number | boolean | DateFilterRange | null,\n\t\t) => {\n\t\t\tconst newFilters = { ...filters };\n\n\t\t\t// For date ranges, remove if both from and to are empty\n\t\t\tif (value !== null && typeof value === \"object\" && \"from\" in value) {\n\t\t\t\tconst range = value as DateFilterRange;\n\t\t\t\tif (!range.from && !range.to) {\n\t\t\t\t\tdelete newFilters[columnId];\n\t\t\t\t} else {\n\t\t\t\t\tnewFilters[columnId] = value;\n\t\t\t\t}\n\t\t\t} else if (value === null || value === undefined || value === \"\") {\n\t\t\t\tdelete newFilters[columnId];\n\t\t\t} else {\n\t\t\t\tnewFilters[columnId] = value;\n\t\t\t}\n\n\t\t\tif (!controlledFilters) {\n\t\t\t\tsetInternalFilters(newFilters);\n\t\t\t}\n\t\t\tonFilterChange?.(newFilters);\n\t\t},\n\t\t[filters, controlledFilters, onFilterChange],\n\t);\n\n\tconst clearFilter = useCallback(\n\t\t(columnId: string) => {\n\t\t\tconst newFilters = { ...filters };\n\t\t\tdelete newFilters[columnId];\n\n\t\t\tif (!controlledFilters) {\n\t\t\t\tsetInternalFilters(newFilters);\n\t\t\t}\n\t\t\tonFilterChange?.(newFilters);\n\t\t},\n\t\t[filters, controlledFilters, onFilterChange],\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tif (!controlledFilters) {\n\t\t\tsetInternalFilters({});\n\t\t}\n\t\tonFilterChange?.({});\n\t}, [controlledFilters, onFilterChange]);\n\n\tconst filteredData = useMemo(() => {\n\t\treturn filterData(data, filters, columns);\n\t}, [data, filters, columns]);\n\n\treturn { filteredData, filters, setFilter, clearFilters, clearFilter };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { PaginationConfig, TableData } from \"../types\";\n\ninterface UseTablePaginationOptions<T extends TableData> {\n\tdata: T[];\n\tconfig?: PaginationConfig | false;\n\tonPageChange?: (page: number, pageSize: number) => void;\n}\n\ninterface UseTablePaginationReturn<T extends TableData> {\n\tpaginatedData: T[];\n\tpage: number;\n\tpageSize: number;\n\ttotalPages: number;\n\ttotalItems: number;\n\tgoToPage: (page: number) => void;\n\tnextPage: () => void;\n\tprevPage: () => void;\n\tchangePageSize: (size: number) => void;\n\thasNextPage: boolean;\n\thasPrevPage: boolean;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\nexport function useTablePagination<T extends TableData>({\n\tdata,\n\tconfig,\n\tonPageChange,\n}: UseTablePaginationOptions<T>): UseTablePaginationReturn<T> {\n\tconst enabled = config !== false;\n\n\tconst initialPage =\n\t\tconfig && typeof config === \"object\" ? (config.page ?? 1) : 1;\n\tconst initialPageSize =\n\t\tconfig && typeof config === \"object\" ? (config.pageSize ?? 10) : 10;\n\tconst serverTotalItems =\n\t\tconfig && typeof config === \"object\" ? config.totalItems : undefined;\n\n\tconst [page, setPage] = useState(initialPage);\n\tconst [pageSize, setPageSize] = useState(initialPageSize);\n\n\tconst totalItems = serverTotalItems ?? data.length;\n\tconst totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n\n\tconst goToPage = useCallback(\n\t\t(newPage: number) => {\n\t\t\tconst validPage = Math.max(1, Math.min(newPage, totalPages));\n\t\t\tsetPage(validPage);\n\t\t\tonPageChange?.(validPage, pageSize);\n\t\t},\n\t\t[totalPages, pageSize, onPageChange],\n\t);\n\n\tconst nextPage = useCallback(() => {\n\t\tif (page < totalPages) {\n\t\t\tgoToPage(page + 1);\n\t\t}\n\t}, [page, totalPages, goToPage]);\n\n\tconst prevPage = useCallback(() => {\n\t\tif (page > 1) {\n\t\t\tgoToPage(page - 1);\n\t\t}\n\t}, [page, goToPage]);\n\n\tconst changePageSize = useCallback(\n\t\t(newSize: number) => {\n\t\t\tsetPageSize(newSize);\n\t\t\tsetPage(1);\n\t\t\tonPageChange?.(1, newSize);\n\t\t},\n\t\t[onPageChange],\n\t);\n\n\tconst paginatedData = useMemo(() => {\n\t\tif (!enabled || serverTotalItems !== undefined) {\n\t\t\t// Si hay paginación del servidor, devolver datos tal cual\n\t\t\treturn data;\n\t\t}\n\t\tconst start = (page - 1) * pageSize;\n\t\treturn data.slice(start, start + pageSize);\n\t}, [data, page, pageSize, enabled, serverTotalItems]);\n\n\tconst startIndex = (page - 1) * pageSize + 1;\n\tconst endIndex = Math.min(page * pageSize, totalItems);\n\n\treturn {\n\t\tpaginatedData,\n\t\tpage,\n\t\tpageSize,\n\t\ttotalPages,\n\t\ttotalItems,\n\t\tgoToPage,\n\t\tnextPage,\n\t\tprevPage,\n\t\tchangePageSize,\n\t\thasNextPage: page < totalPages,\n\t\thasPrevPage: page > 1,\n\t\tstartIndex,\n\t\tendIndex,\n\t};\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { TableData } from \"../types\";\n\ninterface UseTableSelectionOptions<T extends TableData> {\n\tdata: T[];\n\trowKey: keyof T | ((row: T, index: number) => string);\n\tmode?: \"single\" | \"multiple\";\n\tinitialSelection?: T[];\n\tcontrolledSelection?: T[];\n\tonSelectionChange?: (selectedRows: T[]) => void;\n}\n\ninterface UseTableSelectionReturn<T extends TableData> {\n\tselectedRows: T[];\n\tisSelected: (row: T, index: number) => boolean;\n\ttoggleRow: (row: T, index: number) => void;\n\tselectRow: (row: T, index: number) => void;\n\tdeselectRow: (row: T, index: number) => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n\tisAllSelected: boolean;\n\tisPartiallySelected: boolean;\n\tselectedCount: number;\n}\n\nexport function useTableSelection<T extends TableData>({\n\tdata,\n\trowKey,\n\tmode = \"multiple\",\n\tinitialSelection,\n\tcontrolledSelection,\n\tonSelectionChange,\n}: UseTableSelectionOptions<T>): UseTableSelectionReturn<T> {\n\tconst [internalSelection, setInternalSelection] = useState<T[]>(\n\t\tinitialSelection ?? [],\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst selectedRows = controlledSelection ?? internalSelection;\n\n\tconst getRowKey = useCallback(\n\t\t(row: T, index: number): string => {\n\t\t\tif (typeof rowKey === \"function\") {\n\t\t\t\treturn rowKey(row, index);\n\t\t\t}\n\t\t\treturn String(row[rowKey]);\n\t\t},\n\t\t[rowKey],\n\t);\n\n\tconst selectedKeys = useMemo(() => {\n\t\treturn new Set(selectedRows.map((row, idx) => getRowKey(row, idx)));\n\t}, [selectedRows, getRowKey]);\n\n\tconst isSelected = useCallback(\n\t\t(row: T, index: number): boolean => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\treturn selectedKeys.has(key);\n\t\t},\n\t\t[getRowKey, selectedKeys],\n\t);\n\n\tconst updateSelection = useCallback(\n\t\t(newSelection: T[]) => {\n\t\t\tif (!controlledSelection) {\n\t\t\t\tsetInternalSelection(newSelection);\n\t\t\t}\n\t\t\tonSelectionChange?.(newSelection);\n\t\t},\n\t\t[controlledSelection, onSelectionChange],\n\t);\n\n\tconst toggleRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\tlet newSelection: T[];\n\n\t\t\tif (mode === \"single\") {\n\t\t\t\tnewSelection = selectedKeys.has(key) ? [] : [row];\n\t\t\t} else {\n\t\t\t\tif (selectedKeys.has(key)) {\n\t\t\t\t\tnewSelection = selectedRows.filter((r, i) => getRowKey(r, i) !== key);\n\t\t\t\t} else {\n\t\t\t\t\tnewSelection = [...selectedRows, row];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateSelection(newSelection);\n\t\t},\n\t\t[mode, selectedKeys, selectedRows, getRowKey, updateSelection],\n\t);\n\n\tconst selectRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tif (!isSelected(row, index)) {\n\t\t\t\tconst newSelection = mode === \"single\" ? [row] : [...selectedRows, row];\n\t\t\t\tupdateSelection(newSelection);\n\t\t\t}\n\t\t},\n\t\t[isSelected, mode, selectedRows, updateSelection],\n\t);\n\n\tconst deselectRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\tconst newSelection = selectedRows.filter(\n\t\t\t\t(r, i) => getRowKey(r, i) !== key,\n\t\t\t);\n\t\t\tupdateSelection(newSelection);\n\t\t},\n\t\t[selectedRows, getRowKey, updateSelection],\n\t);\n\n\tconst selectAll = useCallback(() => {\n\t\tif (mode === \"multiple\") {\n\t\t\tupdateSelection([...data]);\n\t\t}\n\t}, [data, mode, updateSelection]);\n\n\tconst deselectAll = useCallback(() => {\n\t\tupdateSelection([]);\n\t}, [updateSelection]);\n\n\tconst isAllSelected = data.length > 0 && selectedRows.length === data.length;\n\tconst isPartiallySelected =\n\t\tselectedRows.length > 0 && selectedRows.length < data.length;\n\n\treturn {\n\t\tselectedRows,\n\t\tisSelected,\n\t\ttoggleRow,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t\tselectedCount: selectedRows.length,\n\t};\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport { TableData, Column } from \"../types\";\nimport { searchData } from \"../utils/filterData\";\n\ninterface UseTableSearchOptions<T extends TableData> {\n\tdata: T[];\n\tcolumns: Column<T>[];\n\tsearchColumns?: string[];\n\tinitialValue?: string;\n\tcontrolledValue?: string;\n\tonSearchChange?: (value: string) => void;\n\tdebounceMs?: number;\n}\n\ninterface UseTableSearchReturn<T extends TableData> {\n\tsearchedData: T[];\n\tsearchValue: string;\n\thandleSearch: (value: string) => void;\n\tclearSearch: () => void;\n}\n\nexport function useTableSearch<T extends TableData>({\n\tdata,\n\tcolumns,\n\tsearchColumns,\n\tinitialValue,\n\tcontrolledValue,\n\tonSearchChange,\n\tdebounceMs = 0,\n}: UseTableSearchOptions<T>): UseTableSearchReturn<T> {\n\tconst [internalValue, setInternalValue] = useState(initialValue ?? \"\");\n\tconst [debouncedValue, setDebouncedValue] = useState(initialValue ?? \"\");\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t// Usar valor controlado si está disponible\n\tconst searchValue = controlledValue ?? internalValue;\n\n\t// Debounce: update debouncedValue after delay\n\tuseEffect(() => {\n\t\tif (debounceMs <= 0) {\n\t\t\tsetDebouncedValue(searchValue);\n\t\t\treturn;\n\t\t}\n\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tsetDebouncedValue(searchValue);\n\t\t}, debounceMs);\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t}\n\t\t};\n\t}, [searchValue, debounceMs]);\n\n\tconst handleSearch = useCallback(\n\t\t(value: string) => {\n\t\t\tif (controlledValue === undefined) {\n\t\t\t\tsetInternalValue(value);\n\t\t\t}\n\t\t\tonSearchChange?.(value);\n\t\t},\n\t\t[controlledValue, onSearchChange],\n\t);\n\n\tconst clearSearch = useCallback(() => {\n\t\tif (controlledValue === undefined) {\n\t\t\tsetInternalValue(\"\");\n\t\t}\n\t\t// Clear immediately, bypass debounce\n\t\tif (timerRef.current) {\n\t\t\tclearTimeout(timerRef.current);\n\t\t}\n\t\tsetDebouncedValue(\"\");\n\t\tonSearchChange?.(\"\");\n\t}, [controlledValue, onSearchChange]);\n\n\tconst searchedData = useMemo(() => {\n\t\treturn searchData(data, debouncedValue, columns, searchColumns);\n\t}, [data, debouncedValue, columns, searchColumns]);\n\n\treturn { searchedData, searchValue, handleSearch, clearSearch };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { Column, TableData } from \"../types\";\n\ninterface UseColumnVisibilityOptions<T extends TableData> {\n\tcolumns: Column<T>[];\n\t/** Controlled hidden column IDs */\n\tcontrolledHiddenColumns?: string[];\n\t/** Callback when visibility changes */\n\tonColumnVisibilityChange?: (hiddenColumns: string[]) => void;\n}\n\ninterface UseColumnVisibilityReturn<T extends TableData> {\n\t/** Columns filtered by visibility */\n\tvisibleColumns: Column<T>[];\n\t/** Set of hidden column IDs */\n\thiddenColumnIds: Set<string>;\n\t/** Toggle a column's visibility */\n\ttoggleColumn: (columnId: string) => void;\n\t/** Show all columns */\n\tshowAllColumns: () => void;\n\t/** Check if a column is visible */\n\tisColumnVisible: (columnId: string) => boolean;\n\t/** Array of hidden column IDs (for serialization) */\n\thiddenColumns: string[];\n}\n\nexport function useColumnVisibility<T extends TableData>({\n\tcolumns,\n\tcontrolledHiddenColumns,\n\tonColumnVisibilityChange,\n}: UseColumnVisibilityOptions<T>): UseColumnVisibilityReturn<T> {\n\t// Internal state: hidden column IDs derived from columns with hidden: true + user toggles\n\tconst [internalHidden, setInternalHidden] = useState<string[]>(() =>\n\t\tcolumns.filter((col) => col.hidden).map((col) => col.id),\n\t);\n\n\tconst hiddenColumns = controlledHiddenColumns ?? internalHidden;\n\tconst hiddenColumnIds = useMemo(\n\t\t() => new Set(hiddenColumns),\n\t\t[hiddenColumns],\n\t);\n\n\tconst toggleColumn = useCallback(\n\t\t(columnId: string) => {\n\t\t\tconst newHidden = hiddenColumnIds.has(columnId)\n\t\t\t\t? hiddenColumns.filter((id) => id !== columnId)\n\t\t\t\t: [...hiddenColumns, columnId];\n\n\t\t\tif (!controlledHiddenColumns) {\n\t\t\t\tsetInternalHidden(newHidden);\n\t\t\t}\n\t\t\tonColumnVisibilityChange?.(newHidden);\n\t\t},\n\t\t[\n\t\t\thiddenColumns,\n\t\t\thiddenColumnIds,\n\t\t\tcontrolledHiddenColumns,\n\t\t\tonColumnVisibilityChange,\n\t\t],\n\t);\n\n\tconst showAllColumns = useCallback(() => {\n\t\tif (!controlledHiddenColumns) {\n\t\t\tsetInternalHidden([]);\n\t\t}\n\t\tonColumnVisibilityChange?.([]);\n\t}, [controlledHiddenColumns, onColumnVisibilityChange]);\n\n\tconst isColumnVisible = useCallback(\n\t\t(columnId: string) => !hiddenColumnIds.has(columnId),\n\t\t[hiddenColumnIds],\n\t);\n\n\tconst visibleColumns = useMemo(\n\t\t() => columns.filter((col) => !hiddenColumnIds.has(col.id)),\n\t\t[columns, hiddenColumnIds],\n\t);\n\n\treturn {\n\t\tvisibleColumns,\n\t\thiddenColumnIds,\n\t\ttoggleColumn,\n\t\tshowAllColumns,\n\t\tisColumnVisible,\n\t\thiddenColumns,\n\t};\n}\n","import { useMemo, useState, useCallback, ReactNode } from 'react';\nimport {\n BetterTableProps,\n TableData,\n defaultLocale,\n locales,\n PaginationConfig,\n} from '../types';\nimport { TableProvider, TableContextValue } from '../context';\nimport { useTableSort } from '../hooks/useTableSort';\nimport { useTableFilter } from '../hooks/useTableFilter';\nimport { useTablePagination } from '../hooks/useTablePagination';\nimport { useTableSelection } from '../hooks/useTableSelection';\nimport { useTableSearch } from '../hooks/useTableSearch';\nimport { useColumnVisibility } from '../hooks/useColumnVisibility';\nimport { useMediaQuery } from '../hooks/useMediaQuery';\nimport {\n TableHeader,\n TableBody,\n TablePagination,\n TableToolbar,\n TableEmpty,\n TableLoadingOverlay,\n TableModal,\n TableFilterPanel,\n} from '../components';\nimport { TableCards } from './TableCards';\nimport '../styles/index.css';\nimport clsx from 'clsx';\n\nfunction BetterTableInner<T extends TableData>(\n props: BetterTableProps<T>\n): React.ReactElement {\n const {\n // Data\n data,\n columns,\n rowKey = 'id' as keyof T,\n\n // Actions\n rowActions,\n globalActions,\n maxVisibleActions = 3,\n\n // Pagination\n pagination = { pageSize: 10 },\n onPageChange,\n\n // Sort\n sort: controlledSort,\n onSortChange,\n multiSort = false,\n multiSortState: controlledMultiSort,\n onMultiSortChange,\n\n // Filter\n filters: controlledFilters,\n onFilterChange,\n filterMode = 'floating',\n\n // Search\n searchable = false,\n searchValue: controlledSearchValue,\n onSearchChange,\n searchColumns,\n searchDebounceMs = 300,\n\n // Selection - now auto-inferred if not explicitly set\n selectable: selectableProp,\n selectedRows: controlledSelectedRows,\n onSelectionChange,\n selectionMode = 'multiple',\n\n // Column Visibility\n columnVisibility = false,\n hiddenColumns: controlledHiddenColumns,\n onColumnVisibilityChange,\n\n // States\n loading = false,\n loadingComponent,\n emptyComponent,\n\n // Styling\n classNames = {},\n styles = {},\n locale: userLocale,\n stickyHeader = false,\n maxHeight,\n bordered = false,\n striped = false,\n hoverable = true,\n size = 'medium',\n\n // Callbacks\n onRowClick,\n onRowDoubleClick,\n\n // Accessibility\n ariaLabel,\n ariaDescribedBy,\n } = props;\n\n // Auto-infer selectable: show selection if there's a reason to select\n // - Explicitly set by user (selectableProp)\n // - Has globalAction with requiresSelection\n // - Has onSelectionChange callback\n const selectable = useMemo(() => {\n // If explicitly set, use that value\n if (selectableProp !== undefined) {\n return selectableProp;\n }\n // Auto-infer: true if there's a functional reason to select\n const hasSelectionAction = globalActions?.some(\n (action) => action.requiresSelection\n );\n const hasSelectionCallback = onSelectionChange !== undefined;\n return hasSelectionAction || hasSelectionCallback;\n }, [selectableProp, globalActions, onSelectionChange]);\n\n // Merge locale with defaults\n const locale = useMemo(\n () => {\n const base = typeof userLocale === 'string' ? locales[userLocale] : defaultLocale;\n const overrides = typeof userLocale === 'object' ? userLocale : {};\n return { ...base, ...overrides };\n },\n [userLocale]\n );\n\n // Modal state\n const [isModalOpen, setModalOpen] = useState(false);\n const [modalContent, setModalContent] = useState<ReactNode | null>(null);\n\n // Filter panel state\n const [filterPanelOpen, setFilterPanelOpen] = useState(false);\n const toggleFilterPanel = useCallback(() => {\n setFilterPanelOpen((prev) => !prev);\n }, []);\n\n const hasFilterableColumns = useMemo(\n () => columns.some((col) => col.filterable !== false && col.type !== 'custom' && !col.hidden),\n [columns]\n );\n\n const openModal = useCallback((content: ReactNode) => {\n setModalContent(content);\n setModalOpen(true);\n }, []);\n\n const closeModal = useCallback(() => {\n setModalOpen(false);\n setModalContent(null);\n }, []);\n\n // Pagination config\n const paginationConfig: PaginationConfig | false = useMemo(() => {\n if (pagination === false) return false;\n return {\n pageSize: 10,\n pageSizeOptions: [10, 20, 50, 100],\n showSizeChanger: false,\n ...pagination,\n };\n }, [pagination]);\n\n // Search hook\n const {\n searchedData,\n searchValue,\n handleSearch,\n clearSearch,\n } = useTableSearch({\n data,\n columns,\n searchColumns,\n controlledValue: controlledSearchValue,\n onSearchChange,\n debounceMs: searchDebounceMs,\n });\n\n // Filter hook\n const {\n filteredData,\n filters,\n setFilter,\n clearFilter,\n clearFilters,\n } = useTableFilter({\n data: searchedData,\n columns,\n controlledFilters,\n onFilterChange,\n });\n\n // Sort hook\n const { sortedData, sortState, handleSort, clearSort, multiSortState, isMultiSort } = useTableSort({\n data: filteredData,\n controlledSort,\n onSortChange,\n multiSort,\n controlledMultiSort,\n onMultiSortChange,\n });\n\n // Column visibility hook\n const {\n visibleColumns,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n } = useColumnVisibility({\n columns,\n controlledHiddenColumns,\n onColumnVisibilityChange,\n });\n\n // Selection hook\n const {\n selectedRows,\n isSelected,\n toggleRow,\n selectAll,\n deselectAll,\n isAllSelected,\n isPartiallySelected,\n selectedCount,\n } = useTableSelection({\n data: sortedData,\n rowKey,\n mode: selectionMode,\n controlledSelection: controlledSelectedRows,\n onSelectionChange,\n });\n\n // Pagination hook\n const {\n paginatedData,\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n } = useTablePagination({\n data: sortedData,\n config: paginationConfig,\n onPageChange,\n });\n\n // Build context value\n const contextValue: TableContextValue<T> = useMemo(\n () => ({\n // Data\n data,\n processedData: paginatedData,\n columns,\n visibleColumns,\n rowKey,\n\n // Actions\n rowActions,\n globalActions,\n maxVisibleActions,\n\n // Sort\n sortState,\n handleSort,\n multiSortState,\n isMultiSort,\n clearSort,\n\n // Column Visibility\n columnVisibilityEnabled: columnVisibility,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n\n // Filter\n filters,\n setFilter,\n clearFilter,\n clearFilters,\n\n // Search\n searchValue,\n handleSearch,\n clearSearch,\n searchable,\n\n // Selection\n selectedRows,\n isSelected,\n toggleRow,\n selectAll,\n deselectAll,\n isAllSelected,\n isPartiallySelected,\n selectable,\n selectionMode,\n selectedCount,\n\n // Pagination\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n paginationEnabled: pagination !== false,\n pageSizeOptions:\n paginationConfig && typeof paginationConfig === 'object'\n ? paginationConfig.pageSizeOptions ?? [10, 20, 50, 100]\n : [10, 20, 50, 100],\n showSizeChanger:\n paginationConfig && typeof paginationConfig === 'object'\n ? paginationConfig.showSizeChanger ?? false\n : false,\n\n // UI State\n loading,\n loadingComponent,\n emptyComponent,\n\n // Styling\n locale,\n classNames,\n size,\n bordered,\n striped,\n hoverable,\n stickyHeader,\n\n // Callbacks\n onRowClick,\n onRowDoubleClick,\n\n // Modal\n openModal,\n closeModal,\n modalContent,\n isModalOpen,\n\n // Filter panel\n filterPanelOpen,\n toggleFilterPanel,\n hasFilterableColumns,\n filterMode,\n }),\n [\n data,\n paginatedData,\n columns,\n visibleColumns,\n rowKey,\n rowActions,\n globalActions,\n maxVisibleActions,\n sortState,\n handleSort,\n multiSortState,\n isMultiSort,\n clearSort,\n columnVisibility,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n filters,\n setFilter,\n clearFilter,\n clearFilters,\n searchValue,\n handleSearch,\n clearSearch,\n searchable,\n selectedRows,\n isSelected,\n toggleRow,\n selectAll,\n deselectAll,\n isAllSelected,\n isPartiallySelected,\n selectable,\n selectionMode,\n selectedCount,\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n pagination,\n paginationConfig,\n loading,\n loadingComponent,\n emptyComponent,\n locale,\n classNames,\n size,\n bordered,\n striped,\n hoverable,\n stickyHeader,\n onRowClick,\n onRowDoubleClick,\n openModal,\n closeModal,\n modalContent,\n isModalOpen,\n filterPanelOpen,\n toggleFilterPanel,\n hasFilterableColumns,\n filterMode,\n ]\n );\n\n const hasData = paginatedData.length > 0;\n const isMobile = useMediaQuery('(max-width: 640px)');\n\n return (\n <TableProvider value={contextValue}>\n <div\n className={clsx(\n 'bt-container',\n `bt-size-${size}`,\n striped && 'bt-striped',\n bordered && 'bt-bordered',\n hoverable && 'bt-hoverable',\n loading && 'bt-container-loading',\n classNames.container\n )}\n style={styles.container}\n >\n <TableToolbar />\n {(filterMode === 'panel' || filterMode === 'both') && (\n <TableFilterPanel open={filterPanelOpen} />\n )}\n\n <div\n className='bt-table-wrapper'\n style={{ maxHeight }}\n >\n {isMobile ? (\n /* Cards (móvil) */\n hasData && <TableCards />\n ) : (\n /* Tabla tradicional (desktop/tablet) */\n <table\n className={clsx('bt-table', classNames.table)}\n style={styles.table}\n role=\"grid\"\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n aria-busy={loading}\n >\n <TableHeader />\n {hasData ? <TableBody /> : <TableEmpty />}\n </table>\n )}\n\n <TableLoadingOverlay show={loading && hasData} />\n </div>\n\n {pagination !== false && <TablePagination />}\n\n <TableModal />\n </div>\n </TableProvider>\n );\n}\n\n// Export the generic component directly to preserve type parameters\nexport const BetterTable = BetterTableInner;\nexport default BetterTable;\n"],"names":["defaultLocale","locales","TableContext","createContext","useTableContext","context","useContext","TableProvider","value","children","jsx","r","f","n","o","clsx","SortIdleIcon","jsxs","SortAscIcon","SortDescIcon","TableHeaderCellInner","column","sortState","handleSort","locale","multiSortState","isMultiSort","isSorted","multiSortIndex","s","isInMultiSort","multiSortDirection","showMultiSortBadge","effectivelySorted","effectiveDirection","handleSortClick","useCallback","handleKeyDown","e","renderSortIcon","Icon","TableHeaderCell","React","FilterIcon","TableFloatingFilterInner","visibleColumns","filters","setFilter","selectable","selectionMode","rowActions","stickyHeader","hasActions","col","FloatingInput","FloatingInputInner","handleChange","v","handleDateChange","field","newRange","fieldId","isActive","useMemo","dr","dateRange","TableFloatingFilter","TableHeaderInner","isAllSelected","isPartiallySelected","selectAll","deselectAll","filterMode","showFloatingFilter","handleSelectAllChange","el","TableHeader","getValueFromPath","obj","path","keys","result","key","compareValues","valueA","valueB","direction","comparison","strA","strB","sortData","data","columnId","a","b","multiSortData","sorts","activeSorts","sort","toDate","d","filterData","columns","activeFilters","row","filterValue","cellValue","cellDate","range","fromDate","toDateVal","endOfDay","filterDate","searchData","searchValue","searchColumnIds","searchLower","columnsToSearch","TableCellInner","rowIndex","content","date","TableCell","DEFAULT_ACTION_ICON","TableActionOverflowInner","actions","_rowIndex","onActionClick","isOpen","setIsOpen","useState","position","setPosition","triggerRef","useRef","menuRef","toggle","prev","rect","spaceBelow","shouldOpenUp","useEffect","handleClickOutside","target","handleScroll","normalActions","dangerActions","sortedActions","hasDangerSeparator","dangerStartIndex","menuStyle","createPortal","action","index","isDisabled","icon","showSeparator","TableActionOverflow","TableActionsInner","openModal","closeModal","maxVisibleActions","handleActionClick","ModalContent","url","inlineActions","overflowActions","visible","inlineSlots","TableActions","TableRowInner","isSelected","toggleRow","striped","hoverable","onRowClick","onRowDoubleClick","selected","isClickable","handleRowClick","handleRowDoubleClick","handleCheckboxChange","TableRow","TableBodyInner","processedData","rowKey","getRowKey","keyValue","TableBody","TableCardInner","titleColumn","otherColumns","handleCardClick","renderCellValue","titleValue","cellContent","TableCard","TableCardsInner","TableCards","PanelFilterIcon","TableFilterPanelInner","open","clearFilter","clearFilters","filterableColumns","activeFilterCount","FilterField","FilterFieldInner","hasValue","isDateActive","renderInput","TableFilterPanel","ColumnsIcon","CheckIcon","TableColumnVisibilityInner","hiddenColumnIds","toggleColumn","showAllColumns","isColumnVisible","columnVisibilityEnabled","setOpen","containerRef","buttonRef","hiddenCount","handleEscape","handleToggle","toggleableColumns","TableColumnVisibility","ChevronLeftIcon","ChevronRightIcon","TablePagination","page","pageSize","totalPages","totalItems","goToPage","nextPage","prevPage","changePageSize","hasNextPage","hasPrevPage","startIndex","endIndex","paginationEnabled","pageSizeOptions","showSizeChanger","classNames","handlePageSizeChange","handleQuickJump","pageNumbers","pages","i","start","end","size","pageNum","idx","useMediaQuery","query","matches","setMatches","mql","handler","SearchIcon","ClearIcon","TableToolbarInner","searchable","handleSearch","clearSearch","globalActions","selectedRows","selectedCount","filterPanelOpen","toggleFilterPanel","hasFilterableColumns","isMobile","searchExpanded","setSearchExpanded","searchInputRef","handleSearchChange","toggleSearch","showFilterPanelToggle","showCollapsedSearch","showExpandedSearch","TableToolbar","EmptyIcon","TableEmpty","emptyComponent","colSpan","TableLoadingOverlay","show","loadingComponent","Fragment","CloseIcon","TableModal","isModalOpen","modalContent","handleBackdropClick","useTableSort","initialSort","controlledSort","onSortChange","multiSort","controlledMultiSort","onMultiSortChange","internalSort","setInternalSort","internalMultiSort","setInternalMultiSort","existingIndex","newMultiSort","_","primary","newSortState","newState","clearSort","useTableFilter","initialFilters","controlledFilters","onFilterChange","internalFilters","setInternalFilters","newFilters","useTablePagination","config","onPageChange","enabled","initialPage","initialPageSize","serverTotalItems","setPage","setPageSize","newPage","validPage","newSize","paginatedData","useTableSelection","mode","initialSelection","controlledSelection","onSelectionChange","internalSelection","setInternalSelection","selectedKeys","updateSelection","newSelection","selectRow","deselectRow","useTableSearch","searchColumns","initialValue","controlledValue","onSearchChange","debounceMs","internalValue","setInternalValue","debouncedValue","setDebouncedValue","timerRef","useColumnVisibility","controlledHiddenColumns","onColumnVisibilityChange","internalHidden","setInternalHidden","hiddenColumns","newHidden","id","BetterTableInner","props","pagination","controlledSearchValue","searchDebounceMs","selectableProp","controlledSelectedRows","columnVisibility","loading","styles","userLocale","maxHeight","bordered","ariaLabel","ariaDescribedBy","setModalOpen","setModalContent","setFilterPanelOpen","paginationConfig","searchedData","filteredData","sortedData","contextValue","hasData","BetterTable"],"mappings":"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","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"better-table.es.js","sources":["../src/components/BetterTable/context/TableDataContext.tsx","../src/components/BetterTable/context/TableSortContext.tsx","../src/components/BetterTable/context/TableFilterContext.tsx","../src/components/BetterTable/context/TableSelectionContext.tsx","../src/components/BetterTable/context/TablePaginationContext.tsx","../src/components/BetterTable/context/TableUIContext.tsx","../src/components/BetterTable/context/TableContext.tsx","../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/components/BetterTable/components/TableHeaderCell.tsx","../src/components/BetterTable/components/TableFloatingFilter.tsx","../src/components/BetterTable/components/TableHeader.tsx","../src/components/BetterTable/utils/getValueFromPath.ts","../src/components/BetterTable/utils/sortData.ts","../src/components/BetterTable/utils/filterData.ts","../src/components/BetterTable/components/TableCell.tsx","../src/components/BetterTable/components/TableActionOverflow.tsx","../src/components/BetterTable/components/TableActions.tsx","../src/components/BetterTable/components/TableRow.tsx","../src/components/BetterTable/components/TableExpandedRow.tsx","../src/components/BetterTable/components/TableBody.tsx","../src/components/BetterTable/components/TableCard.tsx","../src/components/BetterTable/components/TableCards.tsx","../src/components/BetterTable/components/TableFilterPanel.tsx","../src/components/BetterTable/components/TableColumnVisibility.tsx","../src/components/BetterTable/components/TablePagination.tsx","../src/components/BetterTable/hooks/useMediaQuery.ts","../src/components/BetterTable/components/TableToolbar.tsx","../src/components/BetterTable/components/TableEmpty.tsx","../src/components/BetterTable/components/TableLoading.tsx","../src/components/BetterTable/hooks/useFocusTrap.ts","../src/components/BetterTable/components/TableModal.tsx","../src/components/BetterTable/components/TableVirtualBody.tsx","../src/components/BetterTable/types.ts","../src/components/BetterTable/hooks/useTableSort.ts","../src/components/BetterTable/hooks/useTableFilter.ts","../src/components/BetterTable/hooks/useTablePagination.ts","../src/components/BetterTable/hooks/useTableSelection.ts","../src/components/BetterTable/hooks/useTableSearch.ts","../src/components/BetterTable/hooks/useColumnVisibility.ts","../src/components/BetterTable/hooks/useColumnResize.ts","../src/components/BetterTable/hooks/useVirtualization.ts","../src/components/BetterTable/hooks/useExpandableRows.ts","../src/components/BetterTable/constants.ts","../src/components/BetterTable/components/Table.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport { TableData, Column, RowAction, GlobalAction } from '../types';\n\nexport interface TableDataContextValue<T extends TableData = TableData> {\n data: T[];\n processedData: T[];\n columns: Column<T>[];\n visibleColumns: Column<T>[];\n rowKey: keyof T | ((row: T, index: number) => string);\n rowActions?: RowAction<T>[];\n globalActions?: GlobalAction<T>[];\n maxVisibleActions: number;\n // Expandable rows\n expandableRender?: (row: T, rowIndex: number) => ReactNode;\n isExpanded: (rowKey: string) => boolean;\n toggleExpand: (rowKey: string) => void;\n expandableEnabled: boolean;\n}\n\nconst TableDataContext = createContext<TableDataContextValue | null>(null);\n\nexport function useTableData<T extends TableData>(): TableDataContextValue<T> {\n const context = useContext(TableDataContext);\n if (!context) {\n throw new Error('useTableData must be used within a TableProvider');\n }\n return context as TableDataContextValue<T>;\n}\n\nexport const TableDataProvider = TableDataContext.Provider;\n","import { createContext, useContext } from 'react';\nimport { SortState, MultiSortState } from '../types';\n\nexport interface TableSortContextValue {\n sortState: SortState;\n handleSort: (columnId: string) => void;\n multiSortState: MultiSortState;\n isMultiSort: boolean;\n clearSort: () => void;\n}\n\nconst TableSortContext = createContext<TableSortContextValue | null>(null);\n\nexport function useTableSortContext(): TableSortContextValue {\n const context = useContext(TableSortContext);\n if (!context) {\n throw new Error('useTableSortContext must be used within a TableProvider');\n }\n return context;\n}\n\nexport const TableSortProvider = TableSortContext.Provider;\n","import { createContext, useContext } from 'react';\nimport { FilterState, DateFilterRange } from '../types';\n\nexport interface TableFilterContextValue {\n filters: FilterState;\n setFilter: (columnId: string, value: string | number | boolean | DateFilterRange | null) => void;\n clearFilter: (columnId: string) => void;\n clearFilters: () => void;\n searchValue: string;\n handleSearch: (value: string) => void;\n clearSearch: () => void;\n searchable: boolean;\n filterPanelOpen: boolean;\n toggleFilterPanel: () => void;\n hasFilterableColumns: boolean;\n filterMode: 'floating' | 'panel' | 'both';\n}\n\nconst TableFilterContext = createContext<TableFilterContextValue | null>(null);\n\nexport function useTableFilterContext(): TableFilterContextValue {\n const context = useContext(TableFilterContext);\n if (!context) {\n throw new Error('useTableFilterContext must be used within a TableProvider');\n }\n return context;\n}\n\nexport const TableFilterProvider = TableFilterContext.Provider;\n","import { createContext, useContext } from 'react';\nimport { TableData } from '../types';\n\nexport interface TableSelectionContextValue<T extends TableData = TableData> {\n selectedRows: T[];\n isSelected: (row: T, index: number) => boolean;\n toggleRow: (row: T, index: number) => void;\n selectAll: () => void;\n deselectAll: () => void;\n isAllSelected: boolean;\n isPartiallySelected: boolean;\n selectedCount: number;\n selectable: boolean;\n selectionMode: 'single' | 'multiple';\n}\n\nconst TableSelectionContext = createContext<TableSelectionContextValue | null>(null);\n\nexport function useTableSelectionContext<T extends TableData>(): TableSelectionContextValue<T> {\n const context = useContext(TableSelectionContext);\n if (!context) {\n throw new Error('useTableSelectionContext must be used within a TableProvider');\n }\n return context as TableSelectionContextValue<T>;\n}\n\nexport const TableSelectionProvider = TableSelectionContext.Provider;\n","import { createContext, useContext } from 'react';\n\nexport interface TablePaginationContextValue {\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n goToPage: (page: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n changePageSize: (size: number) => void;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n startIndex: number;\n endIndex: number;\n paginationEnabled: boolean;\n pageSizeOptions: number[];\n showSizeChanger: boolean;\n}\n\nconst TablePaginationContext = createContext<TablePaginationContextValue | null>(null);\n\nexport function useTablePaginationContext(): TablePaginationContextValue {\n const context = useContext(TablePaginationContext);\n if (!context) {\n throw new Error('useTablePaginationContext must be used within a TableProvider');\n }\n return context;\n}\n\nexport const TablePaginationProvider = TablePaginationContext.Provider;\n","import { createContext, useContext, ReactNode } from 'react';\nimport { TableData, TableLocale, TableClassNames, Column } from '../types';\n\nexport interface TableUIContextValue<T extends TableData = TableData> {\n locale: TableLocale;\n classNames: TableClassNames;\n size: 'small' | 'medium' | 'large';\n bordered: boolean;\n striped: boolean;\n hoverable: boolean;\n stickyHeader: boolean;\n loading: boolean;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n onRowClick?: (row: T, rowIndex: number) => void;\n onRowDoubleClick?: (row: T, rowIndex: number) => void;\n // Modal\n openModal: (content: ReactNode) => void;\n closeModal: () => void;\n modalContent: ReactNode | null;\n isModalOpen: boolean;\n // Column Visibility\n columnVisibilityEnabled: boolean;\n hiddenColumnIds: Set<string>;\n toggleColumn: (columnId: string) => void;\n showAllColumns: () => void;\n isColumnVisible: (columnId: string) => boolean;\n columns: Column<T>[];\n // Column Resizing\n resizable: boolean;\n columnWidths: Record<string, number>;\n isResizing: boolean;\n startResize: (columnId: string, startX: number) => void;\n getColumnWidth: (columnId: string) => number | undefined;\n}\n\nconst TableUIContext = createContext<TableUIContextValue | null>(null);\n\nexport function useTableUI<T extends TableData>(): TableUIContextValue<T> {\n const context = useContext(TableUIContext);\n if (!context) {\n throw new Error('useTableUI must be used within a TableProvider');\n }\n return context as TableUIContextValue<T>;\n}\n\nexport const TableUIProvider = TableUIContext.Provider;\n","import { ReactNode } from 'react';\nimport { TableData } from '../types';\nimport { TableDataContextValue, TableDataProvider } from './TableDataContext';\nimport { TableSortContextValue, TableSortProvider } from './TableSortContext';\nimport { TableFilterContextValue, TableFilterProvider } from './TableFilterContext';\nimport { TableSelectionContextValue, TableSelectionProvider } from './TableSelectionContext';\nimport { TablePaginationContextValue, TablePaginationProvider } from './TablePaginationContext';\nimport { TableUIContextValue, TableUIProvider } from './TableUIContext';\n\nexport interface TableProviderProps<T extends TableData = TableData> {\n data: TableDataContextValue<T>;\n sort: TableSortContextValue;\n filter: TableFilterContextValue;\n selection: TableSelectionContextValue<T>;\n pagination: TablePaginationContextValue;\n ui: TableUIContextValue<T>;\n children: ReactNode;\n}\n\nexport function TableProvider<T extends TableData>({\n data,\n sort,\n filter,\n selection,\n pagination,\n ui,\n children,\n}: TableProviderProps<T>) {\n return (\n <TableDataProvider value={data as TableDataContextValue}>\n <TableSortProvider value={sort}>\n <TableFilterProvider value={filter}>\n <TableSelectionProvider value={selection as TableSelectionContextValue}>\n <TablePaginationProvider value={pagination}>\n <TableUIProvider value={ui as TableUIContextValue}>\n {children}\n </TableUIProvider>\n </TablePaginationProvider>\n </TableSelectionProvider>\n </TableFilterProvider>\n </TableSortProvider>\n </TableDataProvider>\n );\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React, { useCallback, KeyboardEvent } from 'react';\nimport { useTableSortContext, useTableUI } from '../context';\nimport { TableData, Column } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG sort icons */\nfunction SortIdleIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" opacity=\"0.4\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" opacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg className=\"bt-sort-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 2.5L10 5.5H4L7 2.5Z\" fill=\"currentColor\" opacity=\"0.2\" />\n <path d=\"M7 11.5L4 8.5H10L7 11.5Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\ninterface TableHeaderCellProps<T extends TableData> {\n column: Column<T>;\n}\n\nfunction TableHeaderCellInner<T extends TableData>({\n column,\n}: TableHeaderCellProps<T>) {\n const { sortState, handleSort, multiSortState, isMultiSort } = useTableSortContext();\n const { locale, resizable, startResize, getColumnWidth } = useTableUI<T>();\n\n // Determine if THIS column is resizable\n const isResizable = column.resizable !== undefined ? column.resizable : resizable;\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startResize(column.id, e.clientX);\n },\n [column.id, startResize]\n );\n\n const isSorted = sortState.columnId === column.id;\n\n // For multi-sort, check if this column is in the multi-sort array\n const multiSortIndex = isMultiSort\n ? multiSortState.findIndex((s) => s.columnId === column.id)\n : -1;\n const isInMultiSort = multiSortIndex >= 0;\n const multiSortDirection = isInMultiSort\n ? multiSortState[multiSortIndex].direction\n : null;\n const showMultiSortBadge = isMultiSort && multiSortState.length > 1 && isInMultiSort;\n\n // Determine effective sort state for this column\n const effectivelySorted = isMultiSort ? isInMultiSort : isSorted;\n const effectiveDirection = isMultiSort\n ? multiSortDirection\n : isSorted\n ? sortState.direction\n : null;\n\n const handleSortClick = useCallback(() => {\n if (column.sortable !== false) {\n handleSort(column.id);\n }\n }, [column.id, column.sortable, handleSort]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && column.sortable !== false) {\n handleSort(column.id);\n }\n },\n [column.id, column.sortable, handleSort]\n );\n\n const renderSortIcon = () => {\n if (column.sortable === false || column.type === 'custom') {\n return null;\n }\n\n const Icon = effectivelySorted\n ? effectiveDirection === 'asc'\n ? SortAscIcon\n : SortDescIcon\n : SortIdleIcon;\n\n return (\n <button\n className={clsx('bt-sort-btn', effectivelySorted && 'bt-active')}\n onClick={handleSortClick}\n aria-label={\n effectiveDirection === 'asc' ? locale.sortDesc : locale.sortAsc\n }\n type=\"button\"\n >\n <Icon />\n {showMultiSortBadge && (\n <span className=\"bt-sort-priority\" aria-label={`${locale.sortPriority} ${multiSortIndex + 1}`}>\n {multiSortIndex + 1}\n </span>\n )}\n </button>\n );\n };\n\n // Custom header cell render\n if (column.headerCell) {\n const resizedWidth = getColumnWidth(column.id);\n return (\n <th\n className={clsx('bt-th', column.align && `bt-align-${column.align}`, isResizable && 'bt-th-resizable')}\n style={{ width: resizedWidth ?? column.width }}\n data-column-id={column.id}\n >\n {column.headerCell(column)}\n {isResizable && (\n <div\n className=\"bt-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${column.header}`}\n />\n )}\n </th>\n );\n }\n\n return (\n <th\n className={clsx('bt-th', column.align && `bt-align-${column.align}`, effectivelySorted && 'bt-sorted', isResizable && 'bt-th-resizable')}\n style={{ width: getColumnWidth(column.id) ?? column.width }}\n data-column-id={column.id}\n role=\"columnheader\"\n aria-sort={\n effectivelySorted\n ? effectiveDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n tabIndex={column.sortable !== false ? 0 : undefined}\n onKeyDown={column.sortable !== false ? handleKeyDown : undefined}\n >\n <div className=\"bt-th-content\">\n <div className=\"bt-th-header\">\n <span className=\"bt-th-title\">{column.header}</span>\n {renderSortIcon()}\n </div>\n </div>\n {isResizable && (\n <div\n className=\"bt-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${column.header}`}\n />\n )}\n </th>\n );\n}\n\nexport const TableHeaderCell = React.memo(\n TableHeaderCellInner\n) as typeof TableHeaderCellInner;\n","import React, { useCallback, useMemo } from 'react';\nimport { TableData, Column, DateFilterRange } from '../types';\nimport { useTableData, useTableFilterContext, useTableSelectionContext, useTableUI } from '../context';\nimport clsx from 'clsx';\n\n/**\n * Compact filter icon (funnel) used as visual cue inside floating inputs.\n * Rendered as an inline SVG so it inherits currentColor.\n */\nconst FilterIcon = () => (\n <svg\n className=\"bt-ff-icon\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M1.5 2h13L9.5 8.5V14l-3-1.5V8.5z\" />\n </svg>\n);\n\n/**\n * Floating filter row rendered inside <thead> — one input per filterable column.\n * Reads and writes to the same filterValues state as the FilterPanel.\n */\nfunction TableFloatingFilterInner<T extends TableData>() {\n const { visibleColumns, rowActions, expandableEnabled } = useTableData<T>();\n const { filters, setFilter } = useTableFilterContext();\n const { selectable, selectionMode } = useTableSelectionContext<T>();\n const { locale, stickyHeader } = useTableUI<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n\n // Only render if at least one column is filterable\n const hasFilterable = visibleColumns.some(\n (col) => col.filterable !== false && col.type !== 'custom'\n );\n if (!hasFilterable) return null;\n\n return (\n <tr className={clsx('bt-tr', 'bt-floating-filter-row', stickyHeader && 'bt-sticky-filter')}>\n {/* Expand column spacer */}\n {expandableEnabled && (\n <th className=\"bt-th bt-floating-filter-cell bt-expand-cell\" />\n )}\n {/* Checkbox column spacer */}\n {selectable && selectionMode === 'multiple' && (\n <th className=\"bt-th bt-floating-filter-cell bt-checkbox-cell\" />\n )}\n {selectable && selectionMode === 'single' && (\n <th className=\"bt-th bt-floating-filter-cell bt-checkbox-cell\" />\n )}\n\n {/* One filter cell per visible column */}\n {visibleColumns.map((column) => (\n <th\n key={column.id}\n className={clsx(\n 'bt-th',\n 'bt-floating-filter-cell',\n column.align && `bt-align-${column.align}`\n )}\n style={{ width: column.width }}\n >\n {column.filterable !== false && column.type !== 'custom' ? (\n <FloatingInput\n column={column}\n value={filters[column.id]}\n setFilter={setFilter}\n locale={locale}\n />\n ) : null}\n </th>\n ))}\n\n {/* Actions column spacer */}\n {hasActions && (\n <th className=\"bt-th bt-floating-filter-cell bt-actions-cell\" />\n )}\n </tr>\n );\n}\n\n/* ──────────────────────────────────────────────\n Individual floating filter input\n ────────────────────────────────────────────── */\n\ninterface FloatingInputProps<T extends TableData> {\n column: Column<T>;\n value: string | number | boolean | DateFilterRange | null | undefined;\n setFilter: (\n columnId: string,\n value: string | number | boolean | DateFilterRange | null\n ) => void;\n locale: ReturnType<typeof useTableUI>['locale'];\n}\n\nfunction FloatingInputInner<T extends TableData>({\n column,\n value,\n setFilter,\n locale,\n}: FloatingInputProps<T>) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const v = e.target.value;\n if (column.type === 'boolean') {\n if (v === '') {\n setFilter(column.id, null);\n } else {\n setFilter(column.id, v === 'true');\n }\n } else {\n setFilter(column.id, v || null);\n }\n },\n [column.id, column.type, setFilter]\n );\n\n const handleDateChange = useCallback(\n (field: 'from' | 'to', v: string) => {\n const current = (value as DateFilterRange) ?? {};\n const newRange: DateFilterRange = { ...current, [field]: v || undefined };\n setFilter(column.id, newRange);\n },\n [column.id, value, setFilter]\n );\n\n const fieldId = `bt-ff-${column.id}`;\n\n /** Whether this filter has an active (non-empty) value */\n const isActive = useMemo(() => {\n if (value === null || value === undefined) return false;\n if (typeof value === 'object') {\n const dr = value as DateFilterRange;\n return !!(dr.from || dr.to);\n }\n return value !== '';\n }, [value]);\n\n if (column.type === 'boolean') {\n return (\n <div className={clsx('bt-ff-wrapper', isActive && 'bt-ff-active')}>\n <FilterIcon />\n <select\n id={fieldId}\n name={fieldId}\n className=\"bt-floating-filter-select\"\n value={value === null || value === undefined ? '' : String(value)}\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n >\n <option value=\"\">—</option>\n <option value=\"true\">✅</option>\n <option value=\"false\">❌</option>\n </select>\n </div>\n );\n }\n\n if (column.type === 'date') {\n const dateRange = (value as DateFilterRange) ?? {};\n return (\n <div className={clsx('bt-floating-filter-dates', isActive && 'bt-ff-active')}>\n <input\n id={`${fieldId}-from`}\n name={`${fieldId}-from`}\n type=\"date\"\n className=\"bt-floating-filter-input\"\n value={dateRange.from ?? ''}\n onChange={(e) => handleDateChange('from', e.target.value)}\n aria-label={`${locale.dateFrom} ${column.header}`}\n title={locale.dateFrom}\n />\n <span className=\"bt-ff-date-sep\">–</span>\n <input\n id={`${fieldId}-to`}\n name={`${fieldId}-to`}\n type=\"date\"\n className=\"bt-floating-filter-input\"\n value={dateRange.to ?? ''}\n onChange={(e) => handleDateChange('to', e.target.value)}\n aria-label={`${locale.dateTo} ${column.header}`}\n title={locale.dateTo}\n />\n </div>\n );\n }\n\n return (\n <div className={clsx('bt-ff-wrapper', isActive && 'bt-ff-active')}>\n <FilterIcon />\n <input\n id={fieldId}\n name={fieldId}\n type={column.type === 'number' ? 'number' : 'text'}\n className=\"bt-floating-filter-input\"\n placeholder=\"...\"\n value={value !== null && value !== undefined ? String(value) : ''}\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n />\n </div>\n );\n}\n\nconst FloatingInput = React.memo(FloatingInputInner) as typeof FloatingInputInner;\n\nexport const TableFloatingFilter = React.memo(\n TableFloatingFilterInner\n) as unknown as typeof TableFloatingFilterInner;\n","\nimport { useTableData, useTableSelectionContext, useTableUI, useTableFilterContext } from '../context';\nimport { TableData } from '../types';\nimport { TableHeaderCell } from './TableHeaderCell';\nimport { TableFloatingFilter } from './TableFloatingFilter';\nimport clsx from 'clsx';\n\nfunction TableHeaderInner<T extends TableData>() {\n const { visibleColumns, rowActions, expandableEnabled } = useTableData<T>();\n const { selectable, selectionMode, isAllSelected, isPartiallySelected, selectAll, deselectAll } = useTableSelectionContext<T>();\n const { locale, stickyHeader } = useTableUI<T>();\n const { filterMode } = useTableFilterContext();\n\n const hasActions = rowActions && rowActions.length > 0;\n\n const showFloatingFilter = filterMode === 'floating' || filterMode === 'both';\n\n const handleSelectAllChange = () => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n };\n\n return (\n <thead className={clsx('bt-thead', stickyHeader && 'bt-sticky')}>\n <tr className=\"bt-tr\">\n {expandableEnabled && (\n <th className=\"bt-th bt-expand-cell\" aria-label=\"Expand\" />\n )}\n {selectable && (\n <th className=\"bt-th bt-checkbox-cell\">\n {selectionMode === 'multiple' && (\n <input\n id=\"bt-select-all\"\n name=\"bt-select-all\"\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={isAllSelected}\n ref={(el) => {\n if (el) {\n el.indeterminate = isPartiallySelected;\n }\n }}\n onChange={handleSelectAllChange}\n aria-label={isAllSelected ? locale.deselectAll : locale.selectAll}\n />\n )}\n </th>\n )}\n {visibleColumns.map((column) => (\n <TableHeaderCell key={column.id} column={column} />\n ))}\n {hasActions && (\n <th className=\"bt-th bt-actions-cell\">{locale.actions}</th>\n )}\n </tr>\n {showFloatingFilter && <TableFloatingFilter />}\n </thead>\n );\n}\n\nexport const TableHeader = TableHeaderInner;\n","/**\n * Accede a propiedades anidadas de un objeto usando dot notation\n * @param obj - Objeto del cual extraer el valor\n * @param path - Ruta al valor (e.g., 'user.profile.name')\n * @returns El valor encontrado o undefined\n */\nexport function getValueFromPath<T = unknown>(\n\tobj: Record<string, unknown>,\n\tpath: string,\n): T | undefined {\n\tif (!obj || !path) return undefined;\n\n\tconst keys = path.split(\".\");\n\tlet result: unknown = obj;\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeof result === \"object\") {\n\t\t\tresult = (result as Record<string, unknown>)[key];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn result as T;\n}\n","import { TableData, MultiSortState } from \"../types\";\nimport { getValueFromPath } from \"./getValueFromPath\";\n\n/**\n * Compara dos valores de una columna\n */\nfunction compareValues(\n\tvalueA: unknown,\n\tvalueB: unknown,\n\tdirection: \"asc\" | \"desc\",\n): number {\n\t// Manejar valores nulos/undefined\n\tif (valueA === null || valueA === undefined) {\n\t\treturn direction === \"asc\" ? 1 : -1;\n\t}\n\tif (valueB === null || valueB === undefined) {\n\t\treturn direction === \"asc\" ? -1 : 1;\n\t}\n\n\t// Comparar según tipo\n\tif (typeof valueA === \"string\" && typeof valueB === \"string\") {\n\t\tconst comparison = valueA.localeCompare(valueB, undefined, {\n\t\t\tsensitivity: \"base\",\n\t\t\tnumeric: true,\n\t\t});\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\tif (typeof valueA === \"number\" && typeof valueB === \"number\") {\n\t\treturn direction === \"asc\" ? valueA - valueB : valueB - valueA;\n\t}\n\n\tif (typeof valueA === \"boolean\" && typeof valueB === \"boolean\") {\n\t\tconst comparison = valueA === valueB ? 0 : valueA ? -1 : 1;\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\tif (valueA instanceof Date && valueB instanceof Date) {\n\t\tconst comparison = valueA.getTime() - valueB.getTime();\n\t\treturn direction === \"asc\" ? comparison : -comparison;\n\t}\n\n\t// Fallback: convertir a string y comparar\n\tconst strA = String(valueA);\n\tconst strB = String(valueB);\n\tconst comparison = strA.localeCompare(strB);\n\treturn direction === \"asc\" ? comparison : -comparison;\n}\n\n/**\n * Ordena un array de datos por una columna específica\n * @param data - Array de datos a ordenar\n * @param columnId - ID/accessor de la columna\n * @param direction - Dirección del ordenamiento\n * @returns Array ordenado (nueva referencia)\n */\nexport function sortData<T extends TableData>(\n\tdata: T[],\n\tcolumnId: string,\n\tdirection: \"asc\" | \"desc\",\n): T[] {\n\treturn [...data].sort((a, b) => {\n\t\tconst valueA = getValueFromPath(a as Record<string, unknown>, columnId);\n\t\tconst valueB = getValueFromPath(b as Record<string, unknown>, columnId);\n\t\treturn compareValues(valueA, valueB, direction);\n\t});\n}\n\n/**\n * Ordena un array de datos por múltiples columnas (multi-sort)\n * @param data - Array de datos a ordenar\n * @param sorts - Array de estados de sort en orden de prioridad\n * @returns Array ordenado (nueva referencia)\n */\nexport function multiSortData<T extends TableData>(\n\tdata: T[],\n\tsorts: MultiSortState,\n): T[] {\n\tconst activeSorts = sorts.filter((s) => s.columnId !== null);\n\tif (activeSorts.length === 0) return data;\n\n\treturn [...data].sort((a, b) => {\n\t\tfor (const sort of activeSorts) {\n\t\t\tconst valueA = getValueFromPath(\n\t\t\t\ta as Record<string, unknown>,\n\t\t\t\tsort.columnId!,\n\t\t\t);\n\t\t\tconst valueB = getValueFromPath(\n\t\t\t\tb as Record<string, unknown>,\n\t\t\t\tsort.columnId!,\n\t\t\t);\n\t\t\tconst result = compareValues(valueA, valueB, sort.direction);\n\t\t\tif (result !== 0) return result;\n\t\t}\n\t\treturn 0;\n\t});\n}\n","import { TableData, Column, FilterState, DateFilterRange } from \"../types\";\nimport { getValueFromPath } from \"./getValueFromPath\";\n\n/**\n * Normaliza un valor a Date para comparación\n */\nfunction toDate(value: unknown): Date | null {\n\tif (value instanceof Date) return value;\n\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\tconst d = new Date(value);\n\t\treturn isNaN(d.getTime()) ? null : d;\n\t}\n\treturn null;\n}\n\n/**\n * Filtra un array de datos basado en múltiples filtros de columna\n * @param data - Array de datos a filtrar\n * @param filters - Estado de filtros por columna\n * @param columns - Configuración de columnas\n * @returns Array filtrado (nueva referencia)\n */\nexport function filterData<T extends TableData>(\n\tdata: T[],\n\tfilters: FilterState,\n\tcolumns: Column<T>[],\n): T[] {\n\tconst activeFilters = Object.entries(filters).filter(\n\t\t([, value]) => value !== null && value !== undefined && value !== \"\",\n\t);\n\n\tif (activeFilters.length === 0) {\n\t\treturn data;\n\t}\n\n\treturn data.filter((row) => {\n\t\treturn activeFilters.every(([columnId, filterValue]) => {\n\t\t\tconst column = columns.find((col) => col.id === columnId);\n\t\t\tif (!column) return true;\n\n\t\t\tconst cellValue = getValueFromPath(\n\t\t\t\trow as Record<string, unknown>,\n\t\t\t\tString(column.accessor),\n\t\t\t);\n\n\t\t\tif (cellValue === null || cellValue === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst columnType = column.type ?? \"string\";\n\n\t\t\tswitch (columnType) {\n\t\t\t\tcase \"boolean\":\n\t\t\t\t\treturn cellValue === filterValue;\n\n\t\t\t\tcase \"number\":\n\t\t\t\t\treturn String(cellValue) === String(filterValue);\n\n\t\t\t\tcase \"date\": {\n\t\t\t\t\tconst cellDate = toDate(cellValue);\n\t\t\t\t\tif (!cellDate) return false;\n\n\t\t\t\t\t// Date range filter { from?, to? }\n\t\t\t\t\tif (\n\t\t\t\t\t\tfilterValue &&\n\t\t\t\t\t\ttypeof filterValue === \"object\" &&\n\t\t\t\t\t\t(\"from\" in filterValue || \"to\" in filterValue)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst range = filterValue as DateFilterRange;\n\t\t\t\t\t\tif (range.from) {\n\t\t\t\t\t\t\tconst fromDate = toDate(range.from);\n\t\t\t\t\t\t\tif (fromDate && cellDate < fromDate) return false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (range.to) {\n\t\t\t\t\t\t\tconst toDateVal = toDate(range.to);\n\t\t\t\t\t\t\tif (toDateVal) {\n\t\t\t\t\t\t\t\t// Include the entire \"to\" day\n\t\t\t\t\t\t\t\tconst endOfDay = new Date(toDateVal);\n\t\t\t\t\t\t\t\tendOfDay.setHours(23, 59, 59, 999);\n\t\t\t\t\t\t\t\tif (cellDate > endOfDay) return false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Legacy: single date value comparison\n\t\t\t\t\tconst filterDate = toDate(filterValue);\n\t\t\t\t\tif (filterDate) {\n\t\t\t\t\t\treturn cellDate.toDateString() === filterDate.toDateString();\n\t\t\t\t\t}\n\t\t\t\t\treturn String(cellValue).includes(String(filterValue));\n\t\t\t\t}\n\n\t\t\t\tcase \"string\":\n\t\t\t\tdefault:\n\t\t\t\t\treturn String(cellValue)\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes(String(filterValue).toLowerCase());\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Realiza una búsqueda global en los datos\n * @param data - Array de datos\n * @param searchValue - Valor a buscar\n * @param columns - Columnas en las que buscar\n * @param searchColumnIds - IDs de columnas específicas (opcional)\n * @returns Array filtrado\n */\nexport function searchData<T extends TableData>(\n\tdata: T[],\n\tsearchValue: string,\n\tcolumns: Column<T>[],\n\tsearchColumnIds?: string[],\n): T[] {\n\tif (!searchValue.trim()) {\n\t\treturn data;\n\t}\n\n\tconst searchLower = searchValue.toLowerCase().trim();\n\tconst columnsToSearch = searchColumnIds\n\t\t? columns.filter(\n\t\t\t\t(col) =>\n\t\t\t\t\tsearchColumnIds.includes(col.id) ||\n\t\t\t\t\tsearchColumnIds.includes(String(col.accessor)),\n\t\t\t)\n\t\t: columns.filter((col) => col.type !== \"custom\");\n\n\treturn data.filter((row) =>\n\t\tcolumnsToSearch.some((col) => {\n\t\t\tconst value = getValueFromPath(\n\t\t\t\trow as Record<string, unknown>,\n\t\t\t\tString(col.accessor),\n\t\t\t);\n\t\t\tif (value === null || value === undefined) return false;\n\t\t\treturn String(value).toLowerCase().includes(searchLower);\n\t\t}),\n\t);\n}\n","import React from 'react';\nimport { TableData, Column } from '../types';\nimport { getValueFromPath } from '../utils';\nimport { useTableUI } from '../context';\nimport clsx from 'clsx';\n\ninterface TableCellProps<T extends TableData> {\n row: T;\n column: Column<T>;\n rowIndex: number;\n}\n\nfunction TableCellInner<T extends TableData>({\n row,\n column,\n rowIndex,\n}: TableCellProps<T>) {\n const { resizable, getColumnWidth } = useTableUI<T>();\n const value = getValueFromPath(\n row as Record<string, unknown>,\n String(column.accessor)\n );\n\n const renderCellContent = () => {\n // Custom cell renderer\n if (column.cell) {\n return column.cell(value, row, rowIndex);\n }\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return <span className=\"bt-cell-empty\">—</span>;\n }\n\n // Type-based rendering\n switch (column.type) {\n case 'boolean':\n return value ? '✅' : '❌';\n\n case 'date':\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n // Try to parse string dates\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n\n case 'number':\n return typeof value === 'number' ? value.toLocaleString() : value;\n\n case 'string':\n default:\n return String(value);\n }\n };\n\n const content = renderCellContent();\n\n const effectiveWidth = resizable ? (getColumnWidth(column.id) ?? column.width) : column.width;\n\n return (\n <td\n className={clsx('bt-td', column.align && `bt-align-${column.align}`)}\n style={{ width: effectiveWidth }}\n >\n {content as React.ReactNode}\n </td>\n );\n}\n\nexport const TableCell = React.memo(TableCellInner) as typeof TableCellInner;\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TableData, RowAction } from '../types';\nimport { useTableUI } from '../context';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface MenuPosition {\n top: number;\n left: number;\n openUp: boolean;\n}\n\ninterface TableActionOverflowProps<T extends TableData> {\n /** Actions to show in the dropdown */\n actions: RowAction<T>[];\n /** Row data */\n row: T;\n /** Row index */\n rowIndex: number;\n /** Handler for action clicks */\n onActionClick: (action: RowAction<T>) => void;\n /** Direction the menu opens */\n direction?: 'up' | 'down';\n}\n\nfunction TableActionOverflowInner<T extends TableData>({\n actions,\n row,\n rowIndex: _rowIndex,\n onActionClick,\n direction = 'down',\n}: TableActionOverflowProps<T>) {\n const { locale } = useTableUI<T>();\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ top: 0, left: 0, openUp: false });\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const toggle = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsOpen((prev) => {\n if (!prev && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const shouldOpenUp = direction === 'up' || spaceBelow < 200;\n\n setPosition({\n top: shouldOpenUp ? rect.top : rect.bottom,\n left: rect.right,\n openUp: shouldOpenUp,\n });\n }\n return !prev;\n });\n }, [direction]);\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n triggerRef.current && !triggerRef.current.contains(target) &&\n menuRef.current && !menuRef.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n // Close on scroll (parent containers may move)\n useEffect(() => {\n if (!isOpen) return;\n\n const handleScroll = () => setIsOpen(false);\n window.addEventListener('scroll', handleScroll, true);\n return () => window.removeEventListener('scroll', handleScroll, true);\n }, [isOpen]);\n\n // Separate danger actions to place them at the end with a separator\n const normalActions = actions.filter((a) => a.variant !== 'danger');\n const dangerActions = actions.filter((a) => a.variant === 'danger');\n const sortedActions = [...normalActions, ...dangerActions];\n const hasDangerSeparator = normalActions.length > 0 && dangerActions.length > 0;\n const dangerStartIndex = normalActions.length;\n\n const menuStyle: React.CSSProperties = position.openUp\n ? { position: 'fixed', bottom: window.innerHeight - position.top, right: window.innerWidth - position.left }\n : { position: 'fixed', top: position.top, right: window.innerWidth - position.left };\n\n return (\n <div className=\"bt-overflow-container\">\n <button\n ref={triggerRef}\n className=\"bt-action-btn bt-overflow-trigger\"\n onClick={toggle}\n aria-label={locale.moreActions}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n title={locale.moreActions}\n type=\"button\"\n >\n <span className=\"bt-overflow-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" />\n </svg>\n </span>\n </button>\n\n {isOpen && createPortal(\n <div\n ref={menuRef}\n className={clsx(\n 'bt-overflow-menu',\n position.openUp && 'bt-overflow-menu-up'\n )}\n style={menuStyle}\n role=\"menu\"\n >\n {sortedActions.map((action, index) => {\n if (action.visible && !action.visible(row)) {\n return null;\n }\n\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n const showSeparator = hasDangerSeparator && index === dangerStartIndex;\n\n return (\n <React.Fragment key={action.id}>\n {showSeparator && <div className=\"bt-overflow-separator\" role=\"separator\" />}\n {action.mode === 'link' && action.href ? (\n <a\n href={\n typeof action.href === 'function'\n ? action.href(row)\n : action.href\n }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-overflow-item',\n action.variant === 'danger' && 'bt-overflow-item-danger'\n )}\n role=\"menuitem\"\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen(false);\n }}\n >\n <span className=\"bt-overflow-item-icon\">{icon}</span>\n <span className=\"bt-overflow-item-label\">{action.label}</span>\n </a>\n ) : (\n <button\n className={clsx(\n 'bt-overflow-item',\n action.variant === 'danger' && 'bt-overflow-item-danger'\n )}\n role=\"menuitem\"\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n onActionClick(action);\n setIsOpen(false);\n }}\n type=\"button\"\n >\n <span className=\"bt-overflow-item-icon\">{icon}</span>\n <span className=\"bt-overflow-item-label\">{action.label}</span>\n </button>\n )}\n </React.Fragment>\n );\n })}\n </div>,\n document.body\n )}\n </div>\n );\n}\n\nexport const TableActionOverflow = React.memo(\n TableActionOverflowInner\n) as typeof TableActionOverflowInner;\n","import React, { useCallback, useMemo } from 'react';\nimport { useTableData, useTableUI } from '../context';\nimport { TableData, RowAction } from '../types';\nimport { TableActionOverflow } from './TableActionOverflow';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface TableActionsProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableActionsInner<T extends TableData>({\n row,\n rowIndex,\n}: TableActionsProps<T>) {\n const { rowActions, maxVisibleActions } = useTableData<T>();\n const { openModal, closeModal } = useTableUI<T>();\n\n const handleActionClick = useCallback(\n (action: RowAction<T>) => {\n if (action.mode === 'callback' && action.onClick) {\n action.onClick(row, rowIndex);\n } else if (action.mode === 'modal' && action.modalContent) {\n const ModalContent = action.modalContent;\n openModal(\n <ModalContent\n data={row}\n onClose={closeModal}\n />\n );\n } else if (action.mode === 'link' && action.href) {\n const url = typeof action.href === 'function' ? action.href(row) : action.href;\n window.open(url, '_blank');\n }\n },\n [row, rowIndex, openModal, closeModal]\n );\n\n // Split visible actions into inline vs overflow\n const { inlineActions, overflowActions } = useMemo(() => {\n if (!rowActions) return { inlineActions: [], overflowActions: [] };\n\n const visible = rowActions.filter(\n (a) => !a.visible || a.visible(row)\n );\n\n if (visible.length <= maxVisibleActions) {\n return { inlineActions: visible, overflowActions: [] };\n }\n\n // Reserve one slot for the ⋯ trigger\n const inlineSlots = maxVisibleActions - 1;\n return {\n inlineActions: visible.slice(0, inlineSlots),\n overflowActions: visible.slice(inlineSlots),\n };\n }, [rowActions, maxVisibleActions, row]);\n\n if (!rowActions || rowActions.length === 0) {\n return null;\n }\n\n return (\n <td className=\"bt-td bt-actions-cell\">\n <div className=\"bt-actions-wrapper\">\n {inlineActions.map((action) => {\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n\n // Render as link if mode is 'link'\n if (action.mode === 'link' && action.href) {\n const url =\n typeof action.href === 'function' ? action.href(row) : action.href;\n return (\n <a\n key={action.id}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n aria-label={action.label}\n title={action.label}\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </a>\n );\n }\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n onClick={() => handleActionClick(action)}\n disabled={isDisabled}\n aria-label={action.label}\n title={action.label}\n type=\"button\"\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </button>\n );\n })}\n\n {overflowActions.length > 0 && (\n <TableActionOverflow\n actions={overflowActions}\n row={row}\n rowIndex={rowIndex}\n onActionClick={handleActionClick}\n direction=\"down\"\n />\n )}\n </div>\n </td>\n );\n}\n\nexport const TableActions = React.memo(\n TableActionsInner\n) as typeof TableActionsInner;\n","import React, { useCallback, KeyboardEvent } from 'react';\nimport { useTableData, useTableSelectionContext, useTableUI } from '../context';\nimport { TableData } from '../types';\nimport { TableCell } from './TableCell';\nimport { TableActions } from './TableActions';\nimport clsx from 'clsx';\n\ninterface TableRowProps<T extends TableData> {\n row: T;\n rowIndex: number;\n rowKey: string;\n}\n\nfunction TableRowInner<T extends TableData>({ row, rowIndex, rowKey }: TableRowProps<T>) {\n const { visibleColumns, rowActions, expandableEnabled, isExpanded, toggleExpand } = useTableData<T>();\n const { selectable, isSelected, toggleRow } = useTableSelectionContext<T>();\n const { striped, hoverable, onRowClick, onRowDoubleClick, locale } = useTableUI<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n const selected = selectable && isSelected(row, rowIndex);\n const isClickable = Boolean(onRowClick);\n const expanded = expandableEnabled && isExpanded(rowKey);\n\n const handleRowClick = useCallback(() => {\n onRowClick?.(row, rowIndex);\n }, [row, rowIndex, onRowClick]);\n\n const handleRowDoubleClick = useCallback(() => {\n onRowDoubleClick?.(row, rowIndex);\n }, [row, rowIndex, onRowDoubleClick]);\n\n const handleCheckboxChange = useCallback(() => {\n toggleRow(row, rowIndex);\n }, [row, rowIndex, toggleRow]);\n\n const handleToggleExpand = useCallback(() => {\n toggleExpand(rowKey);\n }, [rowKey, toggleExpand]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && onRowClick) {\n handleRowClick();\n }\n },\n [handleRowClick, onRowClick]\n );\n\n return (\n <tr\n className={clsx(\n 'bt-tr',\n striped && 'bt-striped',\n hoverable && 'bt-hoverable',\n selected && 'bt-selected',\n isClickable && 'bt-clickable',\n expanded && 'bt-expanded'\n )}\n onClick={isClickable ? handleRowClick : undefined}\n onDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n onKeyDown={isClickable ? handleKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n role={isClickable ? 'button' : undefined}\n aria-selected={selectable ? selected : undefined}\n aria-expanded={expandableEnabled ? expanded : undefined}\n >\n {expandableEnabled && (\n <td className=\"bt-td bt-expand-cell\">\n <button\n type=\"button\"\n className={clsx('bt-expand-button', expanded && 'bt-expand-button-expanded')}\n onClick={(e) => {\n e.stopPropagation();\n handleToggleExpand();\n }}\n aria-label={expanded ? locale.collapseRow : locale.expandRow}\n aria-expanded={expanded}\n >\n <svg\n className=\"bt-expand-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </td>\n )}\n {selectable && (\n <td className=\"bt-td bt-checkbox-cell\">\n <input\n id={`bt-row-select-${rowIndex}`}\n name={`bt-row-select-${rowIndex}`}\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={selected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select row ${rowIndex + 1}`}\n />\n </td>\n )}\n {visibleColumns.map((column) => (\n <TableCell\n key={column.id}\n row={row}\n column={column}\n rowIndex={rowIndex}\n />\n ))}\n {hasActions && <TableActions row={row} rowIndex={rowIndex} />}\n </tr>\n );\n}\n\nexport const TableRow = React.memo(TableRowInner) as typeof TableRowInner;\n","import { useTableData, useTableSelectionContext } from '../context';\nimport { TableData } from '../types';\n\ninterface TableExpandedRowProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableExpandedRowInner<T extends TableData>({ row, rowIndex }: TableExpandedRowProps<T>) {\n const { visibleColumns, rowActions, expandableRender } = useTableData<T>();\n const { selectable } = useTableSelectionContext<T>();\n\n if (!expandableRender) return null;\n\n // Calculate colspan: expand cell + selectable checkbox + visible columns + actions\n const hasActions = rowActions && rowActions.length > 0;\n const colspan = 1 + (selectable ? 1 : 0) + visibleColumns.length + (hasActions ? 1 : 0);\n\n return (\n <tr className=\"bt-tr bt-expanded-row\" role=\"row\">\n <td className=\"bt-td bt-expanded-content\" colSpan={colspan}>\n {expandableRender(row, rowIndex)}\n </td>\n </tr>\n );\n}\n\nexport const TableExpandedRow = TableExpandedRowInner;\n","import React from 'react';\nimport { useTableData } from '../context';\nimport { TableData } from '../types';\nimport { TableRow } from './TableRow';\nimport { TableExpandedRow } from './TableExpandedRow';\n\nfunction TableBodyInner<T extends TableData>() {\n const { processedData, rowKey, expandableEnabled, isExpanded } = useTableData<T>();\n\n const getRowKey = (row: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(row, index);\n }\n const keyValue = row[rowKey];\n return keyValue !== undefined ? String(keyValue) : String(index);\n };\n\n return (\n <tbody className=\"bt-tbody\">\n {processedData.map((row, index) => {\n const key = getRowKey(row, index);\n const expanded = expandableEnabled && isExpanded(key);\n return (\n <React.Fragment key={key}>\n <TableRow row={row} rowIndex={index} rowKey={key} />\n {expanded && (\n <TableExpandedRow row={row} rowIndex={index} />\n )}\n </React.Fragment>\n );\n })}\n </tbody>\n );\n}\n\n// Export without memo to preserve generic type parameter\nexport const TableBody = TableBodyInner;\n","import React, { useCallback, useMemo, KeyboardEvent, ReactNode } from 'react';\nimport { useTableData, useTableSelectionContext, useTableUI } from '../context';\nimport { TableData, RowAction } from '../types';\nimport { getValueFromPath } from '../utils';\nimport { TableActionOverflow } from './TableActionOverflow';\nimport clsx from 'clsx';\n\n/** Default icon for actions that don't define one */\nconst DEFAULT_ACTION_ICON = '📦';\n\ninterface TableCardProps<T extends TableData> {\n row: T;\n rowIndex: number;\n}\n\nfunction TableCardInner<T extends TableData>({ row, rowIndex }: TableCardProps<T>) {\n const { visibleColumns, rowActions, maxVisibleActions } = useTableData<T>();\n const { selectable, isSelected, toggleRow } = useTableSelectionContext<T>();\n const { hoverable, onRowClick, openModal, closeModal } = useTableUI<T>();\n\n const hasActions = rowActions && rowActions.length > 0;\n const selected = selectable && isSelected(row, rowIndex);\n\n // Primera columna como título\n const titleColumn = visibleColumns[0];\n const otherColumns = visibleColumns.slice(1);\n\n // Split visible actions into inline vs overflow\n const { inlineActions, overflowActions } = useMemo(() => {\n if (!rowActions) return { inlineActions: [], overflowActions: [] };\n\n const visible = rowActions.filter(\n (a) => !a.visible || a.visible(row)\n );\n\n if (visible.length <= maxVisibleActions) {\n return { inlineActions: visible, overflowActions: [] };\n }\n\n const inlineSlots = maxVisibleActions - 1;\n return {\n inlineActions: visible.slice(0, inlineSlots),\n overflowActions: visible.slice(inlineSlots),\n };\n }, [rowActions, maxVisibleActions, row]);\n\n const handleCheckboxChange = useCallback(() => {\n toggleRow(row, rowIndex);\n }, [row, rowIndex, toggleRow]);\n\n const handleCardClick = useCallback(() => {\n onRowClick?.(row, rowIndex);\n }, [row, rowIndex, onRowClick]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && onRowClick) {\n handleCardClick();\n }\n },\n [handleCardClick, onRowClick]\n );\n\n const handleActionClick = useCallback(\n (action: RowAction<T>) => {\n if (action.mode === 'callback' && action.onClick) {\n action.onClick(row, rowIndex);\n } else if (action.mode === 'modal' && action.modalContent) {\n const ModalContent = action.modalContent;\n openModal(<ModalContent data={row} onClose={closeModal} />);\n } else if (action.mode === 'link' && action.href) {\n const url = typeof action.href === 'function' ? action.href(row) : action.href;\n window.open(url, '_blank');\n }\n },\n [row, rowIndex, openModal, closeModal]\n );\n\n // Renderizar valor de celda\n const renderCellValue = (column: typeof visibleColumns[0], value: unknown): ReactNode => {\n if (column.cell) {\n return column.cell(value, row, rowIndex) as ReactNode;\n }\n\n if (value === null || value === undefined) {\n return <span className=\"bt-card-value-empty\">—</span>;\n }\n\n switch (column.type) {\n case 'boolean':\n return value ? '✅' : '❌';\n case 'date':\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n case 'number':\n return typeof value === 'number' ? value.toLocaleString() : String(value);\n default:\n return String(value);\n }\n };\n\n const titleValue = titleColumn\n ? getValueFromPath(row as Record<string, unknown>, String(titleColumn.accessor))\n : '';\n\n return (\n <div\n className={clsx(\n 'bt-card',\n hoverable && 'bt-hoverable',\n selected && 'bt-selected',\n onRowClick && 'bt-clickable'\n )}\n onClick={onRowClick ? handleCardClick : undefined}\n onKeyDown={onRowClick ? handleKeyDown : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n role={onRowClick ? 'button' : undefined}\n aria-selected={selectable ? selected : undefined}\n >\n {/* Header con checkbox y título */}\n <div className=\"bt-card-header\">\n {selectable && (\n <input\n id={`bt-card-select-${rowIndex}`}\n name={`bt-card-select-${rowIndex}`}\n type=\"checkbox\"\n className=\"bt-checkbox\"\n checked={selected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select row ${rowIndex + 1}`}\n />\n )}\n <span className=\"bt-card-title\">\n {titleColumn \n ? (renderCellValue(titleColumn, titleValue) as React.ReactNode)\n : `Item ${rowIndex + 1}`}\n </span>\n </div>\n\n {/* Otras columnas */}\n {otherColumns.map((column) => {\n const value = getValueFromPath(\n row as Record<string, unknown>,\n String(column.accessor)\n );\n const cellContent = renderCellValue(column, value);\n\n return (\n <div key={column.id} className=\"bt-card-row\">\n <span className=\"bt-card-label\">{column.header}</span>\n <span className=\"bt-card-value\">{cellContent as React.ReactNode}</span>\n </div>\n );\n })}\n\n {/* Acciones */}\n {hasActions && (\n <div className=\"bt-card-actions\">\n {inlineActions.map((action) => {\n const isDisabled = action.disabled ? action.disabled(row) : false;\n const icon = action.icon ?? DEFAULT_ACTION_ICON;\n\n if (action.mode === 'link' && action.href) {\n const url =\n typeof action.href === 'function' ? action.href(row) : action.href;\n return (\n <a\n key={action.id}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n aria-label={action.label}\n title={action.label}\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </a>\n );\n }\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-action-btn bt-action-icon-only',\n action.variant && `bt-variant-${action.variant}`\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleActionClick(action);\n }}\n disabled={isDisabled}\n aria-label={action.label}\n title={action.label}\n type=\"button\"\n >\n <span className=\"bt-action-icon\">{icon}</span>\n </button>\n );\n })}\n\n {overflowActions.length > 0 && (\n <TableActionOverflow\n actions={overflowActions}\n row={row}\n rowIndex={rowIndex}\n onActionClick={handleActionClick}\n direction=\"up\"\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const TableCard = React.memo(TableCardInner) as typeof TableCardInner;\n","import { useTableData } from '../context';\nimport { TableData } from '../types';\nimport { TableCard } from './TableCard';\n\nfunction TableCardsInner<T extends TableData>() {\n const { processedData, rowKey } = useTableData<T>();\n\n const getRowKey = (row: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(row, index);\n }\n const keyValue = row[rowKey];\n return keyValue !== undefined ? String(keyValue) : String(index);\n };\n\n return (\n <div className=\"bt-cards\">\n {processedData.map((row, index) => (\n <TableCard key={getRowKey(row, index)} row={row} rowIndex={index} />\n ))}\n </div>\n );\n}\n\nexport const TableCards = TableCardsInner;\n","import React, { useCallback } from 'react';\nimport { TableData, Column, DateFilterRange } from '../types';\nimport { useTableUI, useTableFilterContext } from '../context';\nimport clsx from 'clsx';\n\n/* Inline SVG funnel icon — matches floating filter pattern */\nfunction PanelFilterIcon() {\n return (\n <svg className=\"bt-fp-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1.5 2H10.5L7 5.87V9.5L5 8.5V5.87L1.5 2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\ninterface TableFilterPanelProps {\n open: boolean;\n}\n\nfunction TableFilterPanelInner<T extends TableData>({\n open,\n}: TableFilterPanelProps) {\n const { columns, locale } = useTableUI<T>();\n const { filters, setFilter, clearFilter, clearFilters } = useTableFilterContext();\n\n const filterableColumns = columns.filter(\n (col) => col.filterable !== false && col.type !== 'custom' && !col.hidden\n );\n\n if (!open || filterableColumns.length === 0) {\n return null;\n }\n\n const activeFilterCount = Object.keys(filters).length;\n\n return (\n <div className=\"bt-filter-panel\" role=\"region\" aria-label={locale.filterBy}>\n <div className=\"bt-filter-panel-grid\">\n {filterableColumns.map((column) => (\n <FilterField\n key={column.id}\n column={column}\n value={filters[column.id]}\n setFilter={setFilter}\n clearFilter={clearFilter}\n locale={locale}\n />\n ))}\n </div>\n\n {activeFilterCount > 0 && (\n <div className=\"bt-filter-panel-footer\">\n <button\n className=\"bt-filter-panel-clear\"\n onClick={clearFilters}\n type=\"button\"\n >\n {locale.clearFilters}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ──────────────────────────────────────────────\n Individual filter field\n ────────────────────────────────────────────── */\n\ninterface FilterFieldProps<T extends TableData> {\n column: Column<T>;\n value: string | number | boolean | DateFilterRange | null | undefined;\n setFilter: (\n columnId: string,\n value: string | number | boolean | DateFilterRange | null\n ) => void;\n clearFilter: (columnId: string) => void;\n locale: ReturnType<typeof useTableUI>['locale'];\n}\n\nfunction FilterFieldInner<T extends TableData>({\n column,\n value,\n setFilter,\n locale,\n}: FilterFieldProps<T>) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const v = e.target.value;\n if (column.type === 'boolean') {\n if (v === '') {\n setFilter(column.id, null);\n } else {\n setFilter(column.id, v === 'true');\n }\n } else {\n setFilter(column.id, v || null);\n }\n },\n [column.id, column.type, setFilter]\n );\n\n const handleDateChange = useCallback(\n (field: 'from' | 'to', v: string) => {\n const current = (value as DateFilterRange) ?? {};\n const newRange: DateFilterRange = { ...current, [field]: v || undefined };\n setFilter(column.id, newRange);\n },\n [column.id, value, setFilter]\n );\n\n const hasValue =\n value !== null && value !== undefined && value !== '';\n\n // For date: check if at least one field is set\n const isDateActive =\n hasValue &&\n typeof value === 'object' &&\n ('from' in value || 'to' in value) &&\n Boolean((value as DateFilterRange).from || (value as DateFilterRange).to);\n\n const isActive = column.type === 'date' ? isDateActive : hasValue;\n\n const renderInput = () => {\n const fieldId = `bt-filter-${column.id}`;\n\n if (column.type === 'boolean') {\n return (\n <div className={clsx('bt-fp-wrapper', isActive && 'bt-fp-active')}>\n <PanelFilterIcon />\n <select\n id={fieldId}\n name={fieldId}\n className=\"bt-filter-select\"\n value={\n value === null || value === undefined ? '' : String(value)\n }\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n >\n <option value=\"\">—</option>\n <option value=\"true\">✅</option>\n <option value=\"false\">❌</option>\n </select>\n </div>\n );\n }\n\n if (column.type === 'date') {\n const dateRange = (value as DateFilterRange) ?? {};\n return (\n <div className={clsx('bt-fp-wrapper bt-filter-field-dates', isActive && 'bt-fp-active')}>\n <input\n id={`${fieldId}-from`}\n name={`${fieldId}-from`}\n type=\"date\"\n className=\"bt-filter-input\"\n value={dateRange.from ?? ''}\n onChange={(e) => handleDateChange('from', e.target.value)}\n aria-label={`${locale.dateFrom} ${column.header}`}\n placeholder={locale.dateFrom}\n />\n <span className=\"bt-filter-field-separator\">–</span>\n <input\n id={`${fieldId}-to`}\n name={`${fieldId}-to`}\n type=\"date\"\n className=\"bt-filter-input\"\n value={dateRange.to ?? ''}\n onChange={(e) => handleDateChange('to', e.target.value)}\n aria-label={`${locale.dateTo} ${column.header}`}\n placeholder={locale.dateTo}\n />\n </div>\n );\n }\n\n return (\n <div className={clsx('bt-fp-wrapper', isActive && 'bt-fp-active')}>\n <PanelFilterIcon />\n <input\n id={fieldId}\n name={fieldId}\n type={column.type === 'number' ? 'number' : 'text'}\n className=\"bt-filter-input\"\n placeholder=\"...\"\n value={\n value !== null && value !== undefined ? String(value) : ''\n }\n onChange={handleChange}\n aria-label={`${locale.filterBy} ${column.header}`}\n />\n </div>\n );\n };\n\n return (\n <div className={clsx('bt-filter-field', isActive && 'bt-filter-field-active')}>\n <label className=\"bt-filter-field-label\" htmlFor={`bt-filter-${column.id}`}>{column.header}</label>\n {renderInput()}\n </div>\n );\n}\n\nconst FilterField = React.memo(FilterFieldInner) as typeof FilterFieldInner;\n\nexport const TableFilterPanel = React.memo(\n TableFilterPanelInner\n) as typeof TableFilterPanelInner;\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useTableUI } from '../context';\nimport { TableData } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG icons */\nfunction ColumnsIcon() {\n return (\n <svg className=\"bt-columns-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"4\" height=\"10\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <rect x=\"8.5\" y=\"2\" width=\"4\" height=\"10\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction TableColumnVisibilityInner<T extends TableData>() {\n const {\n columns,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n locale,\n columnVisibilityEnabled,\n } = useTableUI<T>();\n\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const hiddenCount = hiddenColumnIds.size;\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [open]);\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => !prev);\n }, []);\n\n if (!columnVisibilityEnabled) return null;\n\n // Only show toggleable columns (not custom type or columns that shouldn't be toggled)\n const toggleableColumns = columns.filter((col) => col.type !== 'custom');\n\n return (\n <div className=\"bt-column-visibility\" ref={containerRef}>\n <button\n ref={buttonRef}\n className={clsx('bt-column-visibility-btn', open && 'bt-column-visibility-btn-active')}\n onClick={handleToggle}\n aria-expanded={open}\n aria-haspopup=\"true\"\n aria-label={locale.columns}\n title={locale.columns}\n type=\"button\"\n >\n <ColumnsIcon />\n <span className=\"bt-column-visibility-label\">{locale.columns}</span>\n {hiddenCount > 0 && (\n <span className=\"bt-column-visibility-badge\">{hiddenCount}</span>\n )}\n </button>\n\n {open && (\n <div className=\"bt-column-visibility-dropdown\" role=\"menu\">\n <div className=\"bt-column-visibility-header\">\n <span className=\"bt-column-visibility-title\">{locale.columns}</span>\n {hiddenCount > 0 && (\n <button\n className=\"bt-column-visibility-show-all\"\n onClick={showAllColumns}\n type=\"button\"\n >\n {locale.showAllColumns}\n </button>\n )}\n </div>\n <div className=\"bt-column-visibility-list\">\n {toggleableColumns.map((column) => {\n const visible = isColumnVisible(column.id);\n return (\n <button\n key={column.id}\n className={clsx(\n 'bt-column-visibility-item',\n !visible && 'bt-column-visibility-item-hidden'\n )}\n onClick={() => toggleColumn(column.id)}\n role=\"menuitemcheckbox\"\n aria-checked={visible}\n type=\"button\"\n >\n <span className={clsx('bt-column-visibility-check', visible && 'bt-column-visibility-check-active')}>\n {visible && <CheckIcon />}\n </span>\n <span className=\"bt-column-visibility-item-label\">{column.header}</span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const TableColumnVisibility = TableColumnVisibilityInner;\n","import React, { useMemo, useCallback } from 'react';\nimport { useTablePaginationContext, useTableUI } from '../context';\n\n/* Inline SVG chevron icons for pagination */\nfunction ChevronLeftIcon() {\n return (\n <svg className=\"bt-pagination-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M9 3L5 7L9 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg className=\"bt-pagination-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function TablePagination() {\n const {\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n paginationEnabled,\n pageSizeOptions,\n showSizeChanger,\n } = useTablePaginationContext();\n const { locale, classNames } = useTableUI();\n\n const handlePageSizeChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n changePageSize(Number(e.target.value));\n },\n [changePageSize]\n );\n\n const handleQuickJump = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const value = parseInt((e.target as HTMLInputElement).value, 10);\n if (!isNaN(value) && value >= 1 && value <= totalPages) {\n goToPage(value);\n }\n }\n },\n [goToPage, totalPages]\n );\n\n // Generate page numbers to show\n const pageNumbers = useMemo(() => {\n const pages: (number | 'ellipsis')[] = [];\n const maxVisiblePages = 5;\n\n if (totalPages <= maxVisiblePages) {\n // Show all pages\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n\n if (page > 3) {\n pages.push('ellipsis');\n }\n\n // Pages around current\n const start = Math.max(2, page - 1);\n const end = Math.min(totalPages - 1, page + 1);\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n if (page < totalPages - 2) {\n pages.push('ellipsis');\n }\n\n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!paginationEnabled) {\n return null;\n }\n\n return (\n <div className={`bt-pagination ${classNames.pagination || ''}`}>\n <div className=\"bt-pagination-info\">\n {totalItems > 0\n ? `${startIndex}-${endIndex} ${locale.of} ${totalItems} ${locale.items}`\n : `0 ${locale.items}`}\n </div>\n\n <div className=\"bt-pagination-controls\">\n {showSizeChanger && (\n <div className=\"bt-page-size\">\n <label className=\"bt-page-size-label\" htmlFor=\"bt-page-size\">{locale.rowsPerPage}:</label>\n <select\n id=\"bt-page-size\"\n name=\"bt-page-size\"\n className=\"bt-page-size-select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label={locale.rowsPerPage}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n\n <button\n className=\"bt-pagination-btn\"\n onClick={prevPage}\n disabled={!hasPrevPage}\n aria-label={locale.previousPage}\n type=\"button\"\n >\n <ChevronLeftIcon />\n </button>\n\n <div className=\"bt-pagination-pages\">\n {pageNumbers.map((pageNum, idx) => {\n if (pageNum === 'ellipsis') {\n return (\n <span key={`ellipsis-${idx}`} className=\"bt-pagination-ellipsis\">\n ...\n </span>\n );\n }\n return (\n <button\n key={pageNum}\n className={`bt-pagination-btn ${page === pageNum ? 'bt-active' : ''}`}\n onClick={() => goToPage(pageNum)}\n aria-label={`${locale.page} ${pageNum}`}\n aria-current={page === pageNum ? 'page' : undefined}\n type=\"button\"\n >\n {pageNum}\n </button>\n );\n })}\n </div>\n\n <button\n className=\"bt-pagination-btn\"\n onClick={nextPage}\n disabled={!hasNextPage}\n aria-label={locale.nextPage}\n type=\"button\"\n >\n <ChevronRightIcon />\n </button>\n\n <div className=\"bt-quick-jumper\">\n <label className=\"bt-quick-jumper-label\" htmlFor=\"bt-quick-jumper\">{locale.page}:</label>\n <div className=\"bt-qj-wrapper\">\n <input\n id=\"bt-quick-jumper\"\n name=\"bt-quick-jumper\"\n key={page}\n type=\"number\"\n className=\"bt-quick-jumper-input\"\n min={1}\n max={totalPages}\n defaultValue={page}\n onKeyDown={handleQuickJump}\n aria-label={locale.jumpToPage}\n />\n <span className=\"bt-qj-hint\" aria-hidden=\"true\">↵</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\n\n/**\n * Hook that tracks a CSS media query match state.\n * SSR-safe: returns `false` during server rendering and hydrates on mount.\n *\n * @param query - CSS media query string, e.g. `'(max-width: 640px)'`\n * @returns `true` when the viewport matches the query\n */\nexport function useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState<boolean>(() => {\n\t\tif (typeof window === \"undefined\") return false;\n\t\treturn window.matchMedia(query).matches;\n\t});\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst mql = window.matchMedia(query);\n\t\t// Sync in case initial state diverged (SSR hydration)\n\t\tsetMatches(mql.matches);\n\n\t\tconst handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\t\tmql.addEventListener(\"change\", handler);\n\t\treturn () => mql.removeEventListener(\"change\", handler);\n\t}, [query]);\n\n\treturn matches;\n}\n","import React, { useCallback, useState, useRef, useEffect } from 'react';\nimport { useTableFilterContext, useTableSelectionContext, useTableData, useTableUI } from '../context';\nimport { useMediaQuery } from '../hooks/useMediaQuery';\nimport { TableColumnVisibility } from './TableColumnVisibility';\nimport { TableData } from '../types';\nimport clsx from 'clsx';\n\n/* Inline SVG icons */\nfunction SearchIcon() {\n return (\n <svg className=\"bt-search-svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg className=\"bt-clear-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 3L9 9M9 3L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg className=\"bt-check-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg className=\"bt-filter-toggle-svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M1 2.5H11L7.5 6.5V10L4.5 9V6.5L1 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction TableToolbarInner<T extends TableData>() {\n const {\n searchable,\n searchValue,\n handleSearch,\n clearSearch,\n filters,\n filterPanelOpen,\n toggleFilterPanel,\n hasFilterableColumns,\n filterMode,\n } = useTableFilterContext();\n const { selectable, selectedRows, selectedCount, deselectAll } = useTableSelectionContext<T>();\n const { data, globalActions } = useTableData<T>();\n const { locale, classNames, columnVisibilityEnabled } = useTableUI<T>();\n\n const isMobile = useMediaQuery('(max-width: 640px)');\n const [searchExpanded, setSearchExpanded] = useState(false);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const activeFilterCount = Object.keys(filters).length;\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n handleSearch(e.target.value);\n },\n [handleSearch]\n );\n\n const toggleSearch = useCallback(() => {\n setSearchExpanded((prev) => {\n if (!prev) {\n // Focus input after expanding\n setTimeout(() => searchInputRef.current?.focus(), 50);\n } else {\n // Clear search when collapsing\n if (searchValue) clearSearch();\n }\n return !prev;\n });\n }, [searchValue, clearSearch]);\n\n // Keep search expanded if there's a value\n useEffect(() => {\n if (searchValue && !searchExpanded) {\n setSearchExpanded(true);\n }\n }, [searchValue, searchExpanded]);\n\n const showFilterPanelToggle = hasFilterableColumns && (filterMode === 'panel' || filterMode === 'both');\n\n const hasToolbar =\n searchable || showFilterPanelToggle || columnVisibilityEnabled || (globalActions && globalActions.length > 0) || (selectable && selectedCount > 0);\n\n if (!hasToolbar) {\n return null;\n }\n\n // On mobile, collapse search to icon button\n const showCollapsedSearch = isMobile && searchable && !searchExpanded;\n const showExpandedSearch = searchable && (!isMobile || searchExpanded);\n\n return (\n <div className={clsx('bt-toolbar', classNames.toolbar)}>\n <div className=\"bt-toolbar-left\">\n {showCollapsedSearch && (\n <button\n className=\"bt-search-toggle\"\n onClick={toggleSearch}\n aria-label={locale.search}\n title={locale.search}\n type=\"button\"\n >\n <SearchIcon />\n </button>\n )}\n\n {showExpandedSearch && (\n <div className={clsx('bt-search', isMobile && 'bt-search-mobile')}>\n <span className=\"bt-search-icon\"><SearchIcon /></span>\n <input\n id=\"bt-search\"\n name=\"bt-search\"\n ref={searchInputRef}\n type=\"text\"\n className=\"bt-search-input\"\n placeholder={locale.searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n aria-label={locale.search}\n />\n {(searchValue || isMobile) && (\n <button\n className=\"bt-search-clear\"\n onClick={isMobile ? toggleSearch : clearSearch}\n aria-label={locale.clearSearch}\n type=\"button\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n )}\n\n {showFilterPanelToggle && (\n <button\n className={clsx(\n 'bt-filter-toggle',\n filterPanelOpen && 'bt-filter-toggle-active'\n )}\n onClick={toggleFilterPanel}\n aria-expanded={filterPanelOpen}\n aria-label={locale.filterBy}\n title={locale.filterBy}\n type=\"button\"\n >\n <span className=\"bt-filter-toggle-icon\"><FilterIcon /></span>\n {!isMobile && <span>{locale.filterBy}</span>}\n {activeFilterCount > 0 && (\n <span className=\"bt-filter-toggle-badge\">{activeFilterCount}</span>\n )}\n </button>\n )}\n\n <TableColumnVisibility />\n\n {selectable && selectedCount > 0 && (\n <div className=\"bt-selection-info\">\n <CheckIcon />\n <span className=\"bt-selection-count\">\n {selectedCount} {isMobile ? 'sel.' : locale.selected}\n </span>\n <button\n className=\"bt-selection-clear\"\n onClick={deselectAll}\n type=\"button\"\n >\n {isMobile ? <ClearIcon /> : locale.deselectAll}\n </button>\n </div>\n )}\n </div>\n\n {globalActions && globalActions.length > 0 && (\n <div className=\"bt-toolbar-right\">\n <div className=\"bt-global-actions\">\n {globalActions.map((action) => {\n const isDisabled =\n action.requiresSelection && selectedRows.length === 0;\n\n return (\n <button\n key={action.id}\n className={clsx(\n 'bt-global-btn',\n action.variant && `bt-variant-${action.variant}`,\n isMobile && 'bt-global-btn-mobile'\n )}\n onClick={() => action.onClick(selectedRows, data)}\n disabled={isDisabled}\n title={action.label}\n aria-label={action.label}\n type=\"button\"\n >\n {action.icon && (\n <span className=\"bt-global-icon\">{action.icon}</span>\n )}\n {!isMobile && <span>{action.label}</span>}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const TableToolbar = TableToolbarInner;\n","import { useTableUI, useTableData, useTableSelectionContext } from '../context';\n\n/* Inline SVG empty-box illustration */\nfunction EmptyIcon() {\n return (\n <svg className=\"bt-empty-svg\" width=\"64\" height=\"64\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <rect x=\"12\" y=\"18\" width=\"40\" height=\"32\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.3\" />\n <path d=\"M12 28H52\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" />\n <path d=\"M24 38H40\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" opacity=\"0.4\" />\n <path d=\"M28 44H36\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" opacity=\"0.25\" />\n <circle cx=\"32\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" />\n </svg>\n );\n}\n\nexport function TableEmpty() {\n const { locale, emptyComponent } = useTableUI();\n const { visibleColumns, rowActions } = useTableData();\n const { selectable } = useTableSelectionContext();\n\n const hasActions = rowActions && rowActions.length > 0;\n const colSpan = visibleColumns.length + (selectable ? 1 : 0) + (hasActions ? 1 : 0);\n\n if (emptyComponent) {\n return (\n <tbody className=\"bt-tbody\">\n <tr className=\"bt-tr\">\n <td className=\"bt-td\" colSpan={colSpan}>\n {emptyComponent}\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody className=\"bt-tbody\">\n <tr className=\"bt-tr\">\n <td className=\"bt-td\" colSpan={colSpan}>\n <div className=\"bt-empty\">\n <div className=\"bt-empty-icon\"><EmptyIcon /></div>\n <div className=\"bt-empty-text\">{locale.noData}</div>\n </div>\n </td>\n </tr>\n </tbody>\n );\n}\n","import { useTableUI } from '../context';\n\nexport function TableLoading() {\n const { locale, loadingComponent } = useTableUI();\n\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n\n return (\n <div className=\"bt-loading\">\n <div className=\"bt-loading-spinner\" aria-hidden=\"true\" />\n <span className=\"bt-loading-text\">{locale.loading}</span>\n </div>\n );\n}\n\ninterface TableLoadingOverlayProps {\n show: boolean;\n}\n\nexport function TableLoadingOverlay({ show }: TableLoadingOverlayProps) {\n const { loadingComponent, locale } = useTableUI();\n\n if (!show) return null;\n\n return (\n <div className=\"bt-loading-overlay\" role=\"status\" aria-live=\"polite\">\n {loadingComponent || (\n <>\n <div className=\"bt-loading-spinner\" aria-hidden=\"true\" />\n <span className=\"bt-loading-text\">{locale.loading}</span>\n </>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useCallback } from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]:not([disabled]):not([tabindex=\"-1\"])',\n 'button:not([disabled]):not([tabindex=\"-1\"])',\n 'input:not([disabled]):not([tabindex=\"-1\"])',\n 'select:not([disabled]):not([tabindex=\"-1\"])',\n 'textarea:not([disabled]):not([tabindex=\"-1\"])',\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n].join(', ');\n\n/**\n * Traps focus within a container element while active.\n * On activate: stores previously focused element and focuses first focusable child.\n * On deactivate: restores focus to the previously focused element.\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n isActive: boolean\n) {\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n const getFocusableElements = useCallback((): HTMLElement[] => {\n if (!containerRef.current) return [];\n return Array.from(containerRef.current.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n }, [containerRef]);\n\n // Activate / deactivate focus trap\n useEffect(() => {\n if (!isActive) return;\n\n // Store the element that had focus before the trap activated\n previouslyFocusedRef.current = document.activeElement as HTMLElement;\n\n // Focus the first focusable element inside the container\n const focusFirst = () => {\n const focusable = getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n };\n\n // Small delay to ensure the container is rendered\n const timerId = setTimeout(focusFirst, 0);\n\n return () => {\n clearTimeout(timerId);\n // Restore focus when trap deactivates\n if (previouslyFocusedRef.current && typeof previouslyFocusedRef.current.focus === 'function') {\n previouslyFocusedRef.current.focus();\n }\n };\n }, [isActive, getFocusableElements]);\n\n // Handle Tab/Shift+Tab cycling\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusable = getFocusableElements();\n if (focusable.length === 0) return;\n\n const firstElement = focusable[0];\n const lastElement = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n // Shift+Tab: if on first element, wrap to last\n if (document.activeElement === firstElement) {\n e.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: if on last element, wrap to first\n if (document.activeElement === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, getFocusableElements]);\n}\n","import React, { useEffect, useCallback, useRef } from 'react';\nimport { useTableUI } from '../context';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\n\n/* Inline SVG close icon */\nfunction CloseIcon() {\n return (\n <svg className=\"bt-modal-close-svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 4L12 12M12 4L4 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function TableModal() {\n const { isModalOpen, modalContent, closeModal, locale } = useTableUI();\n const modalRef = useRef<HTMLDivElement>(null);\n\n useFocusTrap(modalRef, isModalOpen);\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n closeModal();\n }\n },\n [closeModal]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n }\n },\n [closeModal]\n );\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.overflow = '';\n };\n }, [isModalOpen, handleKeyDown]);\n\n if (!isModalOpen || !modalContent) {\n return null;\n }\n\n return (\n <div\n className=\"bt-modal-backdrop\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div className=\"bt-modal bt-modal-md\" ref={modalRef}>\n <div className=\"bt-modal-header\">\n <h2 className=\"bt-modal-title\">{locale.details}</h2>\n <button\n className=\"bt-modal-close\"\n onClick={closeModal}\n aria-label={locale.closeModal}\n type=\"button\"\n >\n <CloseIcon />\n </button>\n </div>\n <div className=\"bt-modal-body\">{modalContent}</div>\n </div>\n </div>\n );\n}\n","import { useTableData } from '../context';\nimport { TableData } from '../types';\nimport { TableRow } from './TableRow';\n\ninterface TableVirtualBodyProps {\n startIndex: number;\n endIndex: number;\n totalHeight: number;\n offsetTop: number;\n}\n\nfunction TableVirtualBodyInner<T extends TableData>({\n startIndex,\n endIndex,\n totalHeight,\n offsetTop,\n}: TableVirtualBodyProps) {\n const { processedData, rowKey } = useTableData<T>();\n\n const getRowKey = (row: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(row, index);\n }\n const keyValue = row[rowKey];\n return keyValue !== undefined ? String(keyValue) : String(index);\n };\n\n const visibleRows = processedData.slice(startIndex, endIndex);\n const bottomHeight = totalHeight - offsetTop - (visibleRows.length * (totalHeight / processedData.length));\n\n return (\n <tbody className=\"bt-tbody\">\n {/* Spacer row for content above visible area */}\n {offsetTop > 0 && (\n <tr aria-hidden=\"true\">\n <td style={{ height: offsetTop, padding: 0, border: 'none' }} />\n </tr>\n )}\n\n {/* Visible rows */}\n {visibleRows.map((row, i) => {\n const actualIndex = startIndex + i;\n return (\n <TableRow\n key={getRowKey(row, actualIndex)}\n row={row}\n rowIndex={actualIndex}\n rowKey={getRowKey(row, actualIndex)}\n />\n );\n })}\n\n {/* Spacer row for content below visible area */}\n {bottomHeight > 0 && (\n <tr aria-hidden=\"true\">\n <td style={{ height: bottomHeight, padding: 0, border: 'none' }} />\n </tr>\n )}\n </tbody>\n );\n}\n\nexport const TableVirtualBody = TableVirtualBodyInner;\n","import { ReactNode, CSSProperties } from \"react\";\n\n/**\n * Tipo base para los datos de la tabla\n * Permite extensión con tipos específicos del usuario\n */\nexport type TableData = Record<string, unknown>;\n\n/**\n * Configuración de columna con tipado genérico\n */\nexport interface Column<T extends TableData = TableData> {\n\t/** Identificador único de la columna */\n\tid: string;\n\t/** Key para acceder al dato (soporta dot notation: 'user.profile.name') */\n\taccessor: keyof T | string;\n\t/** Texto visible en el header */\n\theader: string;\n\t/** Tipo de dato para filtrado y renderizado */\n\ttype?: \"string\" | \"number\" | \"boolean\" | \"date\" | \"custom\";\n\t/** Render personalizado de celda */\n\tcell?: (value: unknown, row: T, rowIndex: number) => ReactNode;\n\t/** Render personalizado de header */\n\theaderCell?: (column: Column<T>) => ReactNode;\n\t/** ¿Columna ordenable? */\n\tsortable?: boolean;\n\t/** ¿Columna filtrable? */\n\tfilterable?: boolean;\n\t/** Ancho de columna */\n\twidth?: string | number;\n\t/** Ancho mínimo de columna en px (default: 50) */\n\tminWidth?: number;\n\t/** Ancho máximo de columna en px */\n\tmaxWidth?: number;\n\t/** Whether this column can be resized (default: inherits from table-level resizable) */\n\tresizable?: boolean;\n\t/** Alineación del contenido */\n\talign?: \"left\" | \"center\" | \"right\";\n\t/** Columna oculta */\n\thidden?: boolean;\n}\n\n/**\n * Acción de fila individual\n */\nexport interface RowAction<T extends TableData = TableData> {\n\t/** Identificador único */\n\tid: string;\n\t/** Etiqueta de la acción */\n\tlabel: string;\n\t/** Icono (string, emoji, o componente) */\n\ticon?: ReactNode;\n\t/** Modo de ejecución */\n\tmode: \"callback\" | \"modal\" | \"link\";\n\t/** Callback cuando mode='callback' */\n\tonClick?: (row: T, rowIndex: number) => void;\n\t/** Componente para modal cuando mode='modal' */\n\tmodalContent?: React.ComponentType<{ data: T; onClose: () => void }>;\n\t/** URL cuando mode='link' */\n\thref?: string | ((row: T) => string);\n\t/** ¿Mostrar acción condicionalmente? */\n\tvisible?: (row: T) => boolean;\n\t/** ¿Deshabilitar acción condicionalmente? */\n\tdisabled?: (row: T) => boolean;\n\t/** Variante visual */\n\tvariant?: \"default\" | \"primary\" | \"danger\" | \"ghost\";\n}\n\n/**\n * Acción global (toolbar)\n */\nexport interface GlobalAction<T extends TableData = TableData> {\n\t/** Identificador único */\n\tid: string;\n\t/** Etiqueta del botón */\n\tlabel: string;\n\t/** Icono */\n\ticon?: ReactNode;\n\t/** Callback de ejecución */\n\tonClick: (selectedRows: T[], allData: T[]) => void;\n\t/** ¿Requiere selección de filas? */\n\trequiresSelection?: boolean;\n\t/** Variante visual */\n\tvariant?: \"default\" | \"primary\" | \"danger\";\n}\n\n/**\n * Configuración de paginación\n */\nexport interface PaginationConfig {\n\t/** Página actual (controlado) */\n\tpage?: number;\n\t/** Items por página */\n\tpageSize?: number;\n\t/** Opciones de tamaño de página */\n\tpageSizeOptions?: number[];\n\t/** Total de items (para paginación del servidor) */\n\ttotalItems?: number;\n\t/** Mostrar selector de tamaño de página */\n\tshowSizeChanger?: boolean;\n\t/** Mostrar salto a página */\n\tshowQuickJumper?: boolean;\n}\n\n/**\n * Configuration for expandable rows\n */\nexport interface ExpandableConfig<T extends TableData = TableData> {\n\t/** Render function for the expanded row content */\n\trender: (row: T, rowIndex: number) => ReactNode;\n\t/** Whether only one row can be expanded at a time (default: false) */\n\taccordion?: boolean;\n}\n\n/**\n * Estado de ordenamiento\n */\nexport interface SortState {\n\tcolumnId: string | null;\n\tdirection: \"asc\" | \"desc\";\n}\n\n/**\n * Estado de multi-sort (array de sort states en orden de prioridad)\n */\nexport type MultiSortState = SortState[];\n\n/**\n * Rango de fechas para filtros tipo date\n */\nexport interface DateFilterRange {\n\tfrom?: string;\n\tto?: string;\n}\n\n/**\n * Estado de filtros\n */\nexport interface FilterState {\n\t[columnId: string]: string | number | boolean | DateFilterRange | null;\n}\n\n/**\n * Personalización de estilos\n */\nexport interface TableClassNames {\n\t/** Clase CSS del contenedor */\n\tcontainer?: string;\n\t/** Clase CSS de la tabla */\n\ttable?: string;\n\t/** Clase CSS del header */\n\theader?: string;\n\t/** Clase CSS del body */\n\tbody?: string;\n\t/** Clase CSS de filas */\n\trow?: string;\n\t/** Clase CSS de celdas */\n\tcell?: string;\n\t/** Clase CSS de la paginación */\n\tpagination?: string;\n\t/** Clase CSS del toolbar */\n\ttoolbar?: string;\n}\n\n/**\n * Textos personalizables (i18n)\n */\nexport interface TableLocale {\n\tsearch?: string;\n\tsearchPlaceholder?: string;\n\tnoData?: string;\n\tloading?: string;\n\tpage?: string;\n\tof?: string;\n\titems?: string;\n\tselected?: string;\n\trowsPerPage?: string;\n\tactions?: string;\n\tsortAsc?: string;\n\tsortDesc?: string;\n\tfilterBy?: string;\n\tclearFilters?: string;\n\tdateFrom?: string;\n\tdateTo?: string;\n\tselectAll?: string;\n\tdeselectAll?: string;\n\tmoreActions?: string;\n\tclearSearch?: string;\n\tcloseModal?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tjumpToPage?: string;\n\tdetails?: string;\n\tcolumns?: string;\n\tshowAllColumns?: string;\n\thideColumn?: string;\n\tsortPriority?: string;\n\tclearSort?: string;\n\t/** aria-live announcements */\n\tresultsFound?: string;\n\tnoResultsFound?: string;\n\trowsSelected?: string;\n\t/** Expandable rows */\n\texpandRow?: string;\n\tcollapseRow?: string;\n}\n\n/**\n * Locale por defecto (Inglés)\n */\nexport const defaultLocale: Required<TableLocale> = {\n\tsearch: \"Search\",\n\tsearchPlaceholder: \"Search...\",\n\tnoData: \"No data\",\n\tloading: \"Loading...\",\n\tpage: \"Page\",\n\tof: \"of\",\n\titems: \"items\",\n\tselected: \"selected\",\n\trowsPerPage: \"Rows per page\",\n\tactions: \"Actions\",\n\tsortAsc: \"Sort ascending\",\n\tsortDesc: \"Sort descending\",\n\tfilterBy: \"Filter by\",\n\tclearFilters: \"Clear filters\",\n\tdateFrom: \"From\",\n\tdateTo: \"To\",\n\tselectAll: \"Select all\",\n\tdeselectAll: \"Deselect all\",\n\tmoreActions: \"More actions\",\n\tclearSearch: \"Clear search\",\n\tcloseModal: \"Close\",\n\tpreviousPage: \"Previous page\",\n\tnextPage: \"Next page\",\n\tjumpToPage: \"Go to page\",\n\tdetails: \"Details\",\n\tcolumns: \"Columns\",\n\tshowAllColumns: \"Show all\",\n\thideColumn: \"Hide column\",\n\tsortPriority: \"Sort priority\",\n\tclearSort: \"Clear sort\",\n\tresultsFound: \"{count} results found\",\n\tnoResultsFound: \"No results found\",\n\trowsSelected: \"{count} rows selected\",\n\texpandRow: \"Expand row\",\n\tcollapseRow: \"Collapse row\",\n};\n\n/**\n * Locales predefinidos\n */\nexport const locales = {\n\ten: defaultLocale,\n\tes: {\n\t\tsearch: \"Buscar\",\n\t\tsearchPlaceholder: \"Buscar...\",\n\t\tnoData: \"No hay datos\",\n\t\tloading: \"Cargando...\",\n\t\tpage: \"Página\",\n\t\tof: \"de\",\n\t\titems: \"elementos\",\n\t\tselected: \"seleccionados\",\n\t\trowsPerPage: \"Filas por página\",\n\t\tactions: \"Acciones\",\n\t\tsortAsc: \"Ordenar ascendente\",\n\t\tsortDesc: \"Ordenar descendente\",\n\t\tfilterBy: \"Filtrar por\",\n\t\tclearFilters: \"Limpiar filtros\",\n\t\tdateFrom: \"Desde\",\n\t\tdateTo: \"Hasta\",\n\t\tselectAll: \"Seleccionar todo\",\n\t\tdeselectAll: \"Deseleccionar todo\",\n\t\tmoreActions: \"Más acciones\",\n\t\tclearSearch: \"Limpiar búsqueda\",\n\t\tcloseModal: \"Cerrar\",\n\t\tpreviousPage: \"Página anterior\",\n\t\tnextPage: \"Página siguiente\",\n\t\tjumpToPage: \"Ir a página\",\n\t\tdetails: \"Detalles\",\n\t\tcolumns: \"Columnas\",\n\t\tshowAllColumns: \"Mostrar todas\",\n\t\thideColumn: \"Ocultar columna\",\n\t\tsortPriority: \"Prioridad de orden\",\n\t\tclearSort: \"Quitar orden\",\n\t\tresultsFound: \"{count} resultados encontrados\",\n\t\tnoResultsFound: \"No se encontraron resultados\",\n\t\trowsSelected: \"{count} filas seleccionadas\",\n\t\texpandRow: \"Expandir fila\",\n\t\tcollapseRow: \"Colapsar fila\",\n\t} satisfies Required<TableLocale>,\n\tpt: {\n\t\tsearch: \"Pesquisar\",\n\t\tsearchPlaceholder: \"Pesquisar...\",\n\t\tnoData: \"Sem dados\",\n\t\tloading: \"Carregando...\",\n\t\tpage: \"Página\",\n\t\tof: \"de\",\n\t\titems: \"itens\",\n\t\tselected: \"selecionados\",\n\t\trowsPerPage: \"Linhas por página\",\n\t\tactions: \"Ações\",\n\t\tsortAsc: \"Ordenar ascendente\",\n\t\tsortDesc: \"Ordenar descendente\",\n\t\tfilterBy: \"Filtrar por\",\n\t\tclearFilters: \"Limpar filtros\",\n\t\tdateFrom: \"De\",\n\t\tdateTo: \"Até\",\n\t\tselectAll: \"Selecionar tudo\",\n\t\tdeselectAll: \"Desselecionar tudo\",\n\t\tmoreActions: \"Mais ações\",\n\t\tclearSearch: \"Limpar pesquisa\",\n\t\tcloseModal: \"Fechar\",\n\t\tpreviousPage: \"Página anterior\",\n\t\tnextPage: \"Próxima página\",\n\t\tjumpToPage: \"Ir para página\",\n\t\tdetails: \"Detalhes\",\n\t\tcolumns: \"Colunas\",\n\t\tshowAllColumns: \"Mostrar todas\",\n\t\thideColumn: \"Ocultar coluna\",\n\t\tsortPriority: \"Prioridade de ordem\",\n\t\tclearSort: \"Remover ordem\",\n\t\tresultsFound: \"{count} resultados encontrados\",\n\t\tnoResultsFound: \"Nenhum resultado encontrado\",\n\t\trowsSelected: \"{count} linhas selecionadas\",\n\t\texpandRow: \"Expandir linha\",\n\t\tcollapseRow: \"Recolher linha\",\n\t} satisfies Required<TableLocale>,\n} as const;\n\n/** Claves de locales predefinidos */\nexport type LocaleKey = keyof typeof locales;\n\n/**\n * Props principales del componente BetterTable\n */\nexport interface BetterTableProps<T extends TableData = TableData> {\n\t// === Datos ===\n\t/** Array de datos a mostrar */\n\tdata: T[];\n\t/** Configuración de columnas */\n\tcolumns: Column<T>[];\n\t/** Key único para identificar filas (default: 'id') */\n\trowKey?: keyof T | ((row: T, index: number) => string);\n\n\t// === Acciones ===\n\t/** Acciones por fila */\n\trowActions?: RowAction<T>[];\n\t/** Acciones globales (toolbar) */\n\tglobalActions?: GlobalAction<T>[];\n\t/** Máximo de acciones visibles inline antes de agrupar en menú overflow (default: 3) */\n\tmaxVisibleActions?: number;\n\n\t// === Paginación ===\n\t/** Configuración de paginación (false para desactivar) */\n\tpagination?: PaginationConfig | false;\n\t/** Callback de cambio de página */\n\tonPageChange?: (page: number, pageSize: number) => void;\n\n\t// === Ordenamiento ===\n\t/** Estado de ordenamiento (controlado) */\n\tsort?: SortState;\n\t/** Callback de cambio de ordenamiento */\n\tonSortChange?: (sort: SortState) => void;\n\t/** Habilitar multi-sort (cada columna cicla: sin orden → asc → desc → sin orden, default: false) */\n\tmultiSort?: boolean;\n\t/** Estado de multi-sort (controlado) */\n\tmultiSortState?: MultiSortState;\n\t/** Callback de cambio de multi-sort */\n\tonMultiSortChange?: (sorts: MultiSortState) => void;\n\n\t// === Filtrado ===\n\t/** Modo de visualización de filtros: 'floating' (en header), 'panel' (colapsable), o 'both' (default: 'floating') */\n\tfilterMode?: \"floating\" | \"panel\" | \"both\";\n\t/** Estado de filtros (controlado) */\n\tfilters?: FilterState;\n\t/** Callback de cambio de filtros */\n\tonFilterChange?: (filters: FilterState) => void;\n\n\t// === Búsqueda Global ===\n\t/** Mostrar barra de búsqueda */\n\tsearchable?: boolean;\n\t/** Valor de búsqueda (controlado) */\n\tsearchValue?: string;\n\t/** Callback de cambio de búsqueda */\n\tonSearchChange?: (value: string) => void;\n\t/** Columnas en las que buscar (default: todas) */\n\tsearchColumns?: string[];\n\t/** Milisegundos de debounce en la búsqueda (default: 300) */\n\tsearchDebounceMs?: number;\n\n\t// === Server-Side / Manual Mode ===\n\t/** Skip client-side sorting — data is assumed pre-sorted by the server (default: false) */\n\tmanualSorting?: boolean;\n\t/** Skip client-side filtering and search — data is assumed pre-filtered by the server (default: false) */\n\tmanualFiltering?: boolean;\n\t/** Skip client-side pagination — data represents the current page from the server (default: false) */\n\tmanualPagination?: boolean;\n\n\t// === Selección ===\n\t/** Habilitar selección de filas */\n\tselectable?: boolean;\n\t/** Filas seleccionadas (controlado) */\n\tselectedRows?: T[];\n\t/** Callback de cambio de selección */\n\tonSelectionChange?: (selectedRows: T[]) => void;\n\t/** Modo de selección */\n\tselectionMode?: \"single\" | \"multiple\";\n\n\t// === Column Visibility ===\n\t/** Mostrar toggle de visibilidad de columnas en el toolbar */\n\tcolumnVisibility?: boolean;\n\t/** Estado controlado de columnas ocultas (array de column IDs) */\n\thiddenColumns?: string[];\n\t/** Callback cuando cambia la visibilidad de columnas */\n\tonColumnVisibilityChange?: (hiddenColumns: string[]) => void;\n\n\t// === Estados ===\n\t/** Estado de carga */\n\tloading?: boolean;\n\t/** Componente de loading personalizado */\n\tloadingComponent?: ReactNode;\n\t/** Componente de estado vacío personalizado */\n\temptyComponent?: ReactNode;\n\n\t// === Personalización ===\n\t/** Clases CSS personalizadas */\n\tclassNames?: TableClassNames;\n\t/** Estilos inline personalizados */\n\tstyles?: {\n\t\tcontainer?: CSSProperties;\n\t\ttable?: CSSProperties;\n\t\theader?: CSSProperties;\n\t\tbody?: CSSProperties;\n\t\trow?: CSSProperties;\n\t\tcell?: CSSProperties;\n\t};\n\t/** Textos personalizados (preset: 'en' | 'es' | 'pt', o parcial para override) */\n\tlocale?: LocaleKey | TableLocale;\n\n\t// === Características ===\n\t/** Header fijo al hacer scroll */\n\tstickyHeader?: boolean;\n\t/** Altura máxima (activa scroll interno) */\n\tmaxHeight?: string | number;\n\t/** Mostrar bordes */\n\tbordered?: boolean;\n\t/** Filas con rayas alternas */\n\tstriped?: boolean;\n\t/** Hover en filas */\n\thoverable?: boolean;\n\t/** Tamaño de la tabla */\n\tsize?: \"small\" | \"medium\" | \"large\";\n\t/** Enable column resizing via drag (default: false) */\n\tresizable?: boolean;\n\t/** Callback when a column is resized */\n\tonColumnResize?: (columnId: string, width: number) => void;\n\t/** Minimum column width in px when resizing (default: 50) */\n\tminColumnWidth?: number;\n\t/** Maximum column width in px when resizing */\n\tmaxColumnWidth?: number;\n\n\t// === Callbacks ===\n\t/** Callback al hacer click en una fila */\n\tonRowClick?: (row: T, rowIndex: number) => void;\n\t/** Callback al hacer doble click en una fila */\n\tonRowDoubleClick?: (row: T, rowIndex: number) => void;\n\n\t// === Accesibilidad ===\n\t/** Descripción de la tabla para screen readers */\n\tariaLabel?: string;\n\t/** ID del elemento que describe la tabla */\n\tariaDescribedBy?: string;\n\n\t// === Expandable Rows ===\n\t/** Configuration for expandable rows (render function for expanded content) */\n\texpandable?: ExpandableConfig<T>;\n\t/** Array of expanded row keys (controlled mode) */\n\texpandedRows?: string[];\n\t/** Callback when expanded rows change */\n\tonExpandChange?: (expandedRows: string[]) => void;\n\n\t// === Virtualización ===\n\t/** Force-enable virtualization (auto-enabled when pagination is off and dataset > VIRTUALIZATION_THRESHOLD) */\n\tvirtualize?: boolean;\n\t/** Fixed row height in px for virtualized rendering (default: 48) */\n\trowHeight?: number;\n\t/** Extra rows rendered above/below the viewport as scroll buffer (default: 5) */\n\tvirtualBuffer?: number;\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { SortState, MultiSortState, TableData } from \"../types\";\nimport { sortData, multiSortData } from \"../utils/sortData\";\n\ninterface UseTableSortOptions<T extends TableData> {\n\tdata: T[];\n\tinitialSort?: SortState;\n\tcontrolledSort?: SortState;\n\tonSortChange?: (sort: SortState) => void;\n\t/** Enable multi-sort (Shift+Click) */\n\tmultiSort?: boolean;\n\t/** Controlled multi-sort state */\n\tcontrolledMultiSort?: MultiSortState;\n\t/** Callback when multi-sort changes */\n\tonMultiSortChange?: (sorts: MultiSortState) => void;\n\t/** When true, skip client-side sorting — data is returned as-is */\n\tmanual?: boolean;\n}\n\ninterface UseTableSortReturn<T extends TableData> {\n\tsortedData: T[];\n\tsortState: SortState;\n\thandleSort: (columnId: string) => void;\n\tclearSort: () => void;\n\t/** Multi-sort state (array of sort states in priority order) */\n\tmultiSortState: MultiSortState;\n\t/** Whether multi-sort is enabled */\n\tisMultiSort: boolean;\n}\n\nexport function useTableSort<T extends TableData>({\n\tdata,\n\tinitialSort,\n\tcontrolledSort,\n\tonSortChange,\n\tmultiSort = false,\n\tcontrolledMultiSort,\n\tonMultiSortChange,\n\tmanual = false,\n}: UseTableSortOptions<T>): UseTableSortReturn<T> {\n\tconst [internalSort, setInternalSort] = useState<SortState>(\n\t\tinitialSort ?? { columnId: null, direction: \"asc\" },\n\t);\n\tconst [internalMultiSort, setInternalMultiSort] = useState<MultiSortState>(\n\t\t[],\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst sortState = controlledSort ?? internalSort;\n\tconst multiSortState = controlledMultiSort ?? internalMultiSort;\n\n\tconst handleSort = useCallback(\n\t\t(columnId: string) => {\n\t\t\tif (multiSort) {\n\t\t\t\t// Multi-sort: 3-state cycle per column (unsorted → asc → desc → unsorted)\n\t\t\t\tconst existingIndex = multiSortState.findIndex(\n\t\t\t\t\t(s) => s.columnId === columnId,\n\t\t\t\t);\n\t\t\t\tlet newMultiSort: MultiSortState;\n\n\t\t\t\tif (existingIndex >= 0) {\n\t\t\t\t\tconst existing = multiSortState[existingIndex];\n\t\t\t\t\tif (existing.direction === \"asc\") {\n\t\t\t\t\t\t// asc → desc\n\t\t\t\t\t\tnewMultiSort = [...multiSortState];\n\t\t\t\t\t\tnewMultiSort[existingIndex] = {\n\t\t\t\t\t\t\tcolumnId,\n\t\t\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// desc → remove (unsorted)\n\t\t\t\t\t\tnewMultiSort = multiSortState.filter((_, i) => i !== existingIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// unsorted → asc\n\t\t\t\t\tnewMultiSort = [...multiSortState, { columnId, direction: \"asc\" }];\n\t\t\t\t}\n\n\t\t\t\tif (!controlledMultiSort) {\n\t\t\t\t\tsetInternalMultiSort(newMultiSort);\n\t\t\t\t}\n\t\t\t\tonMultiSortChange?.(newMultiSort);\n\n\t\t\t\t// Sync single sort state with primary sort\n\t\t\t\tconst primary = newMultiSort[0];\n\t\t\t\tconst newSortState: SortState = primary\n\t\t\t\t\t? { columnId: primary.columnId, direction: primary.direction }\n\t\t\t\t\t: { columnId: null, direction: \"asc\" };\n\t\t\t\tif (!controlledSort) {\n\t\t\t\t\tsetInternalSort(newSortState);\n\t\t\t\t}\n\t\t\t\tonSortChange?.(newSortState);\n\t\t\t} else {\n\t\t\t\t// Single sort: 3-state cycle (unsorted → asc → desc → unsorted)\n\t\t\t\tlet newState: SortState;\n\t\t\t\tif (sortState.columnId !== columnId) {\n\t\t\t\t\t// Different column → start asc\n\t\t\t\t\tnewState = { columnId, direction: \"asc\" };\n\t\t\t\t} else if (sortState.direction === \"asc\") {\n\t\t\t\t\t// asc → desc\n\t\t\t\t\tnewState = { columnId, direction: \"desc\" };\n\t\t\t\t} else {\n\t\t\t\t\t// desc → unsorted\n\t\t\t\t\tnewState = { columnId: null, direction: \"asc\" };\n\t\t\t\t}\n\n\t\t\t\tif (!controlledSort) {\n\t\t\t\t\tsetInternalSort(newState);\n\t\t\t\t}\n\t\t\t\tonSortChange?.(newState);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tsortState,\n\t\t\tmultiSortState,\n\t\t\tcontrolledSort,\n\t\t\tcontrolledMultiSort,\n\t\t\tonSortChange,\n\t\t\tonMultiSortChange,\n\t\t\tmultiSort,\n\t\t],\n\t);\n\n\tconst clearSort = useCallback(() => {\n\t\tconst newState: SortState = { columnId: null, direction: \"asc\" };\n\t\tif (!controlledSort) {\n\t\t\tsetInternalSort(newState);\n\t\t}\n\t\tonSortChange?.(newState);\n\n\t\tif (multiSort) {\n\t\t\tif (!controlledMultiSort) {\n\t\t\t\tsetInternalMultiSort([]);\n\t\t\t}\n\t\t\tonMultiSortChange?.([]);\n\t\t}\n\t}, [\n\t\tcontrolledSort,\n\t\tcontrolledMultiSort,\n\t\tonSortChange,\n\t\tonMultiSortChange,\n\t\tmultiSort,\n\t]);\n\n\tconst sortedData = useMemo(() => {\n\t\tif (manual) return data;\n\t\t// Use multi-sort if there are multiple sort states\n\t\tif (multiSort && multiSortState.length > 0) {\n\t\t\treturn multiSortData(data, multiSortState);\n\t\t}\n\t\t// Fallback to single sort\n\t\tif (!sortState.columnId) return data;\n\t\treturn sortData(data, sortState.columnId, sortState.direction);\n\t}, [data, sortState, multiSortState, multiSort, manual]);\n\n\treturn {\n\t\tsortedData,\n\t\tsortState,\n\t\thandleSort,\n\t\tclearSort,\n\t\tmultiSortState,\n\t\tisMultiSort: multiSort,\n\t};\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { FilterState, TableData, Column, DateFilterRange } from \"../types\";\nimport { filterData } from \"../utils/filterData\";\n\ninterface UseTableFilterOptions<T extends TableData> {\n\tdata: T[];\n\tcolumns: Column<T>[];\n\tinitialFilters?: FilterState;\n\tcontrolledFilters?: FilterState;\n\tonFilterChange?: (filters: FilterState) => void;\n\t/** When true, skip client-side filtering — data is returned as-is */\n\tmanual?: boolean;\n}\n\ninterface UseTableFilterReturn<T extends TableData> {\n\tfilteredData: T[];\n\tfilters: FilterState;\n\tsetFilter: (\n\t\tcolumnId: string,\n\t\tvalue: string | number | boolean | DateFilterRange | null,\n\t) => void;\n\tclearFilters: () => void;\n\tclearFilter: (columnId: string) => void;\n}\n\nexport function useTableFilter<T extends TableData>({\n\tdata,\n\tcolumns,\n\tinitialFilters,\n\tcontrolledFilters,\n\tonFilterChange,\n\tmanual = false,\n}: UseTableFilterOptions<T>): UseTableFilterReturn<T> {\n\tconst [internalFilters, setInternalFilters] = useState<FilterState>(\n\t\tinitialFilters ?? {},\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst filters = controlledFilters ?? internalFilters;\n\n\tconst setFilter = useCallback(\n\t\t(\n\t\t\tcolumnId: string,\n\t\t\tvalue: string | number | boolean | DateFilterRange | null,\n\t\t) => {\n\t\t\tconst newFilters = { ...filters };\n\n\t\t\t// For date ranges, remove if both from and to are empty\n\t\t\tif (value !== null && typeof value === \"object\" && \"from\" in value) {\n\t\t\t\tconst range = value as DateFilterRange;\n\t\t\t\tif (!range.from && !range.to) {\n\t\t\t\t\tdelete newFilters[columnId];\n\t\t\t\t} else {\n\t\t\t\t\tnewFilters[columnId] = value;\n\t\t\t\t}\n\t\t\t} else if (value === null || value === undefined || value === \"\") {\n\t\t\t\tdelete newFilters[columnId];\n\t\t\t} else {\n\t\t\t\tnewFilters[columnId] = value;\n\t\t\t}\n\n\t\t\tif (!controlledFilters) {\n\t\t\t\tsetInternalFilters(newFilters);\n\t\t\t}\n\t\t\tonFilterChange?.(newFilters);\n\t\t},\n\t\t[filters, controlledFilters, onFilterChange],\n\t);\n\n\tconst clearFilter = useCallback(\n\t\t(columnId: string) => {\n\t\t\tconst newFilters = { ...filters };\n\t\t\tdelete newFilters[columnId];\n\n\t\t\tif (!controlledFilters) {\n\t\t\t\tsetInternalFilters(newFilters);\n\t\t\t}\n\t\t\tonFilterChange?.(newFilters);\n\t\t},\n\t\t[filters, controlledFilters, onFilterChange],\n\t);\n\n\tconst clearFilters = useCallback(() => {\n\t\tif (!controlledFilters) {\n\t\t\tsetInternalFilters({});\n\t\t}\n\t\tonFilterChange?.({});\n\t}, [controlledFilters, onFilterChange]);\n\n\tconst filteredData = useMemo(() => {\n\t\tif (manual) return data;\n\t\treturn filterData(data, filters, columns);\n\t}, [data, filters, columns, manual]);\n\n\treturn { filteredData, filters, setFilter, clearFilters, clearFilter };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { PaginationConfig, TableData } from \"../types\";\n\ninterface UseTablePaginationOptions<T extends TableData> {\n\tdata: T[];\n\tconfig?: PaginationConfig | false;\n\tonPageChange?: (page: number, pageSize: number) => void;\n\t/** When true, skip client-side pagination — data represents the current page from the server */\n\tmanual?: boolean;\n}\n\ninterface UseTablePaginationReturn<T extends TableData> {\n\tpaginatedData: T[];\n\tpage: number;\n\tpageSize: number;\n\ttotalPages: number;\n\ttotalItems: number;\n\tgoToPage: (page: number) => void;\n\tnextPage: () => void;\n\tprevPage: () => void;\n\tchangePageSize: (size: number) => void;\n\thasNextPage: boolean;\n\thasPrevPage: boolean;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\nexport function useTablePagination<T extends TableData>({\n\tdata,\n\tconfig,\n\tonPageChange,\n\tmanual = false,\n}: UseTablePaginationOptions<T>): UseTablePaginationReturn<T> {\n\tconst enabled = config !== false;\n\n\tconst initialPage =\n\t\tconfig && typeof config === \"object\" ? (config.page ?? 1) : 1;\n\tconst initialPageSize =\n\t\tconfig && typeof config === \"object\" ? (config.pageSize ?? 10) : 10;\n\tconst serverTotalItems =\n\t\tconfig && typeof config === \"object\" ? config.totalItems : undefined;\n\n\tconst [page, setPage] = useState(initialPage);\n\tconst [pageSize, setPageSize] = useState(initialPageSize);\n\n\tconst totalItems = serverTotalItems ?? data.length;\n\tconst totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n\n\tconst goToPage = useCallback(\n\t\t(newPage: number) => {\n\t\t\tconst validPage = Math.max(1, Math.min(newPage, totalPages));\n\t\t\tsetPage(validPage);\n\t\t\tonPageChange?.(validPage, pageSize);\n\t\t},\n\t\t[totalPages, pageSize, onPageChange],\n\t);\n\n\tconst nextPage = useCallback(() => {\n\t\tif (page < totalPages) {\n\t\t\tgoToPage(page + 1);\n\t\t}\n\t}, [page, totalPages, goToPage]);\n\n\tconst prevPage = useCallback(() => {\n\t\tif (page > 1) {\n\t\t\tgoToPage(page - 1);\n\t\t}\n\t}, [page, goToPage]);\n\n\tconst changePageSize = useCallback(\n\t\t(newSize: number) => {\n\t\t\tsetPageSize(newSize);\n\t\t\tsetPage(1);\n\t\t\tonPageChange?.(1, newSize);\n\t\t},\n\t\t[onPageChange],\n\t);\n\n\tconst paginatedData = useMemo(() => {\n\t\tif (!enabled || manual || serverTotalItems !== undefined) {\n\t\t\t// Manual mode or server-provided total: data is already the current page\n\t\t\treturn data;\n\t\t}\n\t\tconst start = (page - 1) * pageSize;\n\t\treturn data.slice(start, start + pageSize);\n\t}, [data, page, pageSize, enabled, manual, serverTotalItems]);\n\n\tconst startIndex = (page - 1) * pageSize + 1;\n\tconst endIndex = Math.min(page * pageSize, totalItems);\n\n\treturn {\n\t\tpaginatedData,\n\t\tpage,\n\t\tpageSize,\n\t\ttotalPages,\n\t\ttotalItems,\n\t\tgoToPage,\n\t\tnextPage,\n\t\tprevPage,\n\t\tchangePageSize,\n\t\thasNextPage: page < totalPages,\n\t\thasPrevPage: page > 1,\n\t\tstartIndex,\n\t\tendIndex,\n\t};\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { TableData } from \"../types\";\n\ninterface UseTableSelectionOptions<T extends TableData> {\n\tdata: T[];\n\trowKey: keyof T | ((row: T, index: number) => string);\n\tmode?: \"single\" | \"multiple\";\n\tinitialSelection?: T[];\n\tcontrolledSelection?: T[];\n\tonSelectionChange?: (selectedRows: T[]) => void;\n}\n\ninterface UseTableSelectionReturn<T extends TableData> {\n\tselectedRows: T[];\n\tisSelected: (row: T, index: number) => boolean;\n\ttoggleRow: (row: T, index: number) => void;\n\tselectRow: (row: T, index: number) => void;\n\tdeselectRow: (row: T, index: number) => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n\tisAllSelected: boolean;\n\tisPartiallySelected: boolean;\n\tselectedCount: number;\n}\n\nexport function useTableSelection<T extends TableData>({\n\tdata,\n\trowKey,\n\tmode = \"multiple\",\n\tinitialSelection,\n\tcontrolledSelection,\n\tonSelectionChange,\n}: UseTableSelectionOptions<T>): UseTableSelectionReturn<T> {\n\tconst [internalSelection, setInternalSelection] = useState<T[]>(\n\t\tinitialSelection ?? [],\n\t);\n\n\t// Usar estado controlado si está disponible\n\tconst selectedRows = controlledSelection ?? internalSelection;\n\n\tconst getRowKey = useCallback(\n\t\t(row: T, index: number): string => {\n\t\t\tif (typeof rowKey === \"function\") {\n\t\t\t\treturn rowKey(row, index);\n\t\t\t}\n\t\t\treturn String(row[rowKey]);\n\t\t},\n\t\t[rowKey],\n\t);\n\n\tconst selectedKeys = useMemo(() => {\n\t\treturn new Set(selectedRows.map((row, idx) => getRowKey(row, idx)));\n\t}, [selectedRows, getRowKey]);\n\n\tconst isSelected = useCallback(\n\t\t(row: T, index: number): boolean => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\treturn selectedKeys.has(key);\n\t\t},\n\t\t[getRowKey, selectedKeys],\n\t);\n\n\tconst updateSelection = useCallback(\n\t\t(newSelection: T[]) => {\n\t\t\tif (!controlledSelection) {\n\t\t\t\tsetInternalSelection(newSelection);\n\t\t\t}\n\t\t\tonSelectionChange?.(newSelection);\n\t\t},\n\t\t[controlledSelection, onSelectionChange],\n\t);\n\n\tconst toggleRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\tlet newSelection: T[];\n\n\t\t\tif (mode === \"single\") {\n\t\t\t\tnewSelection = selectedKeys.has(key) ? [] : [row];\n\t\t\t} else {\n\t\t\t\tif (selectedKeys.has(key)) {\n\t\t\t\t\tnewSelection = selectedRows.filter((r, i) => getRowKey(r, i) !== key);\n\t\t\t\t} else {\n\t\t\t\t\tnewSelection = [...selectedRows, row];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateSelection(newSelection);\n\t\t},\n\t\t[mode, selectedKeys, selectedRows, getRowKey, updateSelection],\n\t);\n\n\tconst selectRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tif (!isSelected(row, index)) {\n\t\t\t\tconst newSelection = mode === \"single\" ? [row] : [...selectedRows, row];\n\t\t\t\tupdateSelection(newSelection);\n\t\t\t}\n\t\t},\n\t\t[isSelected, mode, selectedRows, updateSelection],\n\t);\n\n\tconst deselectRow = useCallback(\n\t\t(row: T, index: number) => {\n\t\t\tconst key = getRowKey(row, index);\n\t\t\tconst newSelection = selectedRows.filter(\n\t\t\t\t(r, i) => getRowKey(r, i) !== key,\n\t\t\t);\n\t\t\tupdateSelection(newSelection);\n\t\t},\n\t\t[selectedRows, getRowKey, updateSelection],\n\t);\n\n\tconst selectAll = useCallback(() => {\n\t\tif (mode === \"multiple\") {\n\t\t\tupdateSelection([...data]);\n\t\t}\n\t}, [data, mode, updateSelection]);\n\n\tconst deselectAll = useCallback(() => {\n\t\tupdateSelection([]);\n\t}, [updateSelection]);\n\n\tconst isAllSelected = data.length > 0 && selectedRows.length === data.length;\n\tconst isPartiallySelected =\n\t\tselectedRows.length > 0 && selectedRows.length < data.length;\n\n\treturn {\n\t\tselectedRows,\n\t\tisSelected,\n\t\ttoggleRow,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t\tselectedCount: selectedRows.length,\n\t};\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport { TableData, Column } from \"../types\";\nimport { searchData } from \"../utils/filterData\";\n\ninterface UseTableSearchOptions<T extends TableData> {\n\tdata: T[];\n\tcolumns: Column<T>[];\n\tsearchColumns?: string[];\n\tinitialValue?: string;\n\tcontrolledValue?: string;\n\tonSearchChange?: (value: string) => void;\n\tdebounceMs?: number;\n\t/** When true, skip client-side search — data is returned as-is */\n\tmanual?: boolean;\n}\n\ninterface UseTableSearchReturn<T extends TableData> {\n\tsearchedData: T[];\n\tsearchValue: string;\n\thandleSearch: (value: string) => void;\n\tclearSearch: () => void;\n}\n\nexport function useTableSearch<T extends TableData>({\n\tdata,\n\tcolumns,\n\tsearchColumns,\n\tinitialValue,\n\tcontrolledValue,\n\tonSearchChange,\n\tdebounceMs = 0,\n\tmanual = false,\n}: UseTableSearchOptions<T>): UseTableSearchReturn<T> {\n\tconst [internalValue, setInternalValue] = useState(initialValue ?? \"\");\n\tconst [debouncedValue, setDebouncedValue] = useState(initialValue ?? \"\");\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t// Usar valor controlado si está disponible\n\tconst searchValue = controlledValue ?? internalValue;\n\n\t// Debounce: update debouncedValue after delay\n\tuseEffect(() => {\n\t\tif (debounceMs <= 0) {\n\t\t\tsetDebouncedValue(searchValue);\n\t\t\treturn;\n\t\t}\n\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tsetDebouncedValue(searchValue);\n\t\t}, debounceMs);\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t}\n\t\t};\n\t}, [searchValue, debounceMs]);\n\n\tconst handleSearch = useCallback(\n\t\t(value: string) => {\n\t\t\tif (controlledValue === undefined) {\n\t\t\t\tsetInternalValue(value);\n\t\t\t}\n\t\t\tonSearchChange?.(value);\n\t\t},\n\t\t[controlledValue, onSearchChange],\n\t);\n\n\tconst clearSearch = useCallback(() => {\n\t\tif (controlledValue === undefined) {\n\t\t\tsetInternalValue(\"\");\n\t\t}\n\t\t// Clear immediately, bypass debounce\n\t\tif (timerRef.current) {\n\t\t\tclearTimeout(timerRef.current);\n\t\t}\n\t\tsetDebouncedValue(\"\");\n\t\tonSearchChange?.(\"\");\n\t}, [controlledValue, onSearchChange]);\n\n\tconst searchedData = useMemo(() => {\n\t\tif (manual) return data;\n\t\treturn searchData(data, debouncedValue, columns, searchColumns);\n\t}, [data, debouncedValue, columns, searchColumns, manual]);\n\n\treturn { searchedData, searchValue, handleSearch, clearSearch };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { Column, TableData } from \"../types\";\n\ninterface UseColumnVisibilityOptions<T extends TableData> {\n\tcolumns: Column<T>[];\n\t/** Controlled hidden column IDs */\n\tcontrolledHiddenColumns?: string[];\n\t/** Callback when visibility changes */\n\tonColumnVisibilityChange?: (hiddenColumns: string[]) => void;\n}\n\ninterface UseColumnVisibilityReturn<T extends TableData> {\n\t/** Columns filtered by visibility */\n\tvisibleColumns: Column<T>[];\n\t/** Set of hidden column IDs */\n\thiddenColumnIds: Set<string>;\n\t/** Toggle a column's visibility */\n\ttoggleColumn: (columnId: string) => void;\n\t/** Show all columns */\n\tshowAllColumns: () => void;\n\t/** Check if a column is visible */\n\tisColumnVisible: (columnId: string) => boolean;\n\t/** Array of hidden column IDs (for serialization) */\n\thiddenColumns: string[];\n}\n\nexport function useColumnVisibility<T extends TableData>({\n\tcolumns,\n\tcontrolledHiddenColumns,\n\tonColumnVisibilityChange,\n}: UseColumnVisibilityOptions<T>): UseColumnVisibilityReturn<T> {\n\t// Internal state: hidden column IDs derived from columns with hidden: true + user toggles\n\tconst [internalHidden, setInternalHidden] = useState<string[]>(() =>\n\t\tcolumns.filter((col) => col.hidden).map((col) => col.id),\n\t);\n\n\tconst hiddenColumns = controlledHiddenColumns ?? internalHidden;\n\tconst hiddenColumnIds = useMemo(\n\t\t() => new Set(hiddenColumns),\n\t\t[hiddenColumns],\n\t);\n\n\tconst toggleColumn = useCallback(\n\t\t(columnId: string) => {\n\t\t\tconst newHidden = hiddenColumnIds.has(columnId)\n\t\t\t\t? hiddenColumns.filter((id) => id !== columnId)\n\t\t\t\t: [...hiddenColumns, columnId];\n\n\t\t\tif (!controlledHiddenColumns) {\n\t\t\t\tsetInternalHidden(newHidden);\n\t\t\t}\n\t\t\tonColumnVisibilityChange?.(newHidden);\n\t\t},\n\t\t[\n\t\t\thiddenColumns,\n\t\t\thiddenColumnIds,\n\t\t\tcontrolledHiddenColumns,\n\t\t\tonColumnVisibilityChange,\n\t\t],\n\t);\n\n\tconst showAllColumns = useCallback(() => {\n\t\tif (!controlledHiddenColumns) {\n\t\t\tsetInternalHidden([]);\n\t\t}\n\t\tonColumnVisibilityChange?.([]);\n\t}, [controlledHiddenColumns, onColumnVisibilityChange]);\n\n\tconst isColumnVisible = useCallback(\n\t\t(columnId: string) => !hiddenColumnIds.has(columnId),\n\t\t[hiddenColumnIds],\n\t);\n\n\tconst visibleColumns = useMemo(\n\t\t() => columns.filter((col) => !hiddenColumnIds.has(col.id)),\n\t\t[columns, hiddenColumnIds],\n\t);\n\n\treturn {\n\t\tvisibleColumns,\n\t\thiddenColumnIds,\n\t\ttoggleColumn,\n\t\tshowAllColumns,\n\t\tisColumnVisible,\n\t\thiddenColumns,\n\t};\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { Column, TableData } from '../types';\n\nconst DEFAULT_MIN_WIDTH = 50;\n\ninterface UseColumnResizeOptions<T extends TableData> {\n columns: Column<T>[];\n enabled: boolean;\n minWidth?: number;\n maxWidth?: number;\n onColumnResize?: (columnId: string, width: number) => void;\n tableRef: React.RefObject<HTMLTableElement | null>;\n}\n\ninterface UseColumnResizeReturn {\n /** Current column widths (only populated for resized columns) */\n columnWidths: Record<string, number>;\n /** Whether a resize is currently in progress */\n isResizing: boolean;\n /** Start resizing a column */\n startResize: (columnId: string, startX: number) => void;\n /** Get effective width for a column (resized width or initial width) */\n getColumnWidth: (columnId: string) => number | undefined;\n /** Reset all column widths to initial */\n resetColumnWidths: () => void;\n}\n\nexport function useColumnResize<T extends TableData>({\n columns,\n enabled,\n minWidth = DEFAULT_MIN_WIDTH,\n maxWidth,\n onColumnResize,\n tableRef,\n}: UseColumnResizeOptions<T>): UseColumnResizeReturn {\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\n const [isResizing, setIsResizing] = useState(false);\n\n const resizeState = useRef<{\n columnId: string;\n startX: number;\n startWidth: number;\n } | null>(null);\n\n const getInitialWidth = useCallback(\n (columnId: string): number => {\n if (!tableRef.current) return 150;\n const th = tableRef.current.querySelector(`th[data-column-id=\"${columnId}\"]`);\n return th ? th.getBoundingClientRect().width : 150;\n },\n [tableRef]\n );\n\n const startResize = useCallback(\n (columnId: string, startX: number) => {\n if (!enabled) return;\n\n const startWidth = columnWidths[columnId] ?? getInitialWidth(columnId);\n resizeState.current = { columnId, startX, startWidth };\n setIsResizing(true);\n },\n [enabled, columnWidths, getInitialWidth]\n );\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeState.current) return;\n e.preventDefault();\n\n const { columnId, startX, startWidth } = resizeState.current;\n const diff = e.clientX - startX;\n let newWidth = Math.max(startWidth + diff, minWidth);\n if (maxWidth !== undefined) {\n newWidth = Math.min(newWidth, maxWidth);\n }\n\n // Per-column constraints\n const col = columns.find((c) => c.id === columnId);\n if (col) {\n const colMin = col.minWidth ?? minWidth;\n const colMax = col.maxWidth ?? maxWidth;\n newWidth = Math.max(newWidth, colMin);\n if (colMax !== undefined) {\n newWidth = Math.min(newWidth, colMax);\n }\n }\n\n setColumnWidths((prev) => ({ ...prev, [columnId]: newWidth }));\n };\n\n const handleMouseUp = () => {\n if (resizeState.current) {\n const { columnId } = resizeState.current;\n const width = columnWidths[columnId];\n if (width !== undefined && onColumnResize) {\n onColumnResize(columnId, width);\n }\n }\n resizeState.current = null;\n setIsResizing(false);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Prevent text selection during resize\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n }, [isResizing, columnWidths, columns, minWidth, maxWidth, onColumnResize]);\n\n const getColumnWidth = useCallback(\n (columnId: string): number | undefined => {\n return columnWidths[columnId];\n },\n [columnWidths]\n );\n\n const resetColumnWidths = useCallback(() => {\n setColumnWidths({});\n }, []);\n\n return {\n columnWidths,\n isResizing,\n startResize,\n getColumnWidth,\n resetColumnWidths,\n };\n}\n","import { useState, useEffect, useCallback, useMemo, RefObject } from 'react';\n\ninterface UseVirtualizationOptions {\n /** Ref to the scrollable container */\n containerRef: RefObject<HTMLElement | null>;\n /** Total number of items */\n itemCount: number;\n /** Fixed height per row in pixels */\n rowHeight: number;\n /** Extra rows to render above/below the viewport */\n buffer: number;\n /** Whether virtualization is active */\n enabled: boolean;\n}\n\ninterface UseVirtualizationResult {\n /** Total height of the virtualized content (px) */\n totalHeight: number;\n /** Index of the first row to render */\n startIndex: number;\n /** Index of the last row to render (exclusive) */\n endIndex: number;\n /** Top offset for the first rendered row (px) */\n offsetTop: number;\n}\n\nexport function useVirtualization({\n containerRef,\n itemCount,\n rowHeight,\n buffer,\n enabled,\n}: UseVirtualizationOptions): UseVirtualizationResult {\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n\n // Observe scroll position\n useEffect(() => {\n if (!enabled) return;\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollTop(container.scrollTop);\n };\n\n // Initial measurement\n setContainerHeight(container.clientHeight);\n setScrollTop(container.scrollTop);\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n\n // Observe container resize\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerHeight(entry.contentRect.height);\n }\n });\n resizeObserver.observe(container);\n\n return () => {\n container.removeEventListener('scroll', handleScroll);\n resizeObserver.disconnect();\n };\n }, [containerRef, enabled]);\n\n // Reset scroll when data changes (e.g., after filter/sort)\n const resetScroll = useCallback(() => {\n if (containerRef.current) {\n containerRef.current.scrollTop = 0;\n setScrollTop(0);\n }\n }, [containerRef]);\n\n useEffect(() => {\n if (enabled) {\n resetScroll();\n }\n }, [itemCount, enabled, resetScroll]);\n\n return useMemo(() => {\n if (!enabled || itemCount === 0) {\n return {\n totalHeight: 0,\n startIndex: 0,\n endIndex: itemCount,\n offsetTop: 0,\n };\n }\n\n const totalHeight = itemCount * rowHeight;\n\n // Calculate visible range\n const visibleStart = Math.floor(scrollTop / rowHeight);\n const visibleCount = Math.ceil(containerHeight / rowHeight);\n\n // Apply buffer\n const startIndex = Math.max(0, visibleStart - buffer);\n const endIndex = Math.min(itemCount, visibleStart + visibleCount + buffer);\n\n const offsetTop = startIndex * rowHeight;\n\n return { totalHeight, startIndex, endIndex, offsetTop };\n }, [enabled, itemCount, rowHeight, scrollTop, containerHeight, buffer]);\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport interface UseExpandableRowsOptions {\n /** Controlled expanded row keys */\n controlledExpandedRows?: string[];\n /** Callback when expanded rows change */\n onExpandChange?: (expandedRows: string[]) => void;\n /** Only allow one row expanded at a time */\n accordion?: boolean;\n}\n\nexport interface UseExpandableRowsReturn {\n /** Set of currently expanded row keys */\n expandedRowKeys: Set<string>;\n /** Check if a row is expanded */\n isExpanded: (rowKey: string) => boolean;\n /** Toggle a row's expanded state */\n toggleExpand: (rowKey: string) => void;\n /** Collapse all rows */\n collapseAll: () => void;\n}\n\nexport function useExpandableRows({\n controlledExpandedRows,\n onExpandChange,\n accordion = false,\n}: UseExpandableRowsOptions): UseExpandableRowsReturn {\n const [internalExpanded, setInternalExpanded] = useState<string[]>([]);\n\n const isControlled = controlledExpandedRows !== undefined;\n const expandedArray = isControlled ? controlledExpandedRows : internalExpanded;\n\n const expandedRowKeys = useMemo(\n () => new Set(expandedArray),\n [expandedArray]\n );\n\n const updateExpanded = useCallback(\n (next: string[]) => {\n if (!isControlled) {\n setInternalExpanded(next);\n }\n onExpandChange?.(next);\n },\n [isControlled, onExpandChange]\n );\n\n const isExpanded = useCallback(\n (rowKey: string) => expandedRowKeys.has(rowKey),\n [expandedRowKeys]\n );\n\n const toggleExpand = useCallback(\n (rowKey: string) => {\n if (expandedRowKeys.has(rowKey)) {\n updateExpanded(expandedArray.filter((k) => k !== rowKey));\n } else if (accordion) {\n updateExpanded([rowKey]);\n } else {\n updateExpanded([...expandedArray, rowKey]);\n }\n },\n [expandedRowKeys, expandedArray, accordion, updateExpanded]\n );\n\n const collapseAll = useCallback(() => {\n updateExpanded([]);\n }, [updateExpanded]);\n\n return {\n expandedRowKeys,\n isExpanded,\n toggleExpand,\n collapseAll,\n };\n}\n","/**\n * Virtualization constants\n *\n * VIRTUALIZATION_THRESHOLD: Minimum number of rows to auto-enable virtualization\n * when pagination is disabled. Below this threshold, all rows render normally.\n * Above it, only visible rows + buffer are rendered for performance.\n *\n * To change this value, update it here — it's the single source of truth.\n */\nexport const VIRTUALIZATION_THRESHOLD = 500;\n\n/**\n * Default fixed row height in pixels for virtualized rendering.\n * Assumes uniform row height (variable height is not supported yet).\n */\nexport const DEFAULT_ROW_HEIGHT = 48;\n\n/**\n * Number of extra rows rendered above and below the visible viewport\n * to prevent flicker during fast scrolling.\n */\nexport const DEFAULT_VIRTUAL_BUFFER = 5;\n","import { useMemo, useState, useCallback, useRef, ReactNode } from 'react';\nimport {\n BetterTableProps,\n TableData,\n defaultLocale,\n locales,\n PaginationConfig,\n} from '../types';\nimport {\n TableProvider,\n TableDataContextValue,\n TableSortContextValue,\n TableFilterContextValue,\n TableSelectionContextValue,\n TablePaginationContextValue,\n TableUIContextValue,\n} from '../context';\nimport { useTableSort } from '../hooks/useTableSort';\nimport { useTableFilter } from '../hooks/useTableFilter';\nimport { useTablePagination } from '../hooks/useTablePagination';\nimport { useTableSelection } from '../hooks/useTableSelection';\nimport { useTableSearch } from '../hooks/useTableSearch';\nimport { useColumnVisibility } from '../hooks/useColumnVisibility';\nimport { useColumnResize } from '../hooks/useColumnResize';\nimport { useMediaQuery } from '../hooks/useMediaQuery';\nimport { useVirtualization } from '../hooks/useVirtualization';\nimport { useExpandableRows } from '../hooks/useExpandableRows';\nimport {\n TableHeader,\n TableBody,\n TablePagination,\n TableToolbar,\n TableEmpty,\n TableLoadingOverlay,\n TableModal,\n TableFilterPanel,\n} from '../components';\nimport { TableCards } from './TableCards';\nimport { TableVirtualBody } from './TableVirtualBody';\nimport {\n VIRTUALIZATION_THRESHOLD,\n DEFAULT_ROW_HEIGHT,\n DEFAULT_VIRTUAL_BUFFER,\n} from '../constants';\nimport '../styles/index.css';\nimport clsx from 'clsx';\n\nfunction BetterTableInner<T extends TableData>(\n props: BetterTableProps<T>\n): React.ReactElement {\n const {\n // Data\n data,\n columns,\n rowKey = 'id' as keyof T,\n\n // Actions\n rowActions,\n globalActions,\n maxVisibleActions = 3,\n\n // Pagination\n pagination = { pageSize: 10 },\n onPageChange,\n\n // Sort\n sort: controlledSort,\n onSortChange,\n multiSort = false,\n multiSortState: controlledMultiSort,\n onMultiSortChange,\n\n // Filter\n filters: controlledFilters,\n onFilterChange,\n filterMode = 'floating',\n\n // Search\n searchable = false,\n searchValue: controlledSearchValue,\n onSearchChange,\n searchColumns,\n searchDebounceMs = 300,\n\n // Server-Side / Manual Mode\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n\n // Selection - now auto-inferred if not explicitly set\n selectable: selectableProp,\n selectedRows: controlledSelectedRows,\n onSelectionChange,\n selectionMode = 'multiple',\n\n // Column Visibility\n columnVisibility = false,\n hiddenColumns: controlledHiddenColumns,\n onColumnVisibilityChange,\n\n // States\n loading = false,\n loadingComponent,\n emptyComponent,\n\n // Styling\n classNames = {},\n styles = {},\n locale: userLocale,\n stickyHeader = false,\n maxHeight,\n bordered = false,\n striped = false,\n hoverable = true,\n size = 'medium',\n\n // Callbacks\n onRowClick,\n onRowDoubleClick,\n\n // Column Resizing\n resizable = false,\n onColumnResize,\n minColumnWidth,\n maxColumnWidth,\n\n // Expandable Rows\n expandable,\n expandedRows: controlledExpandedRows,\n onExpandChange,\n\n // Accessibility\n ariaLabel,\n ariaDescribedBy,\n\n // Virtualization\n virtualize: virtualizeProp,\n rowHeight = DEFAULT_ROW_HEIGHT,\n virtualBuffer = DEFAULT_VIRTUAL_BUFFER,\n } = props;\n\n // Auto-infer selectable: show selection if there's a reason to select\n // - Explicitly set by user (selectableProp)\n // - Has globalAction with requiresSelection\n // - Has onSelectionChange callback\n const selectable = useMemo(() => {\n // If explicitly set, use that value\n if (selectableProp !== undefined) {\n return selectableProp;\n }\n // Auto-infer: true if there's a functional reason to select\n const hasSelectionAction = globalActions?.some(\n (action) => action.requiresSelection\n );\n const hasSelectionCallback = onSelectionChange !== undefined;\n return hasSelectionAction || hasSelectionCallback;\n }, [selectableProp, globalActions, onSelectionChange]);\n\n // Merge locale with defaults\n const locale = useMemo(\n () => {\n const base = typeof userLocale === 'string' ? locales[userLocale] : defaultLocale;\n const overrides = typeof userLocale === 'object' ? userLocale : {};\n return { ...base, ...overrides };\n },\n [userLocale]\n );\n\n // Modal state\n const [isModalOpen, setModalOpen] = useState(false);\n const [modalContent, setModalContent] = useState<ReactNode | null>(null);\n\n // Filter panel state\n const [filterPanelOpen, setFilterPanelOpen] = useState(false);\n const toggleFilterPanel = useCallback(() => {\n setFilterPanelOpen((prev) => !prev);\n }, []);\n\n const hasFilterableColumns = useMemo(\n () => columns.some((col) => col.filterable !== false && col.type !== 'custom' && !col.hidden),\n [columns]\n );\n\n const openModal = useCallback((content: ReactNode) => {\n setModalContent(content);\n setModalOpen(true);\n }, []);\n\n const closeModal = useCallback(() => {\n setModalOpen(false);\n setModalContent(null);\n }, []);\n\n // Pagination config\n const paginationConfig: PaginationConfig | false = useMemo(() => {\n if (pagination === false) return false;\n return {\n pageSize: 10,\n pageSizeOptions: [10, 20, 50, 100],\n showSizeChanger: false,\n ...pagination,\n };\n }, [pagination]);\n\n // Search hook\n const {\n searchedData,\n searchValue,\n handleSearch,\n clearSearch,\n } = useTableSearch({\n data,\n columns,\n searchColumns,\n controlledValue: controlledSearchValue,\n onSearchChange,\n debounceMs: searchDebounceMs,\n manual: manualFiltering,\n });\n\n // Filter hook\n const {\n filteredData,\n filters,\n setFilter,\n clearFilter,\n clearFilters,\n } = useTableFilter({\n data: searchedData,\n columns,\n controlledFilters,\n onFilterChange,\n manual: manualFiltering,\n });\n\n // Sort hook\n const { sortedData, sortState, handleSort, clearSort, multiSortState, isMultiSort } = useTableSort({\n data: filteredData,\n controlledSort,\n onSortChange,\n multiSort,\n controlledMultiSort,\n onMultiSortChange,\n manual: manualSorting,\n });\n\n // Column visibility hook\n const {\n visibleColumns,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n } = useColumnVisibility({\n columns,\n controlledHiddenColumns,\n onColumnVisibilityChange,\n });\n\n // Selection hook\n const {\n selectedRows,\n isSelected,\n toggleRow,\n selectAll,\n deselectAll,\n isAllSelected,\n isPartiallySelected,\n selectedCount,\n } = useTableSelection({\n data: sortedData,\n rowKey,\n mode: selectionMode,\n controlledSelection: controlledSelectedRows,\n onSelectionChange,\n });\n\n // Pagination hook\n const {\n paginatedData,\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n } = useTablePagination({\n data: sortedData,\n config: paginationConfig,\n onPageChange,\n manual: manualPagination,\n });\n\n // Virtualization: auto-enable when no pagination and dataset exceeds threshold\n const isPaginationDisabled = pagination === false;\n const shouldVirtualize = useMemo(() => {\n // User explicitly controls it\n if (virtualizeProp !== undefined) return virtualizeProp;\n // Auto-enable only when pagination is off and dataset is large\n return isPaginationDisabled && sortedData.length > VIRTUALIZATION_THRESHOLD;\n }, [virtualizeProp, isPaginationDisabled, sortedData.length]);\n\n const tableWrapperRef = useRef<HTMLDivElement>(null);\n const tableRef = useRef<HTMLTableElement>(null);\n\n // Column resize hook\n const {\n columnWidths,\n isResizing,\n startResize,\n getColumnWidth,\n } = useColumnResize({\n columns: visibleColumns,\n enabled: resizable,\n minWidth: minColumnWidth,\n maxWidth: maxColumnWidth,\n onColumnResize,\n tableRef,\n });\n\n // Expandable rows hook\n const {\n isExpanded,\n toggleExpand,\n } = useExpandableRows({\n controlledExpandedRows,\n onExpandChange,\n accordion: expandable?.accordion,\n });\n\n // Data to render: when pagination is off, use sortedData directly\n const displayData = isPaginationDisabled ? sortedData : paginatedData;\n\n const { totalHeight, startIndex: virtualStartIndex, endIndex: virtualEndIndex, offsetTop } = useVirtualization({\n containerRef: tableWrapperRef,\n itemCount: displayData.length,\n rowHeight,\n buffer: virtualBuffer,\n enabled: shouldVirtualize,\n });\n\n // Build split context values\n const dataCtx: TableDataContextValue<T> = useMemo(\n () => ({\n data,\n processedData: displayData,\n columns,\n visibleColumns,\n rowKey,\n rowActions,\n globalActions,\n maxVisibleActions,\n expandableRender: expandable?.render,\n isExpanded,\n toggleExpand,\n expandableEnabled: expandable !== undefined,\n }),\n [data, displayData, columns, visibleColumns, rowKey, rowActions, globalActions, maxVisibleActions, expandable, isExpanded, toggleExpand]\n );\n\n const sortCtx: TableSortContextValue = useMemo(\n () => ({\n sortState,\n handleSort,\n multiSortState,\n isMultiSort,\n clearSort,\n }),\n [sortState, handleSort, multiSortState, isMultiSort, clearSort]\n );\n\n const filterCtx: TableFilterContextValue = useMemo(\n () => ({\n filters,\n setFilter,\n clearFilter,\n clearFilters,\n searchValue,\n handleSearch,\n clearSearch,\n searchable,\n filterPanelOpen,\n toggleFilterPanel,\n hasFilterableColumns,\n filterMode,\n }),\n [filters, setFilter, clearFilter, clearFilters, searchValue, handleSearch, clearSearch, searchable, filterPanelOpen, toggleFilterPanel, hasFilterableColumns, filterMode]\n );\n\n const selectionCtx: TableSelectionContextValue<T> = useMemo(\n () => ({\n selectedRows,\n isSelected,\n toggleRow,\n selectAll,\n deselectAll,\n isAllSelected,\n isPartiallySelected,\n selectedCount,\n selectable,\n selectionMode,\n }),\n [selectedRows, isSelected, toggleRow, selectAll, deselectAll, isAllSelected, isPartiallySelected, selectedCount, selectable, selectionMode]\n );\n\n const paginationCtx: TablePaginationContextValue = useMemo(\n () => ({\n page,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n prevPage,\n changePageSize,\n hasNextPage,\n hasPrevPage,\n startIndex,\n endIndex,\n paginationEnabled: pagination !== false,\n pageSizeOptions:\n paginationConfig && typeof paginationConfig === 'object'\n ? paginationConfig.pageSizeOptions ?? [10, 20, 50, 100]\n : [10, 20, 50, 100],\n showSizeChanger:\n paginationConfig && typeof paginationConfig === 'object'\n ? paginationConfig.showSizeChanger ?? false\n : false,\n }),\n [page, pageSize, totalPages, totalItems, goToPage, nextPage, prevPage, changePageSize, hasNextPage, hasPrevPage, startIndex, endIndex, pagination, paginationConfig]\n );\n\n const uiCtx: TableUIContextValue<T> = useMemo(\n () => ({\n locale,\n classNames,\n size,\n bordered,\n striped,\n hoverable,\n stickyHeader,\n loading,\n loadingComponent,\n emptyComponent,\n onRowClick,\n onRowDoubleClick,\n openModal,\n closeModal,\n modalContent,\n isModalOpen,\n columnVisibilityEnabled: columnVisibility,\n hiddenColumnIds,\n toggleColumn,\n showAllColumns,\n isColumnVisible,\n columns,\n resizable,\n columnWidths,\n isResizing,\n startResize,\n getColumnWidth,\n }),\n [locale, classNames, size, bordered, striped, hoverable, stickyHeader, loading, loadingComponent, emptyComponent, onRowClick, onRowDoubleClick, openModal, closeModal, modalContent, isModalOpen, columnVisibility, hiddenColumnIds, toggleColumn, showAllColumns, isColumnVisible, columns, resizable, columnWidths, isResizing, startResize, getColumnWidth]\n );\n\n const hasData = displayData.length > 0;\n const isMobile = useMediaQuery('(max-width: 640px)');\n\n // Announcement for screen readers (aria-live region)\n const announcement = useMemo(() => {\n const parts: string[] = [];\n\n // Results count (only when search or filters are active)\n const hasActiveSearch = searchValue.length > 0;\n const hasActiveFilters = Object.keys(filters).length > 0;\n\n if (hasActiveSearch || hasActiveFilters) {\n if (sortedData.length === 0) {\n parts.push(locale.noResultsFound);\n } else {\n parts.push(locale.resultsFound.replace('{count}', String(sortedData.length)));\n }\n }\n\n // Selection count\n if (selectable && selectedCount > 0) {\n parts.push(locale.rowsSelected.replace('{count}', String(selectedCount)));\n }\n\n return parts.join('. ');\n }, [sortedData.length, searchValue, filters, selectable, selectedCount, locale]);\n\n return (\n <TableProvider data={dataCtx} sort={sortCtx} filter={filterCtx} selection={selectionCtx} pagination={paginationCtx} ui={uiCtx}>\n <div\n className={clsx(\n 'bt-container',\n `bt-size-${size}`,\n striped && 'bt-striped',\n bordered && 'bt-bordered',\n hoverable && 'bt-hoverable',\n loading && 'bt-container-loading',\n classNames.container\n )}\n style={styles.container}\n >\n <TableToolbar />\n {(filterMode === 'panel' || filterMode === 'both') && (\n <TableFilterPanel open={filterPanelOpen} />\n )}\n\n <div\n ref={tableWrapperRef}\n className='bt-table-wrapper'\n style={{\n maxHeight,\n ...(shouldVirtualize && !maxHeight ? { maxHeight: '80vh', overflow: 'auto' } : {}),\n }}\n >\n {isMobile ? (\n /* Cards (móvil) */\n hasData && <TableCards />\n ) : (\n /* Tabla tradicional (desktop/tablet) */\n <table\n ref={tableRef}\n className={clsx('bt-table', resizable && 'bt-table-resizable', classNames.table)}\n style={styles.table}\n role=\"grid\"\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n aria-busy={loading}\n aria-rowcount={shouldVirtualize ? displayData.length : undefined}\n >\n {resizable && (\n <colgroup>\n {expandable && <col style={{ width: 40 }} />}\n {selectable && <col style={{ width: 40 }} />}\n {visibleColumns.map((col) => {\n const w = getColumnWidth(col.id);\n return <col key={col.id} style={w !== undefined ? { width: w } : col.width !== undefined ? { width: col.width } : undefined} />;\n })}\n {rowActions && rowActions.length > 0 && <col />}\n </colgroup>\n )}\n <TableHeader />\n {hasData ? (\n shouldVirtualize ? (\n <TableVirtualBody\n startIndex={virtualStartIndex}\n endIndex={virtualEndIndex}\n totalHeight={totalHeight}\n offsetTop={offsetTop}\n />\n ) : (\n <TableBody />\n )\n ) : (\n <TableEmpty />\n )}\n </table>\n )}\n\n <TableLoadingOverlay show={loading && hasData} />\n </div>\n\n {pagination !== false && <TablePagination />}\n\n <TableModal />\n\n {/* Screen reader announcements for dynamic content changes */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"bt-sr-only\">\n {announcement}\n </div>\n </div>\n </TableProvider>\n );\n}\n\n// Export the generic component directly to preserve type parameters\nexport const BetterTable = BetterTableInner;\nexport default BetterTable;\n"],"names":["TableDataContext","createContext","useTableData","context","useContext","TableDataProvider","TableSortContext","useTableSortContext","TableSortProvider","TableFilterContext","useTableFilterContext","TableFilterProvider","TableSelectionContext","useTableSelectionContext","TableSelectionProvider","TablePaginationContext","useTablePaginationContext","TablePaginationProvider","TableUIContext","useTableUI","TableUIProvider","TableProvider","data","sort","filter","selection","pagination","ui","children","jsx","r","f","n","clsx","SortIdleIcon","jsxs","SortAscIcon","SortDescIcon","TableHeaderCellInner","column","sortState","handleSort","multiSortState","isMultiSort","locale","resizable","startResize","getColumnWidth","isResizable","handleResizeMouseDown","useCallback","e","isSorted","multiSortIndex","s","isInMultiSort","multiSortDirection","showMultiSortBadge","effectivelySorted","effectiveDirection","handleSortClick","handleKeyDown","renderSortIcon","Icon","resizedWidth","TableHeaderCell","React","FilterIcon","TableFloatingFilterInner","visibleColumns","rowActions","expandableEnabled","filters","setFilter","selectable","selectionMode","stickyHeader","hasActions","col","FloatingInput","FloatingInputInner","value","handleChange","v","handleDateChange","field","newRange","fieldId","isActive","useMemo","dr","dateRange","TableFloatingFilter","TableHeaderInner","isAllSelected","isPartiallySelected","selectAll","deselectAll","filterMode","showFloatingFilter","handleSelectAllChange","el","TableHeader","getValueFromPath","obj","path","keys","result","key","compareValues","valueA","valueB","direction","comparison","strA","strB","sortData","columnId","a","b","multiSortData","sorts","activeSorts","toDate","d","filterData","columns","activeFilters","row","filterValue","cellValue","cellDate","range","fromDate","toDateVal","endOfDay","filterDate","searchData","searchValue","searchColumnIds","searchLower","columnsToSearch","TableCellInner","rowIndex","content","date","effectiveWidth","TableCell","DEFAULT_ACTION_ICON","TableActionOverflowInner","actions","_rowIndex","onActionClick","isOpen","setIsOpen","useState","position","setPosition","triggerRef","useRef","menuRef","toggle","prev","rect","spaceBelow","shouldOpenUp","useEffect","handleClickOutside","target","handleScroll","normalActions","dangerActions","sortedActions","hasDangerSeparator","dangerStartIndex","menuStyle","createPortal","action","index","isDisabled","icon","showSeparator","TableActionOverflow","TableActionsInner","maxVisibleActions","openModal","closeModal","handleActionClick","ModalContent","url","inlineActions","overflowActions","visible","inlineSlots","TableActions","TableRowInner","rowKey","isExpanded","toggleExpand","isSelected","toggleRow","striped","hoverable","onRowClick","onRowDoubleClick","selected","isClickable","expanded","handleRowClick","handleRowDoubleClick","handleCheckboxChange","handleToggleExpand","TableRow","TableExpandedRowInner","expandableRender","colspan","TableExpandedRow","TableBodyInner","processedData","getRowKey","keyValue","TableBody","TableCardInner","titleColumn","otherColumns","handleCardClick","renderCellValue","titleValue","cellContent","TableCard","TableCardsInner","TableCards","PanelFilterIcon","TableFilterPanelInner","open","clearFilter","clearFilters","filterableColumns","activeFilterCount","FilterField","FilterFieldInner","hasValue","isDateActive","renderInput","TableFilterPanel","ColumnsIcon","CheckIcon","TableColumnVisibilityInner","hiddenColumnIds","toggleColumn","showAllColumns","isColumnVisible","columnVisibilityEnabled","setOpen","containerRef","buttonRef","hiddenCount","handleEscape","handleToggle","toggleableColumns","TableColumnVisibility","ChevronLeftIcon","ChevronRightIcon","TablePagination","page","pageSize","totalPages","totalItems","goToPage","nextPage","prevPage","changePageSize","hasNextPage","hasPrevPage","startIndex","endIndex","paginationEnabled","pageSizeOptions","showSizeChanger","classNames","handlePageSizeChange","handleQuickJump","pageNumbers","pages","i","start","end","size","pageNum","idx","useMediaQuery","query","matches","setMatches","mql","handler","SearchIcon","ClearIcon","TableToolbarInner","searchable","handleSearch","clearSearch","filterPanelOpen","toggleFilterPanel","hasFilterableColumns","selectedRows","selectedCount","globalActions","isMobile","searchExpanded","setSearchExpanded","searchInputRef","handleSearchChange","toggleSearch","showFilterPanelToggle","showCollapsedSearch","showExpandedSearch","TableToolbar","EmptyIcon","TableEmpty","emptyComponent","colSpan","TableLoadingOverlay","show","loadingComponent","Fragment","FOCUSABLE_SELECTOR","useFocusTrap","previouslyFocusedRef","getFocusableElements","timerId","focusable","firstElement","lastElement","CloseIcon","TableModal","isModalOpen","modalContent","modalRef","handleBackdropClick","TableVirtualBodyInner","totalHeight","offsetTop","visibleRows","bottomHeight","actualIndex","TableVirtualBody","defaultLocale","locales","useTableSort","initialSort","controlledSort","onSortChange","multiSort","controlledMultiSort","onMultiSortChange","manual","internalSort","setInternalSort","internalMultiSort","setInternalMultiSort","existingIndex","newMultiSort","_","primary","newSortState","newState","clearSort","useTableFilter","initialFilters","controlledFilters","onFilterChange","internalFilters","setInternalFilters","newFilters","useTablePagination","config","onPageChange","enabled","initialPage","initialPageSize","serverTotalItems","setPage","setPageSize","newPage","validPage","newSize","paginatedData","useTableSelection","mode","initialSelection","controlledSelection","onSelectionChange","internalSelection","setInternalSelection","selectedKeys","updateSelection","newSelection","selectRow","deselectRow","useTableSearch","searchColumns","initialValue","controlledValue","onSearchChange","debounceMs","internalValue","setInternalValue","debouncedValue","setDebouncedValue","timerRef","useColumnVisibility","controlledHiddenColumns","onColumnVisibilityChange","internalHidden","setInternalHidden","hiddenColumns","newHidden","id","DEFAULT_MIN_WIDTH","useColumnResize","minWidth","maxWidth","onColumnResize","tableRef","columnWidths","setColumnWidths","isResizing","setIsResizing","resizeState","getInitialWidth","th","startX","startWidth","handleMouseMove","diff","newWidth","c","colMin","colMax","handleMouseUp","width","resetColumnWidths","useVirtualization","itemCount","rowHeight","buffer","scrollTop","setScrollTop","containerHeight","setContainerHeight","container","resizeObserver","entries","entry","resetScroll","visibleStart","visibleCount","useExpandableRows","controlledExpandedRows","onExpandChange","accordion","internalExpanded","setInternalExpanded","isControlled","expandedArray","expandedRowKeys","updateExpanded","next","k","collapseAll","VIRTUALIZATION_THRESHOLD","DEFAULT_ROW_HEIGHT","DEFAULT_VIRTUAL_BUFFER","BetterTableInner","props","controlledSearchValue","searchDebounceMs","manualSorting","manualFiltering","manualPagination","selectableProp","controlledSelectedRows","columnVisibility","loading","styles","userLocale","maxHeight","bordered","minColumnWidth","maxColumnWidth","expandable","ariaLabel","ariaDescribedBy","virtualizeProp","virtualBuffer","setModalOpen","setModalContent","setFilterPanelOpen","paginationConfig","searchedData","filteredData","sortedData","isPaginationDisabled","shouldVirtualize","tableWrapperRef","displayData","virtualStartIndex","virtualEndIndex","dataCtx","sortCtx","filterCtx","selectionCtx","paginationCtx","uiCtx","hasData","announcement","parts","hasActiveSearch","hasActiveFilters","w","BetterTable"],"mappings":"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","x_google_ignoreList":[7]}