@redsift/ds-mcp-server 12.5.0-muiv7 → 12.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/data/demos/patterns/_shared/StateDebugPanel.tsx +2 -2
  2. package/data/demos/patterns/_shared/columns.tsx +3 -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 +55 -38
  8. package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +2 -2
  9. package/data/demos/patterns/crossfiltered-datagrid-client-side/example.tsx +2 -2
  10. package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +2 -2
  11. package/data/demos/patterns/crossfiltered-datagrid-server-side/example.tsx +5 -5
  12. package/data/demos/patterns/drilldowned-datagrid-client-side/DrilldownedDatagridClientSide.interaction.stories.tsx +2 -2
  13. package/data/demos/patterns/drilldowned-datagrid-client-side/example.tsx +1 -1
  14. package/data/demos/patterns/drilldowned-datagrid-server-side/DrilldownedDatagridServerSide.interaction.stories.tsx +2 -2
  15. package/data/demos/patterns/drilldowned-datagrid-server-side/example.tsx +1 -1
  16. package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +3 -3
  17. package/data/demos/patterns/single-datagrid-client-side/example.tsx +5 -5
  18. package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +3 -3
  19. package/data/demos/patterns/single-datagrid-server-side/example.tsx +5 -5
  20. package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +1 -1
  21. package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +4 -4
  22. package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +2 -4
  23. package/data/demos/patterns/stateful-single-datagrid-server-side/example.tsx +4 -4
  24. package/data/demos/patterns/summary-dashboard/SummaryDashboard.interaction.stories.tsx +2 -2
  25. package/data/demos/patterns/tabbed-datagrid-client-side/TabbedDatagridClientSide.interaction.stories.tsx +2 -2
  26. package/data/demos/patterns/tabbed-datagrid-server-side/TabbedDatagridServerSide.interaction.stories.tsx +2 -2
  27. package/data/demos/patterns/tabbed-datagrid-server-side/example.tsx +1 -1
  28. package/data/docs/components/dashboard/Dashboard.json +2 -2
  29. package/data/docs/components/table/DataGrid.json +3 -30
  30. package/data/docs/components/table/StatefulDataGrid.json +3 -30
  31. package/data/docs/components-index.json +2 -2
  32. package/data/docs/components.json +10 -64
  33. package/data/docs/llms-full.txt +36 -42
  34. package/data/docs/llms.txt +6 -6
  35. package/data/docs/patterns-catalog.md +24 -25
  36. package/data/docs/patterns.json +4 -4
  37. package/data/metadata.json +2 -2
  38. package/data/patterns/crossfiltered-datagrid-server-side.mdx +1 -1
  39. package/data/patterns/drilldowned-datagrid-client-side.mdx +1 -1
  40. package/data/patterns/drilldowned-datagrid-server-side.mdx +1 -1
  41. package/data/patterns/single-datagrid-client-side.mdx +9 -9
  42. package/data/patterns/single-datagrid-server-side.mdx +4 -4
  43. package/data/patterns/stateful-single-datagrid-client-side.mdx +1 -1
  44. package/data/patterns/tabbed-datagrid-server-side.mdx +1 -1
  45. package/package.json +2 -2
@@ -71,22 +71,6 @@
71
71
  "defaultValue": null,
72
72
  "category": "props"
73
73
  },
74
- {
75
- "name": "className",
76
- "description": "",
77
- "type": "string",
78
- "required": false,
79
- "defaultValue": null,
80
- "category": "props"
81
- },
82
- {
83
- "name": "style",
84
- "description": "",
85
- "type": "CSSProperties",
86
- "required": false,
87
- "defaultValue": null,
88
- "category": "props"
89
- },
90
74
  {
91
75
  "name": "getTreeDataPath",
92
76
  "description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
@@ -96,20 +80,9 @@
96
80
  "category": "props"
97
81
  },
