@mui/x-data-grid 9.0.0-beta.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/CHANGELOG.md +267 -1
  2. package/DataGrid/DataGrid.js +1 -0
  3. package/DataGrid/DataGrid.mjs +1 -0
  4. package/components/GridColumnUnsortedIcon.d.mts +5 -2
  5. package/components/GridColumnUnsortedIcon.d.ts +5 -2
  6. package/components/GridColumnUnsortedIcon.js +20 -6
  7. package/components/GridColumnUnsortedIcon.mjs +20 -5
  8. package/components/GridDetailPanels.d.mts +1 -4
  9. package/components/GridDetailPanels.d.ts +1 -4
  10. package/components/GridPinnedRows.d.mts +0 -2
  11. package/components/GridPinnedRows.d.ts +0 -2
  12. package/components/GridRowDragAndDropOverlay.js +1 -1
  13. package/components/GridRowDragAndDropOverlay.mjs +2 -2
  14. package/components/GridScrollbarFillerCell.js +9 -1
  15. package/components/GridScrollbarFillerCell.mjs +9 -1
  16. package/components/cell/GridCell.js +4 -2
  17. package/components/cell/GridCell.mjs +4 -2
  18. package/components/columnHeaders/GridColumnGroupHeader.js +5 -3
  19. package/components/columnHeaders/GridColumnGroupHeader.mjs +5 -3
  20. package/components/columnHeaders/GridColumnHeaderItem.js +3 -1
  21. package/components/columnHeaders/GridColumnHeaderItem.mjs +3 -1
  22. package/components/containers/GridRootStyles.js +86 -5
  23. package/components/containers/GridRootStyles.mjs +86 -5
  24. package/components/index.d.mts +3 -1
  25. package/components/index.d.ts +3 -1
  26. package/components/index.js +10 -2
  27. package/components/index.mjs +2 -1
  28. package/components/panel/filterPanel/GridFilterForm.js +1 -1
  29. package/components/panel/filterPanel/GridFilterForm.mjs +1 -1
  30. package/components/virtualization/GridBottomContainer.js +4 -1
  31. package/components/virtualization/GridBottomContainer.mjs +4 -1
  32. package/components/virtualization/GridVirtualScroller.js +55 -30
  33. package/components/virtualization/GridVirtualScroller.mjs +56 -31
  34. package/components/virtualization/GridVirtualScrollerContent.js +5 -1
  35. package/components/virtualization/GridVirtualScrollerContent.mjs +5 -1
  36. package/constants/gridClasses.d.mts +40 -1
  37. package/constants/gridClasses.d.ts +40 -1
  38. package/constants/gridClasses.js +2 -2
  39. package/constants/gridClasses.mjs +2 -2
  40. package/constants/localeTextConstants.js +1 -1
  41. package/constants/localeTextConstants.mjs +1 -1
  42. package/hooks/core/useGridVirtualizer.js +1 -0
  43. package/hooks/core/useGridVirtualizer.mjs +1 -0
  44. package/hooks/features/columnHeaders/useGridColumnHeaders.js +8 -4
  45. package/hooks/features/columnHeaders/useGridColumnHeaders.mjs +8 -4
  46. package/hooks/features/dimensions/useGridDimensions.js +1 -0
  47. package/hooks/features/dimensions/useGridDimensions.mjs +1 -0
  48. package/hooks/features/export/useGridPrintExport.js +5 -1
  49. package/hooks/features/export/useGridPrintExport.mjs +5 -1
  50. package/hooks/features/focus/useGridFocus.js +4 -0
  51. package/hooks/features/focus/useGridFocus.mjs +4 -0
  52. package/hooks/features/rowSelection/useGridRowSelection.js +17 -1
  53. package/hooks/features/rowSelection/useGridRowSelection.mjs +17 -1
  54. package/hooks/features/virtualization/gridVirtualizationSelectors.d.mts +8 -0
  55. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +8 -0
  56. package/hooks/features/virtualization/gridVirtualizationSelectors.js +8 -1
  57. package/hooks/features/virtualization/gridVirtualizationSelectors.mjs +7 -0
  58. package/hooks/features/virtualization/index.d.mts +1 -1
  59. package/hooks/features/virtualization/index.d.ts +1 -1
  60. package/hooks/features/virtualization/index.js +44 -13
  61. package/hooks/features/virtualization/index.mjs +1 -1
  62. package/hooks/utils/usePinnedScrollOffset.d.mts +3 -0
  63. package/hooks/utils/usePinnedScrollOffset.d.ts +3 -0
  64. package/hooks/utils/usePinnedScrollOffset.js +27 -0
  65. package/hooks/utils/usePinnedScrollOffset.mjs +21 -0
  66. package/index.js +1 -1
  67. package/index.mjs +1 -1
  68. package/internals/index.d.mts +3 -2
  69. package/internals/index.d.ts +3 -2
  70. package/internals/index.js +29 -0
  71. package/internals/index.mjs +3 -2
  72. package/locales/arSD.js +1 -1
  73. package/locales/arSD.mjs +1 -1
  74. package/locales/beBY.js +1 -1
  75. package/locales/beBY.mjs +1 -1
  76. package/locales/bgBG.js +1 -1
  77. package/locales/bgBG.mjs +1 -1
  78. package/locales/bnBD.js +1 -1
  79. package/locales/bnBD.mjs +1 -1
  80. package/locales/caES.js +1 -1
  81. package/locales/caES.mjs +1 -1
  82. package/locales/csCZ.js +1 -1
  83. package/locales/csCZ.mjs +1 -1
  84. package/locales/daDK.js +1 -1
  85. package/locales/daDK.mjs +1 -1
  86. package/locales/deDE.js +1 -1
  87. package/locales/deDE.mjs +1 -1
  88. package/locales/elGR.js +1 -1
  89. package/locales/elGR.mjs +1 -1
  90. package/locales/esES.js +1 -1
  91. package/locales/esES.mjs +1 -1
  92. package/locales/faIR.js +1 -1
  93. package/locales/faIR.mjs +1 -1
  94. package/locales/fiFI.js +1 -1
  95. package/locales/fiFI.mjs +1 -1
  96. package/locales/frFR.js +1 -1
  97. package/locales/frFR.mjs +1 -1
  98. package/locales/heIL.js +1 -1
  99. package/locales/heIL.mjs +1 -1
  100. package/locales/hrHR.js +1 -1
  101. package/locales/hrHR.mjs +1 -1
  102. package/locales/huHU.js +1 -1
  103. package/locales/huHU.mjs +1 -1
  104. package/locales/hyAM.js +1 -1
  105. package/locales/hyAM.mjs +1 -1
  106. package/locales/idID.js +1 -1
  107. package/locales/idID.mjs +1 -1
  108. package/locales/isIS.js +1 -1
  109. package/locales/isIS.mjs +1 -1
  110. package/locales/itIT.js +1 -1
  111. package/locales/itIT.mjs +1 -1
  112. package/locales/jaJP.js +1 -1
  113. package/locales/jaJP.mjs +1 -1
  114. package/locales/koKR.js +1 -1
  115. package/locales/koKR.mjs +1 -1
  116. package/locales/nbNO.js +1 -1
  117. package/locales/nbNO.mjs +1 -1
  118. package/locales/nlNL.js +1 -1
  119. package/locales/nlNL.mjs +1 -1
  120. package/locales/nnNO.js +1 -1
  121. package/locales/nnNO.mjs +1 -1
  122. package/locales/plPL.js +1 -1
  123. package/locales/plPL.mjs +1 -1
  124. package/locales/ptBR.js +1 -1
  125. package/locales/ptBR.mjs +1 -1
  126. package/locales/ptPT.js +1 -1
  127. package/locales/ptPT.mjs +1 -1
  128. package/locales/roRO.js +1 -1
  129. package/locales/roRO.mjs +1 -1
  130. package/locales/ruRU.js +1 -1
  131. package/locales/ruRU.mjs +1 -1
  132. package/locales/skSK.js +1 -1
  133. package/locales/skSK.mjs +1 -1
  134. package/locales/svSE.js +1 -1
  135. package/locales/svSE.mjs +1 -1
  136. package/locales/thTH.js +1 -1
  137. package/locales/thTH.mjs +1 -1
  138. package/locales/trTR.js +1 -1
  139. package/locales/trTR.mjs +1 -1
  140. package/locales/ukUA.js +1 -1
  141. package/locales/ukUA.mjs +1 -1
  142. package/locales/urPK.js +1 -1
  143. package/locales/urPK.mjs +1 -1
  144. package/locales/viVN.js +1 -1
  145. package/locales/viVN.mjs +1 -1
  146. package/locales/zhCN.js +1 -1
  147. package/locales/zhCN.mjs +1 -1
  148. package/locales/zhHK.js +1 -1
  149. package/locales/zhHK.mjs +1 -1
  150. package/locales/zhTW.js +1 -1
  151. package/locales/zhTW.mjs +1 -1
  152. package/material/index.js +26 -21
  153. package/material/index.mjs +26 -21
  154. package/material/variables.js +4 -4
  155. package/material/variables.mjs +4 -5
  156. package/models/api/gridLocaleTextApi.d.mts +1 -1
  157. package/models/api/gridLocaleTextApi.d.ts +1 -1
  158. package/models/gridBaseSlots.d.mts +4 -2
  159. package/models/gridBaseSlots.d.ts +4 -2
  160. package/models/props/DataGridProps.d.mts +9 -0
  161. package/models/props/DataGridProps.d.ts +9 -0
  162. package/package.json +6 -6
  163. package/utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking.mjs +2 -2
  164. package/utils/cleanupTracking/TimerBasedCleanupTracking.mjs +2 -2
  165. package/utils/domUtils.js +3 -2
  166. package/utils/domUtils.mjs +3 -2
  167. package/utils/keyboardUtils.d.mts +2 -0
  168. package/utils/keyboardUtils.d.ts +2 -0
  169. package/utils/keyboardUtils.js +8 -0
  170. package/utils/keyboardUtils.mjs +6 -0
