@redsift/ds-mcp-server 12.4.0-muiv7 → 12.4.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 (38) hide show
  1. package/data/demos/patterns/_shared/columns.tsx +3 -3
  2. package/data/demos/patterns/_shared/defaults.ts +1 -1
  3. package/data/demos/patterns/_shared/filter-helpers.ts +1 -1
  4. package/data/demos/patterns/_shared/helpers.tsx +1 -1
  5. package/data/demos/patterns/_shared/server-logic.ts +1 -1
  6. package/data/demos/patterns/_shared/story-helpers.ts +5 -13
  7. package/data/demos/patterns/crossfiltered-datagrid-client-side/CrossfilteredDatagridClientSide.interaction.stories.tsx +2 -2
  8. package/data/demos/patterns/crossfiltered-datagrid-client-side/example.tsx +2 -2
  9. package/data/demos/patterns/crossfiltered-datagrid-server-side/CrossfilteredDatagridServerSide.interaction.stories.tsx +2 -2
  10. package/data/demos/patterns/crossfiltered-datagrid-server-side/example.tsx +5 -5
  11. package/data/demos/patterns/drilldowned-datagrid-client-side/DrilldownedDatagridClientSide.interaction.stories.tsx +2 -2
  12. package/data/demos/patterns/drilldowned-datagrid-client-side/example.tsx +1 -1
  13. package/data/demos/patterns/drilldowned-datagrid-server-side/DrilldownedDatagridServerSide.interaction.stories.tsx +2 -2
  14. package/data/demos/patterns/drilldowned-datagrid-server-side/example.tsx +1 -1
  15. package/data/demos/patterns/single-datagrid-client-side/SingleDatagridClientSide.interaction.stories.tsx +3 -3
  16. package/data/demos/patterns/single-datagrid-client-side/example.tsx +4 -4
  17. package/data/demos/patterns/single-datagrid-server-side/SingleDatagridServerSide.interaction.stories.tsx +3 -3
  18. package/data/demos/patterns/single-datagrid-server-side/example.tsx +4 -4
  19. package/data/demos/patterns/summary-dashboard/SummaryDashboard.interaction.stories.tsx +2 -2
  20. package/data/demos/patterns/tabbed-datagrid-client-side/TabbedDatagridClientSide.interaction.stories.tsx +2 -2
  21. package/data/demos/patterns/tabbed-datagrid-server-side/TabbedDatagridServerSide.interaction.stories.tsx +2 -2
  22. package/data/demos/patterns/tabbed-datagrid-server-side/example.tsx +1 -1
  23. package/data/docs/components/dashboard/Dashboard.json +2 -2
  24. package/data/docs/components/table/DataGrid.json +3 -30
  25. package/data/docs/components/table/StatefulDataGrid.json +3 -30
  26. package/data/docs/components-index.json +2 -2
  27. package/data/docs/components.json +10 -64
  28. package/data/docs/llms-full.txt +15 -21
  29. package/data/docs/llms.txt +6 -6
  30. package/data/docs/patterns-catalog.md +4 -4
  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 +9 -9
  37. package/data/patterns/single-datagrid-server-side.mdx +7 -7
  38. package/package.json +2 -2
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { createColumn, TextCell } from '@redsift/table';
3
3
  import { Flexbox, Icon, IconButtonLink, Pill } from '@redsift/design-system';
4
4
  import { mdiArrowRight, mdiCheck, mdiClose } from '@redsift/icons';
5
- import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-pro';
5
+ import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';
6
6
  import { Row } from './data';
7
7
 
8
8
  // -- Option constants -------------------------------------------------------
@@ -106,7 +106,7 @@ export const columns: GridColDef<Row>[] = [
106
106
  headerName: 'Date',
107
107
  width: 140,
108
108
  ...createColumn('date'),
109
- valueGetter: (value: unknown) => parseDate(value),
109
+ valueGetter: (value: string) => parseDate(value),
110
110
  renderCell: ({ value }: GridRenderCellParams) => <TextCell>{value ? formatDate(value as Date) : '—'}</TextCell>,
111
111
  },
