@redsift/ds-mcp-server 12.5.2-muiv6 → 12.5.2

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 (41) hide show
  1. package/data/demos/patterns/_shared/StateDebugPanel.tsx +2 -2
  2. package/data/demos/patterns/_shared/columns.tsx +12 -3
  3. package/data/demos/patterns/_shared/defaults.ts +1 -1
  4. package/data/demos/patterns/_shared/filter-helpers.ts +1 -1
  5. package/data/demos/patterns/_shared/helpers.tsx +1 -1
  6. package/data/demos/patterns/_shared/server-logic.ts +1 -1
  7. package/data/demos/patterns/_shared/story-helpers.ts +106 -22
  8. package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +1 -18
  9. package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +1 -1
  10. package/data/demos/patterns/crossfiltered-datagrid-server-side/example.tsx +10 -10
  11. package/data/demos/patterns/drilldowned-datagrid-client-side/example.tsx +1 -1
  12. package/data/demos/patterns/drilldowned-datagrid-server-side/example.tsx +1 -1
  13. package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +1 -1
  14. package/data/demos/patterns/single-datagrid-client-side/example.tsx +4 -4
  15. package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +1 -1
  16. package/data/demos/patterns/single-datagrid-server-side/example.tsx +4 -4
  17. package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +129 -1
  18. package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +6 -5
  19. package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +134 -1
  20. package/data/demos/patterns/stateful-single-datagrid-server-side/example.tsx +6 -5
  21. package/data/demos/patterns/tabbed-datagrid-server-side/example.tsx +1 -1
  22. package/data/docs/components/dashboard/Dashboard.json +2 -2
  23. package/data/docs/components/table/DataGrid.json +7 -7
  24. package/data/docs/components/table/GridToolbarFilterSemanticField.json +1 -1
  25. package/data/docs/components/table/StatefulDataGrid.json +7 -7
  26. package/data/docs/components/table/Toolbar.json +8 -2
  27. package/data/docs/components.json +1359 -5959
  28. package/data/docs/llms-full.txt +48 -46
  29. package/data/docs/llms.txt +4 -4
  30. package/data/docs/patterns-catalog.md +24 -25
  31. package/data/docs/patterns.json +4 -4
  32. package/data/metadata.json +2 -2
  33. package/data/patterns/crossfiltered-datagrid-server-side.mdx +1 -1
  34. package/data/patterns/drilldowned-datagrid-client-side.mdx +1 -1
  35. package/data/patterns/drilldowned-datagrid-server-side.mdx +1 -1
  36. package/data/patterns/single-datagrid-client-side.mdx +7 -7
  37. package/data/patterns/single-datagrid-server-side.mdx +4 -4
  38. package/data/patterns/stateful-single-datagrid-client-side.mdx +36 -21
  39. package/data/patterns/stateful-single-datagrid-server-side.mdx +46 -18
  40. package/data/patterns/tabbed-datagrid-server-side.mdx +1 -1
  41. package/package.json +2 -2
@@ -3,7 +3,7 @@
3
3
  This file contains comprehensive documentation for all components in the Red Sift Design System.
4
4
  It is optimized for LLM consumption and includes props, types, defaults, and usage examples.
5
5
 
6
- Generated: 2026-04-15T11:48:43.043Z
6
+ Generated: 2026-04-10T18:15:31.360Z
7
7
  Total Components: 228
8
8
 
9
9
  ---