@@ -6,16 +6,17 @@ import useId from '@mui/utils/useId';
6
6
  import composeClasses from '@mui/utils/composeClasses';
7
7
  import capitalize from '@mui/utils/capitalize';
8
8
  import { useRtl } from '@mui/system/RtlProvider';
9
+ import { useGridPrivateApiContext } from "../../hooks/utils/useGridPrivateApiContext.mjs";
9
10
  import { doesSupportPreventScroll } from "../../utils/doesSupportPreventScroll.mjs";
10
11
  import { getDataGridUtilityClass } from "../../constants/gridClasses.mjs";
11
12
  import { useGridRootProps } from "../../hooks/utils/useGridRootProps.mjs";
12
13
  import { gridColumnGroupsLookupSelector } from "../../hooks/features/columnGrouping/gridColumnGroupsSelector.mjs";
13
- import { useGridApiContext } from "../../hooks/utils/useGridApiContext.mjs";
14
14
  import { useGridSelector } from "../../hooks/utils/useGridSelector.mjs";
15
15
  import { GridGenericColumnHeaderItem } from "./GridGenericColumnHeaderItem.mjs";
16
16
  import { isEventTargetInPortal } from "../../utils/domUtils.mjs";
17
17
  import { PinnedColumnPosition } from "../../internals/constants.mjs";
