fun <T> StylishDataTable(rows: List<T>, columns: List<StylishDataTableColumn<T>>, rowKey: (T) -> Any, modifier: Modifier = Modifier, sortState: StylishDataTableSortState? = null, onSortStateChange: (StylishDataTableSortState) -> Unit? = null, sortStates: List<StylishDataTableSortState> = emptyList(), onSortStatesChange: (List<StylishDataTableSortState>) -> Unit? = null, selectedKeys: Set<Any> = emptySet(), onSelectedKeysChange: (Set<Any>) -> Unit? = null, stickyHeader: Boolean = true, contentPadding: PaddingValues = PaddingValues(0.dp), listState: LazyListState = rememberLazyListState(), headerContainerColor: Color = MaterialTheme.colorScheme.surfaceContainerHighest, selectedRowColor: Color = MaterialTheme.colorScheme.secondaryContainer, rowColor: Color = MaterialTheme.colorScheme.surface, isLoading: Boolean = false, error: Throwable? = null, loadingContent: @Composable () -> Unit? = null, emptyContent: @Composable () -> Unit? = null, errorContent: @Composable () -> Unit? = null, filterText: String = "", onFilterTextChange: (String) -> Unit? = null, filterPredicate: (T, String) -> Boolean? = null, filterPlaceholder: String = "", page: Int = 1, pageSize: Int? = null, onPageChange: (Int) -> Unit? = null, expandedKeys: Set<Any> = emptySet(), onExpandedKeysChange: (Set<Any>) -> Unit? = null, expandedContent: @Composable (T) -> Unit? = null, visibleColumnIds: Set<String> = emptySet(), columnOrder: List<String> = emptyList(), onColumnOrderChange: (List<String>) -> Unit? = null, columnWidths: Map<String, Dp> = emptyMap(), onColumnWidthsChange: (Map<String, Dp>) -> Unit? = null, pinnedColumnIds: Set<String> = emptySet(), freezePinnedColumns: Boolean = false, focusedCell: StylishDataTableCellPosition? = null, onFocusedCellChange: (StylishDataTableCellPosition) -> Unit? = null, onExport: (List<T>) -> Unit? = null, onExportText: (String) -> Unit? = null, exportFormat: StylishDataTableExportFormat = StylishDataTableExportFormat.Csv, exportLabel: String = "") A virtualized, sortable, selectable data table with stable row identity and a sticky header.
State is hoisted: pass sortState and onSortStateChange for controlled sorting, and selectedKeys with onSelectedKeysChange for controlled selection. Omit either callback to disable that interaction. Optional local filtering, pagination, row expansion, column visibility, and export hooks can be connected to server-side data on Web, Android, desktop, and iOS.
fun <T> StylishDataTable(rows: List<T>, columns: List<StylishDataTableColumn<T>>, rowKey: (T) -> Any, state: StylishDataTableState, onStateChange: (StylishDataTableState) -> Unit, modifier: Modifier = Modifier, stickyHeader: Boolean = true, contentPadding: PaddingValues = PaddingValues(0.dp), listState: LazyListState = rememberLazyListState(), headerContainerColor: Color = MaterialTheme.colorScheme.surfaceContainerHighest, selectedRowColor: Color = MaterialTheme.colorScheme.secondaryContainer, rowColor: Color = MaterialTheme.colorScheme.surface, isLoading: Boolean = false, error: Throwable? = null, loadingContent: @Composable () -> Unit? = null, emptyContent: @Composable () -> Unit? = null, errorContent: @Composable () -> Unit? = null, filterPredicate: (T, String) -> Boolean? = null, filterPlaceholder: String = "", expandedContent: @Composable (T) -> Unit? = null, onExport: (List<T>) -> Unit? = null, onExportText: (String) -> Unit? = null, exportFormat: StylishDataTableExportFormat = StylishDataTableExportFormat.Csv, exportLabel: String = "") Renders StylishDataTable from a single hoisted StylishDataTableState.
This overload is the recommended entry point for feature teams that want a headless reducer and a replaceable renderer. Presentation-only options remain available while all query and interaction changes are emitted as StylishDataTableAction-compatible state transitions.