@redsift/ds-mcp-server 12.5.2-muiv7 → 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 (46) 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 +106 -36
  8. package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +4 -19
  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 +3 -3
  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 +5 -19
  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 -6
  20. package/data/demos/patterns/stateful-single-datagrid-client-side/StatefulSingleDatagridClientSide.interaction.stories.tsx +130 -3
  21. package/data/demos/patterns/stateful-single-datagrid-client-side/example.tsx +6 -6
  22. package/data/demos/patterns/stateful-single-datagrid-server-side/StatefulSingleDatagridServerSide.interaction.stories.tsx +136 -6
  23. package/data/demos/patterns/stateful-single-datagrid-server-side/example.tsx +6 -9
  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 -58
  33. package/data/docs/llms-full.txt +40 -46
  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 +36 -20
  44. package/data/patterns/stateful-single-datagrid-server-side.mdx +46 -18
  45. package/data/patterns/tabbed-datagrid-server-side.mdx +1 -1
  46. package/package.json +2 -2
@@ -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-15T11:48:43.051Z",
4
+ "version": "12.3.0",
5
+ "generated": "2026-04-10T18:15:31.369Z",
6
6
  "repository": "https://github.com/redsift/design-system",
7
7
  "documentation": "https://design-system.redsift.io",
8
8
  "packages": [
@@ -51493,22 +51493,6 @@
51493
51493
  "defaultValue": null,
51494
51494
  "category": "props"
51495
51495
  },
51496
- {
51497
- "name": "className",
51498
- "description": "",
51499
- "type": "string",
51500
- "required": false,
51501
- "defaultValue": null,
51502
- "category": "props"
51503
- },
51504
- {
51505
- "name": "style",
51506
- "description": "",
51507
- "type": "CSSProperties",
51508
- "required": false,
51509
- "defaultValue": null,
51510
- "category": "props"
51511
- },
51512
51496
  {
51513
51497
  "name": "getTreeDataPath",
51514
51498
  "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.",
@@ -51518,17 +51502,9 @@
51518
51502
  "category": "props"
51519
51503
  },
51520
51504
  {
51521
- "name": "unstable_dataSourceCache",
51522
- "description": "",
51523
- "type": ["null", "GridDataSourceCache"],
51524
- "required": false,
51525
- "defaultValue": null,
51526
- "category": "props"
51527
- },
51528
- {
51529
- "name": "unstable_onDataSourceError",
51530
- "description": "",
51531
- "type": "(error: Error, params: GridGetRowsParams) => void",
51505
+ "name": "setTreeDataPath",
51506
+ "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.",
51507
+ "type": "(path: string[], row: any) => any",
51532
51508
  "required": false,
51533
51509
  "defaultValue": null,
51534
51510
  "category": "props"
@@ -51695,22 +51671,6 @@
51695
51671
  "defaultValue": null,
51696
51672
  "category": "props"
51697
51673
  },
51698
- {
51699
- "name": "className",
51700
- "description": "",
51701
- "type": "string",
51702
- "required": false,
51703
- "defaultValue": null,
51704
- "category": "props"
51705
- },
51706
- {
51707
- "name": "style",
51708
- "description": "",
51709
- "type": "CSSProperties",
51710
- "required": false,
51711
- "defaultValue": null,
51712
- "category": "props"
51713
- },
51714
51674
  {
51715
51675
  "name": "getTreeDataPath",
51716
51676
  "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.",
@@ -51720,17 +51680,9 @@
51720
51680
  "category": "props"
51721
51681
  },
51722
51682
  {
51723
- "name": "unstable_dataSourceCache",
51724
- "description": "",
51725
- "type": ["null", "GridDataSourceCache"],
51726
- "required": false,
51727
- "defaultValue": null,
51728
- "category": "props"
51729
- },
51730
- {
51731
- "name": "unstable_onDataSourceError",
51732
- "description": "",
51733
- "type": "(error: Error, params: GridGetRowsParams) => void",
51683
+ "name": "setTreeDataPath",
51684
+ "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.",
51685
+ "type": "(path: string[], row: any) => any",
51734
51686
  "required": false,
51735
51687
  "defaultValue": null,
51736
51688
  "category": "props"
@@ -52077,8 +52029,8 @@
52077
52029
  },