112
112
  // DateTime
@@ -115,7 +115,7 @@ export const columns: GridColDef<Row>[] = [
115
115
  headerName: 'Date & Time',
116
116
  width: 180,
117
117
  ...createColumn('dateTime'),
118
- valueGetter: (value: unknown) => parseDate(value),
118
+ valueGetter: (value: string) => parseDate(value),
119
119
  renderCell: ({ value }: GridRenderCellParams) => <TextCell>{value ? formatDateTime(value as Date) : '—'}</TextCell>,
120
120
  },
121
121
  // Boolean — in stock
@@ -1,4 +1,4 @@
1
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
1
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
2
2
 
3
3
  /**
4
4
  * Default filter model applied to all pattern examples.
@@ -1,4 +1,4 @@
1
- import { GridFilterModel } from '@mui/x-data-grid-pro';
1
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
2
2
  import { Row } from './data';
3
3
 
4
4
  // -- Types ------------------------------------------------------------------
@@ -8,7 +8,7 @@ import {
8
8
  GridToolbarExport,
9
9
  GridToolbarFilterButton,
10
10
  GridToolbarQuickFilter,
11
- } from '@mui/x-data-grid-pro';
11
+ } from '@mui/x-data-grid-premium';
12
12
 
13
13
  // -- Toolbar ----------------------------------------------------------------
14
14
 
@@ -1,4 +1,4 @@
1
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
1
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
2
2
  import { Row, allRows } from './data';
3
3
  import { Aggregates, computeAggregates, applyFilters } from './filter-helpers';
4
4
 
@@ -314,22 +314,14 @@ export const clickHeaderCheckbox = async (canvasElement: HTMLElement) => {
314
314
 
315
315
  /** Click a row checkbox by row index (0-based, within the visible page). */
316
316
  export const clickRowCheckbox = async (canvasElement: HTMLElement, rowIndex: number) => {
317
- let checkbox!: HTMLInputElement;
318
317
  await waitFor(() => {
319
- const row = canvasElement.querySelector(`.MuiDataGrid-row[data-rowindex="${rowIndex}"]`);
320
- expect(row).toBeTruthy();
321
- checkbox = row!.querySelector('input[type="checkbox"]') as HTMLInputElement;
322
- expect(checkbox).toBeTruthy();
318
+ const rows = canvasElement.querySelectorAll('.MuiDataGrid-row');
319
+ expect(rows.length).toBeGreaterThan(rowIndex);
323
320
  });
324
- const wasChecked = checkbox.checked;
321
+ const rows = canvasElement.querySelectorAll('.MuiDataGrid-row');
322
+ const checkbox = rows[rowIndex].querySelector('input[type="checkbox"]');
323
+ if (!checkbox) throw new Error(`Could not find checkbox in row ${rowIndex}`);
325
324
  await userEvent.click(checkbox);
326
- // Wait for the click to actually toggle the checkbox (needed for MUI v7 re-render timing)
327
- await waitFor(() => {
328
- const freshRow = canvasElement.querySelector(`.MuiDataGrid-row[data-rowindex="${rowIndex}"]`);
329
- const freshCheckbox = freshRow?.querySelector('input[type="checkbox"]') as HTMLInputElement | null;
330
- expect(freshCheckbox).toBeTruthy();
331
- expect(freshCheckbox!.checked).toBe(!wasChecked);
332
- });
333
325
  };
334
326
 
335
327
  // ---------------------------------------------------------------------------
@@ -85,9 +85,9 @@ import {
85
85
  RU7_RM_PASTRY,
86
86
  } from '../_shared/expected-values';
87
87
 