@@ -6034,10 +6034,10 @@ For `boolean` columns, use `type: 'boolean'` directly (no createColumn wrapper n
6034
6034
  | toolbar | ReactNode | No | - | Toolbar. A default one is provided but every button from this default Toolbar can be customized and the entire Toolbar can be replaced. |
6035
6035
  | hideToolbar | false \| true | No | - | Whether the Toolbar is displayed or not. |
6036
6036
  | paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
6037
- | paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "page" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
6037
+ | paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
6038
6038
  | theme | "light" \| "dark" | No | - | Theme. |
6039
- | className | string | No | - | |
6040
- | style | CSSProperties | No | - | |
6039
+ | getTreeDataPath | (row: any) => readonly string[] | No | - | Determines the path of a row in the tree data. For instance, a row with the path ["A", "B"] is the child of the row with the path ["A"]. Note that all paths must contain at least one element. @template R @param row The row from which we want the path. @returns The path to the row. |
6040
+ | setTreeDataPath | (path: string[], row: any) => any | No | - | Updates the tree path in a row model. Used when reordering rows across different parents in tree data. @template R @param path The new path for the row. @param row The row model to update. @returns The updated row model with the new path. |
6041
6041
 
6042
6042
  ---
6043
6043
 
@@ -6053,7 +6053,7 @@ The GridToolbarFilterSemanticField component.
6053
6053
  | Prop | Type | Required | Default | Description |
6054
6054
  |------|------|----------|---------|-------------|
6055
6055
  | nlpFilterConfig | FilterConfig | Yes | - | |
6056
- | onFilterModelChange | (filterModel: GridFilterModel) => void | Yes | - | |
6056
+ | onFilterModelChange | (filterModel: GridFilterModel) => void | No | - | |
6057
6057
  | dateFormat | string | No | - | |
6058
6058
  | defaultModel | string | No | - | |
6059
6059
  | defaultFilter | CompletionResponse | No | - | |
@@ -6092,10 +6092,10 @@ Use when users need persistent table preferences. Requires unique `localStorageK
6092
6092
  | toolbar | ReactNode | No | - | Toolbar. A default one is provided but every button from this default Toolbar can be customized and the entire Toolbar can be replaced. |
6093
6093
  | hideToolbar | false \| true | No | - | Whether the Toolbar is displayed or not. |
6094
6094
  | paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
6095
- | paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "page" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
6095
+ | paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
6096
6096
  | theme | "light" \| "dark" | No | - | Theme. |
6097
- | className | string | No | - | |
6098
- | style | CSSProperties | No | - | |
6097
+ | getTreeDataPath | (row: any) => readonly string[] | No | - | Determines the path of a row in the tree data. For instance, a row with the path ["A", "B"] is the child of the row with the path ["A"]. Note that all paths must contain at least one element. @template R @param row The row from which we want the path. @returns The path to the row. |
6098
+ | setTreeDataPath | (path: string[], row: any) => any | No | - | Updates the tree path in a row model. Used when reordering rows across different parents in tree data. @template R @param path The new path for the row. @param row The row model to update. @returns The updated row model with the new path. |
6099
6099
 
6100
6100
  ---
6101
6101
 
@@ -6130,9 +6130,9 @@ The Cell component.
6130
6130
 
6131
6131
  | Prop | Type | Required | Default | Description |
6132
6132
  |------|------|----------|---------|-------------|
6133
- | columnsButtonProps | GridToolbarColumnsProps | No | - | Props to forward to the column button. |
6133
+ | columnsButtonProps | GridToolbarColumnsButtonProps \| GridToolbarColumnsButtonProps & RefAttributes<HTMLButtonElement> | No | - | Props to forward to the column button. |
6134
6134
  | columnsButtonRef | RefObject<HTMLButtonElement> | No | - | Column button ref. |
6135
- | densityButtonProps | GridToolbarDensityProps | No | - | Props to forward to the density button. |
6135
+ | densityButtonProps | GridToolbarDensitySelectorProps \| GridToolbarDensitySelectorProps & RefAttributes<HTMLButtonElement> | No | - | Props to forward to the density button. |
6136
6136
  | densityButtonRef | RefObject<HTMLButtonElement> | No | - | Density button ref. |
6137
6137
  | exportButtonProps | GridToolbarExportProps | No | - | Props to forward to the export button. |
6138
6138
  | exportButtonRef | RefObject<HTMLButtonElement> | No | - | Export button ref. |
@@ -6205,7 +6205,7 @@ When one chart is filtered, all connected charts update automatically.
6205
6205
  | Prop | Type | Required | Default | Description |
6206
6206
  |------|------|----------|---------|-------------|
6207
6207
  | data | JSONArray | Yes | - | Dataset that will be share across every components within the dashboard. |
6208
- | dataGridApiRef | MutableRefObject<GridApiPro> | No | - | Datagrid API Ref. |
6208
+ | dataGridApiRef | MutableRefObject<GridApiPremium \| null> | No | - | Datagrid API Ref. MUI v8: can be null initially. |
6209
6209
 
6210
6210
  ---
6211
6211
 
@@ -7871,7 +7871,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
7871
7871
  ## Datagrid Page
7872
7872
  **Description:** Full-page MUI DataGrid with built-in Toolbar (columns, filters, density, export, quick search). Uses GridColDef[] with createColumn() for typed filter operators (string, number, date, singleSelect, multiSelect, tags), renderCell with TextCell and Pill, pagination, and checkboxSelection. All filtering, sorting, and pagination happen client-side — all rows are loaded into the DataGrid at once. Optionally includes bulk selection actions (rowSelectionModel + onRowSelectionModelChange). For server-side data handling, see the Server Datagrid Page pattern. Matches the table pattern used across OnDMARC, Certificates, and Brand Trust.
7873
7873
  **Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
7874
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
7874
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
7875
7875
  **Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
7876
7876
  **Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
7877
7877
 
@@ -7954,22 +7954,22 @@ type Row = {
7954
7954
 
7955
7955
  ```tsx
7956
7956
  import React, { useState } from 'react';
7957
- import { DataGrid } from '@redsift/table';
7957
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
7958
7958
  import { Flexbox } from '@redsift/design-system';
7959
- import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-pro';
7959
+ import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
7960
7960
  import { rows } from '../_shared/data';
7961
7961
  import { columns } from '../_shared/columns';
7962
7962
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
7963
7963
  import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
7964
7964
 
7965
7965
  export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
7966
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
7966
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
7967
7967
 
7968
7968
  return (
7969
7969
  <div style={{ width: '100%' }}>
7970
7970
  <Flexbox flexDirection="column" gap="0px">
7971
7971
  <BulkActionBar
7972
- count={selectionModel.length}
7972
+ count={getSelectionCount(selectionModel)}
7973
7973
  onLog={() => console.log('Selected:', selectionModel)}
7974
7974
  onDelete={() => console.log('Delete:', selectionModel)}
7975
7975
  />
@@ -8008,7 +8008,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8008
8008
  ## Server Datagrid Page
8009
8009
  **Description:** Full-page MUI DataGrid where filtering, sorting, and pagination are all handled server-side. Uses paginationMode='server', sortingMode='server', filterMode='server' with controlled rowCount and loading props. The same column types and toolbar as the client-side Datagrid Page pattern, but only the current page of data is fetched per request. Filter changes are debounced to avoid excessive requests. Ideal for datasets too large to load entirely in the browser.
8010
8010
  **Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
8011
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
8011
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
8012
8012
  **Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
8013
8013
  **Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
8014
8014
 
@@ -8119,9 +8119,9 @@ type FetchResult = {
8119
8119
 
8120
8120
  ```tsx
8121
8121
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8122
- import { DataGrid } from '@redsift/table';
8122
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8123
8123
  import { Flexbox } from '@redsift/design-system';
8124
- import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-pro';
8124
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
8125
8125
  import { Row } from '../_shared/data';
8126
8126
  import { columns } from '../_shared/columns';
8127
8127
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8136,7 +8136,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8136
8136
  const [pageSize, setPageSize] = useState(10);
8137
8137
  const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
8138
8138
  const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
8139
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8139
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8140
8140
 
8141
8141
  const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
8142
8142
  const debounceRef = useRef<ReturnType<typeof setTimeout>>();
@@ -8174,7 +8174,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8174
8174
  <div style={{ width: '100%' }}>
8175
8175
  <Flexbox flexDirection="column" gap="0px">
8176
8176
  <BulkActionBar
8177
- count={selectionModel.length}
8177
+ count={getSelectionCount(selectionModel)}
8178
8178
  onLog={() => console.log('Selected:', selectionModel)}
8179
8179
  onDelete={() => console.log('Delete:', selectionModel)}
8180
8180
  />
@@ -8242,9 +8242,10 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8242
8242
 
8243
8243
  ```tsx
8244
8244
  import React, { useState } from 'react';
8245
- import { StatefulDataGrid } from '@redsift/table';
8245
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8246
8246
  import { Flexbox } from '@redsift/design-system';
8247
- import { GridFilterModel, GridRowSelectionModel, GridApiPro, useGridApiRef } from '@mui/x-data-grid-pro';
8247
+ import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-premium';
8248
+ import type { GridApiPremium } from '@mui/x-data-grid-premium';
8248
8249
  import { rows } from '../_shared/data';
8249
8250
  import { columns } from '../_shared/columns';
8250
8251
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
@@ -8255,20 +8256,20 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
8255
8256
  interface Props {
8256
8257
  initialFilterModel?: GridFilterModel;
8257
8258
  useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
8258
- apiRef?: React.MutableRefObject<GridApiPro>;
8259
+ apiRef?: React.MutableRefObject<GridApiPremium | null>;
8259
8260
  }
8260
8261
 
8261
8262
  export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
8262
8263
  const internalApiRef = useGridApiRef();
8263
8264
  const apiRef = propsApiRef ?? internalApiRef;
8264
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8265
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8265
8266
 
8266
8267
  return (
8267
8268
  <div style={{ width: '100%' }}>
8268
8269
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8269
8270
  <Flexbox flexDirection="column" gap="0px">
8270
8271
  <BulkActionBar
8271
- count={selectionModel.length}
8272
+ count={getSelectionCount(selectionModel)}
8272
8273
  onLog={() => console.log('Selected:', selectionModel)}
8273
8274
  onDelete={() => console.log('Delete:', selectionModel)}
8274
8275
  />
@@ -8324,9 +8325,10 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8324
8325
 
8325
8326
  ```tsx
8326
8327
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8327
- import { StatefulDataGrid } from '@redsift/table';
8328
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8328
8329
  import { Flexbox } from '@redsift/design-system';
8329
- import { GridFilterModel, GridRowSelectionModel, GridSortModel, GridApiPro, useGridApiRef } from '@mui/x-data-grid-pro';
8330
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-premium';
8331
+ import type { GridApiPremium } from '@mui/x-data-grid-premium';
8330
8332
  import { Row } from '../_shared/data';
8331
8333
  import { columns } from '../_shared/columns';
8332
8334
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8338,7 +8340,7 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
8338
8340
  interface Props {
8339
8341
  initialFilterModel?: GridFilterModel;
8340
8342
  useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
8341
- apiRef?: React.MutableRefObject<GridApiPro>;
8343
+ apiRef?: React.MutableRefObject<GridApiPremium | null>;
8342
8344
  }
8343
8345
 
8344
8346
  export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
@@ -8347,7 +8349,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8347
8349
  const [rows, setRows] = useState<Row[]>([]);
8348
8350
  const [totalRows, setTotalRows] = useState(0);
8349
8351
  const [loading, setLoading] = useState(true);
8350
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8352
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8351
8353
 
8352
8354
  // Refs track the latest model values so fetchData() always reads current state.
8353
8355
  // StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
@@ -8382,7 +8384,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8382
8384
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8383
8385
  <Flexbox flexDirection="column" gap="0px">
8384
8386
  <BulkActionBar
8385
- count={selectionModel.length}
8387
+ count={getSelectionCount(selectionModel)}
8386
8388
  onLog={() => console.log('Selected:', selectionModel)}
8387
8389
  onDelete={() => console.log('Delete:', selectionModel)}
8388
8390
  />
@@ -8444,7 +8446,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8444
8446
  ## Drilldown Datagrid Page
8445
8447
  **Description:** Extends the Datagrid Page with summary DataCards placed above the grid. Each DataCard contains DataRows showing aggregate counts for a field (status, category, active). Clicking a DataRow adds an isAnyOf filter to the DataGrid — a one-click shortcut. This is a one-way interaction: DataCard counts always reflect the full (unfiltered) dataset. When the user sets an is or isNot filter via the filter panel, the DataCard selection clears and clicking a DataRow overwrites with isAnyOf.
8446
8448
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8447
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8449
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8448
8450
  **Layout:** Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar when selectionModel.length > 0.
8449
8451
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
8450
8452
 
@@ -8538,7 +8540,7 @@ import { DataGrid } from '@redsift/table';
8538
8540
  import { Flexbox } from '@redsift/design-system';
8539
8541
  import { DataCard, DataRow } from '@redsift/dashboard';
8540
8542
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
8541
- import { GridFilterModel } from '@mui/x-data-grid-pro';
8543
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
8542
8544
  import { rows } from '../_shared/data';
8543
8545
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
8544
8546
  import { CustomToolbar } from '../_shared/helpers';
@@ -8742,7 +8744,7 @@ export default () => {
8742
8744
  ## Cross-filtered Datagrid Page
8743
8745
  **Description:** Extends the Drilldown Datagrid Page with two-way synchronization between DataCards and the DataGrid filter panel. DataRow clicks add isAnyOf filters. Filter panel changes update DataCard selection state. DataCard counts recalculate against the cross-filtered dataset — each card computes counts by applying all filters except its own field, preventing a card from zeroing out its non-selected values. When the user sets is/isNot via the filter panel, the DataCard clears. Clicking a DataRow overwrites with isAnyOf.
8744
8746
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8745
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8747
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8746
8748
  **Layout:** Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.
8747
8749
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
8748
8750
 
@@ -9016,7 +9018,7 @@ import { DataGrid } from '@redsift/table';
9016
9018
  import { Flexbox } from '@redsift/design-system';
9017
9019
  import { DataCard, DataRow } from '@redsift/dashboard';
9018
9020
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9019
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9021
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9020
9022
  import { Row } from '../_shared/data';
9021
9023
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9022
9024
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9291,9 +9293,9 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
9291
9293
  import { DataGrid } from '@redsift/table';
9292
9294
  import { Flexbox } from '@redsift/design-system';
9293
9295
  import { DataCard, DataRow } from '@redsift/dashboard';
9294
- import { BarChart, PieChart } from '@redsift/charts';
9296
+ import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
9295
9297
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9296
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9298
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9297
9299
  import { Row } from '../_shared/data';
9298
9300
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9299
9301
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9496,8 +9498,8 @@ export default () => {
9496
9498
  }}
9497
9499
  data={itemsChartData}
9498
9500
  sliceRole="option"
9499
- onSliceClick={(datum: any) => {
9500
- const key = datum.data.key as string;
9501
+ onSliceClick={(datum: ArcDatum) => {
9502
+ const key = datum.data.key;
9501
9503
  setFilterModel((prev) => {
9502
9504
  const selected = getSelectedFromFilterModel(prev, 'Items');
9503
9505
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9505,8 +9507,8 @@ export default () => {
9505
9507
  });
9506
9508
  setPage(0);
9507
9509
  }}
9508
- isSliceSelected={(datum: any) =>
9509
- itemsSelection.length === 0 || itemsSelection.includes(datum.data.key as string)
9510
+ isSliceSelected={(datum: ArcDatum) =>
9511
+ itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
9510
9512
  }
9511
9513
  />
9512
9514
 
@@ -9527,8 +9529,8 @@ export default () => {
9527
9529
  barProps={{ gap: 20 }}
9528
9530
  data={tagsChartData}
9529
9531
  barRole="option"
9530
- onBarClick={(datum: any) => {
9531
- const key = datum.data.key as string;
9532
+ onBarClick={(datum: BarDatum) => {
9533
+ const key = String(datum.data.key);
9532
9534
  setFilterModel((prev) => {
9533
9535
  const selected = getSelectedFromFilterModel(prev, 'Tags');
9534
9536
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9536,8 +9538,8 @@ export default () => {
9536
9538
  });
9537
9539
  setPage(0);
9538
9540
  }}
9539
- isBarSelected={(datum: any) =>
9540
- tagsSelection.length === 0 || tagsSelection.includes(datum.data.key as string)
9541
+ isBarSelected={(datum: BarDatum) =>
9542
+ tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
9541
9543
  }
9542
9544
  />
9543
9545
  </Flexbox>
@@ -9715,7 +9717,7 @@ export default () => {
9715
9717
  import React, { useCallback, useEffect, useRef, useState } from 'react';
9716
9718
  import { DataGrid } from '@redsift/table';
9717
9719
  import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
9718
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9720
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9719
9721
  import { Row } from '../_shared/data';
9720
9722
  import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
9721
9723
  import { fetchBakeryData } from '../_shared/api-client';
@@ -284,12 +284,12 @@ Proven component groupings for common UI scenarios, extracted from production ap
284
284
 
285
285
  | Pattern | Components | Packages |
286
286
  |---------|-----------|----------|
287
- | Datagrid Page | DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
288
- | Server Datagrid Page | DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
287
+ | Datagrid Page | DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-premium |
288
+ | Server Datagrid Page | DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink | @redsift/table, @redsift/design-system, @mui/x-data-grid-premium |
289
289
  | Stateful Datagrid Page (Client) | StatefulDataGrid, DataGrid, Pill, Button, Flexbox, Text, Icon | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
290
290
  | Stateful Datagrid Page (Server) | StatefulDataGrid, DataGrid, Pill, Button, Flexbox, Text, Icon | @redsift/table, @redsift/design-system, @mui/x-data-grid-pro |
291
- | Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro |
292
- | Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro |
291
+ | Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium |
292
+ | Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink | @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium |
293
293
  | Server Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
294
294
  | Server Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
295
295
  | Tabbed Datagrid Page | DataGrid, TextCell, Tabs, Tab, Flexbox, Pill, Number | @redsift/table, @redsift/design-system |
@@ -27,7 +27,7 @@ These patterns serve as implementation specs — they give LLMs and developers e
27
27
  2. DataGrid — the table itself, configured with autoHeight, pagination, checkboxSelection, and GridColDef[] columns
28
28
  3. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
29
29
 
30
- **Key imports:** `DataGrid`, `TextCell`, `StatefulDataGrid` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridRowSelectionModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox` from `@redsift/design-system`
30
+ **Key imports:** `DataGrid`, `TextCell`, `StatefulDataGrid` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridRowSelectionModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox` from `@redsift/design-system`
31
31
  **Components:** DataGrid, TextCell, StatefulDataGrid (from @redsift/table), Flexbox, Button, Pill, Text, Badge, Icon, IconButton, IconButtonLink (from @redsift/design-system)
32
32
  **Layout:** DataGrid with `autoHeight`, `pagination`, `pageSize`, built-in Toolbar (Columns | Filters | Density | Export | Search via `componentsProps.toolbar.showQuickFilter`). Columns use `GridColDef[]` with `createColumn()` for typed filter operators (e.g. `...createColumn('string')`, `...createColumn('number')`, `...createColumn('singleSelect')`), `renderCell` returning `TextCell`, `Pill`, `Badge`. Optional bulk actions bar above grid shown when `selectionModel.length > 0`.
33
33
 
@@ -98,7 +98,7 @@ type Row = {
98
98
  2. DataGrid — the table configured with paginationMode='server', sortingMode='server', filterMode='server', loading, and rowCount
99
99
  3. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
100
100
 
101
- **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridSortModel`, `GridSelectionModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox`, `Icon`, `IconButtonLink` from `@redsift/design-system`
101
+ **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `GridColDef`, `GridFilterModel`, `GridSortModel`, `GridSelectionModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon`, `IconButtonLink` from `@redsift/design-system`
102
102
  **Components:** DataGrid, TextCell (from @redsift/table), Flexbox, Button, Pill, Text, Badge, Icon, IconButton, IconButtonLink (from @redsift/design-system)
103
103
  **Layout:** DataGrid with `autoHeight`, `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `rowCount`, `loading`, built-in Toolbar (Columns | Filters | Density | Export | Search). Same column types as Datagrid Page.
104
104
 
@@ -201,29 +201,29 @@ type FetchResult = {
201
201
 
202
202
  **Anatomy:**
203
203
 
204
- 1. DataCard Row — Flexbox with 1-N DataCards, each containing DataCard.Header and DataCard.Listbox or DataCard.Body with DataRow children
204
+ 1. DataCard Row — Flexbox with 1-N DataCards, each containing DataCard.Header and DataCard.Listbox or DataCard.Body with DrilldownItem children
205
205
  2. Toolbar — Flexbox wrapping GridToolbarContainer with filter, columns, density, export, quick search controls
206
206
  3. DataGrid — the table with controlled filterModel + onFilterModelChange
207
207
  4. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
208
208
 
209
- **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DataRow` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
210
- **Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
209
+ **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
210
+ **Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DrilldownItem (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
211
211
  **Layout:** Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar.
212
212
 
213
213
  **Features:**
214
214
 
215
- | Feature | Required | Description |
216
- | --------------------- | -------- | -------------------------------------------------------------------------------- |
217
- | DataCard aggregation | Yes | DataCard components showing aggregate counts per field from the full dataset |
218
- | DataRow filter push | Yes | Clicking a DataRow adds an isAnyOf filter to the DataGrid filterModel |
219
- | Listbox multi-select | Yes | DataCard.Listbox with selectionMode=multiple and controlled values |
220
- | is/isNot clearing | Yes | When filter panel has is/isNot for a card's field, the DataCard selection clears |
221
- | Column definitions | Yes | GridColDef[] with custom types |
222
- | Toolbar | Yes | Built-in toolbar with filter, columns, density, export, and quick search |
223
- | Custom cell renderers | Yes | renderCell returning TextCell, Pill, Icon, IconButtonLink |
224
- | Boolean toggle | No | DataCard.Body with DataRow onClick for boolean fields |
225
- | Checkbox selection | No | checkboxSelection + rowSelectionModel |
226
- | Bulk action bar | No | Contextual buttons shown when rows are selected |
215
+ | Feature | Required | Description |
216
+ | ------------------------- | -------- | -------------------------------------------------------------------------------- |
217
+ | DataCard aggregation | Yes | DataCard components showing aggregate counts per field from the full dataset |
218
+ | DrilldownItem filter push | Yes | Clicking a DrilldownItem adds an isAnyOf filter to the DataGrid filterModel |
219
+ | Listbox multi-select | Yes | DataCard.Listbox with selectionMode=multiple and controlled values |
220
+ | is/isNot clearing | Yes | When filter panel has is/isNot for a card's field, the DataCard selection clears |
221
+ | Column definitions | Yes | GridColDef[] with custom types |
222
+ | Toolbar | Yes | Built-in toolbar with filter, columns, density, export, and quick search |
223
+ | Custom cell renderers | Yes | renderCell returning TextCell, Pill, Icon, IconButtonLink |
224
+ | Boolean toggle | No | DataCard.Body with DrilldownItem onClick for boolean fields |
225
+ | Checkbox selection | No | checkboxSelection + rowSelectionModel |
226
+ | Bulk action bar | No | Contextual buttons shown when rows are selected |
227
227
 
228
228
  **Filter helpers:**
229
229
 
@@ -257,7 +257,7 @@ type AggregateCounts = {
257
257
 
258
258
  1. Define your row type — every row must have a unique id field.
259
259
  2. Compute aggregate counts — useAggregateCounts(allRows) counts from the full dataset.
260
- 3. Build DataCards with DataCard.Header, DataCard.Listbox (multi-select) or DataCard.Body (boolean toggle) containing DataRow children.
260
+ 3. Build DataCards with DataCard.Header, DataCard.Listbox (multi-select) or DataCard.Body (boolean toggle) containing DrilldownItem children.
261
261
  4. Write filter helpers — getSelectedFromFilterModel and updateFilterModel.
262
262
  5. Wire DataCard handlers — onChange to updateFilterModel, onClick to updateBooleanFilter.
263
263
  6. Render the DataGrid with controlled filterModel and onFilterModelChange.
@@ -277,7 +277,7 @@ type AggregateCounts = {
277
277
  - DataCard counts should recalculate as filters change — reflecting the current filter context
278
278
  - Clicking a card value should add a filter to the datagrid (bidirectional)
279
279
  - Changing the filter panel should update the card selection
280
- - The dataset is small enough to load entirely (under ~50,000 rows — crossfilter2 handles this efficiently)
280
+ - The dataset is small enough to load entirely (under ~1,000 rows)
281
281
 
282
282
  **When NOT to use:**
283
283
 
@@ -290,11 +290,10 @@ type AggregateCounts = {
290
290
  1. DataCard Row — Flexbox with 1-N DataCards. Counts are cross-filtered: each card excludes its own field from the filter calculation
291
291
  2. Toolbar — Flexbox wrapping GridToolbarContainer with filter, columns, density, export, quick search controls
292
292
  3. DataGrid — the table with controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side
293
- 4. Dashboard wrapper`Dashboard` component wraps everything, providing the crossfilter2 context
294
- 5. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
293
+ 4. Bulk Action Bar Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
295
294
 
296
- **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DataRow` from `@redsift/dashboard`; `Dashboard`, `WithFilters` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
297
- **Components:** DataGrid, TextCell (from @redsift/table), Dashboard, WithFilters, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
295
+ **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-premium`; `Pill`, `Button`, `Flexbox`, `Icon` from `@redsift/design-system`
296
+ **Components:** DataGrid, TextCell (from @redsift/table), DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DrilldownItem (from @redsift/dashboard), Flexbox, Button, Pill, Text, Icon, IconButtonLink (from @redsift/design-system)
298
297
  **Layout:** Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.
299
298
 
300
299
  **Features:**
@@ -303,14 +302,14 @@ type AggregateCounts = {
303
302
  | -------------------------- | -------- | -------------------------------------------------------------------------------- |
304
303
  | Cross-filtered aggregation | Yes | DataCard counts recompute from rows filtered by all fields except the card's own |
305
304
  | Two-way filter sync | Yes | DataCard selections derive from filterModel; DataCard clicks update filterModel |
306
- | DataRow filter push | Yes | Clicking a DataRow adds an isAnyOf filter to the DataGrid filterModel |
305
+ | DrilldownItem filter push | Yes | Clicking a DrilldownItem adds an isAnyOf filter to the DataGrid filterModel |
307
306
  | Listbox multi-select | Yes | DataCard.Listbox with selectionMode=multiple and controlled values |
308
307
  | is/isNot clearing | Yes | When filter panel has is/isNot for a card's field, the DataCard selection clears |
309
308
  | Client-side row filtering | Yes | applyFilters function filters the full row set by the current filterModel |
310
309
  | Column definitions | Yes | GridColDef[] with custom types |
311
310
  | Toolbar | Yes | Built-in toolbar with filter, columns, density, export, and quick search |
312
311
  | Custom cell renderers | Yes | renderCell returning TextCell, Pill, Icon, IconButtonLink |
313
- | Boolean toggle | No | DataCard.Body with DataRow onClick for boolean fields (active/inactive) |
312
+ | Boolean toggle | No | DataCard.Body with DrilldownItem onClick for boolean fields |
314
313
  | Checkbox selection | No | checkboxSelection + rowSelectionModel |
315
314
  | Bulk action bar | No | Contextual buttons shown when rows are selected |
316
315
 
@@ -16,7 +16,7 @@
16
16
  "IconButton",
17
17
  "IconButtonLink"
18
18
  ],
19
- "packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-pro"],
19
+ "packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-premium"],
20
20
  "layout": "DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.",
21
21
  "tags": [
22
22
  "table",
@@ -167,7 +167,7 @@
167
167
  "IconButton",
168
168
  "IconButtonLink"
169
169
  ],
170
- "packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-pro"],
170
+ "packages": ["@redsift/table", "@redsift/design-system", "@mui/x-data-grid-premium"],
171
171
  "layout": "DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.",
172
172
  "tags": [
173
173
  "table",
@@ -448,7 +448,7 @@
448
448
  "Icon",
449
449
  "IconButtonLink"
450
450
  ],
451
- "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-pro"],
451
+ "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
452
452
  "layout": "Flexbox column: DataCard row (Flexbox gap=12px flexWrap=wrap with 1-N DataCards), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Optional bulk actions bar when selectionModel.length > 0.",
453
453
  "tags": [
454
454
  "table",
@@ -616,7 +616,7 @@
616
616
  "Icon",
617
617
  "IconButtonLink"
618
618
  ],
619
- "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-pro"],
619
+ "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
620
620
  "layout": "Flexbox column: DataCard row (cross-filtered counts), then DataGrid with autoHeight, pagination, controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side via applyFilters. Optional bulk actions bar.",
621
621
  "tags": [
622
622
  "table",
@@ -1,4 +1,4 @@
1
1
  {
2
- "generatedAt": "2026-04-22T18:11:44.828Z",
3
- "commitSha": "6baea6f3d9ffdae6977a63827a537bf0661701d7"
2
+ "generatedAt": "2026-04-22T18:24:18.286Z",
3
+ "commitSha": "3dd5b1120b0eab67de52a7942c5b8b16fa520abd"
4
4
  }
@@ -99,7 +99,7 @@ When **not** to use:
99
99
  ## State Management
100
100
 
101
101
  <CodeBlock codeString={`import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
102
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
102
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
103
103
 
104
104
  // Server-driven state
105
105
  const [rows, setRows] = useState<Row[]>([]);
@@ -114,7 +114,7 @@ When **not** to use:
114
114
  ## State Management
115
115
 
116
116
  <CodeBlock codeString={`import { useCallback, useMemo, useState } from 'react';
117
- import { GridFilterModel } from '@mui/x-data-grid-pro';
117
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
118
118
 
119
119
  // Filter state — controlled, shared between DataCards and DataGrid
120
120
  const [filterModel, setFilterModel] = useState<GridFilterModel>({ items: [] });
@@ -91,7 +91,7 @@ When **not** to use:
91
91
  ## State Management
92
92
 
93
93
  <CodeBlock codeString={`import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
94
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
94
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
95
95
 
96
96
  // Server-driven state
97
97
  const [rows, setRows] = useState<Row[]>([]);
@@ -33,7 +33,7 @@ When **not** to use:
33
33
 
34
34
  1. **Toolbar** — `Flexbox` wrapping MUI's `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and `GridToolbarQuickFilter`
35
35
  2. **DataGrid** — the table itself from `@redsift/table`, configured with `autoHeight`, `pagination`, `checkboxSelection`, and `GridColDef[]` columns
36
- 3. **Bulk Action Bar** — a `Flexbox` row shown when `selectionModel.length > 0`, containing a `Pill` with the selection count and action `Button` components
36
+ 3. **Bulk Action Bar** — a `Flexbox` row shown when rows are selected, containing a `Pill` with the selection count and action `Button` components
37
37
 
38
38
  ## Features
39
39
 
@@ -124,10 +124,10 @@ When **not** to use:
124
124
  ## State Management
125
125
 
126
126
  <CodeBlock codeString={`import { useState } from 'react';
127
- import { GridSelectionModel } from '@mui/x-data-grid-pro';
127
+ import { GridRowSelectionModel } from '@mui/x-data-grid-premium';
128
128
 
129
129
  // Selection state — tracks which rows are checked
130
- const [selectionModel, setSelectionModel] = useState<GridSelectionModel>([]);
130
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
131
131
 
132
132
  // Page size — controlled if you need to persist it
133
133
  // (DataGrid manages page/pageSize internally for client-side mode)
@@ -149,7 +149,7 @@ type Row = {
149
149
  };
150
150
 
151
151
  // Column definitions — use createColumn() for built-in filter operators
152
- import { GridColDef } from '@mui/x-data-grid-pro';
152
+ import { GridColDef } from '@mui/x-data-grid-premium';
153
153
  import { createColumn } from '@redsift/table';
154
154
 
155
155
  const columns: GridColDef[] = [
@@ -184,9 +184,9 @@ When data fetching fails, replace the DataGrid area with an error message and a
184
184
  1. **Define your row type** — Create a TypeScript `type Row` per the Data Contract section. Every row must have a unique `id` field.
185
185
  2. **Define column definitions** — Create a `GridColDef[]` array. Use `createColumn()` (e.g. `...createColumn('string')`, `...createColumn('number')`, `...createColumn('singleSelect')`, `...createColumn('multiSelect')`) for built-in filter operators. Add `renderCell` for rich content (pills, icons, links).
186
186
  3. **Create the toolbar** — Build a `CustomToolbar` component using `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and optionally `GridToolbarQuickFilter`.
187
- 4. **Set up state** — Add `useState<GridSelectionModel>([])` for checkbox selection (if needed).
188
- 5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `pageSize`, `rowsPerPageOptions`, `checkboxSelection`, `components={{ Toolbar: CustomToolbar }}`.
189
- 6. **Add bulk action bar** — Conditionally render a `Flexbox` with a `Pill` (selection count) and action `Button` components when `selectionModel.length > 0`.
187
+ 4. **Set up state** — Add `useState<GridRowSelectionModel>` for checkbox selection (if needed).
188
+ 5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `pageSize`, `rowsPerPageOptions`, `checkboxSelection`, `slots={{ toolbar: CustomToolbar }}`.
189
+ 6. **Add bulk action bar** — Conditionally render a `Flexbox` with a `Pill` (selection count) and action `Button` components when rows are selected.
190
190
  7. **Handle edge cases** — Add loading state (`loading` prop), empty state (custom `NoRowsOverlay`), and error state (conditional render with retry).
191
191
  8. **Verify** — Test pagination breakpoints, filter operators, column visibility toggle, density switching, and export.
192
192
 
@@ -34,7 +34,7 @@ When **not** to use:
34
34
 
35
35
  1. **Toolbar** — `Flexbox` wrapping MUI's `GridToolbarContainer` with `GridToolbarFilterButton`, `GridToolbarColumnsButton`, `GridToolbarDensitySelector`, `GridToolbarExport`, and `GridToolbarQuickFilter`
36
36
  2. **DataGrid** — the table configured with `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, and `rowCount`
37
- 3. **Bulk Action Bar** — a `Flexbox` row shown when `selectionModel.length > 0`, containing a `Pill` with the selection count and action `Button` components
37
+ 3. **Bulk Action Bar** — a `Flexbox` row shown when rows are selected, containing a `Pill` with the selection count and action `Button` components
38
38
 
39
39
  ## Features
40
40
 
@@ -159,7 +159,7 @@ When **not** to use:
159
159
  ## State Management
160
160
 
161
161
  <CodeBlock codeString={`import { useCallback, useEffect, useRef, useState } from 'react';
162
- import { GridFilterModel, GridSelectionModel, GridSortModel } from '@mui/x-data-grid-pro';
162
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
163
163
 
164
164
  // Data state — rows returned from the server for the current page
165
165
  const [rows, setRows] = useState<Row[]>([]);
@@ -175,7 +175,7 @@ const [sortModel, setSortModel] = useState<GridSortModel>([]);
175
175
  const [filterModel, setFilterModel] = useState<GridFilterModel>({ items: [] });
176
176
 
177
177
  // Selection state
178
- const [selectionModel, setSelectionModel] = useState<GridSelectionModel>([]);
178
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
179
179
 
180
180
  // Quick search
181
181
  const [quickFilterText, setQuickFilterText] = useState('');
@@ -269,7 +269,7 @@ The fetch function rejects with an error. The component shows an error banner ab
269
269
  6. **Wire the fetch effect** — Use `useEffect` to call your fetch function whenever `page`, `pageSize`, `sortModel`, `filterModel`, or `quickFilterText` changes.
270
270
  7. **Configure the DataGrid** — Pass `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, `rowCount={totalRows}`, and all controlled state handlers (`onPageChange`, `onPageSizeChange`, `onSortModelChange`, `onFilterModelChange`).
271
271
  8. **Debounce filter changes** — Use a 300ms `setTimeout` in `onFilterModelChange` to avoid excessive requests during rapid typing. Reset to page 0 on filter change.
272
- 9. **Add bulk action bar** — Conditionally render when `selectionModel.length > 0`.
272
+ 9. **Add bulk action bar** — Conditionally render when rows are selected.
273
273
  10. **Handle edge cases** — Add loading state (`loading` prop), empty state (custom `NoRowsOverlay`), and error state (conditional render with retry).
274
274
  11. **Verify** — Test page navigation, sort toggling, filter operators, debounced quick search, loading overlay, empty results, and error recovery.
275
275