98
82
  {
99
- "name": "unstable_dataSourceCache",
100
- "description": "",
101
- "type": [
102
- "null",
103
- "GridDataSourceCache"
104
- ],
105
- "required": false,
106
- "defaultValue": null,
107
- "category": "props"
108
- },
109
- {
110
- "name": "unstable_onDataSourceError",
111
- "description": "",
112
- "type": "(error: Error, params: GridGetRowsParams) => void",
83
+ "name": "setTreeDataPath",
84
+ "description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
85
+ "type": "(path: string[], row: any) => any",
113
86
  "required": false,
114
87
  "defaultValue": null,
115
88
  "category": "props"
@@ -95,22 +95,6 @@
95
95
  "defaultValue": null,
96
96
  "category": "props"
97
97
  },
98
- {
99
- "name": "className",
100
- "description": "",
101
- "type": "string",
102
- "required": false,
103
- "defaultValue": null,
104
- "category": "props"
105
- },
106
- {
107
- "name": "style",
108
- "description": "",
109
- "type": "CSSProperties",
110
- "required": false,
111
- "defaultValue": null,
112
- "category": "props"
113
- },
114
98
  {
115
99
  "name": "getTreeDataPath",
116
100
  "description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
@@ -120,20 +104,9 @@
120
104
  "category": "props"
121
105
  },
122
106
  {
123
- "name": "unstable_dataSourceCache",
124
- "description": "",
125
- "type": [
126
- "null",
127
- "GridDataSourceCache"
128
- ],
129
- "required": false,
130
- "defaultValue": null,
131
- "category": "props"
132
- },
133
- {
134
- "name": "unstable_onDataSourceError",
135
- "description": "",
136
- "type": "(error: Error, params: GridGetRowsParams) => void",
107
+ "name": "setTreeDataPath",
108
+ "description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
109
+ "type": "(path: string[], row: any) => any",
137
110
  "required": false,
138
111
  "defaultValue": null,
139
112
  "category": "props"
@@ -1011,7 +1011,7 @@
1011
1011
  "name": "DataGrid",
1012
1012
  "package": "@redsift/table",
1013
1013
  "description": "DataGrid displays tabular data with sorting, filtering, pagination, and row selection.",
1014
- "propsCount": 12,
1014
+ "propsCount": 9,
1015
1015
  "hasExamples": false
1016
1016
  },
1017
1017
  {
@@ -1039,7 +1039,7 @@
1039
1039
  "name": "StatefulDataGrid",
1040
1040
  "package": "@redsift/table",
1041
1041
  "description": "StatefulDataGrid extends DataGrid with automatic state persistence to localStorage.",
1042
- "propsCount": 15,
1042
+ "propsCount": 12,
1043
1043
  "hasExamples": false
1044
1044
  },