88
- const meta: Meta<typeof Example> = {
88
+ const meta: Meta = {
89
89
  title: 'Patterns/Crossfiltered Datagrid (Client)',
90
- component: Example,
90
+ component: Example as any,
91
91
  };
92
92
  export default meta;
93
93
  type Story = StoryObj;
@@ -18,7 +18,7 @@ export default () => (
18
18
  {/* Category card — two-way: counts update when other cards filter */}
19
19
  <WithFilters
20
20
  field="Category"
21
- dimension={(d: Row) => d.Category}
21
+ dimension={(d: any) => d.Category}
22
22
  datagridCategoryDimFilter={{ field: 'Category', operator: 'isAnyOf' }}
23
23
  syncMode="two-way"
24
24
  >
@@ -51,7 +51,7 @@ export default () => (
51
51
  {/* Allergens card — two-way */}
52
52
  <WithFilters
53
53
  field="Allergens"
54
- dimension={(d: Row) => d.Allergens}
54
+ dimension={(d: any) => d.Allergens}
55
55
  isDimensionArray
56
56
  datagridCategoryDimFilter={{ field: 'Allergens', operator: 'hasAnyOf' }}
57
57
  syncMode="two-way"
@@ -84,9 +84,9 @@ import {
84
84
  RU7_RM_PASTRY,
85
85
  } from '../_shared/expected-values';
86
86
 
87
- const meta: Meta<typeof Example> = {
87
+ const meta: Meta = {
88
88
  title: 'Patterns/Crossfiltered Datagrid (Server)',
89
- component: Example,
89
+ component: Example as any,
90
90
  parameters: {
91
91
  msw: { handlers: bakeryHandlers },
92
92
  },
@@ -4,7 +4,7 @@ import { Flexbox } from '@redsift/design-system';
4
4
  import { DataCard, DataRow } from '@redsift/dashboard';
5
5
  import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
6
6
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
7
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
7
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
8
8
  import { Row } from '../_shared/data';
9
9
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
10
10
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -208,7 +208,7 @@ export default () => {
208
208
  data={itemsChartData}
209
209
  sliceRole="option"
210
210
  onSliceClick={(datum: ArcDatum) => {
211
- const key = datum.data.key as string;
211
+ const key = datum.data.key;
212
212
  setFilterModel((prev) => {
213
213
  const selected = getSelectedFromFilterModel(prev, 'Items');
214
214
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -217,7 +217,7 @@ export default () => {
217
217
  setPage(0);
218
218
  }}
219
219
  isSliceSelected={(datum: ArcDatum) =>
220
- itemsSelection.length === 0 || itemsSelection.includes(datum.data.key as string)
220
+ itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
221
221
  }
222
222
  />
223
223
 
@@ -239,7 +239,7 @@ export default () => {
239
239
  data={tagsChartData}
240
240
  barRole="option"
241
241
  onBarClick={(datum: BarDatum) => {
242
- const key = datum.data.key as string;
242
+ const key = String(datum.data.key);
243
243
  setFilterModel((prev) => {
244
244
  const selected = getSelectedFromFilterModel(prev, 'Tags');
245
245
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -248,7 +248,7 @@ export default () => {
248
248
  setPage(0);
249
249
  }}
250
250
  isBarSelected={(datum: BarDatum) =>
251
- tagsSelection.length === 0 || tagsSelection.includes(datum.data.key as string)
251
+ tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
252
252
  }
253
253
  />
254
254
  </Flexbox>
@@ -34,9 +34,9 @@ import {
34
34
  ALLERGENS_HASANYOF_GLUTEN,
35
35
  } from '../_shared/expected-values';
36
36
 
37
- const meta: Meta<typeof Example> = {
37
+ const meta: Meta = {
38
38
  title: 'Patterns/Drilldowned Datagrid (Client)',
39
- component: Example,
39
+ component: Example as any,
40
40
  };
41
41
  export default meta;
42
42
  type Story = StoryObj;
@@ -3,7 +3,7 @@ import { DataGrid } from '@redsift/table';
3
3
  import { Flexbox } from '@redsift/design-system';
4
4
  import { DataCard, DataRow } from '@redsift/dashboard';
5
5
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
6
- import { GridFilterModel } from '@mui/x-data-grid-pro';
6
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
7
7
  import { rows } from '../_shared/data';
8
8
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9
9
  import { CustomToolbar } from '../_shared/helpers';
@@ -35,9 +35,9 @@ import {
35
35
  ALLERGENS_HASANYOF_GLUTEN,
36
36
  } from '../_shared/expected-values';
37
37
 
38
- const meta: Meta<typeof Example> = {
38
+ const meta: Meta = {
39
39
  title: 'Patterns/Drilldowned Datagrid (Server)',
40
- component: Example,
40
+ component: Example as any,
41
41
  parameters: {
42
42
  msw: { handlers: bakeryHandlers },
43
43
  },
@@ -3,7 +3,7 @@ import { DataGrid } from '@redsift/table';
3
3
  import { Flexbox } from '@redsift/design-system';
4
4
  import { DataCard, DataRow } from '@redsift/dashboard';
5
5
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
6
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
6
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
7
7
  import { Row } from '../_shared/data';
8
8
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
9
9
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
3
  import { within, userEvent } from '@storybook/testing-library';
4
4
  import { expect } from '@storybook/jest';
5
- import { GridFilterModel } from '@mui/x-data-grid-pro';
5
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
6
6
 
7
7
  import Example from './example';
8
8
  import WithLoadingExample from './with-loading';
@@ -35,9 +35,9 @@ import {
35
35
  TAGS_HASANYOF_LOCAL_NEW,
36
36
  } from '../_shared/expected-values';
37
37
 
38
- const meta: Meta<typeof Example> = {
38
+ const meta: Meta = {
39
39
  title: 'Patterns/Single Datagrid (Client)',
40
- component: Example,
40
+ component: Example as any,
41
41
  };
42
42
  export default meta;
43
43
  type Story = StoryObj;
@@ -1,20 +1,20 @@
1
1
  import React, { useState } from 'react';
2
- import { DataGrid } from '@redsift/table';
2
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
3
3
  import { Flexbox } from '@redsift/design-system';
4
- import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-pro';
4
+ import { GridFilterModel, GridRowSelectionModel } from '@mui/x-data-grid-premium';
5
5
  import { rows } from '../_shared/data';
6
6
  import { columns } from '../_shared/columns';
7
7
  import { CustomToolbar, BulkActionBar } from '../_shared/helpers';
8
8
  import { DEFAULT_FILTER_MODEL, DEFAULT_SORT_MODEL } from '../_shared/defaults';
9
9
 
10
10
  export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }) => {
11
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
11
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
12
12
 
13
13
  return (
14
14
  <div style={{ width: '100%' }}>
15
15
  <Flexbox flexDirection="column" gap="0px">
16
16
  <BulkActionBar
17
- count={selectionModel.length}
17
+ count={getSelectionCount(selectionModel)}
18
18
  onLog={() => console.log('Selected:', selectionModel)}
19
19
  onDelete={() => console.log('Delete:', selectionModel)}
20
20
  />
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
3
  import { within } from '@storybook/testing-library';
4
4
  import { expect } from '@storybook/jest';
5
- import { GridFilterModel } from '@mui/x-data-grid-pro';
5
+ import { GridFilterModel } from '@mui/x-data-grid-premium';
6
6
 
7
7
  import Example from './example';
8
8
  import WithLoadingExample from './with-loading';
@@ -27,9 +27,9 @@ import {
27
27
  TAGS_HASANYOF_LOCAL_NEW,
28
28
  } from '../_shared/expected-values';
29
29
 
30
- const meta: Meta<typeof Example> = {
30
+ const meta: Meta = {
31
31
  title: 'Patterns/Single Datagrid (Server)',
32
- component: Example,
32
+ component: Example as any,
33
33
  parameters: {
34
34
  msw: { handlers: bakeryHandlers },
35
35
  },
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
- import { DataGrid } from '@redsift/table';
2
+ import { DataGrid, EMPTY_ROW_SELECTION_MODEL, getSelectionCount } from '@redsift/table';
3
3
  import { Flexbox } from '@redsift/design-system';
4
- import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-pro';
4
+ import { GridFilterModel, GridRowSelectionModel, GridSortModel } from '@mui/x-data-grid-premium';
5
5
  import { Row } from '../_shared/data';
6
6
  import { columns } from '../_shared/columns';
7
7
  import { fetchBakeryData } from '../_shared/api-client';
@@ -16,7 +16,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
16
16
  const [pageSize, setPageSize] = useState(10);
17
17
  const [sortModel, setSortModel] = useState<GridSortModel>(DEFAULT_SORT_MODEL);
18
18
  const [filterModel, setFilterModel] = useState<GridFilterModel>(initialFilterModel ?? DEFAULT_FILTER_MODEL);
19
- const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
19
+ const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>(EMPTY_ROW_SELECTION_MODEL);
20
20
 
21
21
  const quickFilterText = (filterModel as { quickFilterValues?: string[] }).quickFilterValues?.join(' ') || '';
22
22
  const debounceRef = useRef<ReturnType<typeof setTimeout>>();
@@ -54,7 +54,7 @@ export default ({ initialFilterModel }: { initialFilterModel?: GridFilterModel }
54
54
  <div style={{ width: '100%' }}>
55
55
  <Flexbox flexDirection="column" gap="0px">
56
56
  <BulkActionBar
57
- count={selectionModel.length}
57
+ count={getSelectionCount(selectionModel)}
58
58
  onLog={() => console.log('Selected:', selectionModel)}
59
59
  onDelete={() => console.log('Delete:', selectionModel)}
60
60
  />
@@ -24,9 +24,9 @@ import {
24
24
  } from '../_shared/story-helpers';
25
25
  import { AGG_CATEGORY, AGG_ALLERGENS } from '../_shared/expected-values';
26
26
 
27
- const meta: Meta<typeof Example> = {
27
+ const meta: Meta = {
28
28
  title: 'Patterns/Summary Dashboard',
29
- component: Example,
29
+ component: Example as any,
30
30
  };
31
31
  export default meta;
32
32
  type Story = StoryObj;
@@ -16,9 +16,9 @@ import {
16
16
  } from '../_shared/story-helpers';
17
17
  import { TOTAL, CATEGORY_BAKERY, CATEGORY_BEVERAGE, CATEGORY_PASTRY, CATEGORY_OTHER } from '../_shared/expected-values';
18
18
 
19
- const meta: Meta<typeof Example> = {
19
+ const meta: Meta = {
20
20
  title: 'Patterns/Tabbed Datagrid (Client)',
21
- component: Example,
21
+ component: Example as any,
22
22
  };
23
23
  export default meta;
24
24
  type Story = StoryObj;
@@ -18,9 +18,9 @@ import {
18
18
  } from '../_shared/story-helpers';
19
19
  import { TOTAL, CATEGORY_BAKERY, CATEGORY_BEVERAGE, CATEGORY_PASTRY, CATEGORY_OTHER } from '../_shared/expected-values';
20
20
 
21
- const meta: Meta<typeof Example> = {
21
+ const meta: Meta = {
22
22
  title: 'Patterns/Tabbed Datagrid (Server)',
23
- component: Example,
23
+ component: Example as any,
24
24
  parameters: {
25
25
  msw: { handlers: bakeryHandlers },
26
26
  },
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { DataGrid } from '@redsift/table';
3
3
  import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
4
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
4
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
5
5
  import { Row } from '../_shared/data';
6
6
  import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
7
7
  import { fetchBakeryData } from '../_shared/api-client';
@@ -14,8 +14,8 @@
14
14
  },
15
15
  {
16
16
  "name": "dataGridApiRef",
17
- "description": "Datagrid API Ref.",
18
- "type": "MutableRefObject<GridApiPro>",
17
+ "description": "Datagrid API Ref. MUI v8: can be null initially.",
18
+ "type": "MutableRefObject<GridApiPremium | null>",
19
19
  "required": false,
20
20
  "defaultValue": null,
21
21
  "category": "props"
@@ -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-01T18:24:59.361Z",
4
+ "version": "12.3.0",
5
+ "generated": "2026-04-01T15:04:59.444Z",
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-01T18:24:59.354Z
6
+ Generated: 2026-04-01T15:04:59.437Z
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
 
@@ -7973,7 +7967,7 @@ type Row = {
7973
7967
  ## Server Datagrid Page
7974
7968
  **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.
7975
7969
  **Components:** DataGrid, TextCell, Pill, Button, Flexbox, Text, Badge, Icon, IconButton, IconButtonLink
7976
- **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-pro
7970
+ **Packages:** @redsift/table, @redsift/design-system, @mui/x-data-grid-premium
7977
7971
  **Layout:** DataGrid with autoHeight, paginationMode='server', sortingMode='server', filterMode='server', rowCount, loading, built-in Toolbar. Optional bulk actions bar when selectionModel.length > 0.
7978
7972
  **Tags:** table, datagrid, server-side, pagination, paginationMode, filterMode, sortingMode, loading, rowCount, filter, toolbar, bulk-actions, GridColDef, filterModel, sortModel, debounce
7979
7973
 
@@ -8089,7 +8083,7 @@ type FetchResult = {
8089
8083
  ## Drilldown Datagrid Page
8090
8084
  **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.
8091
8085
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8092
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8086
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8093
8087
  **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.
8094
8088
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, filter, isAnyOf, summary-cards, kpi, one-way, filterModel, client-side
8095
8089
 
@@ -8184,7 +8178,7 @@ type AggregateCounts = {
8184
8178
  ## Cross-filtered Datagrid Page
8185
8179
  **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.
8186
8180
  **Components:** DataGrid, TextCell, DataCard, DataCard.Header, DataCard.Body, DataCard.Listbox, DataRow, Pill, Button, Flexbox, Text, Icon, IconButtonLink
8187
- **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-pro
8181
+ **Packages:** @redsift/table, @redsift/design-system, @redsift/dashboard, @mui/x-data-grid-premium
8188
8182
  **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.
8189
8183
  **Tags:** table, datagrid, datacard, drilldown, drilldown-item, cross-filter, crossfilter, two-way, bidirectional, filter, isAnyOf, summary-cards, kpi, dashboard, filterModel, client-side
8190
8184
 
@@ -8315,7 +8309,7 @@ import { DataGrid } from '@redsift/table';
8315
8309
  import { Flexbox } from '@redsift/design-system';
8316
8310
  import { DataCard, DataRow } from '@redsift/dashboard';
8317
8311
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
8318
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
8312
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
8319
8313
  import { Row } from '../_shared/data';
8320
8314
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
8321
8315
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -8592,7 +8586,7 @@ import { Flexbox } from '@redsift/design-system';
8592
8586
  import { DataCard, DataRow } from '@redsift/dashboard';
8593
8587
  import { BarChart, PieChart, ArcDatum, BarDatum } from '@redsift/charts';
8594
8588
  import { mdiShapeOutline, mdiToggleSwitch, mdiFoodOff } from '@redsift/icons';
8595
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
8589
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
8596
8590
  import { Row } from '../_shared/data';
8597
8591
  import { columns, CATEGORY_OPTIONS, ALLERGEN_OPTIONS } from '../_shared/columns';
8598
8592
  import { fetchBakeryData, FetchResult } from '../_shared/api-client';
@@ -8796,7 +8790,7 @@ export default () => {
8796
8790
  data={itemsChartData}
8797
8791
  sliceRole="option"
8798
8792
  onSliceClick={(datum: ArcDatum) => {
8799
- const key = datum.data.key as string;
8793
+ const key = datum.data.key;
8800
8794
  setFilterModel((prev) => {
8801
8795
  const selected = getSelectedFromFilterModel(prev, 'Items');
8802
8796
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -8805,7 +8799,7 @@ export default () => {
8805
8799
  setPage(0);
8806
8800
  }}
8807
8801
  isSliceSelected={(datum: ArcDatum) =>
8808
- itemsSelection.length === 0 || itemsSelection.includes(datum.data.key as string)
8802
+ itemsSelection.length === 0 || itemsSelection.includes(datum.data.key)
8809
8803
  }
8810
8804
  />
8811
8805
 
@@ -8827,7 +8821,7 @@ export default () => {
8827
8821
  data={tagsChartData}
8828
8822
  barRole="option"
8829
8823
  onBarClick={(datum: BarDatum) => {
8830
- const key = datum.data.key as string;
8824
+ const key = String(datum.data.key);
8831
8825
  setFilterModel((prev) => {
8832
8826
  const selected = getSelectedFromFilterModel(prev, 'Tags');
8833
8827
  const next = selected.includes(key) ? selected.filter((v) => v !== key) : [...selected, key];
@@ -8836,7 +8830,7 @@ export default () => {
8836
8830
  setPage(0);
8837
8831
  }}
8838
8832
  isBarSelected={(datum: BarDatum) =>
8839
- tagsSelection.length === 0 || tagsSelection.includes(datum.data.key as string)
8833
+ tagsSelection.length === 0 || tagsSelection.includes(String(datum.data.key))
8840
8834
  }
8841
8835
  />
8842
8836
  </Flexbox>
@@ -9014,7 +9008,7 @@ export default () => {
9014
9008
  import React, { useCallback, useEffect, useRef, useState } from 'react';
9015
9009
  import { DataGrid } from '@redsift/table';
9016
9010
  import { Flexbox, Pill, Number, Text, Tabs, Tab } from '@redsift/design-system';
9017
- import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-pro';
9011
+ import { GridFilterModel, GridSortModel } from '@mui/x-data-grid-premium';
9018
9012
  import { Row } from '../_shared/data';
9019
9013
  import { columns, CATEGORY_OPTIONS } from '../_shared/columns';
9020
9014
  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,10 +284,10 @@ 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 |
289
- | 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 |
290
- | 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 |
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
+ | 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 |
290
+ | 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 |
291
291
  | Server Drilldown Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
292
292
  | Server Cross-filtered Datagrid Page | DataGrid, TextCell, DataCard, DataRow, Flexbox, Pill, Icon | @redsift/table, @redsift/dashboard, @redsift/design-system, @mui/x-data-grid-pro |
293
293
  | 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
 
@@ -206,7 +206,7 @@ type FetchResult = {
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`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox`, `Icon` 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
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
 
@@ -292,7 +292,7 @@ type AggregateCounts = {
292
292
  3. DataGrid — the table with controlled filterModel + onFilterModelChange. Rows are pre-filtered client-side
293
293
  4. Bulk Action Bar — Flexbox row shown when selectionModel.length > 0, with Pill (count) and action Buttons
294
294
 
295
- **Key imports:** `DataGrid`, `TextCell` from `@redsift/table`; `DataCard`, `DrilldownItem` from `@redsift/dashboard`; `GridColDef`, `GridFilterModel` from `@mui/x-data-grid-pro`; `Pill`, `Button`, `Flexbox`, `Icon` 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
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)
297
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.
298
298
 
@@ -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",
@@ -374,7 +374,7 @@
374
374
  "Icon",
375
375
  "IconButtonLink"
376
376
  ],
377
- "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-pro"],
377
+ "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
378
378
  "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.",
379
379
  "tags": [
380
380
  "table",
@@ -542,7 +542,7 @@
542
542
  "Icon",
543
543
  "IconButtonLink"
544
544
  ],
545
- "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-pro"],
545
+ "packages": ["@redsift/table", "@redsift/design-system", "@redsift/dashboard", "@mui/x-data-grid-premium"],
546
546
  "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.",
547
547
  "tags": [
548
548
  "table",
@@ -1,4 +1,4 @@
1
1
  {
2
- "generatedAt": "2026-04-01T20:04:43.211Z",
3
- "commitSha": "1d33598543559874b83eb607bb12bfd4a30fb66e"
2
+ "generatedAt": "2026-04-01T20:05:51.088Z",
3
+ "commitSha": "01c485a1a597cdec0af3bb199675dcb7577a26e4"
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
 
@@ -60,7 +60,7 @@ When **not** to use:
60
60
  required: true,
61
61
  description: (
62
62
  <>
63
- Client-side pagination with configurable page size (<code>pageSizeOptions</code>)
63
+ Client-side pagination with configurable page size (<code>rowsPerPageOptions</code>)
64
64
  </>
65
65
  ),
66
66
  },
@@ -124,13 +124,13 @@ When **not** to use:
124
124
  ## State Management
125
125
 
126
126
  <CodeBlock codeString={`import { useState } from 'react';
127
- import { GridRowSelectionModel } 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
130
  const [selectionModel, setSelectionModel] = useState<GridRowSelectionModel>([]);
131
131
 
132
- // PaginationDataGrid v7 uses a paginationModel object
133
- // (DataGrid manages pagination internally for client-side mode)
132
+ // Page size controlled if you need to persist it
133
+ // (DataGrid manages page/pageSize internally for client-side mode)
134
134
  `} />
135
135
 
136
136
  ## Data Contract
@@ -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<GridRowSelectionModel>([])` for checkbox selection (if needed).
188
- 5. **Render the DataGrid** — Pass `rows`, `columns`, `autoHeight`, `pagination`, `pageSizeOptions`, `checkboxSelection`, `slots={{ 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
 
@@ -101,8 +101,8 @@ When **not** to use:
101
101
  required: true,
102
102
  description: (
103
103
  <>
104
- <code>GridColDef[]</code> with custom types: <code>rsString</code>, <code>rsNumber</code>,{' '}
105
- <code>rsSingleSelect</code>, <code>rsMultipleSelect</code>
104
+ <code>GridColDef[]</code> with <code>createColumn()</code>: <code>createColumn('string')</code>, <code>createColumn('number')</code>,{' '}
105
+ <code>createColumn('singleSelect')</code>, <code>createColumn('multiSelect')</code>
106
106
  </>
107
107
  ),
108
108
  },
@@ -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, GridRowSelectionModel, 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[]>([]);
@@ -263,13 +263,13 @@ The fetch function rejects with an error. The component shows an error banner ab
263
263
 
264
264
  1. **Define your row type** — Create a TypeScript `type Row` per the Data Contract section. Every row must have a unique `id` field.
265
265
  2. **Create your fetch function** — Implement an async function matching the `FetchParams → FetchResult` contract. This is where you call your API or ElasticSearch. If using React Query, wrap it in a `useQuery` hook with `[page, pageSize, sortModel, filterModel, quickFilterText]` as the query key.
266
- 3. **Define column definitions** — Create a `GridColDef[]` array. Use RS custom column types (`rsString`, `rsNumber`, `rsSingleSelect`, `rsMultipleSelect`) for built-in filter operators. Add `renderCell` for rich content.
266
+ 3. **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.
267
267
  4. **Create the toolbar** — Build a `CustomToolbar` component using `GridToolbarContainer` with filter, columns, density, export, and quick search controls.
268
268
  5. **Set up state** — Add all hooks from the State Management section: `rows`, `totalRows`, `loading`, `page`, `pageSize`, `sortModel`, `filterModel`, `selectionModel`, `quickFilterText`, and the debounce ref.
269
269
  6. **Wire the fetch effect** — Use `useEffect` to call your fetch function whenever `page`, `pageSize`, `sortModel`, `filterModel`, or `quickFilterText` changes.
270
- 7. **Configure the DataGrid** — Pass `paginationMode="server"`, `sortingMode="server"`, `filterMode="server"`, `loading`, `rowCount={totalRows}`, and all controlled state handlers (`onPaginationModelChange`, `onSortModelChange`, `onFilterModelChange`).
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redsift/ds-mcp-server",
3
- "version": "12.4.0-muiv7",
3
+ "version": "12.4.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MCP server for the Red Sift Design System — provides component lookup, prop documentation, and code generation tools for AI assistants.",
@@ -35,5 +35,5 @@
35
35
  "publishConfig": {
36
36
  "access": "restricted"
37
37
  },
38
- "gitHead": "1d33598543559874b83eb607bb12bfd4a30fb66e"
38
+ "gitHead": "01c485a1a597cdec0af3bb199675dcb7577a26e4"
39
39
  }