52078
52030
  {
52079
52031
  "name": "dataGridApiRef",
52080
- "description": "Datagrid API Ref.",
52081
- "type": "MutableRefObject<GridApiPro>",
52032
+ "description": "Datagrid API Ref. MUI v8: can be null initially.",
52033
+ "type": "MutableRefObject<GridApiPremium | null>",
52082
52034
  "required": false,
52083
52035
  "defaultValue": null,
52084
52036
  "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-15T11:48:43.043Z
6
+ Generated: 2026-04-10T18:15:31.360Z
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
 
@@ -7877,7 +7871,7 @@ Each pattern describes a common UI scenario, the components involved, how they a
7877
7871
  ## Datagrid Page
7878
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.
7879
7873
  **Components:** DataGrid, TextCell, StatefulDataGrid, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
7880
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
7874
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
7881
7875
  **Layout:** DataGrid with autoHeight, pagination, pageSize, built-in Toolbar via componentsProps.toolbar.showQuickFilter. Optional bulk actions bar when selectionModel.length > 0.
7882
7876
  **Tags:** table, datagrid, list, pagination, filter, toolbar, bulk-actions, GridColDef, filterModel, checkboxSelection, client-side
7883
7877
 
@@ -7960,22 +7954,22 @@ type Row = {
7960
7954
 
7961
7955
  ```tsx
7962
7956
  import React, { useState } from 'react';
7963
- import { DataGrid } from '@redsift/table';
7957
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
7964
7958
  import { Flexbox } from '@redsift/design-system';
7965
- import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-pro';
7959
+ import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
7966
7960
  import { rows } from '../_shared/data';
7967
7961
  import { columns } from '../_shared/columns';
7968
7962
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
7969
7963
  import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
7970
7964
 
7971
7965
  export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
7972
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
7966
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
7973
7967
 
7974
7968
  return (
7975
7969
  <div style={{ width: '100%' }}>
7976
7970
  <Flexbox flexDirection="column" gap="0px">
7977
7971
  <BulkActionBar
7978
- count={selectionModel.length}
7972
+ count={getSelectionCount(selectionModel)}
7979
7973
  onLog={() => console.log('Selected:', selectionModel)}
7980
7974
  onDelete={() => console.log('Delete:', selectionModel)}
7981
7975
  />
@@ -7983,8 +7977,8 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
7983
7977
  <DataGrid
7984
7978
  autoHeight
7985
7979
  pagination
7980
+ density="compact"
7986
7981
  initialState={{
7987
- density: 'compact',
7988
7982
  filter: { filterModel: initialFilterModel ?? DEFAULT_FILTER_MODEL },
7989
7983
  sorting: { sortModel: DEFAULT_SORT_MODEL },
7990
7984
  pagination: { paginationModel: { page: 0, pageSize: 10 } },
@@ -8014,7 +8008,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8014
8008
  ## Server Datagrid Page
8015
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.
8016
8010
  **Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
8017
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
8011
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
8018
8012
  **Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
8019
8013
  **Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
8020
8014
 
@@ -8125,9 +8119,9 @@ type FetchResult = {
8125
8119
 
8126
8120
  ```tsx
8127
8121
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8128
- import { DataGrid } from '@redsift/table';
8122
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8129
8123
  import { Flexbox } from '@redsift/design-system';
8130
- import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-pro';
8124
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
8131
8125
  import { Row } from '../_shared/data';
8132
8126
  import { columns } from '../_shared/columns';
8133
8127
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8142,7 +8136,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8142
8136
  const [pageSize, setPageSize] = useState(10);
8143
8137
  const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
8144
8138
  const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
8145
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8139
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8146
8140
 
8147
8141
  const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
8148
8142
  const debounceRef = useRef<ReturnType<typeof setTimeout>>();
@@ -8180,7 +8174,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8180
8174
  <div style={{ width: '100%' }}>
8181
8175
  <Flexbox flexDirection="column" gap="0px">
8182
8176
  <BulkActionBar
8183
- count={selectionModel.length}
8177
+ count={getSelectionCount(selectionModel)}
8184
8178
  onLog={() => console.log('Selected:', selectionModel)}
8185
8179
  onDelete={() => console.log('Delete:', selectionModel)}
8186
8180
  />
@@ -8188,7 +8182,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8188
8182
  <DataGrid
8189
8183
  autoHeight
8190
8184
  pagination
8191
- initialState={{ density: 'compact' }}
8185
+ density="compact"
8192
8186
  paginationMode="server"
8193
8187
  sortingMode="server"
8194
8188
  filterMode="server"
@@ -8248,10 +8242,10 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
8248
8242
 
8249
8243
  ```tsx
8250
8244
  import React, { useState } from 'react';
8251
- import { StatefulDataGrid } from '@redsift/table';
8245
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8252
8246
  import { Flexbox } from '@redsift/design-system';
8253
- import { GridFilterModel, GridRowSelectionModel, useGridApiRef } from '@mui/x-data-grid-pro';
8254
- import type { GridApiPro } 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';
8255
8249
  import { rows } from '../_shared/data';
8256
8250
  import { columns } from '../_shared/columns';
8257
8251
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
@@ -8262,20 +8256,20 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
8262
8256
  interface Props {
8263
8257
  initialFilterModel?: GridFilterModel;
8264
8258
  useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
8265
- apiRef?: React.MutableRefObject<GridApiPro>;
8259
+ apiRef?: React.MutableRefObject<GridApiPremium | null>;
8266
8260
  }
8267
8261
 
8268
8262
  export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
8269
8263
  const internalApiRef = useGridApiRef();
8270
8264
  const apiRef = propsApiRef ?? internalApiRef;
8271
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8265
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8272
8266
 
8273
8267
  return (
8274
8268
  <div style={{ width: '100%' }}>
8275
8269
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8276
8270
  <Flexbox flexDirection="column" gap="0px">
8277
8271
  <BulkActionBar
8278
- count={selectionModel.length}
8272
+ count={getSelectionCount(selectionModel)}
8279
8273
  onLog={() => console.log('Selected:', selectionModel)}
8280
8274
  onDelete={() => console.log('Delete:', selectionModel)}
8281
8275
  />
@@ -8331,10 +8325,10 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8331
8325
 
8332
8326
  ```tsx
8333
8327
  import React, { useCallback, useEffect, useRef, useState } from 'react';
8334
- import { StatefulDataGrid } from '@redsift/table';
8328
+ import { StatefulDataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
8335
8329
  import { Flexbox } from '@redsift/design-system';
8336
- import { GridFilterModel, GridRowSelectionModel, GridSortModel, useGridApiRef } from '@mui/x-data-grid-pro';
8337
- import type { GridApiPro } 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';
8338
8332
  import { Row } from '../_shared/data';
8339
8333
  import { columns } from '../_shared/columns';
8340
8334
  import { fetchBakeryData } from '../_shared/api-client';
@@ -8346,7 +8340,7 @@ import { StateDebugPanel } from '../_shared/StateDebugPanel';
8346
8340
  interface Props {
8347
8341
  initialFilterModel?: GridFilterModel;
8348
8342
  useRouter?: () => { pathname: string; search: string; historyReplace: (newSearch: string) => void };
8349
- apiRef?: React.MutableRefObject<GridApiPro>;
8343
+ apiRef?: React.MutableRefObject<GridApiPremium | null>;
8350
8344
  }
8351
8345
 
8352
8346
  export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: propsApiRef }: Props) => {
@@ -8355,7 +8349,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8355
8349
  const [rows, setRows] = useState<Row[]>([]);
8356
8350
  const [totalRows, setTotalRows] = useState(0);
8357
8351
  const [loading, setLoading] = useState(true);
8358
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
8352
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
8359
8353
 
8360
8354
  // Refs track the latest model values so fetchData() always reads current state.
8361
8355
  // StatefulDataGrid manages filter/sort/pagination internally — we use callbacks
@@ -8390,7 +8384,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8390
8384
  <StateDebugPanel apiRef={apiRef} useRouter={useRouter} localStorageVersion={1} />
8391
8385
  <Flexbox flexDirection="column" gap="0px">
8392
8386
  <BulkActionBar
8393
- count={selectionModel.length}
8387
+ count={getSelectionCount(selectionModel)}
8394
8388
  onLog={() => console.log('Selected:', selectionModel)}
8395
8389
  onDelete={() => console.log('Delete:', selectionModel)}
8396
8390
  />
@@ -8452,7 +8446,7 @@ export default ({ initialFilterModel, useRouter = useRouterAdapter, apiRef: prop
8452
8446
  ## Drilldown Datagrid Page
8453
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.
8454
8448
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8455
- **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
8456
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.
8457
8451
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
8458
8452
 
@@ -8546,7 +8540,7 @@ import { DataGrid } from '@redsift/table';
8546
8540
  import { Flexbox } from '@redsift/design-system';
8547
8541
  import { DataCard, DataRow } from '@redsift/dashboard';
8548
8542
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
8549
- import { GridFilterModel } from '@mui/x-data-grid-pro';
8543
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
8550
8544
  import { rows } from '../_shared/data';
8551
8545
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
8552
8546
  import { CustomToolbar } from '../_shared/helpers';
@@ -8750,7 +8744,7 @@ export default () => {
8750
8744
  ## Cross-filtered Datagrid Page
8751
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.
8752
8746
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8753
- **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
8754
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.
8755
8749
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
8756
8750
 
@@ -8865,7 +8859,7 @@ export default () => (
8865
8859
  {/* Category card — two-way: counts update when other cards filter */}
8866
8860
  <WithFilters
8867
8861
  field="Category"
8868
- dimension={(d: Row) => d.Category}
8862
+ dimension={(d: any) => d.Category}
8869
8863
  datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
8870
8864
  syncMode="two-way"
8871
8865
  >
@@ -8898,7 +8892,7 @@ export default () => (
8898
8892
  {/* Allergens card — two-way */}
8899
8893
  <WithFilters
8900
8894
  field="Allergens"
8901
- dimension={(d: Row) => d.Allergens}
8895
+ dimension={(d: any) => d.Allergens}
8902
8896
  isDimensionArray
8903
8897
  datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
8904
8898
  syncMode="two-way"
@@ -9024,7 +9018,7 @@ import { DataGrid } from '@redsift/table';
9024
9018
  import { Flexbox } from '@redsift/design-system';
9025
9019
  import { DataCard, DataRow } from '@redsift/dashboard';
9026
9020
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9027
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9021
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9028
9022
  import { Row } from '../_shared/data';
9029
9023
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9030
9024
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9301,7 +9295,7 @@ import { Flexbox } from '@redsift/design-system';
9301
9295
  import { DataCard, DataRow } from '@redsift/dashboard';
9302
9296
  import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
9303
9297
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
9304
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9298
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9305
9299
  import { Row } from '../_shared/data';
9306
9300
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9307
9301
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -9505,7 +9499,7 @@ export default () => {
9505
9499
  data={itemsChartData}
9506
9500
  sliceRole="option"
9507
9501
  onSliceClick={(datum: ArcDatum) => {
9508
- const key = datum.data.key as string;
9502
+ const key = datum.data.key;
9509
9503
  setFilterModel((prev) => {
9510
9504
  const selected = getSelectedFromFilterModel(prev, 'Items');
9511
9505
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9514,7 +9508,7 @@ export default () => {
9514
9508
  setPage(0);
9515
9509
  }}
9516
9510
  isSliceSelected={(datum: ArcDatum) =>
9517
- itemsSelection.length === 0 || itemsSelection.includes(datum.data.key as string)
9511
+ itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
9518
9512
  }
9519
9513
  />
9520
9514
 
@@ -9536,7 +9530,7 @@ export default () => {
9536
9530
  data={tagsChartData}
9537
9531
  barRole="option"
9538
9532
  onBarClick={(datum: BarDatum) => {
9539
- const key = datum.data.key as string;
9533
+ const key = String(datum.data.key);
9540
9534
  setFilterModel((prev) => {
9541
9535
  const selected = getSelectedFromFilterModel(prev, 'Tags');
9542
9536
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -9545,7 +9539,7 @@ export default () => {
9545
9539
  setPage(0);
9546
9540
  }}
9547
9541
  isBarSelected={(datum: BarDatum) =>
9548
- tagsSelection.length === 0 || tagsSelection.includes(datum.data.key as string)
9542
+ tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
9549
9543
  }
9550
9544
  />
9551
9545
  </Flexbox>
@@ -9723,7 +9717,7 @@ export default () => {
9723
9717
  import React, { useCallback, useEffect, useRef, useState } from 'react';
9724
9718
  import { DataGrid } from '@redsift/table';
9725
9719
  import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
9726
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9720
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9727
9721
  import { Row } from '../_shared/data';
9728
9722
  import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
9729
9723
  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 |
@@ -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:15:04.708Z",
3
- "commitSha": "13324e3299b72c872629ed84537f0080908545c5"
2
+ "generatedAt": "2026-04-22T18:24:18.286Z",
3
+ "commitSha": "3dd5b1120b0eab67de52a7942c5b8b16fa520abd"
4
4
  }