1045
1045
  {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "name": "Red Sift Design System",
4
- "version": "12.3.0-muiv7",
5
- "generated": "2026-04-03T12:48:51.214Z",
4
+ "version": "12.3.0",
5
+ "generated": "2026-04-03T15:15:35.500Z",
6
6
  "repository": "https://github.com/redsift/design-system",
7
7
  "documentation": "https://design-system.redsift.io",
8
8
  "packages": [
@@ -55184,22 +55184,6 @@
55184
55184
  "defaultValue": null,
55185
55185
  "category": "props"
55186
55186
  },
55187
- {
55188
- "name": "className",
55189
- "description": "",
55190
- "type": "string",
55191
- "required": false,
55192
- "defaultValue": null,
55193
- "category": "props"
55194
- },
55195
- {
55196
- "name": "style",
55197
- "description": "",
55198
- "type": "CSSProperties",
55199
- "required": false,
55200
- "defaultValue": null,
55201
- "category": "props"
55202
- },
55203
55187
  {
55204
55188
  "name": "getTreeDataPath",
55205
55189
  "description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
@@ -55209,20 +55193,9 @@
55209
55193
  "category": "props"
55210
55194
  },
55211
55195
  {
55212
- "name": "unstable_dataSourceCache",
55213
- "description": "",
55214
- "type": [
55215
- "null",
55216
- "GridDataSourceCache"
55217
- ],
55218
- "required": false,
55219
- "defaultValue": null,
55220
- "category": "props"
55221
- },
55222
- {
55223
- "name": "unstable_onDataSourceError",
55224
- "description": "",
55225
- "type": "(error: Error, params: GridGetRowsParams) => void",
55196
+ "name": "setTreeDataPath",
55197
+ "description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
55198
+ "type": "(path: string[], row: any) => any",
55226
55199
  "required": false,
55227
55200
  "defaultValue": null,
55228
55201
  "category": "props"
@@ -55403,22 +55376,6 @@
55403
55376
  "defaultValue": null,
55404
55377
  "category": "props"
55405
55378
  },
55406
- {
55407
- "name": "className",
55408
- "description": "",
55409
- "type": "string",
55410
- "required": false,
55411
- "defaultValue": null,
55412
- "category": "props"
55413
- },
55414
- {
55415
- "name": "style",
55416
- "description": "",
55417
- "type": "CSSProperties",
55418
- "required": false,
55419
- "defaultValue": null,
55420
- "category": "props"
55421
- },
55422
55379
  {
55423
55380
  "name": "getTreeDataPath",
55424
55381
  "description": "Determines the path of a row in the tree data.\nFor instance, a row with the path [\"A\", \"B\"] is the child of the row with the path [\"A\"].\nNote that all paths must contain at least one element.\n@template R\n@param row The row from which we want the path.\n@returns The path to the row.",
@@ -55428,20 +55385,9 @@
55428
55385
  "category": "props"
55429
55386
  },
55430
55387
  {
55431
- "name": "unstable_dataSourceCache",
55432
- "description": "",
55433
- "type": [
55434
- "null",
55435
- "GridDataSourceCache"
55436
- ],
55437
- "required": false,
55438
- "defaultValue": null,
55439
- "category": "props"
55440
- },
55441
- {
55442
- "name": "unstable_onDataSourceError",
55443
- "description": "",
55444
- "type": "(error: Error, params: GridGetRowsParams) => void",
55388
+ "name": "setTreeDataPath",
55389
+ "description": "Updates the tree path in a row model.\nUsed when reordering rows across different parents in tree data.\n@template R\n@param path The new path for the row.\n@param row The row model to update.\n@returns The updated row model with the new path.",
55390
+ "type": "(path: string[], row: any) => any",
55445
55391
  "required": false,
55446
55392
  "defaultValue": null,
55447
55393
  "category": "props"
@@ -55811,8 +55757,8 @@
55811
55757
  },
55812
55758
  {
55813
55759
  "name": "dataGridApiRef",
55814
- "description": "Datagrid API Ref.",
55815
- "type": "MutableRefObject<GridApiPro>",
55760
+ "description": "Datagrid API Ref. MUI v8: can be null initially.",
55761
+ "type": "MutableRefObject<GridApiPremium | null>",
55816
55762
  "required": false,
55817
55763
  "defaultValue": null,
55818
55764
  "category": "props"
@@ -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-03T12:48:51.204Z
6
+ Generated: 2026-04-03T15:15:35.485Z
7
7
  Total Components: 228
8
8
 
9
9
  ---
@@ -6036,11 +6036,8 @@ For `boolean` columns, use `type: 'boolean'` directly (no createColumn wrapper n
6036
6036
  | paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
6037
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 | - | |
6041
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. |
6042
- | unstable_dataSourceCache | null \| GridDataSourceCache | No | - | |
6043
- | unstable_onDataSourceError | (error: Error, params: GridGetRowsParams) => void | No | - | |
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. |
6044
6041
 
6045
6042
  ---
6046
6043
 
@@ -6097,11 +6094,8 @@ Use when users need persistent table preferences. Requires unique `localStorageK
6097
6094
  | paginationPlacement | "top" \| "bottom" \| "both" \| "none" | No | 'both' | Indicates how to display pagination. |
6098
6095
  | paginationProps | Omit<TablePaginationProps, "paginationMode" \| "component" \| "count" \| "onPageChange" \| "onRowsPerPageChange" \| "page" \| "rowsPerPage" \| "rowsPerPageOptions"> | No | - | Props to forward to the pagination component. |
6099
6096
  | theme | "light" \| "dark" | No | - | Theme. |
6100
- | className | string | No | - | |
6101
- | style | CSSProperties | No | - | |
6102
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. |
6103
- | unstable_dataSourceCache | null \| GridDataSourceCache | No | - | |
6104
- | unstable_onDataSourceError | (error: Error, params: GridGetRowsParams) => void | No | - | |
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. |
6105
6099
 
6106
6100
  ---
6107
6101
 
@@ -6211,7 +6205,7 @@ When one chart is filtered, all connected charts update automatically.
6211
6205
  | Prop | Type | Required | Default | Description |
6212
6206
  |------|------|----------|---------|-------------|
6213
6207
  | data | JSONArray | Yes | - | Dataset that will be share across every components within the dashboard. |
6214
- | dataGridApiRef | MutableRefObject<GridApiPro> | No | - | Datagrid API Ref. |
6208
+ | dataGridApiRef | MutableRefObject<GridApiPremium \| null> | No | - | Datagrid API Ref. MUI v8: can be null initially. |
6215
6209
 
6216
6210
  ---
6217
6211
 
@@ -7885,7 +7879,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
7885
7879
  ## Datagrid Page
7886
7880
  **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.
7887
7881
  **Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
7888
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
7882
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
7889
7883
  **Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
7890
7884
  **Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
7891
7885
 
@@ -7968,22 +7962,22 @@ type Row = {
7968
7962
 
7969
7963
  ```tsx
7970
7964
  import React, { useState } from 'react';
7971
- import { DataGrid } from '@redsift/table';
7965
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
7972
7966
  import { Flexbox } from '@redsift/design-system';
7973
- import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-pro';
7967
+ import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
7974
7968
  import { rows } from '../_shared/data';
7975
7969
  import { columns } from '../_shared/columns';
7976
7970
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
7977
7971
  import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
7978
7972
 
7979
7973
  export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
7980
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
7974
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
7981
7975
 
7982
7976
  return (
7983
7977
  <div style={{ width: '100%' }}>
7984
7978
  <Flexbox flexDirection="column" gap="0px">
7985
7979
  <BulkActionBar
7986
- count={selectionModel.length}
7980
+ count={getSelectionCount(selectionModel)}
7987
7981
  onLog={() => console.log('Selected:', selectionModel)}
7988
7982
  onDelete={() => console.log('Delete:', selectionModel)}
7989
7983
  />
@@ -7991,8 +7985,8 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
7991
7985
  <DataGrid
7992
7986
  autoHeight
7993
7987
  pagination
7988
+ density="compact"
7994
7989
  initialState={{
7995
- density: 'compact',
7996
7990
  filter: { filterModel: initialFilterModel ?? DEFAULT_FILTER_MODEL },
7997
7991
  sorting: { sortModel: DEFAULT_SORT_MODEL },
7998
7992
  pagination: { paginationModel: { page: 0, pageSize: 10 } },
@@ -8022,7 +8016,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8022
8016
  ## Server Datagrid Page
8023
8017
  **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.
8024
8018
  **Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
8025
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
8019
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
8026
8020
  **Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
8027
8021
  **Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
8028
8022
 
@@ -8133,9 +8127,9 @@ type FetchResult = {
8133
8127
 
8134
8128
  ```tsx
8135
8129
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8136
- import { DataGrid } from '@redsift/table';
8130
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8137
8131
  import { Flexbox } from '@redsift/design-system';
8138
- import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-pro';
8132
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
8139
8133
  import { Row } from '../_shared/data';
8140
8134
  import { columns } from '../_shared/columns';
8141
8135
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8150,7 +8144,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8150
8144
  const [pageSize, setPageSize] = useState(10);
8151
8145
  const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
8152
8146
  const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
8153
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8147
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8154
8148
 
8155
8149
  const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
8156
8150
  const debounceRef = useRef<ReturnType<typeof setTimeout>>();
@@ -8188,7 +8182,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8188
8182
  <div style={{ width: '100%' }}>
8189
8183
  <Flexbox flexDirection="column" gap="0px">
8190
8184
  <BulkActionBar
8191
- count={selectionModel.length}
8185
+ count={getSelectionCount(selectionModel)}
8192
8186
  onLog={() => console.log('Selected:', selectionModel)}
8193
8187
  onDelete={() => console.log('Delete:', selectionModel)}
8194
8188
  />
@@ -8196,7 +8190,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8196
8190
  <DataGrid
8197
8191
  autoHeight
8198
8192
  pagination
8199
- initialState={{ density: 'compact' }}
8193
+ density="compact"
8200
8194
  paginationMode="server"
8201
8195
  sortingMode="server"
8202
8196
  filterMode="server"
@@ -8256,9 +8250,9 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8256
8250
 
8257
8251
  ```tsx
8258
8252
  import React, { useState } from 'react';
8259
- import { StatefulDataGrid } from '@redsift/table';
8253
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8260
8254
  import { Flexbox } from '@redsift/design-system';
8261
- import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-pro';
8255
+ import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-premium';
8262
8256
  import { rows } from '../_shared/data';
8263
8257
  import { columns } from '../_shared/columns';
8264
8258
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
@@ -8273,14 +8267,14 @@ interface Props {
8273
8267
 
8274
8268
  export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) => {
8275
8269
  const apiRef = useGridApiRef();
8276
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8270
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8277
8271
 
8278
8272
  return (
8279
8273
  <div style={{ width: '100%' }}>
8280
8274
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8281
8275
  <Flexbox flexDirection="column" gap="0px">
8282
8276
  <BulkActionBar
8283
- count={selectionModel.length}
8277
+ count={getSelectionCount(selectionModel)}
8284
8278
  onLog={() => console.log('Selected:', selectionModel)}
8285
8279
  onDelete={() => console.log('Delete:', selectionModel)}
8286
8280
  />
@@ -8336,9 +8330,9 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
8336
8330
 
8337
8331
  ```tsx
8338
8332
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8339
- import { StatefulDataGrid } from '@redsift/table';
8333
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8340
8334
  import { Flexbox } from '@redsift/design-system';
8341
- import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-pro';
8335
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-premium';
8342
8336
  import { Row } from '../_shared/data';
8343
8337
  import { columns } from '../_shared/columns';
8344
8338
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8357,7 +8351,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
8357
8351
  const [rows, setRows] = useState<Row[]>([]);
8358
8352
  const [totalRows, setTotalRows] = useState(0);
8359
8353
  const [loading, setLoading] = useState(true);
8360
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8354
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8361
8355
 
8362
8356
  // Refs track the latest model values so fetchData() always reads current state.
8363
8357
  // StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
@@ -8392,7 +8386,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
8392
8386
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8393
8387
  <Flexbox flexDirection="column" gap="0px">
8394
8388
  <BulkActionBar
8395
- count={selectionModel.length}
8389
+ count={getSelectionCount(selectionModel)}
8396
8390
  onLog={() => console.log('Selected:', selectionModel)}
8397
8391
  onDelete={() => console.log('Delete:', selectionModel)}
8398
8392
  />
@@ -8454,7 +8448,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter }: Props) =>
8454
8448
  ## Drilldown Datagrid Page
8455
8449
  **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.
8456
8450
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8457
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8451
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8458
8452
  **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.
8459
8453
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
8460
8454
 
@@ -8548,7 +8542,7 @@ import { DataGrid } from '@redsift/table';
8548
8542
  import { Flexbox } from '@redsift/design-system';
8549
8543
  import { DataCard, DataRow } from '@redsift/dashboard';
8550
8544
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
8551
- import { GridFilterModel } from '@mui/x-data-grid-pro';
8545
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
8552
8546
  import { rows } from '../_shared/data';
8553
8547
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
8554
8548
  import { CustomToolbar } from '../_shared/helpers';
@@ -8752,7 +8746,7 @@ export default () => {
8752
8746
  ## Cross-filtered Datagrid Page
8753
8747
  **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.
8754
8748
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8755
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8749
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8756
8750
  **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.
8757
8751
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
8758
8752
 
@@ -8867,7 +8861,7 @@ export default () => (
8867
8861
  {/* Category card — two-way: counts update when other cards filter */}
8868
8862
  <WithFilters
8869
8863
  field="Category"
8870
- dimension={(d: Row) => d.Category}
8864
+ dimension={(d: any) => d.Category}
8871
8865
  datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
8872
8866
  syncMode="two-way"
8873
8867
  >
@@ -8900,7 +8894,7 @@ export default () => (
8900
8894
  {/* Allergens card — two-way */}
8901
8895
  <WithFilters
8902
8896
  field="Allergens"
8903
- dimension={(d: Row) => d.Allergens}
8897
+ dimension={(d: any) => d.Allergens}
8904
8898
  isDimensionArray
8905
8899
  datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
8906
8900
  syncMode="two-way"
@@ -9026,7 +9020,7 @@ import { DataGrid } from '@redsift/table';
9026
9020
  import { Flexbox } from '@redsift/design-system';
9027
9021
  import { DataCard, DataRow } from '@redsift/dashboard';
9028
9022
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9029
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9023
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9030
9024
  import { Row } from '../_shared/data';
9031
9025
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9032
9026
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9303,7 +9297,7 @@ import { Flexbox } from '@redsift/design-system';
9303
9297
  import { DataCard, DataRow } from '@redsift/dashboard';
9304
9298
  import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
9305
9299
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9306
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9300
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9307
9301
  import { Row } from '../_shared/data';
9308
9302
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9309
9303
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9507,7 +9501,7 @@ export default () => {
9507
9501
  data={itemsChartData}
9508
9502
  sliceRole="option"
9509
9503
  onSliceClick={(datum: ArcDatum) => {
9510
- const key = datum.data.key as string;
9504
+ const key = datum.data.key;
9511
9505
  setFilterModel((prev) => {
9512
9506
  const selected = getSelectedFromFilterModel(prev, 'Items');
9513
9507
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9516,7 +9510,7 @@ export default () => {
9516
9510
  setPage(0);
9517
9511
  }}
9518
9512
  isSliceSelected={(datum: ArcDatum) =>
9519
- itemsSelection.length === 0 || itemsSelection.includes(datum.data.key as string)
9513
+ itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
9520
9514
  }
9521
9515
  />
9522
9516
 
@@ -9538,7 +9532,7 @@ export default () => {
9538
9532
  data={tagsChartData}
9539
9533
  barRole="option"
9540
9534
  onBarClick={(datum: BarDatum) => {
9541
- const key = datum.data.key as string;
9535
+ const key = String(datum.data.key);
9542
9536
  setFilterModel((prev) => {
9543
9537
  const selected = getSelectedFromFilterModel(prev, 'Tags');
9544
9538
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9547,7 +9541,7 @@ export default () => {
9547
9541
  setPage(0);
9548
9542
  }}
9549
9543
  isBarSelected={(datum: BarDatum) =>
9550
- tagsSelection.length === 0 || tagsSelection.includes(datum.data.key as string)
9544
+ tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
9551
9545
  }
9552
9546
  />
9553
9547
  </Flexbox>
@@ -9725,7 +9719,7 @@ export default () => {
9725
9719
  import React, { useCallback, useEffect, useRef, useState } from 'react';
9726
9720
  import { DataGrid } from '@redsift/table';
9727
9721
  import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
9728
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9722
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9729
9723
  import { Row } from '../_shared/data';
9730
9724
  import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
9731
9725
  import { fetchBakeryData } from '../_shared/api-client';
@@ -181,10 +181,10 @@ The Red Sift Design System provides reusable UI components including forms, navi
181
181
  ### table
182
182
 
183
183
  - **ControlledPagination** (0 props)
184
- - **DataGrid** (12 props): DataGrid displays tabular data with sorting, filtering, pagination, and row selection.
184
+ - **DataGrid** (9 props): DataGrid displays tabular data with sorting, filtering, pagination, and row selection.
185
185
  - **GridToolbarFilterSemanticField** (7 props): The GridToolbarFilterSemanticField component.
186
186
  - **ServerSideControlledPagination** (0 props)
187
- - **StatefulDataGrid** (15 props): StatefulDataGrid extends DataGrid with automatic state persistence to localStorage.
187
+ - **StatefulDataGrid** (12 props): StatefulDataGrid extends DataGrid with automatic state persistence to localStorage.
188
188
  - **TextCell** (6 props): The Cell component.
189
189
  - **Toolbar** (15 props): ------
190
190
  - **ToolbarWrapper** (0 props)
@@ -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 |