+ );
+}
diff --git a/docs/data/data-grid/components/columns-panel/GridColumnsPanelTrigger.tsx.preview b/docs/data/data-grid/components/columns-panel/GridColumnsPanelTrigger.tsx.preview
new file mode 100644
index 0000000000000..7f29998cef137
--- /dev/null
+++ b/docs/data/data-grid/components/columns-panel/GridColumnsPanelTrigger.tsx.preview
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/docs/data/data-grid/components/columns-panel/columns-panel.md b/docs/data/data-grid/components/columns-panel/columns-panel.md
new file mode 100644
index 0000000000000..4bede5357e5b8
--- /dev/null
+++ b/docs/data/data-grid/components/columns-panel/columns-panel.md
@@ -0,0 +1,52 @@
+---
+title: React Data Grid - Columns Panel component
+productId: x-data-grid
+components: ColumnsPanelTrigger
+packageName: '@mui/x-data-grid'
+githubLabel: 'component: data grid'
+---
+
+# Data Grid - Columns Panel 🚧
+
+
Customize the Data Grid's columns panel.
+
+:::warning
+This component is incomplete.
+
+Currently, the Columns Panel Trigger is the only part of the Columns Panel component available.
+Future versions of the Columns Panel component will make it possible to compose each of its parts to create a custom columns panel.
+
+In the meantime, it's still possible to deeply customize the panel's subcomponents using custom slots.
+See [Custom subcomponents—Columns panel](/x/react-data-grid/components/#columns-panel) for more details.
+
+:::
+
+## Basic usage
+
+The demo below shows how to add a columns panel trigger to a custom toolbar.
+
+{{"demo": "GridColumnsPanelTrigger.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Anatomy
+
+```tsx
+import { ColumnsPanelTrigger } from '@mui/x-data-grid';
+
+;
+```
+
+### Columns Panel Trigger
+
+`` is a button that opens and closes the columns panel.
+It renders the `baseButton` slot.
+
+## Custom elements
+
+Use the `render` prop to replace default elements.
+See [Components usage—Customization](/x/react-data-grid/components/usage/#customization) for more details, and [Toolbar—Custom elements demo](/x/react-data-grid/components/toolbar/#custom-elements) for an example of a custom Columns Panel Trigger.
+
+## Accessibility
+
+### ARIA
+
+You must apply a text label or an `aria-label` attribute to the ``.
diff --git a/docs/data/data-grid/components/components.md b/docs/data/data-grid/components/components.md
index f845012abba10..532fc01276155 100644
--- a/docs/data/data-grid/components/components.md
+++ b/docs/data/data-grid/components/components.md
@@ -50,6 +50,13 @@ As mentioned above, the column menu is a component slot that can be recomposed e
### Toolbar
+:::warning
+
+The examples below use the ``, ``, and various toolbar button components.
+These components will be deprecated in v8 and replaced by the new [Toolbar component](/x/react-data-grid/components/toolbar/).
+
+:::
+
To enable the toolbar you need to add the `showToolbar` prop to the Data Grid.
This demo showcases how this can be achieved.
diff --git a/docs/data/data-grid/components/export/GridExportMenu.js b/docs/data/data-grid/components/export/GridExportMenu.js
new file mode 100644
index 0000000000000..1ac728a7bb864
--- /dev/null
+++ b/docs/data/data-grid/components/export/GridExportMenu.js
@@ -0,0 +1,76 @@
+import * as React from 'react';
+import {
+ DataGridPremium,
+ Toolbar,
+ ToolbarButton,
+ ExportCsv,
+ ExportExcel,
+ ExportPrint,
+} from '@mui/x-data-grid-premium';
+import { useDemoData } from '@mui/x-data-grid-generator';
+import Tooltip from '@mui/material/Tooltip';
+import Menu from '@mui/material/Menu';
+import MenuItem from '@mui/material/MenuItem';
+import FileDownloadIcon from '@mui/icons-material/FileDownload';
+
+function ExportMenu() {
+ const [open, setOpen] = React.useState(false);
+ const triggerRef = React.useRef(null);
+
+ return (
+
+
+ setOpen(true)}
+ >
+
+
+
+
+
+ );
+}
+
+function CustomToolbar() {
+ return (
+
+
+
+ );
+}
+
+export default function GridExportMenu() {
+ const { data, loading } = useDemoData({
+ dataSet: 'Commodity',
+ rowLength: 10,
+ maxColumns: 10,
+ });
+
+ return (
+
+ );
+}
diff --git a/docs/data/data-grid/components/export/GridExportTrigger.tsx.preview b/docs/data/data-grid/components/export/GridExportTrigger.tsx.preview
new file mode 100644
index 0000000000000..7f29998cef137
--- /dev/null
+++ b/docs/data/data-grid/components/export/GridExportTrigger.tsx.preview
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/docs/data/data-grid/components/export/export.md b/docs/data/data-grid/components/export/export.md
new file mode 100644
index 0000000000000..4844ed91f0b4b
--- /dev/null
+++ b/docs/data/data-grid/components/export/export.md
@@ -0,0 +1,63 @@
+---
+title: React Data Grid - Export component
+productId: x-data-grid
+components: ExportPrint, ExportCsv, ExportExcel
+packageName: '@mui/x-data-grid'
+githubLabel: 'component: data grid'
+---
+
+# Data Grid - Export
+
+
Let users export the Data Grid for Excel, CSV, or printing.
+
+## Basic usage
+
+The demo below shows how to add export triggers to a custom toolbar.
+
+{{"demo": "GridExportTrigger.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Anatomy
+
+```tsx
+import { ExportPrint, ExportCsv, ExportExcel } from '@mui/x-data-grid';
+
+
+
+
+```
+
+### Export Print
+
+`` is a button that triggers a print export.
+It renders the `baseButton` slot.
+
+### Export CSV
+
+`` is a button that triggers a CSV export.
+It renders the `baseButton` slot.
+
+### Export Excel
+
+`` is a button that triggers an Excel export.
+It renders the `baseButton` slot.
+
+## Recipes
+
+Below are some ways the Export components can be used.
+
+### Toolbar export menu
+
+The demo below shows how to display export options within a menu on the toolbar.
+
+{{"demo": "GridExportMenu.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Custom elements
+
+Use the `render` prop to replace default elements.
+See [Components usage—Customization](/x/react-data-grid/components/usage/#customization) for more details, and [Toolbar—Custom elements demo](/x/react-data-grid/components/toolbar/#custom-elements) for an example of custom Export buttons.
+
+## Accessibility
+
+### ARIA
+
+You must apply a text label or an `aria-label` attribute to the ``, `` and `` components.
diff --git a/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.js b/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.js
new file mode 100644
index 0000000000000..2b2e0bd8e73bf
--- /dev/null
+++ b/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.js
@@ -0,0 +1,41 @@
+import * as React from 'react';
+import {
+ DataGrid,
+ Toolbar,
+ ToolbarButton,
+ FilterPanelTrigger,
+} from '@mui/x-data-grid';
+import { useDemoData } from '@mui/x-data-grid-generator';
+import Tooltip from '@mui/material/Tooltip';
+import FilterListIcon from '@mui/icons-material/FilterList';
+
+function CustomToolbar() {
+ return (
+
+
+ }>
+
+
+
+
+ );
+}
+
+export default function GridFilterPanelTrigger() {
+ const { data, loading } = useDemoData({
+ dataSet: 'Commodity',
+ rowLength: 10,
+ maxColumns: 10,
+ });
+
+ return (
+
+ );
+}
diff --git a/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.tsx.preview b/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.tsx.preview
new file mode 100644
index 0000000000000..7f29998cef137
--- /dev/null
+++ b/docs/data/data-grid/components/filter-panel/GridFilterPanelTrigger.tsx.preview
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/docs/data/data-grid/components/filter-panel/filter-panel.md b/docs/data/data-grid/components/filter-panel/filter-panel.md
new file mode 100644
index 0000000000000..3a5d7eb78b149
--- /dev/null
+++ b/docs/data/data-grid/components/filter-panel/filter-panel.md
@@ -0,0 +1,53 @@
+---
+title: React Data Grid - Filter Panel component
+productId: x-data-grid
+components: FilterPanelTrigger
+packageName: '@mui/x-data-grid'
+githubLabel: 'component: data grid'
+---
+
+# Data Grid - Filter Panel 🚧
+
+
Customize the Data Grid's filter panel.
+
+:::warning
+This component is incomplete.
+
+Currently, the Filter Panel Trigger is the only part of the Filter Panel component available.
+Future versions of the Filter Panel component will make it possible to compose each of its parts to create a custom filter panel.
+
+In the meantime, it's still possible to deeply customize the panel's subcomponents using custom slots.
+See [Filter customization—Custom filter panel](/x/react-data-grid/filtering/customization/#custom-filter-panel)
+for more details.
+
+:::
+
+## Basic usage
+
+The demo below shows how to add a filter panel trigger to a custom toolbar.
+
+{{"demo": "GridFilterPanelTrigger.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Anatomy
+
+```tsx
+import { FilterPanelTrigger } from '@mui/x-data-grid';
+
+;
+```
+
+### Filter Panel Trigger
+
+`` is a button that opens and closes the filter panel.
+It renders the `baseButton` slot.
+
+## Custom elements
+
+Use the `render` prop to replace default elements.
+See [Components usage—Customization](/x/react-data-grid/components/usage/#customization) for more details, and [Toolbar—Custom elements demo](/x/react-data-grid/components/toolbar/#custom-elements) for an example of a custom Filter Panel Trigger.
+
+## Accessibility
+
+### ARIA
+
+You must apply a text label or an `aria-label` attribute to the ``.
diff --git a/docs/data/data-grid/components/quick-filter/GridQuickFilter.js b/docs/data/data-grid/components/quick-filter/GridQuickFilter.js
new file mode 100644
index 0000000000000..a5318ad3ede9d
--- /dev/null
+++ b/docs/data/data-grid/components/quick-filter/GridQuickFilter.js
@@ -0,0 +1,72 @@
+import * as React from 'react';
+import {
+ DataGrid,
+ Toolbar,
+ QuickFilter,
+ QuickFilterControl,
+ QuickFilterClear,
+} from '@mui/x-data-grid';
+import { useDemoData } from '@mui/x-data-grid-generator';
+import InputAdornment from '@mui/material/InputAdornment';
+import TextField from '@mui/material/TextField';
+import CancelIcon from '@mui/icons-material/Cancel';
+import SearchIcon from '@mui/icons-material/Search';
+
+function CustomToolbar() {
+ return (
+
+
+ (
+
+
+
+ ),
+ endAdornment: other.value ? (
+
+
+
+
+
+ ) : null,
+ }}
+ />
+ )}
+ />
+
+
+ );
+}
+
+export default function GridQuickFilter() {
+ const { data, loading } = useDemoData({
+ dataSet: 'Commodity',
+ rowLength: 10,
+ maxColumns: 10,
+ });
+
+ return (
+
+ );
+}
diff --git a/docs/data/data-grid/components/toolbar/GridToolbarSettingsMenu.tsx.preview b/docs/data/data-grid/components/toolbar/GridToolbarSettingsMenu.tsx.preview
new file mode 100644
index 0000000000000..c53da675f5dc3
--- /dev/null
+++ b/docs/data/data-grid/components/toolbar/GridToolbarSettingsMenu.tsx.preview
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/docs/data/data-grid/components/toolbar/toolbar.md b/docs/data/data-grid/components/toolbar/toolbar.md
new file mode 100644
index 0000000000000..1d3dbf576cac0
--- /dev/null
+++ b/docs/data/data-grid/components/toolbar/toolbar.md
@@ -0,0 +1,89 @@
+---
+title: React Data Grid - Toolbar component
+productId: x-data-grid
+components: Toolbar, ToolbarButton
+packageName: '@mui/x-data-grid'
+githubLabel: 'component: data grid'
+---
+
+# Data Grid - Toolbar
+
+
Add custom actions and controls to the Data Grid.
+
+## Basic usage
+
+The demo below shows the default toolbar configuration.
+
+To extend the default toolbar, the code in the demo below can be copied and customized to your needs.
+
+{{"demo": "GridToolbar.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Anatomy
+
+```tsx
+import { Toolbar, ToolbarButton } from '@mui/x-data-grid';
+
+
+
+;
+```
+
+### Toolbar
+
+The Toolbar is the top level component that provides context to child components.
+It renders a styled `` element.
+
+### Toolbar Button
+
+`` is a button for performing actions from the toolbar.
+It renders the `baseIconButton` slot.
+
+## Recipes
+
+Below are some ways the Toolbar component can be used.
+
+### Settings menu
+
+The demo below shows how to display an appearance settings menu on the toolbar. It uses local storage to persist the user's selections.
+
+{{"demo": "GridToolbarSettingsMenu.js", "bg": "inline", "defaultCodeOpen": false}}
+
+### Filter bar
+
+The demo below shows how to display active filter chips on the toolbar.
+
+{{"demo": "GridToolbarFilterBar.js", "bg": "inline", "defaultCodeOpen": false}}
+
+## Custom elements
+
+Use the `render` prop to replace default elements. See [Components usage—Customization](/x/react-data-grid/components/usage/#customization) for more details.
+
+The demo below shows how to replace the default elements with custom ones, styled with Tailwind CSS.
+
+{{"demo": "GridToolbarCustom.js", "bg": "inline", "defaultCodeOpen": false, "iframe": true}}
+
+## Accessibility
+
+(WAI-ARIA: https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/)
+
+The component follows the WAI-ARIA authoring practices.
+
+### ARIA
+
+- The element rendered by the `` component has the `toolbar` role.
+- The element rendered by the `` component has `aria-orientation` set to `horizontal`.
+- You must apply a text label or an `aria-label` attribute to the ``.
+
+### Keyboard
+
+The Toolbar component supports keyboard navigation.
+It implements the roving tabindex pattern.
+
+| Keys | Description |
+| ------------------------------------------------------: | :--------------------------------------- |
+| Tab | Moves focus into and out of the toolbar. |
+| Shift+Tab | Moves focus into and out of the toolbar. |
+| Left | Moves focus to the previous button. |
+| Right | Moves focus to the next button. |
+| Home | Moves focus to the first button. |
+| End | Moves focus to the last button. |
diff --git a/docs/data/data-grid/components/usage.md b/docs/data/data-grid/components/usage.md
new file mode 100644
index 0000000000000..3f5e4a3d596c3
--- /dev/null
+++ b/docs/data/data-grid/components/usage.md
@@ -0,0 +1,142 @@
+# Data Grid - Components usage
+
+
Learn how to customize the Data Grid with composable components.
+
+## Introduction
+
+By default, the `` component includes all of the interfaces necessary for users to interact with the built-in features. Where more flexibility is needed over what gets rendered, the Data Grid package includes a set of highly customizable components:
+
+- [Toolbar](/x/react-data-grid/components/toolbar/)
+- [Export](/x/react-data-grid/components/export/)
+- [Quick Filter](/x/react-data-grid/components/quick-filter/)
+- [Columns Panel](/x/react-data-grid/components/columns-panel/) 🚧
+- [Filter Panel](/x/react-data-grid/components/filter-panel/) 🚧
+
+## Composition
+
+The components are composable and consist of several parts. For example, `Toolbar` and `ToolbarButton` are parts of the [Toolbar component](/x/react-data-grid/components/toolbar/).
+
+The snippet below is an example of how to assemble components to create a custom toolbar.
+
+```tsx
+import { Toolbar, ToolbarButton, FilterPanelTrigger } from '@mui/x-data-grid';
+
+function CustomToolbar() {
+ return (
+
+ }>Filters
+
+ );
+}
+```
+
+The custom toolbar can then be passed to the `toolbar` [slot](/x/react-data-grid/components/):
+
+```tsx
+function App() {
+ return ;
+}
+```
+
+## Customization
+
+The component parts are highly customizable, built to integrate with any design system, and any styling method.
+
+### CSS classes
+
+The `className` prop can be used to apply styles:
+
+```tsx
+
+```
+
+Some components also provide internal state that can be used to conditionally apply classes:
+
+```tsx
+ (state.open ? 'text-blue-600' : 'text-gray-900')}
+/>
+```
+
+### Render prop
+
+The `render` prop provides control over how the components are rendered. It serves three main purposes:
+
+1. Replacing the default rendered element
+2. Providing access to props and internal state
+3. Merging functionality between two or more components
+
+#### Custom elements
+
+You can use the `render` prop to replace the default rendered element with your own:
+
+```tsx
+} />
+```
+
+#### Render function
+
+When you need access to the component's props or internal state, you can pass a function to the `render` prop, as shown in the example below. This pattern is particularly useful when you need to:
+
+1. Use internal state for custom rendering
+2. Access and handle component props (like event handlers)
+3. Transform props before passing them to your custom element
+
+```tsx
+// Access props
+Filters}
+/>
+
+// Access state
+ (
+
+ {state.open ? 'Close filter panel' : 'Open filter panel'}
+
+ )}
+/>
+```
+
+#### Prop forwarding
+
+Any props passed to the components will be forwarded directly to their corresponding HTML element. For example:
+
+```tsx
+
+
+// Rendered HTML:
+
+```
+
+#### Providing children
+
+You can provide children to the rendered element in two ways:
+
+```tsx
+// Method 1: Children inside the rendered component
+Filters} />
+
+// Method 2: Children of
+}>Filters
+```
+
+Both methods above will produce the same result, as the component automatically passes its children to the rendered element.
+
+#### Avoiding nested elements
+
+A common use case for the `render` prop is when composing components that render the same HTML element. For example, both `FilterPanelTrigger` and `ToolbarButton` render a button element. The `render` prop in this example merges the functionality of both components whilst ensuring that only one button gets rendered:
+
+```tsx
+// ❌ This creates nested button elements
+
+
+ Filters
+
+
+
+// âś… This merges the props and renders a single button
+}>
+ Filters
+
+```
diff --git a/docs/data/dataGridApiPages.ts b/docs/data/dataGridApiPages.ts
index 37479bd4801b7..3ad0a85a40e3e 100644
--- a/docs/data/dataGridApiPages.ts
+++ b/docs/data/dataGridApiPages.ts
@@ -1,6 +1,10 @@
import type { MuiPage } from 'docs/src/MuiPage';
const dataGridApiPages: MuiPage[] = [
+ {
+ pathname: '/x/api/data-grid/columns-panel-trigger',
+ title: 'ColumnsPanelTrigger',
+ },
{
pathname: '/x/api/data-grid/data-grid',
title: 'DataGrid',
@@ -15,6 +19,23 @@ const dataGridApiPages: MuiPage[] = [
title: 'DataGridPro',
plan: 'pro',
},
+ {
+ pathname: '/x/api/data-grid/export-csv',
+ title: 'ExportCsv',
+ },
+ {
+ pathname: '/x/api/data-grid/export-excel',
+ title: 'ExportExcel',
+ plan: 'premium',
+ },
+ {
+ pathname: '/x/api/data-grid/export-print',
+ title: 'ExportPrint',
+ },
+ {
+ pathname: '/x/api/data-grid/filter-panel-trigger',
+ title: 'FilterPanelTrigger',
+ },
{
pathname: '/x/api/data-grid/grid-filter-form',
title: 'GridFilterForm',
@@ -27,5 +48,25 @@ const dataGridApiPages: MuiPage[] = [
pathname: '/x/api/data-grid/grid-toolbar-quick-filter',
title: 'GridToolbarQuickFilter',
},
+ {
+ pathname: '/x/api/data-grid/quick-filter',
+ title: 'QuickFilter',
+ },
+ {
+ pathname: '/x/api/data-grid/quick-filter-clear',
+ title: 'QuickFilterClear',
+ },
+ {
+ pathname: '/x/api/data-grid/quick-filter-control',
+ title: 'QuickFilterControl',
+ },
+ {
+ pathname: '/x/api/data-grid/toolbar',
+ title: 'Toolbar',
+ },
+ {
+ pathname: '/x/api/data-grid/toolbar-button',
+ title: 'ToolbarButton',
+ },
];
export default dataGridApiPages;
diff --git a/docs/data/pages.ts b/docs/data/pages.ts
index b2f653cfa8526..8e99c6ba37614 100644
--- a/docs/data/pages.ts
+++ b/docs/data/pages.ts
@@ -167,6 +167,27 @@ const pages: MuiPage[] = [
},
],
},
+ {
+ pathname: '/x/react-data-grid/components-group',
+ subheader: 'Components',
+ newFeature: true,
+ children: [
+ { pathname: '/x/react-data-grid/components/usage', title: 'Usage' },
+ { pathname: '/x/react-data-grid/components/toolbar', title: 'Toolbar' },
+ { pathname: '/x/react-data-grid/components/export', title: 'Export' },
+ { pathname: '/x/react-data-grid/components/quick-filter', title: 'Quick Filter' },
+ {
+ pathname: '/x/react-data-grid/components/columns-panel',
+ title: 'Columns Panel',
+ planned: true,
+ },
+ {
+ pathname: '/x/react-data-grid/components/filter-panel',
+ title: 'Filter Panel',
+ planned: true,
+ },
+ ],
+ },
{
pathname: '/x/react-data-grid/customization-group',
subheader: 'Customization',
diff --git a/docs/pages/x/api/data-grid/columns-panel-trigger.js b/docs/pages/x/api/data-grid/columns-panel-trigger.js
new file mode 100644
index 0000000000000..f51d0cb4a2981
--- /dev/null
+++ b/docs/pages/x/api/data-grid/columns-panel-trigger.js
@@ -0,0 +1,24 @@
+import * as React from 'react';
+import ApiPage from 'docs/src/modules/components/ApiPage';
+import mapApiPageTranslations from 'docs/src/modules/utils/mapApiPageTranslations';
+import layoutConfig from 'docsx/src/modules/utils/dataGridLayoutConfig';
+import jsonPageContent from './columns-panel-trigger.json';
+
+export default function Page(props) {
+ const { descriptions, pageContent } = props;
+ return ;
+}
+
+Page.getInitialProps = () => {
+ const req = require.context(
+ 'docsx/translations/api-docs/data-grid/columns-panel-trigger',
+ false,
+ /\.\/columns-panel-trigger.*.json$/,
+ );
+ const descriptions = mapApiPageTranslations(req);
+
+ return {
+ descriptions,
+ pageContent: jsonPageContent,
+ };
+};
diff --git a/docs/pages/x/api/data-grid/columns-panel-trigger.json b/docs/pages/x/api/data-grid/columns-panel-trigger.json
new file mode 100644
index 0000000000000..9a339d6bd79b8
--- /dev/null
+++ b/docs/pages/x/api/data-grid/columns-panel-trigger.json
@@ -0,0 +1,427 @@
+{
+ "props": {
+ "action": {
+ "type": {
+ "name": "union",
+ "description": "func | { current?: { focusVisible: func } }"
+ }
+ },
+ "centerRipple": { "type": { "name": "bool" }, "default": "false" },
+ "className": { "type": { "name": "union", "description": "func | string" } },
+ "color": {
+ "type": {
+ "name": "enum",
+ "description": "'error' | 'info' | 'inherit' | 'primary' | 'secondary' | 'success' | 'warning'"
+ },
+ "default": "'primary'"
+ },
+ "disabled": { "type": { "name": "bool" } },
+ "disableElevation": { "type": { "name": "bool" }, "default": "false" },
+ "disableFocusRipple": { "type": { "name": "bool" }, "default": "false" },
+ "disableRipple": { "type": { "name": "bool" }, "default": "false" },
+ "disableTouchRipple": { "type": { "name": "bool" }, "default": "false" },
+ "endIcon": { "type": { "name": "node" } },
+ "focusRipple": { "type": { "name": "bool" }, "default": "false" },
+ "focusVisibleClassName": { "type": { "name": "string" } },
+ "fullWidth": { "type": { "name": "bool" }, "default": "false" },
+ "href": { "type": { "name": "string" } },
+ "LinkComponent": { "type": { "name": "elementType" }, "default": "'a'" },
+ "onFocusVisible": { "type": { "name": "func" } },
+ "render": { "type": { "name": "union", "description": "element | func" } },
+ "size": {
+ "type": {
+ "name": "enum",
+ "description": "'large' | 'medium' | 'small'"
+ }
+ },
+ "startIcon": { "type": { "name": "node" } },
+ "sx": {
+ "type": {
+ "name": "union",
+ "description": "Array<func | object | bool> | func | object"
+ },
+ "additionalInfo": { "sx": true }
+ },
+ "TouchRippleProps": { "type": { "name": "object" } },
+ "touchRippleRef": { "type": { "name": "any" } },
+ "variant": {
+ "type": {
+ "name": "enum",
+ "description": "'contained' | 'outlined' | 'text'"
+ },
+ "default": "'text'"
+ }
+ },
+ "name": "ColumnsPanelTrigger",
+ "imports": [
+ "import { ColumnsPanelTrigger } from '@mui/x-data-grid/components';",
+ "import { ColumnsPanelTrigger } from '@mui/x-data-grid';",
+ "import { ColumnsPanelTrigger } from '@mui/x-data-grid-pro';",
+ "import { ColumnsPanelTrigger } from '@mui/x-data-grid-premium';"
+ ],
+ "classes": [
+ {
+ "key": "colorError",
+ "className": "MuiColumnsPanelTrigger-colorError",
+ "description": "Styles applied to the root element if `color=\"error\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorInfo",
+ "className": "MuiColumnsPanelTrigger-colorInfo",
+ "description": "Styles applied to the root element if `color=\"info\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorInherit",
+ "className": "MuiColumnsPanelTrigger-colorInherit",
+ "description": "Styles applied to the root element if `color=\"inherit\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorPrimary",
+ "className": "MuiColumnsPanelTrigger-colorPrimary",
+ "description": "Styles applied to the root element if `color=\"primary\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorSecondary",
+ "className": "MuiColumnsPanelTrigger-colorSecondary",
+ "description": "Styles applied to the root element if `color=\"secondary\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorSuccess",
+ "className": "MuiColumnsPanelTrigger-colorSuccess",
+ "description": "Styles applied to the root element if `color=\"success\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "colorWarning",
+ "className": "MuiColumnsPanelTrigger-colorWarning",
+ "description": "Styles applied to the root element if `color=\"warning\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "contained",
+ "className": "MuiColumnsPanelTrigger-contained",
+ "description": "Styles applied to the root element if `variant=\"contained\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "containedError",
+ "className": "MuiColumnsPanelTrigger-containedError",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"error\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedInfo",
+ "className": "MuiColumnsPanelTrigger-containedInfo",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"info\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedInherit",
+ "className": "MuiColumnsPanelTrigger-containedInherit",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"inherit\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedPrimary",
+ "className": "MuiColumnsPanelTrigger-containedPrimary",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"primary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedSecondary",
+ "className": "MuiColumnsPanelTrigger-containedSecondary",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"secondary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedSizeLarge",
+ "className": "MuiColumnsPanelTrigger-containedSizeLarge",
+ "description": "Styles applied to the root element if `size=\"large\"` and `variant=\"contained\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedSizeMedium",
+ "className": "MuiColumnsPanelTrigger-containedSizeMedium",
+ "description": "Styles applied to the root element if `size=\"medium\"` and `variant=\"contained\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedSizeSmall",
+ "className": "MuiColumnsPanelTrigger-containedSizeSmall",
+ "description": "Styles applied to the root element if `size=\"small\"` and `variant=\"contained\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedSuccess",
+ "className": "MuiColumnsPanelTrigger-containedSuccess",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"success\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "containedWarning",
+ "className": "MuiColumnsPanelTrigger-containedWarning",
+ "description": "Styles applied to the root element if `variant=\"contained\"` and `color=\"warning\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "disabled",
+ "className": "Mui-disabled",
+ "description": "State class applied to the root element if `disabled={true}`.",
+ "isGlobal": true
+ },
+ {
+ "key": "disableElevation",
+ "className": "MuiColumnsPanelTrigger-disableElevation",
+ "description": "Styles applied to the root element if `disableElevation={true}`.",
+ "isGlobal": false
+ },
+ {
+ "key": "endIcon",
+ "className": "MuiColumnsPanelTrigger-endIcon",
+ "description": "Styles applied to the endIcon element if supplied.",
+ "isGlobal": false
+ },
+ {
+ "key": "focusVisible",
+ "className": "Mui-focusVisible",
+ "description": "State class applied to the ButtonBase root element if the button is keyboard focused.",
+ "isGlobal": true
+ },
+ {
+ "key": "fullWidth",
+ "className": "MuiColumnsPanelTrigger-fullWidth",
+ "description": "Styles applied to the root element if `fullWidth={true}`.",
+ "isGlobal": false
+ },
+ {
+ "key": "icon",
+ "className": "MuiColumnsPanelTrigger-icon",
+ "description": "Styles applied to the icon element if supplied",
+ "isGlobal": false
+ },
+ {
+ "key": "iconSizeLarge",
+ "className": "MuiColumnsPanelTrigger-iconSizeLarge",
+ "description": "Styles applied to the icon element if supplied and `size=\"large\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "iconSizeMedium",
+ "className": "MuiColumnsPanelTrigger-iconSizeMedium",
+ "description": "Styles applied to the icon element if supplied and `size=\"medium\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "iconSizeSmall",
+ "className": "MuiColumnsPanelTrigger-iconSizeSmall",
+ "description": "Styles applied to the icon element if supplied and `size=\"small\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlined",
+ "className": "MuiColumnsPanelTrigger-outlined",
+ "description": "Styles applied to the root element if `variant=\"outlined\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "outlinedError",
+ "className": "MuiColumnsPanelTrigger-outlinedError",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"error\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedInfo",
+ "className": "MuiColumnsPanelTrigger-outlinedInfo",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"info\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedInherit",
+ "className": "MuiColumnsPanelTrigger-outlinedInherit",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"inherit\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedPrimary",
+ "className": "MuiColumnsPanelTrigger-outlinedPrimary",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"primary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedSecondary",
+ "className": "MuiColumnsPanelTrigger-outlinedSecondary",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"secondary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedSizeLarge",
+ "className": "MuiColumnsPanelTrigger-outlinedSizeLarge",
+ "description": "Styles applied to the root element if `size=\"large\"` and `variant=\"outlined\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedSizeMedium",
+ "className": "MuiColumnsPanelTrigger-outlinedSizeMedium",
+ "description": "Styles applied to the root element if `size=\"medium\"` and `variant=\"outlined\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedSizeSmall",
+ "className": "MuiColumnsPanelTrigger-outlinedSizeSmall",
+ "description": "Styles applied to the root element if `size=\"small\"` and `variant=\"outlined\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedSuccess",
+ "className": "MuiColumnsPanelTrigger-outlinedSuccess",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"success\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "outlinedWarning",
+ "className": "MuiColumnsPanelTrigger-outlinedWarning",
+ "description": "Styles applied to the root element if `variant=\"outlined\"` and `color=\"warning\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "root",
+ "className": "MuiColumnsPanelTrigger-root",
+ "description": "Styles applied to the root element.",
+ "isGlobal": false
+ },
+ {
+ "key": "sizeLarge",
+ "className": "MuiColumnsPanelTrigger-sizeLarge",
+ "description": "Styles applied to the root element if `size=\"large\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "sizeMedium",
+ "className": "MuiColumnsPanelTrigger-sizeMedium",
+ "description": "Styles applied to the root element if `size=\"medium\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "sizeSmall",
+ "className": "MuiColumnsPanelTrigger-sizeSmall",
+ "description": "Styles applied to the root element if `size=\"small\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "startIcon",
+ "className": "MuiColumnsPanelTrigger-startIcon",
+ "description": "Styles applied to the startIcon element if supplied.",
+ "isGlobal": false
+ },
+ {
+ "key": "text",
+ "className": "MuiColumnsPanelTrigger-text",
+ "description": "Styles applied to the root element if `variant=\"text\"`.",
+ "isGlobal": false
+ },
+ {
+ "key": "textError",
+ "className": "MuiColumnsPanelTrigger-textError",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"error\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textInfo",
+ "className": "MuiColumnsPanelTrigger-textInfo",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"info\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textInherit",
+ "className": "MuiColumnsPanelTrigger-textInherit",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"inherit\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textPrimary",
+ "className": "MuiColumnsPanelTrigger-textPrimary",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"primary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textSecondary",
+ "className": "MuiColumnsPanelTrigger-textSecondary",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"secondary\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textSizeLarge",
+ "className": "MuiColumnsPanelTrigger-textSizeLarge",
+ "description": "Styles applied to the root element if `size=\"large\"` and `variant=\"text\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textSizeMedium",
+ "className": "MuiColumnsPanelTrigger-textSizeMedium",
+ "description": "Styles applied to the root element if `size=\"medium\"` and `variant=\"text\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textSizeSmall",
+ "className": "MuiColumnsPanelTrigger-textSizeSmall",
+ "description": "Styles applied to the root element if `size=\"small\"` and `variant=\"text\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textSuccess",
+ "className": "MuiColumnsPanelTrigger-textSuccess",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"success\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ },
+ {
+ "key": "textWarning",
+ "className": "MuiColumnsPanelTrigger-textWarning",
+ "description": "Styles applied to the root element if `variant=\"text\"` and `color=\"warning\"`.",
+ "isGlobal": false,
+ "isDeprecated": true
+ }
+ ],
+ "muiName": "MuiColumnsPanelTrigger",
+ "forwardsRefTo": "GridRoot",
+ "filename": "/packages/x-data-grid/src/components/columnsPanel/ColumnsPanelTrigger.tsx",
+ "inheritance": null,
+ "demos": "
",
+ "cssComponent": false
+}
diff --git a/docs/pages/x/react-data-grid/components/columns-panel.js b/docs/pages/x/react-data-grid/components/columns-panel.js
new file mode 100644
index 0000000000000..ec43dc3870e2f
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/columns-panel.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/columns-panel/columns-panel.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/pages/x/react-data-grid/components/export.js b/docs/pages/x/react-data-grid/components/export.js
new file mode 100644
index 0000000000000..d7f7a69104f57
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/export.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/export/export.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/pages/x/react-data-grid/components/filter-panel.js b/docs/pages/x/react-data-grid/components/filter-panel.js
new file mode 100644
index 0000000000000..476db83dab871
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/filter-panel.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/filter-panel/filter-panel.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/pages/x/react-data-grid/components.js b/docs/pages/x/react-data-grid/components/index.js
similarity index 100%
rename from docs/pages/x/react-data-grid/components.js
rename to docs/pages/x/react-data-grid/components/index.js
diff --git a/docs/pages/x/react-data-grid/components/quick-filter.js b/docs/pages/x/react-data-grid/components/quick-filter.js
new file mode 100644
index 0000000000000..d6cbd709da275
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/quick-filter.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/quick-filter/quick-filter.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/pages/x/react-data-grid/components/toolbar.js b/docs/pages/x/react-data-grid/components/toolbar.js
new file mode 100644
index 0000000000000..612e82a781141
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/toolbar.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/toolbar/toolbar.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/pages/x/react-data-grid/components/usage.js b/docs/pages/x/react-data-grid/components/usage.js
new file mode 100644
index 0000000000000..85488e2fd0fef
--- /dev/null
+++ b/docs/pages/x/react-data-grid/components/usage.js
@@ -0,0 +1,7 @@
+import * as React from 'react';
+import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs';
+import * as pageProps from 'docsx/data/data-grid/components/usage.md?muiMarkdown';
+
+export default function Page() {
+ return ;
+}
diff --git a/docs/translations/api-docs/data-grid/columns-panel-trigger/columns-panel-trigger.json b/docs/translations/api-docs/data-grid/columns-panel-trigger/columns-panel-trigger.json
new file mode 100644
index 0000000000000..f70df38985067
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/columns-panel-trigger/columns-panel-trigger.json
@@ -0,0 +1,355 @@
+{
+ "componentDescription": "A button that opens and closes the columns panel.\nIt renders the `baseButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "className": { "description": "Override or extend the styles applied to the component." },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableElevation": { "description": "If true, no elevation is used." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "endIcon": { "description": "Element placed after the children." },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "fullWidth": {
+ "description": "If true, the button will take up the full width of its container."
+ },
+ "href": {
+ "description": "The URL to link to when the button is clicked. If defined, an a element will be used as the root node."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "startIcon": { "description": "Element placed before the children." },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ },
+ "variant": { "description": "The variant to use." }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "contained": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\""
+ },
+ "containedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "containedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "containedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "containedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "containedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "containedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "containedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "disableElevation": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disableElevation={true}"
+ },
+ "endIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the endIcon element",
+ "conditions": "supplied"
+ },
+ "focusVisible": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the ButtonBase root element",
+ "conditions": "the button is keyboard focused"
+ },
+ "fullWidth": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "fullWidth={true}"
+ },
+ "icon": { "description": "Styles applied to the icon element if supplied" },
+ "iconSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"large\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeLarge classes instead. How to migrate"
+ },
+ "iconSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"medium\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeMedium classes instead. How to migrate"
+ },
+ "iconSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"small\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeSmall classes instead. How to migrate"
+ },
+ "outlined": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\""
+ },
+ "outlinedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "outlinedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "outlinedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "outlinedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "outlinedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "outlinedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "outlinedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ },
+ "startIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the startIcon element",
+ "conditions": "supplied"
+ },
+ "text": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\""
+ },
+ "textError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "textInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "textInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "textPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "textSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "textSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "textWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorWarning classes instead. How to migrate"
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/export-csv/export-csv.json b/docs/translations/api-docs/data-grid/export-csv/export-csv.json
new file mode 100644
index 0000000000000..a1dcf9635a61d
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/export-csv/export-csv.json
@@ -0,0 +1,355 @@
+{
+ "componentDescription": "A button that triggers a CSV export.\nIt renders the `baseButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableElevation": { "description": "If true, no elevation is used." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "endIcon": { "description": "Element placed after the children." },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "fullWidth": {
+ "description": "If true, the button will take up the full width of its container."
+ },
+ "href": {
+ "description": "The URL to link to when the button is clicked. If defined, an a element will be used as the root node."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "options": { "description": "The options to apply on the CSV export." },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "startIcon": { "description": "Element placed before the children." },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ },
+ "variant": { "description": "The variant to use." }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "contained": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\""
+ },
+ "containedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "containedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "containedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "containedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "containedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "containedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "containedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "disableElevation": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disableElevation={true}"
+ },
+ "endIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the endIcon element",
+ "conditions": "supplied"
+ },
+ "focusVisible": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the ButtonBase root element",
+ "conditions": "the button is keyboard focused"
+ },
+ "fullWidth": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "fullWidth={true}"
+ },
+ "icon": { "description": "Styles applied to the icon element if supplied" },
+ "iconSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"large\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeLarge classes instead. How to migrate"
+ },
+ "iconSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"medium\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeMedium classes instead. How to migrate"
+ },
+ "iconSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"small\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeSmall classes instead. How to migrate"
+ },
+ "outlined": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\""
+ },
+ "outlinedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "outlinedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "outlinedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "outlinedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "outlinedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "outlinedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "outlinedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ },
+ "startIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the startIcon element",
+ "conditions": "supplied"
+ },
+ "text": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\""
+ },
+ "textError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "textInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "textInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "textPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "textSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "textSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "textWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorWarning classes instead. How to migrate"
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/export-excel/export-excel.json b/docs/translations/api-docs/data-grid/export-excel/export-excel.json
new file mode 100644
index 0000000000000..362044f53da36
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/export-excel/export-excel.json
@@ -0,0 +1,355 @@
+{
+ "componentDescription": "A button that triggers an Excel export.\nIt renders the `baseButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableElevation": { "description": "If true, no elevation is used." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "endIcon": { "description": "Element placed after the children." },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "fullWidth": {
+ "description": "If true, the button will take up the full width of its container."
+ },
+ "href": {
+ "description": "The URL to link to when the button is clicked. If defined, an a element will be used as the root node."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "options": { "description": "The options to apply on the Excel export." },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "startIcon": { "description": "Element placed before the children." },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ },
+ "variant": { "description": "The variant to use." }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "contained": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\""
+ },
+ "containedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "containedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "containedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "containedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "containedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "containedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "containedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "disableElevation": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disableElevation={true}"
+ },
+ "endIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the endIcon element",
+ "conditions": "supplied"
+ },
+ "focusVisible": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the ButtonBase root element",
+ "conditions": "the button is keyboard focused"
+ },
+ "fullWidth": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "fullWidth={true}"
+ },
+ "icon": { "description": "Styles applied to the icon element if supplied" },
+ "iconSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"large\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeLarge classes instead. How to migrate"
+ },
+ "iconSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"medium\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeMedium classes instead. How to migrate"
+ },
+ "iconSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"small\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeSmall classes instead. How to migrate"
+ },
+ "outlined": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\""
+ },
+ "outlinedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "outlinedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "outlinedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "outlinedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "outlinedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "outlinedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "outlinedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ },
+ "startIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the startIcon element",
+ "conditions": "supplied"
+ },
+ "text": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\""
+ },
+ "textError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "textInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "textInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "textPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "textSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "textSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "textWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorWarning classes instead. How to migrate"
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/export-print/export-print.json b/docs/translations/api-docs/data-grid/export-print/export-print.json
new file mode 100644
index 0000000000000..f20a28e10b036
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/export-print/export-print.json
@@ -0,0 +1,355 @@
+{
+ "componentDescription": "A button that triggers a print export.\nIt renders the `baseButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableElevation": { "description": "If true, no elevation is used." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "endIcon": { "description": "Element placed after the children." },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "fullWidth": {
+ "description": "If true, the button will take up the full width of its container."
+ },
+ "href": {
+ "description": "The URL to link to when the button is clicked. If defined, an a element will be used as the root node."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "options": { "description": "The options to apply on the Print export." },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "startIcon": { "description": "Element placed before the children." },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ },
+ "variant": { "description": "The variant to use." }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "contained": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\""
+ },
+ "containedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "containedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "containedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "containedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "containedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "containedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "containedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "disableElevation": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disableElevation={true}"
+ },
+ "endIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the endIcon element",
+ "conditions": "supplied"
+ },
+ "focusVisible": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the ButtonBase root element",
+ "conditions": "the button is keyboard focused"
+ },
+ "fullWidth": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "fullWidth={true}"
+ },
+ "icon": { "description": "Styles applied to the icon element if supplied" },
+ "iconSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"large\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeLarge classes instead. How to migrate"
+ },
+ "iconSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"medium\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeMedium classes instead. How to migrate"
+ },
+ "iconSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"small\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeSmall classes instead. How to migrate"
+ },
+ "outlined": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\""
+ },
+ "outlinedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "outlinedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "outlinedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "outlinedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "outlinedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "outlinedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "outlinedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ },
+ "startIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the startIcon element",
+ "conditions": "supplied"
+ },
+ "text": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\""
+ },
+ "textError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "textInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "textInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "textPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "textSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "textSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "textWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorWarning classes instead. How to migrate"
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/filter-panel-trigger/filter-panel-trigger.json b/docs/translations/api-docs/data-grid/filter-panel-trigger/filter-panel-trigger.json
new file mode 100644
index 0000000000000..6b1b783ffe03b
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/filter-panel-trigger/filter-panel-trigger.json
@@ -0,0 +1,355 @@
+{
+ "componentDescription": "A button that opens and closes the filter panel.\nIt renders the `baseButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "className": { "description": "A function to customize rendering of the component." },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableElevation": { "description": "If true, no elevation is used." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "endIcon": { "description": "Element placed after the children." },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "fullWidth": {
+ "description": "If true, the button will take up the full width of its container."
+ },
+ "href": {
+ "description": "The URL to link to when the button is clicked. If defined, an a element will be used as the root node."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "startIcon": { "description": "Element placed before the children." },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ },
+ "variant": { "description": "The variant to use." }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "contained": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\""
+ },
+ "containedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "containedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "containedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "containedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "containedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "containedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"contained\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-contained classes instead. How to migrate"
+ },
+ "containedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "containedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"contained\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-contained and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "disableElevation": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disableElevation={true}"
+ },
+ "endIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the endIcon element",
+ "conditions": "supplied"
+ },
+ "focusVisible": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the ButtonBase root element",
+ "conditions": "the button is keyboard focused"
+ },
+ "fullWidth": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "fullWidth={true}"
+ },
+ "icon": { "description": "Styles applied to the icon element if supplied" },
+ "iconSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"large\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeLarge classes instead. How to migrate"
+ },
+ "iconSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"medium\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeMedium classes instead. How to migrate"
+ },
+ "iconSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the icon element",
+ "conditions": "supplied and size=\"small\"",
+ "deprecationInfo": "Combine the .MuiButton-icon and .MuiButtonSizeSmall classes instead. How to migrate"
+ },
+ "outlined": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\""
+ },
+ "outlinedError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "outlinedInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "outlinedInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "outlinedPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "outlinedSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "outlinedSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"outlined\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-outlined classes instead. How to migrate"
+ },
+ "outlinedSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "outlinedWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"outlined\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-outlined and .MuiButton-colorWarning classes instead. How to migrate"
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ },
+ "startIcon": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the startIcon element",
+ "conditions": "supplied"
+ },
+ "text": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\""
+ },
+ "textError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"error\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorError classes instead. How to migrate"
+ },
+ "textInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"info\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInfo classes instead. How to migrate"
+ },
+ "textInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"inherit\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorInherit classes instead. How to migrate"
+ },
+ "textPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"primary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorPrimary classes instead. How to migrate"
+ },
+ "textSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"secondary\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSecondary classes instead. How to migrate"
+ },
+ "textSizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeLarge and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeMedium and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\" and variant=\"text\"",
+ "deprecationInfo": "Combine the .MuiButton-sizeSmall and .MuiButton-text classes instead. How to migrate"
+ },
+ "textSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"success\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorSuccess classes instead. How to migrate"
+ },
+ "textWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "variant=\"text\" and color=\"warning\"",
+ "deprecationInfo": "Combine the .MuiButton-text and .MuiButton-colorWarning classes instead. How to migrate"
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/quick-filter-clear/quick-filter-clear.json b/docs/translations/api-docs/data-grid/quick-filter-clear/quick-filter-clear.json
new file mode 100644
index 0000000000000..171ac56370e73
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/quick-filter-clear/quick-filter-clear.json
@@ -0,0 +1,119 @@
+{
+ "componentDescription": "A button that resets the filter value.\nIt renders the `baseIconButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "className": { "description": "Override or extend the styles applied to the component." },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "edge": {
+ "description": "If given, uses a negative margin to counteract the padding on one side (this is often helpful for aligning the left or right side of the icon with content above or below, without ruining the border size and shape)."
+ },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "edgeEnd": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "edge=\"end\""
+ },
+ "edgeStart": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "edge=\"start\""
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/quick-filter-control/quick-filter-control.json b/docs/translations/api-docs/data-grid/quick-filter-control/quick-filter-control.json
new file mode 100644
index 0000000000000..606297b3a242c
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/quick-filter-control/quick-filter-control.json
@@ -0,0 +1,8 @@
+{
+ "componentDescription": "A component that takes user input and filters row data.\nIt renders the `baseTextField` slot.",
+ "propDescriptions": {
+ "className": { "description": "Override or extend the styles applied to the component." },
+ "render": { "description": "A function to customize rendering of the component." }
+ },
+ "classDescriptions": {}
+}
diff --git a/docs/translations/api-docs/data-grid/quick-filter/quick-filter.json b/docs/translations/api-docs/data-grid/quick-filter/quick-filter.json
new file mode 100644
index 0000000000000..70c2e2ba51d45
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/quick-filter/quick-filter.json
@@ -0,0 +1,21 @@
+{
+ "componentDescription": "The top level Quick Filter component that provides context to child components.\nIt does not render any DOM elements.",
+ "propDescriptions": {
+ "debounceMs": { "description": "The debounce time in milliseconds." },
+ "formatter": {
+ "description": "Function responsible for formatting values of quick filter in a string when the model is modified",
+ "typeDescriptions": {
+ "values": "The new values passed to the quick filter model",
+ "string": "The string to display in the text field"
+ }
+ },
+ "parser": {
+ "description": "Function responsible for parsing text input in an array of independent values for quick filtering.",
+ "typeDescriptions": {
+ "input": "The value entered by the user",
+ "Array": "The array of value on which quick filter is applied"
+ }
+ }
+ },
+ "classDescriptions": {}
+}
diff --git a/docs/translations/api-docs/data-grid/toolbar-button/toolbar-button.json b/docs/translations/api-docs/data-grid/toolbar-button/toolbar-button.json
new file mode 100644
index 0000000000000..e54d522c44865
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/toolbar-button/toolbar-button.json
@@ -0,0 +1,118 @@
+{
+ "componentDescription": "A button for performing actions from the toolbar.\nIt renders the `baseIconButton` slot.",
+ "propDescriptions": {
+ "action": {
+ "description": "A ref for imperative actions. It currently only supports focusVisible() action."
+ },
+ "centerRipple": {
+ "description": "If true, the ripples are centered. They won't start at the cursor interaction position."
+ },
+ "color": {
+ "description": "The color of the component. It supports both default and custom theme colors, which can be added as shown in the palette customization guide."
+ },
+ "disabled": { "description": "If true, the component is disabled." },
+ "disableFocusRipple": {
+ "description": "If true, the keyboard focus ripple is disabled."
+ },
+ "disableRipple": {
+ "description": "If true, the ripple effect is disabled. ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure to highlight the element by applying separate styles with the .Mui-focusVisible class."
+ },
+ "disableTouchRipple": {
+ "description": "If true, the touch ripple effect is disabled."
+ },
+ "edge": {
+ "description": "If given, uses a negative margin to counteract the padding on one side (this is often helpful for aligning the left or right side of the icon with content above or below, without ruining the border size and shape)."
+ },
+ "focusRipple": {
+ "description": "If true, the base button will have a keyboard focus ripple."
+ },
+ "focusVisibleClassName": {
+ "description": "This prop can help identify which element has keyboard focus. The class name will be applied when the element gains the focus through keyboard interaction. It's a polyfill for the CSS :focus-visible selector. The rationale for using this feature is explained here. A polyfill can be used to apply a focus-visible class to other components if needed."
+ },
+ "LinkComponent": {
+ "description": "The component used to render a link when the href prop is provided."
+ },
+ "onFocusVisible": {
+ "description": "Callback fired when the component is focused with a keyboard. We trigger a onFocus callback too."
+ },
+ "render": { "description": "A function to customize rendering of the component." },
+ "size": {
+ "description": "The size of the component. small is equivalent to the dense button styling."
+ },
+ "sx": {
+ "description": "The system prop that allows defining system overrides as well as additional CSS styles."
+ },
+ "TouchRippleProps": { "description": "Props applied to the TouchRipple element." },
+ "touchRippleRef": {
+ "description": "A ref that points to the TouchRipple element."
+ }
+ },
+ "classDescriptions": {
+ "colorError": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"error\""
+ },
+ "colorInfo": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"info\""
+ },
+ "colorInherit": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"inherit\""
+ },
+ "colorPrimary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"primary\""
+ },
+ "colorSecondary": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"secondary\""
+ },
+ "colorSuccess": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"success\""
+ },
+ "colorWarning": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "color=\"warning\""
+ },
+ "disabled": {
+ "description": "State class applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "disabled={true}"
+ },
+ "edgeEnd": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "edge=\"end\""
+ },
+ "edgeStart": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "edge=\"start\""
+ },
+ "root": { "description": "Styles applied to the root element." },
+ "sizeLarge": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"large\""
+ },
+ "sizeMedium": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"medium\""
+ },
+ "sizeSmall": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"small\""
+ }
+ }
+}
diff --git a/docs/translations/api-docs/data-grid/toolbar/toolbar.json b/docs/translations/api-docs/data-grid/toolbar/toolbar.json
new file mode 100644
index 0000000000000..177acd39d23c3
--- /dev/null
+++ b/docs/translations/api-docs/data-grid/toolbar/toolbar.json
@@ -0,0 +1,7 @@
+{
+ "componentDescription": "The top level Toolbar component that provides context to child components.\nIt renders a styled `` element.",
+ "propDescriptions": {
+ "render": { "description": "A function to customize rendering of the component." }
+ },
+ "classDescriptions": {}
+}
diff --git a/packages/x-data-grid-premium/src/components/export/ExportExcel.tsx b/packages/x-data-grid-premium/src/components/export/ExportExcel.tsx
new file mode 100644
index 0000000000000..1f7062b44b721
--- /dev/null
+++ b/packages/x-data-grid-premium/src/components/export/ExportExcel.tsx
@@ -0,0 +1,219 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { GridSlotProps, RenderProp } from '@mui/x-data-grid';
+import { useGridComponentRenderer } from '@mui/x-data-grid/internals';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { GridExcelExportOptions } from '../../hooks/features/export';
+
+export type ExportExcelProps = GridSlotProps['baseButton'] & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * The options to apply on the Excel export.
+ * @demos
+ * - [Excel export](/x/react-data-grid/export/#excel-export)
+ */
+ options?: GridExcelExportOptions;
+};
+
+/**
+ * A button that triggers an Excel export.
+ * It renders the `baseButton` slot.
+ *
+ * Demos:
+ *
+ * - [Export](https://mui.com/x/react-data-grid/components/export/)
+ *
+ * API:
+ *
+ * - [ExportExcel API](https://mui.com/x/api/data-grid/export-excel/)
+ */
+const ExportExcel = forwardRef(
+ function ExportExcel(props, ref) {
+ const { render, options, onClick, ...other } = props;
+ const rootProps = useGridRootProps();
+ const apiRef = useGridApiContext();
+
+ const handleClick = (event: React.MouseEvent) => {
+ apiRef.current.exportDataAsExcel(options);
+ onClick?.(event);
+ };
+
+ const element = useGridComponentRenderer(rootProps.slots.baseButton, render, {
+ onClick: handleClick,
+ ...rootProps.slotProps?.baseButton,
+ ...other,
+ ref,
+ });
+
+ return {element};
+ },
+);
+
+ExportExcel.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ className: PropTypes.string,
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ * @default 'primary'
+ */
+ color: PropTypes.oneOf([
+ 'error',
+ 'info',
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'success',
+ 'warning',
+ ]),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, no elevation is used.
+ * @default false
+ */
+ disableElevation: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * Element placed after the children.
+ */
+ endIcon: PropTypes.node,
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ /**
+ * If `true`, the button will take up the full width of its container.
+ * @default false
+ */
+ fullWidth: PropTypes.bool,
+ /**
+ * The URL to link to when the button is clicked.
+ * If defined, an `a` element will be used as the root node.
+ */
+ href: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * The options to apply on the Excel export.
+ * @demos
+ * - [Excel export](/x/react-data-grid/export/#excel-export)
+ */
+ options: PropTypes.shape({
+ allColumns: PropTypes.bool,
+ columnsStyles: PropTypes.object,
+ escapeFormulas: PropTypes.bool,
+ exceljsPostProcess: PropTypes.func,
+ exceljsPreProcess: PropTypes.func,
+ fields: PropTypes.arrayOf(PropTypes.string),
+ fileName: PropTypes.string,
+ getRowsToExport: PropTypes.func,
+ includeColumnGroupsHeaders: PropTypes.bool,
+ includeHeaders: PropTypes.bool,
+ valueOptionsSheetName: PropTypes.string,
+ worker: PropTypes.func,
+ }),
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ /**
+ * Element placed before the children.
+ */
+ startIcon: PropTypes.node,
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+ /**
+ * The variant to use.
+ * @default 'text'
+ */
+ variant: PropTypes.oneOf(['contained', 'outlined', 'text']),
+} as any;
+
+export { ExportExcel };
diff --git a/packages/x-data-grid-premium/src/components/export/index.ts b/packages/x-data-grid-premium/src/components/export/index.ts
new file mode 100644
index 0000000000000..2258afad2fb07
--- /dev/null
+++ b/packages/x-data-grid-premium/src/components/export/index.ts
@@ -0,0 +1 @@
+export * from './ExportExcel';
diff --git a/packages/x-data-grid-premium/src/components/index.ts b/packages/x-data-grid-premium/src/components/index.ts
index d48932ab3a696..9c9b4bf91545f 100644
--- a/packages/x-data-grid-premium/src/components/index.ts
+++ b/packages/x-data-grid-premium/src/components/index.ts
@@ -3,3 +3,4 @@ export * from '../material/icons';
export * from './GridColumnMenuAggregationItem';
export * from './promptControl';
export { GridColumnMenuGroupingItem } from './GridPremiumColumnMenu';
+export * from './export';
diff --git a/packages/x-data-grid/src/components/columnsPanel/ColumnsPanelTrigger.tsx b/packages/x-data-grid/src/components/columnsPanel/ColumnsPanelTrigger.tsx
new file mode 100644
index 0000000000000..089b13ef64e6f
--- /dev/null
+++ b/packages/x-data-grid/src/components/columnsPanel/ColumnsPanelTrigger.tsx
@@ -0,0 +1,242 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import useId from '@mui/utils/useId';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import {
+ gridPreferencePanelStateSelector,
+ GridPreferencePanelsValue,
+ useGridSelector,
+} from '../../hooks';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import type { GridSlotProps } from '../../models';
+
+export interface ColumnsPanelState {
+ /**
+ * If `true`, the columns panel is open.
+ */
+ open: boolean;
+}
+
+export type ColumnsPanelTriggerProps = Omit & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className?: string | ((state: ColumnsPanelState) => string);
+};
+
+/**
+ * A button that opens and closes the columns panel.
+ * It renders the `baseButton` slot.
+ *
+ * Demos:
+ *
+ * - [Columns Panel](https://mui.com/x/react-data-grid/components/columns-panel/)
+ *
+ * API:
+ *
+ * - [ColumnsPanelTrigger API](https://mui.com/x/api/data-grid/columns-panel-trigger/)
+ */
+const ColumnsPanelTrigger = forwardRef(
+ function ColumnsPanelTrigger(props, ref) {
+ const { render, className, onClick, onPointerUp, ...other } = props;
+ const rootProps = useGridRootProps();
+ const buttonId = useId();
+ const panelId = useId();
+ const apiRef = useGridApiContext();
+ const panelState = useGridSelector(apiRef, gridPreferencePanelStateSelector);
+ const open =
+ panelState.open && panelState.openedPanelValue === GridPreferencePanelsValue.columns;
+ const state = { open };
+ const resolvedClassName = typeof className === 'function' ? className(state) : className;
+
+ const handleClick = (event: React.MouseEvent) => {
+ if (open) {
+ apiRef.current.hidePreferences();
+ } else {
+ apiRef.current.showPreferences(GridPreferencePanelsValue.columns, panelId, buttonId);
+ }
+ onClick?.(event);
+ };
+
+ const handlePointerUp = (event: React.PointerEvent) => {
+ if (open) {
+ event.stopPropagation();
+ }
+ onPointerUp?.(event);
+ };
+
+ const element = useGridComponentRenderer(
+ rootProps.slots.baseButton,
+ render,
+ {
+ ...rootProps.slotProps?.baseButton,
+ id: buttonId,
+ 'aria-haspopup': 'true',
+ 'aria-expanded': open ? 'true' : undefined,
+ 'aria-controls': open ? panelId : undefined,
+ onClick: handleClick,
+ onPointerUp: handlePointerUp,
+ className: resolvedClassName,
+ ...other,
+ ref,
+ },
+ state,
+ );
+
+ return {element};
+ },
+);
+
+ColumnsPanelTrigger.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ * @default 'primary'
+ */
+ color: PropTypes.oneOf([
+ 'error',
+ 'info',
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'success',
+ 'warning',
+ ]),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, no elevation is used.
+ * @default false
+ */
+ disableElevation: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * Element placed after the children.
+ */
+ endIcon: PropTypes.node,
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ /**
+ * If `true`, the button will take up the full width of its container.
+ * @default false
+ */
+ fullWidth: PropTypes.bool,
+ /**
+ * The URL to link to when the button is clicked.
+ * If defined, an `a` element will be used as the root node.
+ */
+ href: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ /**
+ * Element placed before the children.
+ */
+ startIcon: PropTypes.node,
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+ /**
+ * The variant to use.
+ * @default 'text'
+ */
+ variant: PropTypes.oneOf(['contained', 'outlined', 'text']),
+} as any;
+
+export { ColumnsPanelTrigger };
diff --git a/packages/x-data-grid/src/components/columnsPanel/index.ts b/packages/x-data-grid/src/components/columnsPanel/index.ts
new file mode 100644
index 0000000000000..6ea2855b35f9e
--- /dev/null
+++ b/packages/x-data-grid/src/components/columnsPanel/index.ts
@@ -0,0 +1 @@
+export * from './ColumnsPanelTrigger';
diff --git a/packages/x-data-grid/src/components/export/ExportCsv.tsx b/packages/x-data-grid/src/components/export/ExportCsv.tsx
new file mode 100644
index 0000000000000..29ffe7bcc1950
--- /dev/null
+++ b/packages/x-data-grid/src/components/export/ExportCsv.tsx
@@ -0,0 +1,215 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import { GridCsvExportOptions } from '../../models/gridExport';
+import type { GridSlotProps } from '../../models';
+
+export type ExportCsvProps = GridSlotProps['baseButton'] & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * The options to apply on the CSV export.
+ * @demos
+ * - [CSV export](/x/react-data-grid/export/#csv-export)
+ */
+ options?: GridCsvExportOptions;
+};
+
+/**
+ * A button that triggers a CSV export.
+ * It renders the `baseButton` slot.
+ *
+ * Demos:
+ *
+ * - [Export](https://mui.com/x/react-data-grid/components/export/)
+ *
+ * API:
+ *
+ * - [ExportCsv API](https://mui.com/x/api/data-grid/export-csv/)
+ */
+const ExportCsv = forwardRef(function ExportCsv(props, ref) {
+ const { render, options, onClick, ...other } = props;
+ const rootProps = useGridRootProps();
+ const apiRef = useGridApiContext();
+
+ const handleClick = (event: React.MouseEvent) => {
+ apiRef.current.exportDataAsCsv(options);
+ onClick?.(event);
+ };
+
+ const element = useGridComponentRenderer(rootProps.slots.baseButton, render, {
+ ...rootProps.slotProps?.baseButton,
+ onClick: handleClick,
+ ...other,
+ ref,
+ });
+
+ return {element};
+});
+
+ExportCsv.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ className: PropTypes.string,
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ * @default 'primary'
+ */
+ color: PropTypes.oneOf([
+ 'error',
+ 'info',
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'success',
+ 'warning',
+ ]),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, no elevation is used.
+ * @default false
+ */
+ disableElevation: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * Element placed after the children.
+ */
+ endIcon: PropTypes.node,
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ /**
+ * If `true`, the button will take up the full width of its container.
+ * @default false
+ */
+ fullWidth: PropTypes.bool,
+ /**
+ * The URL to link to when the button is clicked.
+ * If defined, an `a` element will be used as the root node.
+ */
+ href: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * The options to apply on the CSV export.
+ * @demos
+ * - [CSV export](/x/react-data-grid/export/#csv-export)
+ */
+ options: PropTypes.shape({
+ allColumns: PropTypes.bool,
+ delimiter: PropTypes.string,
+ escapeFormulas: PropTypes.bool,
+ fields: PropTypes.arrayOf(PropTypes.string),
+ fileName: PropTypes.string,
+ getRowsToExport: PropTypes.func,
+ includeColumnGroupsHeaders: PropTypes.bool,
+ includeHeaders: PropTypes.bool,
+ shouldAppendQuotes: PropTypes.bool,
+ utf8WithBom: PropTypes.bool,
+ }),
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ /**
+ * Element placed before the children.
+ */
+ startIcon: PropTypes.node,
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+ /**
+ * The variant to use.
+ * @default 'text'
+ */
+ variant: PropTypes.oneOf(['contained', 'outlined', 'text']),
+} as any;
+
+export { ExportCsv };
diff --git a/packages/x-data-grid/src/components/export/ExportPrint.tsx b/packages/x-data-grid/src/components/export/ExportPrint.tsx
new file mode 100644
index 0000000000000..8b5adb4893d88
--- /dev/null
+++ b/packages/x-data-grid/src/components/export/ExportPrint.tsx
@@ -0,0 +1,217 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import { GridPrintExportOptions } from '../../models/gridExport';
+import type { GridSlotProps } from '../../models';
+
+export type ExportPrintProps = GridSlotProps['baseButton'] & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * The options to apply on the Print export.
+ * @demos
+ * - [Print export](/x/react-data-grid/export/#print-export)
+ */
+ options?: GridPrintExportOptions;
+};
+
+/**
+ * A button that triggers a print export.
+ * It renders the `baseButton` slot.
+ *
+ * Demos:
+ *
+ * - [Export](https://mui.com/x/react-data-grid/components/export/)
+ *
+ * API:
+ *
+ * - [ExportPrint API](https://mui.com/x/api/data-grid/export-print/)
+ */
+const ExportPrint = forwardRef(
+ function ExportPrint(props, ref) {
+ const { render, options, onClick, ...other } = props;
+ const rootProps = useGridRootProps();
+ const apiRef = useGridApiContext();
+
+ const handleClick = (event: React.MouseEvent) => {
+ apiRef.current.exportDataAsPrint(options);
+ onClick?.(event);
+ };
+
+ const element = useGridComponentRenderer(rootProps.slots.baseButton, render, {
+ ...rootProps.slotProps?.baseButton,
+ onClick: handleClick,
+ ...other,
+ ref,
+ });
+
+ return {element};
+ },
+);
+
+ExportPrint.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ className: PropTypes.string,
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ * @default 'primary'
+ */
+ color: PropTypes.oneOf([
+ 'error',
+ 'info',
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'success',
+ 'warning',
+ ]),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, no elevation is used.
+ * @default false
+ */
+ disableElevation: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * Element placed after the children.
+ */
+ endIcon: PropTypes.node,
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ /**
+ * If `true`, the button will take up the full width of its container.
+ * @default false
+ */
+ fullWidth: PropTypes.bool,
+ /**
+ * The URL to link to when the button is clicked.
+ * If defined, an `a` element will be used as the root node.
+ */
+ href: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * The options to apply on the Print export.
+ * @demos
+ * - [Print export](/x/react-data-grid/export/#print-export)
+ */
+ options: PropTypes.shape({
+ allColumns: PropTypes.bool,
+ bodyClassName: PropTypes.string,
+ copyStyles: PropTypes.bool,
+ fields: PropTypes.arrayOf(PropTypes.string),
+ fileName: PropTypes.string,
+ getRowsToExport: PropTypes.func,
+ hideFooter: PropTypes.bool,
+ hideToolbar: PropTypes.bool,
+ includeCheckboxes: PropTypes.bool,
+ pageStyle: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
+ }),
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ /**
+ * Element placed before the children.
+ */
+ startIcon: PropTypes.node,
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+ /**
+ * The variant to use.
+ * @default 'text'
+ */
+ variant: PropTypes.oneOf(['contained', 'outlined', 'text']),
+} as any;
+
+export { ExportPrint };
diff --git a/packages/x-data-grid/src/components/export/index.ts b/packages/x-data-grid/src/components/export/index.ts
new file mode 100644
index 0000000000000..30df66f725169
--- /dev/null
+++ b/packages/x-data-grid/src/components/export/index.ts
@@ -0,0 +1,2 @@
+export * from './ExportCsv';
+export * from './ExportPrint';
diff --git a/packages/x-data-grid/src/components/filterPanel/FilterPanelTrigger.tsx b/packages/x-data-grid/src/components/filterPanel/FilterPanelTrigger.tsx
new file mode 100644
index 0000000000000..a00ec5c410a18
--- /dev/null
+++ b/packages/x-data-grid/src/components/filterPanel/FilterPanelTrigger.tsx
@@ -0,0 +1,249 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import useId from '@mui/utils/useId';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import {
+ gridFilterActiveItemsSelector,
+ gridPreferencePanelStateSelector,
+ GridPreferencePanelsValue,
+ useGridSelector,
+} from '../../hooks';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import type { GridSlotProps } from '../../models';
+
+export interface FilterPanelState {
+ /**
+ * If `true`, the filter panel is open.
+ */
+ open: boolean;
+ /**
+ * The number of active filters.
+ */
+ filterCount: number;
+}
+
+export type FilterPanelTriggerProps = Omit & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * A function to customize rendering of the component.
+ */
+ className?: string | ((state: FilterPanelState) => string);
+};
+
+/**
+ * A button that opens and closes the filter panel.
+ * It renders the `baseButton` slot.
+ *
+ * Demos:
+ *
+ * - [Filter Panel](https://mui.com/x/react-data-grid/components/filter-panel/)
+ *
+ * API:
+ *
+ * - [FilterPanelTrigger API](https://mui.com/x/api/data-grid/filter-panel-trigger/)
+ */
+const FilterPanelTrigger = forwardRef(
+ function FilterPanelTrigger(props, ref) {
+ const { render, className, onClick, onPointerUp, ...other } = props;
+ const rootProps = useGridRootProps();
+ const buttonId = useId();
+ const panelId = useId();
+ const apiRef = useGridApiContext();
+ const panelState = useGridSelector(apiRef, gridPreferencePanelStateSelector);
+ const open =
+ panelState.open && panelState.openedPanelValue === GridPreferencePanelsValue.filters;
+ const activeFilters = useGridSelector(apiRef, gridFilterActiveItemsSelector);
+ const filterCount = activeFilters.length;
+ const state = { open, filterCount };
+ const resolvedClassName = typeof className === 'function' ? className(state) : className;
+
+ const handleClick = (event: React.MouseEvent) => {
+ if (open) {
+ apiRef.current.hidePreferences();
+ } else {
+ apiRef.current.showPreferences(GridPreferencePanelsValue.filters, panelId, buttonId);
+ }
+ onClick?.(event);
+ };
+
+ const handlePointerUp = (event: React.PointerEvent) => {
+ if (open) {
+ event.stopPropagation();
+ }
+ onPointerUp?.(event);
+ };
+
+ const element = useGridComponentRenderer(
+ rootProps.slots.baseButton,
+ render,
+ {
+ ...rootProps.slotProps?.baseButton,
+ id: buttonId,
+ 'aria-haspopup': 'true',
+ 'aria-expanded': open ? 'true' : undefined,
+ 'aria-controls': open ? panelId : undefined,
+ onClick: handleClick,
+ onPointerUp: handlePointerUp,
+ className: resolvedClassName,
+ ...other,
+ ref,
+ },
+ state,
+ );
+
+ return {element};
+ },
+);
+
+FilterPanelTrigger.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ /**
+ * A function to customize rendering of the component.
+ */
+ className: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ * @default 'primary'
+ */
+ color: PropTypes.oneOf([
+ 'error',
+ 'info',
+ 'inherit',
+ 'primary',
+ 'secondary',
+ 'success',
+ 'warning',
+ ]),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, no elevation is used.
+ * @default false
+ */
+ disableElevation: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * Element placed after the children.
+ */
+ endIcon: PropTypes.node,
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ /**
+ * If `true`, the button will take up the full width of its container.
+ * @default false
+ */
+ fullWidth: PropTypes.bool,
+ /**
+ * The URL to link to when the button is clicked.
+ * If defined, an `a` element will be used as the root node.
+ */
+ href: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ /**
+ * Element placed before the children.
+ */
+ startIcon: PropTypes.node,
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+ /**
+ * The variant to use.
+ * @default 'text'
+ */
+ variant: PropTypes.oneOf(['contained', 'outlined', 'text']),
+} as any;
+
+export { FilterPanelTrigger };
diff --git a/packages/x-data-grid/src/components/filterPanel/index.ts b/packages/x-data-grid/src/components/filterPanel/index.ts
new file mode 100644
index 0000000000000..69e113d420f34
--- /dev/null
+++ b/packages/x-data-grid/src/components/filterPanel/index.ts
@@ -0,0 +1 @@
+export * from './FilterPanelTrigger';
diff --git a/packages/x-data-grid/src/components/index.ts b/packages/x-data-grid/src/components/index.ts
index 679dae53517b8..c95db4d5b0001 100644
--- a/packages/x-data-grid/src/components/index.ts
+++ b/packages/x-data-grid/src/components/index.ts
@@ -19,3 +19,9 @@ export { GridPagination } from './GridPagination';
export * from './GridRowCount';
export * from './GridRow';
export * from './GridSelectedRowCount';
+
+export * from './columnsPanel';
+export * from './export';
+export * from './filterPanel';
+export * from './toolbarV8';
+export * from './quickFilter';
diff --git a/packages/x-data-grid/src/components/quickFilter/QuickFilter.tsx b/packages/x-data-grid/src/components/quickFilter/QuickFilter.tsx
new file mode 100644
index 0000000000000..5fbf81382644a
--- /dev/null
+++ b/packages/x-data-grid/src/components/quickFilter/QuickFilter.tsx
@@ -0,0 +1,148 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { unstable_debounce as debounce } from '@mui/utils';
+import { QuickFilterContext } from './QuickFilterContext';
+import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
+import { useGridSelector } from '../../hooks/utils/useGridSelector';
+import { gridQuickFilterValuesSelector } from '../../hooks/features/filter';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import type { GridFilterModel } from '../../models';
+import { isDeepEqual } from '../../utils/utils';
+
+export type QuickFilterProps = {
+ children: React.ReactNode;
+ /**
+ * Function responsible for parsing text input in an array of independent values for quick filtering.
+ * @param {string} input The value entered by the user
+ * @returns {any[]} The array of value on which quick filter is applied
+ * @default (searchText: string) => searchText.split(' ').filter((word) => word !== '')
+ */
+ parser?: (input: string) => any[];
+ /**
+ * Function responsible for formatting values of quick filter in a string when the model is modified
+ * @param {any[]} values The new values passed to the quick filter model
+ * @returns {string} The string to display in the text field
+ * @default (values: string[]) => values.join(' ')
+ */
+ formatter?: (values: NonNullable) => string;
+ /**
+ * The debounce time in milliseconds.
+ * @default 150
+ */
+ debounceMs?: number;
+};
+
+const DEFAULT_PARSER = (searchText: string) => searchText.split(' ').filter((word) => word !== '');
+
+const DEFAULT_FORMATTER = (values: string[]) => values.join(' ');
+
+/**
+ * The top level Quick Filter component that provides context to child components.
+ * It does not render any DOM elements.
+ *
+ * Demos:
+ *
+ * - [Quick Filter](https://mui.com/x/react-data-grid/components/quick-filter/)
+ *
+ * API:
+ *
+ * - [QuickFilter API](https://mui.com/x/api/data-grid/quick-filter/)
+ */
+function QuickFilter(props: QuickFilterProps) {
+ const rootProps = useGridRootProps();
+ const {
+ parser = DEFAULT_PARSER,
+ formatter = DEFAULT_FORMATTER,
+ debounceMs = rootProps.filterDebounceMs,
+ children,
+ } = props;
+ const apiRef = useGridApiContext();
+ const controlRef = React.useRef(null);
+ const triggerRef = React.useRef(null);
+ const quickFilterValues = useGridSelector(apiRef, gridQuickFilterValuesSelector);
+ const [value, setValue] = React.useState(formatter(quickFilterValues ?? []));
+
+ const prevQuickFilterValuesRef = React.useRef(quickFilterValues);
+
+ React.useEffect(() => {
+ if (!isDeepEqual(prevQuickFilterValuesRef.current, quickFilterValues)) {
+ // The model of quick filter value has been updated
+ prevQuickFilterValuesRef.current = quickFilterValues;
+
+ // Update the input value if needed to match the new model
+ setValue((prevSearchValue) =>
+ isDeepEqual(parser(prevSearchValue), quickFilterValues)
+ ? prevSearchValue
+ : formatter(quickFilterValues ?? []),
+ );
+ }
+ }, [quickFilterValues, formatter, parser]);
+
+ const setQuickFilterValueDebounced = React.useMemo(
+ () =>
+ debounce((newValue: string) => {
+ apiRef.current.setQuickFilterValues(parser(newValue));
+ }, debounceMs),
+ [apiRef, debounceMs, parser],
+ );
+ React.useEffect(() => setQuickFilterValueDebounced.clear, [setQuickFilterValueDebounced]);
+
+ const handleValueChange = React.useCallback(
+ (event: React.ChangeEvent) => {
+ const newValue = event.target.value;
+ setValue(newValue);
+ setQuickFilterValueDebounced(newValue);
+ },
+ [setQuickFilterValueDebounced],
+ );
+
+ const handleClear = React.useCallback(() => {
+ setValue('');
+ apiRef.current.setQuickFilterValues([]);
+ controlRef.current?.focus();
+ }, [apiRef, controlRef]);
+
+ const contextValue = React.useMemo(
+ () => ({
+ controlRef,
+ triggerRef,
+ state: {
+ value,
+ },
+ clearValue: handleClear,
+ onValueChange: handleValueChange,
+ }),
+ [value, handleValueChange, handleClear],
+ );
+
+ return {children};
+}
+
+QuickFilter.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ children: PropTypes.node,
+ /**
+ * The debounce time in milliseconds.
+ * @default 150
+ */
+ debounceMs: PropTypes.number,
+ /**
+ * Function responsible for formatting values of quick filter in a string when the model is modified
+ * @param {any[]} values The new values passed to the quick filter model
+ * @returns {string} The string to display in the text field
+ * @default (values: string[]) => values.join(' ')
+ */
+ formatter: PropTypes.func,
+ /**
+ * Function responsible for parsing text input in an array of independent values for quick filtering.
+ * @param {string} input The value entered by the user
+ * @returns {any[]} The array of value on which quick filter is applied
+ * @default (searchText: string) => searchText.split(' ').filter((word) => word !== '')
+ */
+ parser: PropTypes.func,
+} as any;
+
+export { QuickFilter };
diff --git a/packages/x-data-grid/src/components/quickFilter/QuickFilterClear.tsx b/packages/x-data-grid/src/components/quickFilter/QuickFilterClear.tsx
new file mode 100644
index 0000000000000..e2ad8c5148118
--- /dev/null
+++ b/packages/x-data-grid/src/components/quickFilter/QuickFilterClear.tsx
@@ -0,0 +1,173 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import type { GridSlotProps } from '../../models';
+import { QuickFilterState, useQuickFilterContext } from './QuickFilterContext';
+
+export type QuickFilterClearProps = Omit & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className?: string | ((state: QuickFilterState) => string);
+};
+
+/**
+ * A button that resets the filter value.
+ * It renders the `baseIconButton` slot.
+ *
+ * Demos:
+ *
+ * - [Quick Filter](https://mui.com/x/react-data-grid/components/quick-filter/)
+ *
+ * API:
+ *
+ * - [QuickFilterClear API](https://mui.com/x/api/data-grid/quick-filter-clear/)
+ */
+const QuickFilterClear = forwardRef(
+ function QuickFilterClear(props, ref) {
+ const { render, className, ...other } = props;
+ const rootProps = useGridRootProps();
+ const { state, clearValue } = useQuickFilterContext();
+ const resolvedClassName = typeof className === 'function' ? className(state) : className;
+
+ const element = useGridComponentRenderer(
+ rootProps.slots.baseIconButton,
+ render,
+ {
+ ...rootProps.slotProps?.baseIconButton,
+ onClick: clearValue,
+ className: resolvedClassName,
+ ...other,
+ ref,
+ },
+ state,
+ );
+
+ return {element};
+ },
+);
+
+QuickFilterClear.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ */
+ color: PropTypes.oneOf(['default', 'inherit', 'primary']),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * If given, uses a negative margin to counteract the padding on one
+ * side (this is often helpful for aligning the left or right
+ * side of the icon with content above or below, without ruining the border
+ * size and shape).
+ */
+ edge: PropTypes.oneOf(['end', 'start', false]),
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ label: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+} as any;
+
+export { QuickFilterClear };
diff --git a/packages/x-data-grid/src/components/quickFilter/QuickFilterContext.tsx b/packages/x-data-grid/src/components/quickFilter/QuickFilterContext.tsx
new file mode 100644
index 0000000000000..283b7b5bc9f29
--- /dev/null
+++ b/packages/x-data-grid/src/components/quickFilter/QuickFilterContext.tsx
@@ -0,0 +1,29 @@
+import * as React from 'react';
+
+export interface QuickFilterState {
+ value: string;
+}
+
+export interface QuickFilterContextValue {
+ state: QuickFilterState;
+ controlRef: React.RefObject;
+ triggerRef: React.RefObject;
+ onValueChange: (event: React.ChangeEvent) => void;
+ clearValue: () => void;
+}
+
+export const QuickFilterContext = React.createContext(
+ undefined,
+);
+
+export function useQuickFilterContext() {
+ const context = React.useContext(QuickFilterContext);
+
+ if (context === undefined) {
+ throw new Error(
+ 'MUI X: Missing context. Quick Filter subcomponents must be placed within a component.',
+ );
+ }
+
+ return context;
+}
diff --git a/packages/x-data-grid/src/components/quickFilter/QuickFilterControl.tsx b/packages/x-data-grid/src/components/quickFilter/QuickFilterControl.tsx
new file mode 100644
index 0000000000000..5454e685a85f2
--- /dev/null
+++ b/packages/x-data-grid/src/components/quickFilter/QuickFilterControl.tsx
@@ -0,0 +1,132 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { unstable_useForkRef as useForkRef } from '@mui/utils';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import type { GridSlotProps } from '../../models';
+import { QuickFilterState, useQuickFilterContext } from './QuickFilterContext';
+
+export type QuickFilterControlProps = Omit & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className?: string | ((state: QuickFilterState) => string);
+};
+
+/**
+ * A component that takes user input and filters row data.
+ * It renders the `baseTextField` slot.
+ *
+ * Demos:
+ *
+ * - [Quick Filter](https://mui.com/x/react-data-grid/components/quick-filter/)
+ *
+ * API:
+ *
+ * - [QuickFilterControl API](https://mui.com/x/api/data-grid/quick-filter-control/)
+ */
+const QuickFilterControl = forwardRef(
+ function QuickFilterControl(props, ref) {
+ const { render, className, ...other } = props;
+ const rootProps = useGridRootProps();
+ const { state, controlRef, onValueChange, clearValue } = useQuickFilterContext();
+ const resolvedClassName = typeof className === 'function' ? className(state) : className;
+ const handleRef = useForkRef(controlRef, ref);
+
+ const handleKeyDown = (event: React.KeyboardEvent) => {
+ if (event.key === 'Escape') {
+ clearValue();
+ }
+
+ props.onKeyDown?.(event);
+ };
+
+ const element = useGridComponentRenderer(
+ rootProps.slots.baseTextField,
+ render,
+ {
+ ...rootProps.slotProps?.baseTextField,
+ value: state.value,
+ className: resolvedClassName,
+ onChange: onValueChange,
+ onKeyDown: handleKeyDown,
+ ...other,
+ ref: handleRef,
+ },
+ state,
+ );
+
+ return {element};
+ },
+);
+
+QuickFilterControl.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ autoComplete: PropTypes.string,
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
+ color: PropTypes.oneOf(['error', 'primary']),
+ disabled: PropTypes.bool,
+ error: PropTypes.bool,
+ fullWidth: PropTypes.bool,
+ helperText: PropTypes.string,
+ id: PropTypes.string,
+ inputRef: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.object,
+ }),
+ ]),
+ label: PropTypes.node,
+ onChange: PropTypes.func,
+ onKeyDown: PropTypes.func,
+ placeholder: PropTypes.string,
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ size: PropTypes.oneOf(['medium', 'small']),
+ slotProps: PropTypes.object,
+ style: PropTypes.object,
+ tabIndex: PropTypes.number,
+ type: PropTypes.oneOfType([
+ PropTypes.oneOf([
+ 'button',
+ 'checkbox',
+ 'color',
+ 'date',
+ 'datetime-local',
+ 'email',
+ 'file',
+ 'hidden',
+ 'image',
+ 'month',
+ 'number',
+ 'password',
+ 'radio',
+ 'range',
+ 'reset',
+ 'search',
+ 'submit',
+ 'tel',
+ 'text',
+ 'time',
+ 'url',
+ 'week',
+ ]),
+ PropTypes.object,
+ ]),
+ value: PropTypes.string,
+} as any;
+
+export { QuickFilterControl };
diff --git a/packages/x-data-grid/src/components/quickFilter/index.ts b/packages/x-data-grid/src/components/quickFilter/index.ts
new file mode 100644
index 0000000000000..c6752ada91605
--- /dev/null
+++ b/packages/x-data-grid/src/components/quickFilter/index.ts
@@ -0,0 +1,3 @@
+export * from './QuickFilter';
+export * from './QuickFilterControl';
+export * from './QuickFilterClear';
diff --git a/packages/x-data-grid/src/components/toolbarV8/Toolbar.tsx b/packages/x-data-grid/src/components/toolbarV8/Toolbar.tsx
new file mode 100644
index 0000000000000..1bfde518f7f4f
--- /dev/null
+++ b/packages/x-data-grid/src/components/toolbarV8/Toolbar.tsx
@@ -0,0 +1,150 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { styled } from '@mui/material/styles';
+import composeClasses from '@mui/utils/composeClasses';
+import clsx from 'clsx';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { vars } from '../../constants/cssVariables';
+import { getDataGridUtilityClass } from '../../constants/gridClasses';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import { ToolbarContext } from './ToolbarContext';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import type { DataGridProcessedProps } from '../../models/props/DataGridProps';
+
+export type ToolbarProps = React.HTMLAttributes & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp>;
+};
+
+type OwnerState = DataGridProcessedProps;
+
+const useUtilityClasses = (ownerState: OwnerState) => {
+ const { classes } = ownerState;
+
+ const slots = {
+ root: ['toolbar'],
+ };
+
+ return composeClasses(slots, getDataGridUtilityClass, classes);
+};
+
+const ToolbarRoot = styled('div', {
+ name: 'MuiDataGrid',
+ slot: 'Toolbar',
+})<{ ownerState: OwnerState }>({
+ flex: 0,
+ display: 'flex',
+ alignItems: 'center',
+ gap: vars.spacing(0.25),
+ padding: vars.spacing(0.5),
+ borderBottom: `1px solid ${vars.colors.border.base}`,
+});
+
+/**
+ * The top level Toolbar component that provides context to child components.
+ * It renders a styled `` element.
+ *
+ * Demos:
+ *
+ * - [Toolbar](https://mui.com/x/react-data-grid/components/toolbar/)
+ *
+ * API:
+ *
+ * - [Toolbar API](https://mui.com/x/api/data-grid/toolbar/)
+ */
+const Toolbar = forwardRef(function Toolbar(props, ref) {
+ const { render, className, ...other } = props;
+ const rootProps = useGridRootProps();
+ const classes = useUtilityClasses(rootProps);
+
+ const [focusableItemId, setFocusableItemId] = React.useState(null);
+ const [items, setItems] = React.useState([]);
+
+ const registerItem = React.useCallback((item: string) => {
+ setItems((prevItems) => [...prevItems, item]);
+ }, []);
+
+ const unregisterItem = React.useCallback(
+ (item: string) => {
+ setItems((prevItems) => prevItems.filter((i) => i !== item));
+
+ if (focusableItemId === item) {
+ setFocusableItemId(null);
+ }
+ },
+ [focusableItemId],
+ );
+
+ const onItemKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (!focusableItemId) {
+ return;
+ }
+
+ if (event.key === 'ArrowRight') {
+ event.preventDefault();
+ const nextIndex = items.indexOf(focusableItemId) + 1;
+ setFocusableItemId(items[nextIndex < items.length ? nextIndex : 0]);
+ }
+
+ if (event.key === 'ArrowLeft') {
+ event.preventDefault();
+ const prevIndex = items.indexOf(focusableItemId) - 1;
+ setFocusableItemId(items[prevIndex < 0 ? items.length - 1 : prevIndex]);
+ }
+
+ if (event.key === 'Home') {
+ event.preventDefault();
+ setFocusableItemId(items[0]);
+ }
+
+ if (event.key === 'End') {
+ event.preventDefault();
+ setFocusableItemId(items[items.length - 1]);
+ }
+ },
+ [items, focusableItemId],
+ );
+
+ const contextValue = React.useMemo(
+ () => ({
+ focusableItemId,
+ registerItem,
+ unregisterItem,
+ onItemKeyDown,
+ }),
+ [registerItem, unregisterItem, focusableItemId, onItemKeyDown],
+ );
+
+ const element = useGridComponentRenderer(ToolbarRoot, render, {
+ role: 'toolbar',
+ 'aria-orientation': 'horizontal',
+ className: clsx(classes.root, className),
+ ownerState: rootProps,
+ ...other,
+ ref,
+ });
+
+ React.useEffect(() => {
+ if (items.length > 0) {
+ setFocusableItemId(items[0]);
+ }
+ }, [items]);
+
+ return {element};
+});
+
+Toolbar.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+} as any;
+
+export { Toolbar };
diff --git a/packages/x-data-grid/src/components/toolbarV8/ToolbarButton.tsx b/packages/x-data-grid/src/components/toolbarV8/ToolbarButton.tsx
new file mode 100644
index 0000000000000..c9e6beb2567b9
--- /dev/null
+++ b/packages/x-data-grid/src/components/toolbarV8/ToolbarButton.tsx
@@ -0,0 +1,184 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { unstable_useForkRef as useForkRef } from '@mui/utils';
+import useId from '@mui/utils/useId';
+import { forwardRef } from '@mui/x-internals/forwardRef';
+import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
+import { useGridComponentRenderer, RenderProp } from '../../hooks/utils/useGridComponentRenderer';
+import type { GridSlotProps } from '../../models';
+import { useToolbarContext } from './ToolbarContext';
+
+export type ToolbarButtonProps = GridSlotProps['baseIconButton'] & {
+ /**
+ * A function to customize rendering of the component.
+ */
+ render?: RenderProp;
+};
+
+/**
+ * A button for performing actions from the toolbar.
+ * It renders the `baseIconButton` slot.
+ *
+ * Demos:
+ *
+ * - [Toolbar](https://mui.com/x/react-data-grid/components/toolbar/)
+ *
+ * API:
+ *
+ * - [ToolbarButton API](https://mui.com/x/api/data-grid/toolbar-button/)
+ */
+const ToolbarButton = forwardRef(
+ function ToolbarButton(props, ref) {
+ const { render, ...other } = props;
+ const id = useId();
+ const rootProps = useGridRootProps();
+ const buttonRef = React.useRef(null);
+ const handleRef = useForkRef(buttonRef, ref);
+ const { focusableItemId, registerItem, unregisterItem, onItemKeyDown } = useToolbarContext();
+
+ React.useEffect(() => {
+ registerItem(id!);
+ return () => unregisterItem(id!);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const isInitialFocus = React.useRef(true);
+ React.useEffect(() => {
+ // Do not focus the item on initial render
+ if (focusableItemId && isInitialFocus.current) {
+ isInitialFocus.current = false;
+ return;
+ }
+
+ if (focusableItemId === id) {
+ buttonRef.current?.focus();
+ }
+ }, [focusableItemId, id]);
+
+ const element = useGridComponentRenderer(rootProps.slots.baseIconButton, render, {
+ ...rootProps.slotProps?.baseIconButton,
+ tabIndex: focusableItemId === id ? 0 : -1,
+ onKeyDown: onItemKeyDown,
+ ...other,
+ ref: handleRef,
+ });
+
+ return {element};
+ },
+);
+
+ToolbarButton.propTypes = {
+ // ----------------------------- Warning --------------------------------
+ // | These PropTypes are generated from the TypeScript type definitions |
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
+ // ----------------------------------------------------------------------
+ /**
+ * A ref for imperative actions.
+ * It currently only supports `focusVisible()` action.
+ */
+ action: PropTypes.oneOfType([
+ PropTypes.func,
+ PropTypes.shape({
+ current: PropTypes.shape({
+ focusVisible: PropTypes.func.isRequired,
+ }),
+ }),
+ ]),
+ /**
+ * If `true`, the ripples are centered.
+ * They won't start at the cursor interaction position.
+ * @default false
+ */
+ centerRipple: PropTypes.bool,
+ className: PropTypes.string,
+ /**
+ * The color of the component.
+ * It supports both default and custom theme colors, which can be added as shown in the
+ * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
+ */
+ color: PropTypes.oneOf(['default', 'inherit', 'primary']),
+ component: PropTypes.elementType,
+ /**
+ * If `true`, the component is disabled.
+ */
+ disabled: PropTypes.bool,
+ /**
+ * If `true`, the keyboard focus ripple is disabled.
+ * @default false
+ */
+ disableFocusRipple: PropTypes.bool,
+ /**
+ * If `true`, the ripple effect is disabled.
+ *
+ * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure
+ * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.
+ * @default false
+ */
+ disableRipple: PropTypes.bool,
+ /**
+ * If `true`, the touch ripple effect is disabled.
+ * @default false
+ */
+ disableTouchRipple: PropTypes.bool,
+ /**
+ * If given, uses a negative margin to counteract the padding on one
+ * side (this is often helpful for aligning the left or right
+ * side of the icon with content above or below, without ruining the border
+ * size and shape).
+ */
+ edge: PropTypes.oneOf(['end', 'start', false]),
+ /**
+ * If `true`, the base button will have a keyboard focus ripple.
+ * @default false
+ */
+ focusRipple: PropTypes.bool,
+ /**
+ * This prop can help identify which element has keyboard focus.
+ * The class name will be applied when the element gains the focus through keyboard interaction.
+ * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).
+ * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/HEAD/explainer.md).
+ * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components
+ * if needed.
+ */
+ focusVisibleClassName: PropTypes.string,
+ label: PropTypes.string,
+ /**
+ * The component used to render a link when the `href` prop is provided.
+ * @default 'a'
+ */
+ LinkComponent: PropTypes.elementType,
+ /**
+ * Callback fired when the component is focused with a keyboard.
+ * We trigger a `onFocus` callback too.
+ */
+ onFocusVisible: PropTypes.func,
+ /**
+ * A function to customize rendering of the component.
+ */
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
+ /**
+ * The size of the component.
+ * `small` is equivalent to the dense button styling.
+ */
+ size: PropTypes.oneOf(['large', 'medium', 'small']),
+ style: PropTypes.object,
+ /**
+ * The system prop that allows defining system overrides as well as additional CSS styles.
+ */
+ sx: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
+ PropTypes.func,
+ PropTypes.object,
+ ]),
+ tabIndex: PropTypes.number,
+ /**
+ * Props applied to the `TouchRipple` element.
+ */
+ TouchRippleProps: PropTypes.object,
+ /**
+ * A ref that points to the `TouchRipple` element.
+ */
+ touchRippleRef: PropTypes.any,
+} as any;
+
+export { ToolbarButton };
diff --git a/packages/x-data-grid/src/components/toolbarV8/ToolbarContext.tsx b/packages/x-data-grid/src/components/toolbarV8/ToolbarContext.tsx
new file mode 100644
index 0000000000000..462c71154d24c
--- /dev/null
+++ b/packages/x-data-grid/src/components/toolbarV8/ToolbarContext.tsx
@@ -0,0 +1,22 @@
+import * as React from 'react';
+
+export interface ToolbarContextValue {
+ focusableItemId: string | null;
+ registerItem: (itemId: string) => void;
+ unregisterItem: (itemId: string) => void;
+ onItemKeyDown: (event: React.KeyboardEvent) => void;
+}
+
+export const ToolbarContext = React.createContext(undefined);
+
+export function useToolbarContext() {
+ const context = React.useContext(ToolbarContext);
+
+ if (context === undefined) {
+ throw new Error(
+ 'MUI X: Missing context. Toolbar subcomponents must be placed within a component.',
+ );
+ }
+
+ return context;
+}
diff --git a/packages/x-data-grid/src/components/toolbarV8/index.ts b/packages/x-data-grid/src/components/toolbarV8/index.ts
new file mode 100644
index 0000000000000..6941457a60004
--- /dev/null
+++ b/packages/x-data-grid/src/components/toolbarV8/index.ts
@@ -0,0 +1,2 @@
+export * from './Toolbar';
+export * from './ToolbarButton';
diff --git a/packages/x-data-grid/src/constants/gridClasses.ts b/packages/x-data-grid/src/constants/gridClasses.ts
index f853e22d46e5a..d4895acaa9dd3 100644
--- a/packages/x-data-grid/src/constants/gridClasses.ts
+++ b/packages/x-data-grid/src/constants/gridClasses.ts
@@ -599,6 +599,10 @@ export interface GridClasses {
* Styles applied to the sort icon element.
*/
sortIcon: string;
+ /**
+ * Styles applied to the toolbar root element.
+ */
+ toolbar: string;
/**
* Styles applied to the shadow scroll area element.
* @ignore - do not document.
diff --git a/packages/x-data-grid/src/hooks/utils/index.ts b/packages/x-data-grid/src/hooks/utils/index.ts
index 429df6e6b863f..a1a937c569f38 100644
--- a/packages/x-data-grid/src/hooks/utils/index.ts
+++ b/packages/x-data-grid/src/hooks/utils/index.ts
@@ -10,3 +10,4 @@ export * from './useGridNativeEventListener';
export * from './useFirstRender';
export * from './useOnMount';
export * from './useRunOnce';
+export type { RenderProp } from './useGridComponentRenderer';
diff --git a/packages/x-data-grid/src/hooks/utils/useGridComponentRenderer.test.tsx b/packages/x-data-grid/src/hooks/utils/useGridComponentRenderer.test.tsx
new file mode 100644
index 0000000000000..4b4a113af0c5f
--- /dev/null
+++ b/packages/x-data-grid/src/hooks/utils/useGridComponentRenderer.test.tsx
@@ -0,0 +1,125 @@
+import * as React from 'react';
+import { expect } from 'chai';
+import { createRenderer, screen } from '@mui/internal-test-utils';
+import Box, { BoxProps } from '@mui/material/Box';
+import { RenderProp, useGridComponentRenderer } from './useGridComponentRenderer';
+
+const isJSDOM = /jsdom/.test(window.navigator.userAgent);
+
+describe('useGridComponentRenderer', () => {
+ const { render } = createRenderer();
+
+ function TestComponent(
+ props: React.ComponentPropsWithoutRef<'button'> & {
+ render?: RenderProp, { someState: string }>;
+ },
+ ) {
+ const { render: renderProp, ...other } = props;
+ return useGridComponentRenderer('button', renderProp, other, { someState: 'state value' });
+ }
+
+ it('should render intrinsic element type as default element', () => {
+ render(children);
+ expect(screen.getByTestId('rendered-element')).to.be.instanceOf(window.HTMLButtonElement);
+ expect(screen.getByTestId('rendered-element')).to.have.text('children');
+ });
+
+ it('should render component type as default element', () => {
+ function CustomButton(props: React.ComponentPropsWithoutRef<'button'>) {
+ return ;
+ }
+ function TestComponentWithCustomButton(props: React.ComponentPropsWithoutRef<'button'>) {
+ return useGridComponentRenderer(CustomButton, undefined, props);
+ }
+ render(
+
+ children
+ ,
+ );
+ expect(screen.getByTestId('rendered-element')).to.be.instanceOf(window.HTMLButtonElement);
+ expect(screen.getByTestId('rendered-element')).to.have.text('children');
+ });
+
+ it('should allow default element to be overridden by render prop set to a children', () => {
+ render(children} />);
+ expect(screen.getByTestId('rendered-element')).to.be.instanceOf(window.HTMLDivElement);
+ expect(screen.getByTestId('rendered-element')).to.have.text('children');
+ });
+
+ it('should allow default element to be overridden by render prop set to a function', () => {
+ render(
+ (
+