18
18
  import { attachPinnedStyle } from "../../internals/utils/index.mjs";
19
+ import { usePinnedScrollOffset } from "../../hooks/utils/usePinnedScrollOffset.mjs";
19
20
  import { jsx as _jsx } from "react/jsx-runtime";
20
21
  const useUtilityClasses = ownerState => {
21
22
  const {
@@ -51,10 +52,10 @@ function GridColumnGroupHeader(props) {
51
52
  pinnedPosition,
52
53
  pinnedOffset
53
54
  } = props;
55
+ const apiRef = useGridPrivateApiContext();
54
56
  const rootProps = useGridRootProps();
55
57
  const isRtl = useRtl();
56
58
  const headerCellRef = React.useRef(null);
57
- const apiRef = useGridApiContext();
58
59
  const columnGroupsLookup = useGridSelector(apiRef, gridColumnGroupsLookupSelector);
59
60
  const group = groupId ? columnGroupsLookup[groupId] : {};
60
61
  const {
@@ -122,7 +123,8 @@ function GridColumnGroupHeader(props) {
122
123
  onBlur: publish('columnGroupHeaderBlur')
123
124
  }), [publish]);
124
125
  const headerClassName = typeof group.headerClassName === 'function' ? group.headerClassName(renderParams) : group.headerClassName;
125
- const style = React.useMemo(() => attachPinnedStyle(_extends({}, props.style), isRtl, pinnedPosition, pinnedOffset), [pinnedPosition, pinnedOffset, props.style, isRtl]);
126
+ const pinnedScrollOffset = usePinnedScrollOffset(apiRef, pinnedPosition);
127
+ const style = React.useMemo(() => attachPinnedStyle(_extends({}, props.style), isRtl, pinnedPosition, pinnedOffset !== undefined ? pinnedOffset + pinnedScrollOffset : undefined), [pinnedPosition, pinnedOffset, pinnedScrollOffset, props.style, isRtl]);
126
128
  return /*#__PURE__*/_jsx(GridGenericColumnHeaderItem, _extends({
127
129
  ref: headerCellRef,
128
130
  classes: classes,
@@ -27,6 +27,7 @@ var _GridGenericColumnHeaderItem = require("./GridGenericColumnHeaderItem");
27
27
  var _domUtils = require("../../utils/domUtils");
28
28
  var _constants = require("../../internals/constants");
29
29
  var _utils = require("../../internals/utils");
30
+ var _usePinnedScrollOffset = require("../../hooks/utils/usePinnedScrollOffset");
30
31
  var _jsxRuntime = require("react/jsx-runtime");
31
32
  const useUtilityClasses = ownerState => {
32
33
  const {
@@ -224,7 +225,8 @@ function GridColumnHeaderItem(props) {
224
225
  colDef
225
226
  }) : colDef.headerClassName;
226
227
  const label = colDef.headerName ?? colDef.field;
227
- const style = React.useMemo(() => (0, _utils.attachPinnedStyle)((0, _extends2.default)({}, props.style), isRtl, pinnedPosition, pinnedOffset), [pinnedPosition, pinnedOffset, props.style, isRtl]);
228
+ const pinnedScrollOffset = (0, _usePinnedScrollOffset.usePinnedScrollOffset)(apiRef, pinnedPosition);
229
+ const style = React.useMemo(() => (0, _utils.attachPinnedStyle)((0, _extends2.default)({}, props.style), isRtl, pinnedPosition, pinnedOffset !== undefined ? pinnedOffset + pinnedScrollOffset : undefined), [pinnedPosition, pinnedOffset, pinnedScrollOffset, props.style, isRtl]);
228
230
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridGenericColumnHeaderItem.GridGenericColumnHeaderItem, (0, _extends2.default)({
229
231
  ref: headerCellRef,
230
232
  classes: classes,
@@ -20,6 +20,7 @@ import { GridGenericColumnHeaderItem } from "./GridGenericColumnHeaderItem.mjs";
20
20
  import { isEventTargetInPortal } from "../../utils/domUtils.mjs";
21
21
  import { PinnedColumnPosition } from "../../internals/constants.mjs";
22
22
  import { attachPinnedStyle } from "../../internals/utils/index.mjs";
23
+ import { usePinnedScrollOffset } from "../../hooks/utils/usePinnedScrollOffset.mjs";
23
24
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
25
  const useUtilityClasses = ownerState => {
25
26
  const {
@@ -217,7 +218,8 @@ function GridColumnHeaderItem(props) {
217
218
  colDef
218
219
  }) : colDef.headerClassName;
219
220
  const label = colDef.headerName ?? colDef.field;
220
- const style = React.useMemo(() => attachPinnedStyle(_extends({}, props.style), isRtl, pinnedPosition, pinnedOffset), [pinnedPosition, pinnedOffset, props.style, isRtl]);
221
+ const pinnedScrollOffset = usePinnedScrollOffset(apiRef, pinnedPosition);
222
+ const style = React.useMemo(() => attachPinnedStyle(_extends({}, props.style), isRtl, pinnedPosition, pinnedOffset !== undefined ? pinnedOffset + pinnedScrollOffset : undefined), [pinnedPosition, pinnedOffset, pinnedScrollOffset, props.style, isRtl]);
221
223
  return /*#__PURE__*/_jsx(GridGenericColumnHeaderItem, _extends({
222
224
  ref: headerCellRef,
223
225
  classes: classes,
@@ -108,6 +108,7 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
108
108
  '--DataGrid-headersTotalHeight': '0px',
109
109
  '--DataGrid-topContainerHeight': '0px',
110
110
  '--DataGrid-bottomContainerHeight': '0px',
111
+ '--DataGrid-horizontalFiller': '0px',
111
112
  flex: 1,
112
113
  boxSizing: 'border-box',
113
114
  position: 'relative',
@@ -225,7 +226,8 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
225
226
  position: 'relative',
226
227
  display: 'flex',
227
228
  alignItems: 'center',
228
- backgroundColor: headerBackground
229
+ backgroundColor: headerBackground,
230
+ flex: '0 0 auto'
229
231
  },
230
232
  [`& .${_gridClasses.gridClasses.columnHeader} .${_gridClasses.gridClasses.sortButton}`]: {
231
233
  backgroundColor: _cssVariables.vars.header.background.base
@@ -433,6 +435,7 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
433
435
  /* Row styles */
434
436
  [`.${_gridClasses.gridClasses.row}`]: {
435
437
  display: 'flex',
438
+ position: 'relative',
436
439
  width: 'var(--DataGrid-rowWidth)',
437
440
  breakInside: 'avoid',
438
441
  // Avoid the row to be broken in two different print pages.
@@ -451,8 +454,7 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
451
454
  [`&.${_gridClasses.gridClasses.rowSkeleton}:hover`]: {
452
455
  backgroundColor: 'transparent'
453
456
  },
454
- '&.Mui-selected': selectedStyles,
455
- position: 'relative'
457
+ '&.Mui-selected': selectedStyles
456
458
  },
457
459
  /* Cell styles */
458
460
  [`& .${_gridClasses.gridClasses.cell}`]: {
@@ -469,6 +471,26 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
469
471
  textOverflow: 'ellipsis',
470
472
  '&.Mui-selected': selectedStyles
471
473
  },
474
+ /* Default range border styles using box-shadow to avoid layout shift */
475
+ [`& .${_gridClasses.gridClasses.cell}.Mui-selected`]: {
476
+ '--range-top': '0 0 0 0 transparent',
477
+ '--range-bottom': '0 0 0 0 transparent',
478
+ '--range-left': '0 0 0 0 transparent',
479
+ '--range-right': '0 0 0 0 transparent',
480
+ boxShadow: 'var(--range-top), var(--range-bottom), var(--range-left), var(--range-right)'
481
+ },
482
+ [`& .${_gridClasses.gridClasses['cell--rangeTop']}`]: {
483
+ '--range-top': `inset 0 2px 0 0 ${_cssVariables.vars.colors.interactive.focus}`
484
+ },
485
+ [`& .${_gridClasses.gridClasses['cell--rangeBottom']}`]: {
486
+ '--range-bottom': `inset 0 -2px 0 0 ${_cssVariables.vars.colors.interactive.focus}`
487
+ },
488
+ [`& .${_gridClasses.gridClasses['cell--rangeLeft']}`]: {
489
+ '--range-left': `inset 2px 0 0 0 ${_cssVariables.vars.colors.interactive.focus}`
490
+ },
491
+ [`& .${_gridClasses.gridClasses['cell--rangeRight']}`]: {
492
+ '--range-right': `inset -2px 0 0 0 ${_cssVariables.vars.colors.interactive.focus}`
493
+ },
472
494
  [`& .${_gridClasses.gridClasses['virtualScrollerContent--overflowed']} .${_gridClasses.gridClasses['row--lastVisible']} .${_gridClasses.gridClasses.cell}`]: {
473
495
  borderTopColor: 'transparent'
474
496
  },
@@ -680,16 +702,18 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
680
702
  [`& .${_gridClasses.gridClasses['filler--borderBottom']}`]: {
681
703
  borderBottom: '1px solid var(--DataGrid-rowBorderColor)'
682
704
  },
705
+ [`& .${_gridClasses.gridClasses['filler--horizontal']}`]: {
706
+ width: 'var(--DataGrid-horizontalFiller)'
707
+ },
683
708
  [`& .${_gridClasses.gridClasses.columnHeaders} .${_gridClasses.gridClasses.filler}`]: {
684
709
  backgroundColor: headerBackground
685
710
  },
686
711
  /* Used when skeleton/no columns overlay is visible */
687
712
  [`& .${_gridClasses.gridClasses['main--hiddenContent']}`]: {
688
- [`& .${_gridClasses.gridClasses.virtualScrollerContent}`]: {
713
+ [`& .${_gridClasses.gridClasses.virtualScrollerRenderZone}`]: {
689
714
  // We use visibility hidden so that the virtual scroller content retains its height.
690
715
  // Position fixed is used to remove the virtual scroller content from the flow.
691
716
  // https://github.com/mui/mui-x/issues/14061
692
- position: 'fixed',
693
717
  visibility: 'hidden'
694
718
  },
695
719
  // Hide grid content
@@ -697,11 +721,68 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
697
721
  display: 'none'
698
722
  }
699
723
  },
724
+ /* Fill handle styles */
725
+ [`& .${_gridClasses.gridClasses['cell--withFillHandle']}`]: {
726
+ position: 'relative',
727
+ '&::after': {
728
+ content: '""',
729
+ position: 'absolute',
730
+ bottom: 0,
731
+ insetInlineEnd: 0,
732
+ width: 7,
733
+ height: 7,
734
+ backgroundColor: _cssVariables.vars.colors.interactive.focus,
735
+ cursor: 'crosshair',
736
+ zIndex: 50
737
+ }
738
+ },
739
+ [`& .${_gridClasses.gridClasses['cell--fillPreview']}`]: {
740
+ backgroundColor: `color-mix(in srgb, ${_cssVariables.vars.colors.interactive.focus} 8%, transparent)`
741
+ },
742
+ [`& .${_gridClasses.gridClasses['cell--fillPreviewTop']}`]: {
743
+ borderTop: `1px dashed ${_cssVariables.vars.colors.interactive.focus}`
744
+ },
745
+ [`& .${_gridClasses.gridClasses['cell--fillPreviewBottom']}`]: {
746
+ borderBottom: `1px dashed ${_cssVariables.vars.colors.interactive.focus}`
747
+ },
748
+ [`& .${_gridClasses.gridClasses['cell--fillPreviewLeft']}`]: {
749
+ borderLeft: `1px dashed ${_cssVariables.vars.colors.interactive.focus}`
750
+ },
751
+ [`& .${_gridClasses.gridClasses['cell--fillPreviewRight']}`]: {
752
+ borderRight: `1px dashed ${_cssVariables.vars.colors.interactive.focus}`
753
+ },
700
754
  [`& .${_gridClasses.gridClasses['row--beingDragged']}`]: {
701
755
  color: _cssVariables.vars.colors.foreground.disabled,
702
756
  '&:hover': {
703
757
  backgroundColor: 'transparent'
704
758
  }
759
+ },
760
+ /* Controlled layout overrides (absolute positioning for pinned elements) */
761
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['columnHeader--pinnedLeft']},
762
+ & .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['columnHeader--pinnedRight']}`]: {
763
+ position: 'absolute',
764
+ height: 'var(--height)'
765
+ },
766
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['cell--pinnedLeft']},
767
+ & .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['cell--pinnedRight']}`]: {
768
+ position: 'absolute'
769
+ },
770
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses.row}`]: {
771
+ position: 'static'
772
+ },
773
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['scrollbarFiller--pinnedRight']}`]: {
774
+ position: 'absolute',
775
+ height: 'var(--height)'
776
+ },
777
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses.virtualScrollerRenderZone}`]: {
778
+ position: 'static',
779
+ width: 'fit-content'
780
+ },
781
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['container--top']}`]: {
782
+ width: 'fit-content'
783
+ },
784
+ [`& .${_gridClasses.gridClasses['virtualizer--layoutControlled']} .${_gridClasses.gridClasses['container--bottom']}`]: {
785
+ width: 'fit-content'
705
786
  }
706
787
  };
707
788
  return gridStyle;
@@ -102,6 +102,7 @@ export const GridRootStyles = styled('div', {
102
102
  '--DataGrid-headersTotalHeight': '0px',
103
103
  '--DataGrid-topContainerHeight': '0px',
104
104
  '--DataGrid-bottomContainerHeight': '0px',
105
+ '--DataGrid-horizontalFiller': '0px',
105
106
  flex: 1,
106
107
  boxSizing: 'border-box',
107
108
  position: 'relative',
@@ -219,7 +220,8 @@ export const GridRootStyles = styled('div', {
219
220
  position: 'relative',
220
221
  display: 'flex',
221
222
  alignItems: 'center',
222
- backgroundColor: headerBackground
223
+ backgroundColor: headerBackground,
224
+ flex: '0 0 auto'
223
225
  },
224
226
  [`& .${c.columnHeader} .${c.sortButton}`]: {
225
227
  backgroundColor: vars.header.background.base
@@ -427,6 +429,7 @@ export const GridRootStyles = styled('div', {
427
429
  /* Row styles */
428
430
  [`.${c.row}`]: {
429
431
  display: 'flex',
432
+ position: 'relative',
430
433
  width: 'var(--DataGrid-rowWidth)',
431
434
  breakInside: 'avoid',
432
435
  // Avoid the row to be broken in two different print pages.
@@ -445,8 +448,7 @@ export const GridRootStyles = styled('div', {
445
448
  [`&.${c.rowSkeleton}:hover`]: {
446
449
  backgroundColor: 'transparent'
447
450
  },
448
- '&.Mui-selected': selectedStyles,
449
- position: 'relative'
451
+ '&.Mui-selected': selectedStyles
450
452
  },
451
453
  /* Cell styles */
452
454
  [`& .${c.cell}`]: {
@@ -463,6 +465,26 @@ export const GridRootStyles = styled('div', {
463
465
  textOverflow: 'ellipsis',
464
466
  '&.Mui-selected': selectedStyles
465
467
  },
468
+ /* Default range border styles using box-shadow to avoid layout shift */
469
+ [`& .${c.cell}.Mui-selected`]: {
470
+ '--range-top': '0 0 0 0 transparent',
471
+ '--range-bottom': '0 0 0 0 transparent',
472
+ '--range-left': '0 0 0 0 transparent',
473
+ '--range-right': '0 0 0 0 transparent',
474
+ boxShadow: 'var(--range-top), var(--range-bottom), var(--range-left), var(--range-right)'
475
+ },
476
+ [`& .${c['cell--rangeTop']}`]: {
477
+ '--range-top': `inset 0 2px 0 0 ${vars.colors.interactive.focus}`
478
+ },
479
+ [`& .${c['cell--rangeBottom']}`]: {
480
+ '--range-bottom': `inset 0 -2px 0 0 ${vars.colors.interactive.focus}`
481
+ },
482
+ [`& .${c['cell--rangeLeft']}`]: {
483
+ '--range-left': `inset 2px 0 0 0 ${vars.colors.interactive.focus}`
484
+ },
485
+ [`& .${c['cell--rangeRight']}`]: {
486
+ '--range-right': `inset -2px 0 0 0 ${vars.colors.interactive.focus}`
487
+ },
466
488
  [`& .${c['virtualScrollerContent--overflowed']} .${c['row--lastVisible']} .${c.cell}`]: {
467
489
  borderTopColor: 'transparent'
468
490
  },
@@ -674,16 +696,18 @@ export const GridRootStyles = styled('div', {
674
696
  [`& .${c['filler--borderBottom']}`]: {
675
697
  borderBottom: '1px solid var(--DataGrid-rowBorderColor)'
676
698
  },
699
+ [`& .${c['filler--horizontal']}`]: {
700
+ width: 'var(--DataGrid-horizontalFiller)'
701
+ },
677
702
  [`& .${c.columnHeaders} .${c.filler}`]: {
678
703
  backgroundColor: headerBackground
679
704
  },
680
705
  /* Used when skeleton/no columns overlay is visible */
681
706
  [`& .${c['main--hiddenContent']}`]: {
682
- [`& .${c.virtualScrollerContent}`]: {
707
+ [`& .${c.virtualScrollerRenderZone}`]: {
683
708
  // We use visibility hidden so that the virtual scroller content retains its height.
684
709
  // Position fixed is used to remove the virtual scroller content from the flow.
685
710
  // https://github.com/mui/mui-x/issues/14061
686
- position: 'fixed',
687
711
  visibility: 'hidden'
688
712
  },
689
713
  // Hide grid content
@@ -691,11 +715,68 @@ export const GridRootStyles = styled('div', {
691
715
  display: 'none'
692
716
  }
693
717
  },
718
+ /* Fill handle styles */
719
+ [`& .${c['cell--withFillHandle']}`]: {
720
+ position: 'relative',
721
+ '&::after': {
722
+ content: '""',
723
+ position: 'absolute',
724
+ bottom: 0,
725
+ insetInlineEnd: 0,
726
+ width: 7,
727
+ height: 7,
728
+ backgroundColor: vars.colors.interactive.focus,
729
+ cursor: 'crosshair',
730
+ zIndex: 50
731
+ }
732
+ },
733
+ [`& .${c['cell--fillPreview']}`]: {
734
+ backgroundColor: `color-mix(in srgb, ${vars.colors.interactive.focus} 8%, transparent)`
735
+ },
736
+ [`& .${c['cell--fillPreviewTop']}`]: {
737
+ borderTop: `1px dashed ${vars.colors.interactive.focus}`
738
+ },
739
+ [`& .${c['cell--fillPreviewBottom']}`]: {
740
+ borderBottom: `1px dashed ${vars.colors.interactive.focus}`
741
+ },
742
+ [`& .${c['cell--fillPreviewLeft']}`]: {
743
+ borderLeft: `1px dashed ${vars.colors.interactive.focus}`
744
+ },
745
+ [`& .${c['cell--fillPreviewRight']}`]: {
746
+ borderRight: `1px dashed ${vars.colors.interactive.focus}`
747
+ },
694
748
  [`& .${c['row--beingDragged']}`]: {
695
749
  color: vars.colors.foreground.disabled,
696
750
  '&:hover': {
697
751
  backgroundColor: 'transparent'
698
752
  }
753
+ },
754
+ /* Controlled layout overrides (absolute positioning for pinned elements) */
755
+ [`& .${c['virtualizer--layoutControlled']} .${c['columnHeader--pinnedLeft']},
756
+ & .${c['virtualizer--layoutControlled']} .${c['columnHeader--pinnedRight']}`]: {
757
+ position: 'absolute',
758
+ height: 'var(--height)'
759
+ },
760
+ [`& .${c['virtualizer--layoutControlled']} .${c['cell--pinnedLeft']},
761
+ & .${c['virtualizer--layoutControlled']} .${c['cell--pinnedRight']}`]: {
762
+ position: 'absolute'
763
+ },
764
+ [`& .${c['virtualizer--layoutControlled']} .${c.row}`]: {
765
+ position: 'static'
766
+ },
767
+ [`& .${c['virtualizer--layoutControlled']} .${c['scrollbarFiller--pinnedRight']}`]: {
768
+ position: 'absolute',
769
+ height: 'var(--height)'
770
+ },
771
+ [`& .${c['virtualizer--layoutControlled']} .${c.virtualScrollerRenderZone}`]: {
772
+ position: 'static',
773
+ width: 'fit-content'
774
+ },
775
+ [`& .${c['virtualizer--layoutControlled']} .${c['container--top']}`]: {
776
+ width: 'fit-content'
777
+ },
778
+ [`& .${c['virtualizer--layoutControlled']} .${c['container--bottom']}`]: {
779
+ width: 'fit-content'
699
780
  }
700
781
  };
701
782
  return gridStyle;
@@ -23,4 +23,6 @@ export * from "./columnsPanel/index.mjs";
23
23
  export * from "./export/index.mjs";
24
24
  export * from "./filterPanel/index.mjs";
25
25
  export * from "./toolbarV8/index.mjs";
26
- export * from "./quickFilter/index.mjs";
26
+ export * from "./quickFilter/index.mjs";
27
+ export { GridColumnUnsortedIcon } from "./GridColumnUnsortedIcon.mjs";
28
+ export type { GridColumnUnsortedIconProps } from "./GridColumnUnsortedIcon.mjs";
@@ -23,4 +23,6 @@ export * from "./columnsPanel/index.js";
23
23
  export * from "./export/index.js";
24
24
  export * from "./filterPanel/index.js";
25
25
  export * from "./toolbarV8/index.js";
26
- export * from "./quickFilter/index.js";
26
+ export * from "./quickFilter/index.js";
27
+ export { GridColumnUnsortedIcon } from "./GridColumnUnsortedIcon.js";
28
+ export type { GridColumnUnsortedIconProps } from "./GridColumnUnsortedIcon.js";
@@ -4,8 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  var _exportNames = {
7
- GridPagination: true
7
+ GridPagination: true,
8
+ GridColumnUnsortedIcon: true
8
9
  };
10
+ Object.defineProperty(exports, "GridColumnUnsortedIcon", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _GridColumnUnsortedIcon.GridColumnUnsortedIcon;
14
+ }
15
+ });
9
16
  Object.defineProperty(exports, "GridPagination", {
10
17
  enumerable: true,
11
18
  get: function () {
@@ -312,4 +319,5 @@ Object.keys(_quickFilter).forEach(function (key) {
312
319
  return _quickFilter[key];
313
320
  }
314
321
  });
315
- });
322
+ });
323
+ var _GridColumnUnsortedIcon = require("./GridColumnUnsortedIcon");
@@ -23,4 +23,5 @@ export * from "./columnsPanel/index.mjs";
23
23
  export * from "./export/index.mjs";
24
24
  export * from "./filterPanel/index.mjs";
25
25
  export * from "./toolbarV8/index.mjs";
26
- export * from "./quickFilter/index.mjs";
26
+ export * from "./quickFilter/index.mjs";
27
+ export { GridColumnUnsortedIcon } from "./GridColumnUnsortedIcon.mjs";
@@ -322,7 +322,7 @@ const GridFilterForm = exports.GridFilterForm = (0, _forwardRef.forwardRef)(func
322
322
  size: "small",
323
323
  labelId: columnSelectLabelId,
324
324
  id: columnSelectId,
325
- label: apiRef.current.getLocaleText('filterPanelColumns'),
325
+ label: apiRef.current.getLocaleText('filterPanelColumn'),
326
326
  value: selectedField ?? '',
327
327
  onChange: changeColumn,
328
328
  native: isBaseSelectNative,
@@ -315,7 +315,7 @@ const GridFilterForm = forwardRef(function GridFilterForm(props, ref) {
315
315
  size: "small",
316
316
  labelId: columnSelectLabelId,
317
317
  id: columnSelectId,
318
- label: apiRef.current.getLocaleText('filterPanelColumns'),
318
+ label: apiRef.current.getLocaleText('filterPanelColumn'),
319
319
  value: selectedField ?? '',
320
320
  onChange: changeColumn,
321
321
  native: isBaseSelectNative,
@@ -25,7 +25,10 @@ const Element = (0, _styles.styled)('div', {
25
25
  })({
26
26
  position: 'sticky',
27
27
  zIndex: 40,
28
- bottom: 'calc(var(--DataGrid-hasScrollX) * var(--DataGrid-scrollbarSize))'
28
+ bottom: 'calc(var(--DataGrid-hasScrollX) * var(--DataGrid-scrollbarSize))',
29
+ [`.${_gridClasses.gridClasses['virtualizer--layoutControlled']} &`]: {
30
+ position: 'absolute'
31
+ }
29
32
  });
30
33
  function GridBottomContainer(props) {
31
34
  const classes = useUtilityClasses();
@@ -17,7 +17,10 @@ const Element = styled('div', {
17
17
  })({
18
18
  position: 'sticky',
19
19
  zIndex: 40,
20
- bottom: 'calc(var(--DataGrid-hasScrollX) * var(--DataGrid-scrollbarSize))'
20
+ bottom: 'calc(var(--DataGrid-hasScrollX) * var(--DataGrid-scrollbarSize))',
21
+ [`.${gridClasses['virtualizer--layoutControlled']} &`]: {
22
+ position: 'absolute'
23
+ }
21
24
  });
22
25
  export function GridBottomContainer(props) {
23
26
  const classes = useUtilityClasses();
@@ -10,6 +10,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _styles = require("@mui/material/styles");
12
12
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
13
+ var _clsx = _interopRequireDefault(require("clsx"));
14
+ var _xVirtualizer = require("@mui/x-virtualizer");
13
15
  var _gridDimensionsSelectors = require("../../hooks/features/dimensions/gridDimensionsSelectors");
14
16
  var _rows = require("../../hooks/features/rows");
15
17
  var _GridScrollArea = require("../GridScrollArea");
@@ -58,9 +60,9 @@ const Scroller = (0, _styles.styled)('div', {
58
60
  height: '100%',
59
61
  flexGrow: 1,
60
62
  overflow: 'scroll',
61
- scrollbarWidth: 'none' /* Firefox */,
62
63
  display: 'flex',
63
64
  flexDirection: 'column',
65
+ scrollbarWidth: 'none' /* Firefox */,
64
66
  '&::-webkit-scrollbar': {
65
67
  display: 'none' /* Safari and Chrome */
66
68
  },
@@ -70,6 +72,23 @@ const Scroller = (0, _styles.styled)('div', {
70
72
  // See https://github.com/mui/mui-x/issues/10547
71
73
  zIndex: 0
72
74
  });
75
+ const Viewport = (0, _styles.styled)('div', {
76
+ slot: 'internal',
77
+ shouldForwardProp: undefined
78
+ })({
79
+ display: 'contents',
80
+ [`.${_gridClasses.gridClasses['virtualizer--layoutControlled']} &`]: {
81
+ display: 'inline-block',
82
+ position: 'sticky',
83
+ top: 0,
84
+ left: 0,
85
+ overflow: 'hidden',
86
+ scrollbarWidth: 'none' /* Firefox */,
87
+ '&::-webkit-scrollbar': {
88
+ display: 'none' /* Safari and Chrome */
89
+ }
90
+ }
91
+ });
73
92
  const hasPinnedRightSelector = apiRef => apiRef.current.state.dimensions.rightPinnedWidth > 0;
74
93
  function GridVirtualScroller(props) {
75
94
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
@@ -91,20 +110,26 @@ function GridVirtualScroller(props) {
91
110
  loadingOverlayVariant
92
111
  };
93
112
  const classes = useUtilityClasses(ownerState);
94
- const virtualScroller = (0, _useGridVirtualizer.useGridVirtualizer)().api.getters;
113
+ const virtualizer = (0, _useGridVirtualizer.useGridVirtualizer)();
114
+ const layoutMode = virtualizer.store.use(_xVirtualizer.Virtualization.selectors.layoutMode);
115
+ const hasContentFiller = layoutMode === 'uncontrolled' && loadingOverlayVariant !== 'skeleton';
95
116
  const {
96
117
  getContainerProps,
97
118
  getScrollerProps,
119
+ getScrollerContentProps,
120
+ getViewportProps,
98
121
  getContentProps,
99
122
  getPositionerProps,
100
123
  getScrollbarVerticalProps,
101
124
  getScrollbarHorizontalProps,
102
125
  getRows,
103
- getScrollAreaProps
104
- } = virtualScroller;
126
+ getScrollAreaProps,
127
+ getContainerVerticalProps
128
+ } = virtualizer.api.getters;
105
129
  const rows = getRows(undefined, (0, _rows.gridRowTreeSelector)(apiRef));
130
+ const containerVerticalProps = getContainerVerticalProps();
106
131
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridMainContainer.GridMainContainer, (0, _extends2.default)({
107
- className: classes.root
132
+ className: (0, _clsx.default)(classes.root, layoutMode === 'controlled' && _gridClasses.gridClasses['virtualizer--layoutControlled'])
108
133
  }, getContainerProps(), {
109
134
  ownerState: ownerState,
110
135
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_GridScrollArea.GridScrollArea, (0, _extends2.default)({
@@ -115,35 +140,35 @@ function GridVirtualScroller(props) {
115
140
  scrollDirection: "up"
116
141
  }, getScrollAreaProps())), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridScrollArea.GridScrollArea, (0, _extends2.default)({
117
142
  scrollDirection: "down"
118
- }, getScrollAreaProps())), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Scroller, (0, _extends2.default)({
143
+ }, getScrollAreaProps())), /*#__PURE__*/(0, _jsxRuntime.jsx)(Scroller, (0, _extends2.default)({
119
144
  className: classes.scroller
120
145
  }, getScrollerProps(), {
121
146
  ownerState: ownerState,
122
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridTopContainer.GridTopContainer, {
123
- children: [!rootProps.listView && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridHeaders.GridHeaders, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.pinnedRows, {
124
- position: "top",
125
- virtualScroller: virtualScroller
126
- })]
127
- }), overlayType && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlays.GridOverlayWrapper, {
128
- overlayType: overlayType,
129
- loadingOverlayVariant: loadingOverlayVariant,
130
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Overlay, (0, _extends2.default)({}, rootProps.slotProps?.[overlayType]))
131
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerContent.GridVirtualScrollerContent, (0, _extends2.default)({}, getContentProps(), {
132
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridVirtualScrollerRenderZone.GridVirtualScrollerRenderZone, (0, _extends2.default)({
133
- role: "rowgroup"
134
- }, getPositionerProps(), {
135
- children: [rows, /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.detailPanels, {
136
- virtualScroller: virtualScroller
137
- })]
147
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerContent.GridVirtualScrollerContent, (0, _extends2.default)({}, getScrollerContentProps(), {
148
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Viewport, (0, _extends2.default)({}, getViewportProps(), {
149
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridTopContainer.GridTopContainer, (0, _extends2.default)({}, containerVerticalProps, {
150
+ children: [!rootProps.listView && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridHeaders.GridHeaders, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.pinnedRows, {
151
+ position: "top"
152
+ })]
153
+ })), overlayType && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlays.GridOverlayWrapper, {
154
+ overlayType: overlayType,
155
+ loadingOverlayVariant: loadingOverlayVariant,
156
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Overlay, (0, _extends2.default)({}, rootProps.slotProps?.[overlayType]))
157
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridVirtualScrollerRenderZone.GridVirtualScrollerRenderZone, (0, _extends2.default)({
158
+ role: "rowgroup"
159
+ }, getPositionerProps(), {
160
+ children: [rows, /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.detailPanels, {})]
161
+ })), hasContentFiller && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
162
+ className: _gridClasses.gridClasses.contentFiller
163
+ }, getContentProps())), hasBottomFiller && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerFiller.GridVirtualScrollerFiller, {
164
+ rowsLength: rows.length
165
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.bottomContainer, (0, _extends2.default)({}, containerVerticalProps, {
166
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.pinnedRows, {
167
+ position: "bottom"
168
+ })
169
+ }))]
138
170
  }))
139
- })), hasBottomFiller && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerFiller.GridVirtualScrollerFiller, {
140
- rowsLength: rows.length
141
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.bottomContainer, {
142
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.pinnedRows, {
143
- position: "bottom",
144
- virtualScroller: virtualScroller
145
- })
146
- })]
171
+ }))
147
172
  })), hasScrollX && /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
148
173
  children: [rootProps.pinnedColumnsSectionSeparator?.endsWith('shadow') && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridScrollShadows.GridScrollShadows, {
149
174
  position: "horizontal"