material-react-table 0.15.1 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { ChangeEvent, Dispatch, FC, FocusEvent, MouseEvent, ReactNode, SetStateAction } from 'react';
2
2
  import { AlertProps, ButtonProps, CheckboxProps, IconButtonProps, LinearProgressProps, PaperProps, SkeletonProps, TableBodyProps, TableCellProps, TableContainerProps, TableFooterProps, TableHeadProps, TablePaginationProps, TableProps, TableRowProps, TextFieldProps, ToolbarProps } from '@mui/material';
3
- import { Cell, Column, ColumnDef, FilterFn, FilterFnOption, Header, HeaderGroup, OnChangeFn, Overwrite, ReactTableGenerics, Row, SortingFn, SortingFnOption, TableGenerics, TableInstance, TableState, UseTableInstanceOptions, VisibilityState } from '@tanstack/react-table';
3
+ import { Cell, Column, ColumnDef, ColumnOrderState, ColumnPinningState, FilterFn, FilterFnOption, Header, HeaderGroup, OnChangeFn, Overwrite, ReactTableGenerics, Row, SortingFn, SortingFnOption, TableGenerics, TableInstance, TableState, UseTableInstanceOptions, VisibilityState } from '@tanstack/react-table';
4
4
  import { Options as VirtualizerOptions } from 'react-virtual';
5
5
  import { MRT_Localization } from './localization';
6
6
  import { MRT_Icons } from './icons';
@@ -94,9 +94,9 @@ export declare type MRT_ColumnDef<D extends Record<string, any> = {}> = Omit<Col
94
94
  columns?: MRT_ColumnDef<D>[];
95
95
  enableClickToCopy?: boolean;
96
96
  enableColumnActions?: boolean;
97
+ enableColumnFilterChangeMode?: boolean;
97
98
  enableColumnOrdering?: boolean;
98
99
  enableEditing?: boolean;
99
- enableColumnFilterChangeMode?: boolean;
100
100
  enabledColumnFilterOptions?: (MRT_FILTER_OPTION | string)[] | null;
101
101
  filterFn?: MRT_FilterFn;
102
102
  filterSelectOptions?: (string | {
@@ -338,6 +338,14 @@ export declare type MaterialReactTableProps<D extends Record<string, any> = {}>
338
338
  filterValue: any;
339
339
  instance: MRT_TableInstance<D>;
340
340
  }) => void;
341
+ onColumnOrderChanged?: ({ columnOrder, instance, }: {
342
+ columnOrder: ColumnOrderState;
343
+ instance: MRT_TableInstance<D>;
344
+ }) => void;
345
+ onColumnPinningChanged?: ({ columnPinning, instance, }: {
346
+ columnPinning: ColumnPinningState;
347
+ instance: MRT_TableInstance<D>;
348
+ }) => void;
341
349
  onColumnVisibilityChanged?: ({ column, columnVisibility, instance, }: {
342
350
  column: MRT_Column<D>;
343
351
  columnVisibility: VisibilityState;
@@ -55,11 +55,11 @@ export interface MRT_Localization {
55
55
  sortedByColumnAsc: string;
56
56
  sortedByColumnDesc: string;
57
57
  thenBy: string;
58
- to: string;
59
58
  toggleDensity: string;
60
59
  toggleFullScreen: string;
61
60
  toggleSelectAll: string;
62
61
  toggleSelectRow: string;
62
+ toggleVisibility: string;
63
63
  ungroupByColumn: string;
64
64
  unpin: string;
65
65
  unpinAll: string;
@@ -29,10 +29,6 @@ function _extends() {
29
29
  return _extends.apply(this, arguments);
30
30
  }
31
31
 
32
- function _objectDestructuringEmpty(obj) {
33
- if (obj == null) throw new TypeError("Cannot destructure undefined");
34
- }
35
-
36
32
  function _objectWithoutPropertiesLoose(source, excluded) {
37
33
  if (source == null) return {};
38
34
  var target = {};
@@ -105,11 +101,11 @@ var MRT_DefaultLocalization_EN = {
105
101
  sortedByColumnAsc: 'Sorted by {column} ascending',
106
102
  sortedByColumnDesc: 'Sorted by {column} descending',
107
103
  thenBy: ', then by ',
108
- to: 'to',
109
104
  toggleDensity: 'Toggle density',
110
105
  toggleFullScreen: 'Toggle full screen',
111
106
  toggleSelectAll: 'Toggle select all',
112
107
  toggleSelectRow: 'Toggle select row',
108
+ toggleVisibility: 'Toggle visibility',
113
109
  ungroupByColumn: 'Ungroup by {column}',
114
110
  unpin: 'Unpin',
115
111
  unpinAll: 'Unpin all',
@@ -3404,13 +3400,13 @@ var createDataColumn = function createDataColumn(table, column, currentFilterFns
3404
3400
  var createDisplayColumn = function createDisplayColumn(table, column) {
3405
3401
  return table.createDisplayColumn(column);
3406
3402
  };
3407
- var reorderColumn = function reorderColumn(movingColumn, receivingColumn, columnOrder, setColumnOrder) {
3403
+ var reorderColumn = function reorderColumn(movingColumn, receivingColumn, columnOrder) {
3408
3404
  if (movingColumn.getCanPin()) {
3409
3405
  movingColumn.pin(receivingColumn.getIsPinned());
3410
3406
  }
3411
3407
 
3412
3408
  columnOrder.splice(columnOrder.indexOf(receivingColumn.id), 0, columnOrder.splice(columnOrder.indexOf(movingColumn.id), 1)[0]);
3413
- setColumnOrder([].concat(columnOrder));
3409
+ return [].concat(columnOrder);
3414
3410
  };
3415
3411
  var getLeadingDisplayColumnIds = function getLeadingDisplayColumnIds(props) {
3416
3412
  return [(props.positionActionsColumn === 'first' && props.enableRowActions || props.enableEditing && props.editingMode === 'row') && 'mrt-row-actions', (props.enableExpanding || props.enableGrouping) && 'mrt-expand', props.enableRowSelection && 'mrt-select', props.enableRowNumbers && 'mrt-row-numbers'].filter(Boolean);
@@ -3434,12 +3430,13 @@ var MRT_ShowHideColumnsMenuItems = function MRT_ShowHideColumnsMenuItems(_ref) {
3434
3430
  var getState = instance.getState,
3435
3431
  _instance$options = instance.options,
3436
3432
  enableColumnOrdering = _instance$options.enableColumnOrdering,
3437
- onColumnVisibilityChanged = _instance$options.onColumnVisibilityChanged,
3433
+ enableHiding = _instance$options.enableHiding,
3434
+ enablePinning = _instance$options.enablePinning,
3435
+ localization = _instance$options.localization,
3438
3436
  setColumnOrder = instance.setColumnOrder;
3439
3437
 
3440
3438
  var _getState = getState(),
3441
- columnOrder = _getState.columnOrder,
3442
- columnVisibility = _getState.columnVisibility;
3439
+ columnOrder = _getState.columnOrder;
3443
3440
 
3444
3441
  var columnDef = column.columnDef,
3445
3442
  columnDefType = column.columnDefType;
@@ -3447,7 +3444,8 @@ var MRT_ShowHideColumnsMenuItems = function MRT_ShowHideColumnsMenuItems(_ref) {
3447
3444
  var _useDrop = useDrop({
3448
3445
  accept: 'column',
3449
3446
  drop: function drop(movingColumn) {
3450
- return reorderColumn(movingColumn, column, columnOrder, setColumnOrder);
3447
+ var newColumnOrder = reorderColumn(movingColumn, column, columnOrder);
3448
+ setColumnOrder(newColumnOrder);
3451
3449
  }
3452
3450
  }),
3453
3451
  dropRef = _useDrop[1];
@@ -3480,12 +3478,6 @@ var MRT_ShowHideColumnsMenuItems = function MRT_ShowHideColumnsMenuItems(_ref) {
3480
3478
  } else {
3481
3479
  column.toggleVisibility();
3482
3480
  }
3483
-
3484
- onColumnVisibilityChanged == null ? void 0 : onColumnVisibilityChanged({
3485
- column: column,
3486
- columnVisibility: columnVisibility,
3487
- instance: instance
3488
- });
3489
3481
  };
3490
3482
 
3491
3483
  return React__default.createElement(React__default.Fragment, null, React__default.createElement(material.MenuItem, {
@@ -3504,15 +3496,23 @@ var MRT_ShowHideColumnsMenuItems = function MRT_ShowHideColumnsMenuItems(_ref) {
3504
3496
  flexWrap: 'nowrap',
3505
3497
  gap: '8px'
3506
3498
  }
3507
- }, columnDefType !== 'group' && enableColumnOrdering && columnDef.enableColumnOrdering !== false && !allColumns.some(function (col) {
3499
+ }, columnDefType !== 'group' && enableColumnOrdering && !allColumns.some(function (col) {
3508
3500
  return col.columnDefType === 'group';
3509
- }) && React__default.createElement(MRT_GrabHandleButton, {
3501
+ }) && (columnDef.enableColumnOrdering !== false ? React__default.createElement(MRT_GrabHandleButton, {
3510
3502
  ref: dragRef,
3511
3503
  instance: instance
3512
- }), !isSubMenu && column.getCanPin() && React__default.createElement(MRT_ColumnPinningButtons, {
3504
+ }) : React__default.createElement(material.Box, {
3505
+ sx: {
3506
+ width: '28px'
3507
+ }
3508
+ })), enablePinning && !isSubMenu && (column.getCanPin() ? React__default.createElement(MRT_ColumnPinningButtons, {
3513
3509
  column: column,
3514
3510
  instance: instance
3515
- }), React__default.createElement(material.FormControlLabel, {
3511
+ }) : React__default.createElement(material.Box, {
3512
+ sx: {
3513
+ width: '70px'
3514
+ }
3515
+ })), enableHiding ? React__default.createElement(material.FormControlLabel, {
3516
3516
  componentsProps: {
3517
3517
  typography: {
3518
3518
  sx: {
@@ -3522,13 +3522,22 @@ var MRT_ShowHideColumnsMenuItems = function MRT_ShowHideColumnsMenuItems(_ref) {
3522
3522
  }
3523
3523
  },
3524
3524
  checked: switchChecked,
3525
- control: React__default.createElement(material.Switch, null),
3525
+ control: React__default.createElement(material.Tooltip, {
3526
+ arrow: true,
3527
+ enterDelay: 1000,
3528
+ enterNextDelay: 1000,
3529
+ title: localization.toggleVisibility
3530
+ }, React__default.createElement(material.Switch, null)),
3526
3531
  disabled: isSubMenu && switchChecked || !column.getCanHide() || column.getIsGrouped(),
3527
3532
  label: columnDef.header,
3528
3533
  onChange: function onChange() {
3529
3534
  return handleToggleColumnHidden(column);
3530
3535
  }
3531
- }))), (_column$columns2 = column.columns) == null ? void 0 : _column$columns2.map(function (c, i) {
3536
+ }) : React__default.createElement(material.Typography, {
3537
+ sx: {
3538
+ alignSelf: 'center'
3539
+ }
3540
+ }, columnDef.header))), (_column$columns2 = column.columns) == null ? void 0 : _column$columns2.map(function (c, i) {
3532
3541
  return React__default.createElement(MRT_ShowHideColumnsMenuItems, {
3533
3542
  allColumns: allColumns,
3534
3543
  key: i + "-" + c.id,
@@ -5400,11 +5409,13 @@ var MRT_ToolbarInternalButtons = function MRT_ToolbarInternalButtons(_ref) {
5400
5409
  var instance = _ref.instance;
5401
5410
  var _instance$options = instance.options,
5402
5411
  enableColumnFilters = _instance$options.enableColumnFilters,
5412
+ enableColumnOrdering = _instance$options.enableColumnOrdering,
5403
5413
  enableDensityToggle = _instance$options.enableDensityToggle,
5404
5414
  enableFilters = _instance$options.enableFilters,
5405
5415
  enableFullScreenToggle = _instance$options.enableFullScreenToggle,
5406
5416
  enableGlobalFilter = _instance$options.enableGlobalFilter,
5407
5417
  enableHiding = _instance$options.enableHiding,
5418
+ enablePinning = _instance$options.enablePinning,
5408
5419
  positionGlobalFilter = _instance$options.positionGlobalFilter,
5409
5420
  renderToolbarInternalActions = _instance$options.renderToolbarInternalActions;
5410
5421
  return React__default.createElement(material.Box, {
@@ -5426,7 +5437,7 @@ var MRT_ToolbarInternalButtons = function MRT_ToolbarInternalButtons(_ref) {
5426
5437
  instance: instance
5427
5438
  }), enableFilters && enableColumnFilters && React__default.createElement(MRT_ToggleFiltersButton, {
5428
5439
  instance: instance
5429
- }), enableHiding && React__default.createElement(MRT_ShowHideColumnsButton, {
5440
+ }), (enableHiding || enableColumnOrdering || enablePinning) && React__default.createElement(MRT_ShowHideColumnsButton, {
5430
5441
  instance: instance
5431
5442
  }), enableDensityToggle && React__default.createElement(MRT_ToggleDensePaddingButton, {
5432
5443
  instance: instance
@@ -5729,7 +5740,7 @@ var MRT_ToolbarBottom = function MRT_ToolbarBottom(_ref) {
5729
5740
  };
5730
5741
 
5731
5742
  var MRT_FilterTextField = function MRT_FilterTextField(_ref) {
5732
- var _localization$filterB, _columnDef$enabledCol, _allowedColumnFilterO, _localization$filterM, _localization$, _localization$clearFi, _columnDef$filterSele;
5743
+ var _localization$filterB, _columnDef$enabledCol, _allowedColumnFilterO, _localization$filterM, _localization, _localization$clearFi, _columnDef$filterSele;
5733
5744
 
5734
5745
  var header = _ref.header,
5735
5746
  inputIndex = _ref.inputIndex,
@@ -5877,7 +5888,7 @@ var MRT_FilterTextField = function MRT_FilterTextField(_ref) {
5877
5888
  helperText: allowColumnChangeMode && !inputIndex && (allowedColumnFilterOptions === undefined || ((_allowedColumnFilterO = allowedColumnFilterOptions == null ? void 0 : allowedColumnFilterOptions.length) != null ? _allowedColumnFilterO : 0) > 0) ? React__default.createElement("label", {
5878
5889
  htmlFor: filterId
5879
5890
  }, filterFn instanceof Function ? (_localization$filterM = localization.filterMode.replace('{filterType}', // @ts-ignore
5880
- (_localization$ = localization["filter" + (filterFn.name.charAt(0).toUpperCase() + filterFn.name.slice(1))]) != null ? _localization$ : '')) != null ? _localization$filterM : '' : localization.filterMode.replace('{filterType}', // @ts-ignore
5891
+ (_localization = localization["filter" + (filterFn.name.charAt(0).toUpperCase() + filterFn.name.slice(1))]) != null ? _localization : '')) != null ? _localization$filterM : '' : localization.filterMode.replace('{filterType}', // @ts-ignore
5881
5892
  localization["filter" + (filterFn.charAt(0).toUpperCase() + filterFn.slice(1))])) : null,
5882
5893
  FormHelperTextProps: {
5883
5894
  sx: {
@@ -5972,23 +5983,17 @@ var MRT_FilterTextField = function MRT_FilterTextField(_ref) {
5972
5983
  var MRT_FilterRangeFields = function MRT_FilterRangeFields(_ref) {
5973
5984
  var header = _ref.header,
5974
5985
  instance = _ref.instance;
5975
- var localization = instance.options.localization;
5976
5986
  return React__default.createElement(material.Box, {
5977
5987
  sx: {
5978
5988
  display: 'grid',
5979
- gridTemplateColumns: '6fr auto 5fr'
5989
+ gridTemplateColumns: '6fr 6fr',
5990
+ gap: '1rem'
5980
5991
  }
5981
5992
  }, React__default.createElement(MRT_FilterTextField, {
5982
5993
  header: header,
5983
5994
  inputIndex: 0,
5984
5995
  instance: instance
5985
- }), React__default.createElement(material.Box, {
5986
- sx: {
5987
- width: '100%',
5988
- minWidth: '5ch',
5989
- textAlign: 'center'
5990
- }
5991
- }, localization.to), React__default.createElement(MRT_FilterTextField, {
5996
+ }), React__default.createElement(MRT_FilterTextField, {
5992
5997
  header: header,
5993
5998
  inputIndex: 1,
5994
5999
  instance: instance
@@ -6089,7 +6094,6 @@ var MRT_TableHeadCellResizeHandle = function MRT_TableHeadCellResizeHandle(_ref)
6089
6094
  touchAction: 'none',
6090
6095
  transition: column.getIsResizing() ? undefined : 'all 0.2s ease-in-out',
6091
6096
  userSelect: 'none',
6092
- zIndex: 2000,
6093
6097
  '&:active': {
6094
6098
  backgroundColor: theme.palette.info.main,
6095
6099
  opacity: 1
@@ -6317,11 +6321,8 @@ var MRT_TableHeadCell = function MRT_TableHeadCell(_ref) {
6317
6321
  var MRT_DraggableTableHeadCell = function MRT_DraggableTableHeadCell(_ref) {
6318
6322
  var header = _ref.header,
6319
6323
  instance = _ref.instance;
6320
- var getState = instance.getState;
6321
-
6322
- _objectDestructuringEmpty(instance.options);
6323
-
6324
- var setColumnOrder = instance.setColumnOrder;
6324
+ var getState = instance.getState,
6325
+ setColumnOrder = instance.setColumnOrder;
6325
6326
 
6326
6327
  var _getState = getState(),
6327
6328
  columnOrder = _getState.columnOrder;
@@ -6331,7 +6332,8 @@ var MRT_DraggableTableHeadCell = function MRT_DraggableTableHeadCell(_ref) {
6331
6332
  var _useDrop = useDrop({
6332
6333
  accept: 'column',
6333
6334
  drop: function drop(movingColumn) {
6334
- return reorderColumn(movingColumn, column, columnOrder, setColumnOrder);
6335
+ var newColumnOrder = reorderColumn(movingColumn, column, columnOrder);
6336
+ setColumnOrder(newColumnOrder);
6335
6337
  }
6336
6338
  }),
6337
6339
  dropRef = _useDrop[1];
@@ -7090,7 +7092,8 @@ var MRT_TableBodyCell = function MRT_TableBodyCell(_ref) {
7090
7092
  var _useDrop = useDrop({
7091
7093
  accept: 'column',
7092
7094
  drop: function drop(movingColumn) {
7093
- return reorderColumn(movingColumn, column, columnOrder, setColumnOrder);
7095
+ var newColumnOrder = reorderColumn(movingColumn, column, columnOrder);
7096
+ setColumnOrder(newColumnOrder);
7094
7097
  }
7095
7098
  }),
7096
7099
  dropRef = _useDrop[1];
@@ -7314,7 +7317,7 @@ var rankGlobalFuzzy = function rankGlobalFuzzy(rowA, rowB) {
7314
7317
  var MRT_TableBody = function MRT_TableBody(_ref) {
7315
7318
  var instance = _ref.instance,
7316
7319
  tableContainerRef = _ref.tableContainerRef;
7317
- var getPaginationRowModel = instance.getPaginationRowModel,
7320
+ var getRowModel = instance.getRowModel,
7318
7321
  getPrePaginationRowModel = instance.getPrePaginationRowModel,
7319
7322
  getState = instance.getState,
7320
7323
  _instance$options = instance.options,
@@ -7351,8 +7354,8 @@ var MRT_TableBody = function MRT_TableBody(_ref) {
7351
7354
  return rankedRows;
7352
7355
  }
7353
7356
 
7354
- return enablePagination ? getPaginationRowModel().rows : getPrePaginationRowModel().rows;
7355
- }, [enableGlobalFilterRankedResults, enableGlobalFilterRankedResults && globalFilter || !enablePagination ? getPrePaginationRowModel().rows : getPaginationRowModel().rows, globalFilter]);
7357
+ return enablePagination ? getRowModel().rows : getPrePaginationRowModel().rows;
7358
+ }, [enableGlobalFilterRankedResults, enableGlobalFilterRankedResults && globalFilter || !enablePagination ? getPrePaginationRowModel().rows : getRowModel().rows, globalFilter]);
7356
7359
  var rowVirtualizer = enableRowVirtualization ? useVirtual(_extends({
7357
7360
  overscan: density === 'compact' ? 20 : 10,
7358
7361
  size: rows.length,
@@ -7578,7 +7581,8 @@ var MRT_TablePaper = function MRT_TablePaper(_ref) {
7578
7581
  }, tablePaperProps, {
7579
7582
  sx: _extends({
7580
7583
  transition: 'all 0.2s ease-in-out'
7581
- }, tablePaperProps == null ? void 0 : tablePaperProps.sx, {
7584
+ }, tablePaperProps == null ? void 0 : tablePaperProps.sx),
7585
+ style: _extends({}, tablePaperProps == null ? void 0 : tablePaperProps.style, {
7582
7586
  height: isFullScreen ? '100vh' : undefined,
7583
7587
  margin: isFullScreen ? '0' : undefined,
7584
7588
  maxHeight: isFullScreen ? '100vh' : undefined,
@@ -7728,7 +7732,7 @@ var MRT_TableRoot = function MRT_TableRoot(props) {
7728
7732
  id: 'mrt-expand',
7729
7733
  muiTableBodyCellProps: props.muiTableBodyCellProps,
7730
7734
  muiTableHeadCellProps: props.muiTableHeadCellProps,
7731
- size: 50
7735
+ size: 60
7732
7736
  }), columnOrder.includes('mrt-select') && createDisplayColumn(table, {
7733
7737
  Cell: function Cell(_ref5) {
7734
7738
  var cell = _ref5.cell;
@@ -7747,7 +7751,7 @@ var MRT_TableRoot = function MRT_TableRoot(props) {
7747
7751
  id: 'mrt-select',
7748
7752
  muiTableBodyCellProps: props.muiTableBodyCellProps,
7749
7753
  muiTableHeadCellProps: props.muiTableHeadCellProps,
7750
- size: 50
7754
+ size: 60
7751
7755
  }), columnOrder.includes('mrt-row-numbers') && createDisplayColumn(table, {
7752
7756
  Cell: function Cell(_ref6) {
7753
7757
  var cell = _ref6.cell;
@@ -7762,7 +7766,7 @@ var MRT_TableRoot = function MRT_TableRoot(props) {
7762
7766
  id: 'mrt-row-numbers',
7763
7767
  muiTableBodyCellProps: props.muiTableBodyCellProps,
7764
7768
  muiTableHeadCellProps: props.muiTableHeadCellProps,
7765
- size: 50
7769
+ size: 60
7766
7770
  })].filter(Boolean);
7767
7771
  }, [columnOrder, props.editingMode, props.enableEditing, props.enableExpandAll, props.enableExpanding, props.enableGrouping, props.enableRowActions, props.enableRowNumbers, props.enableRowSelection, props.enableSelectAll, props.localization, props.muiTableBodyCellProps, props.muiTableHeadCellProps, props.positionActionsColumn, table]);
7768
7772
  var columns = React.useMemo(function () {
@@ -7839,6 +7843,27 @@ var MRT_TableRoot = function MRT_TableRoot(props) {
7839
7843
  (_sessionStorage = sessionStorage).setItem.apply(_sessionStorage, itemArgs);
7840
7844
  }
7841
7845
  }, [props.enablePersistentState, props.tableId, props.persistentStateMode, instance]);
7846
+ React.useEffect(function () {
7847
+ props == null ? void 0 : props.onColumnOrderChanged == null ? void 0 : props.onColumnOrderChanged({
7848
+ columnOrder: instance.getState().columnOrder,
7849
+ //@ts-ignore
7850
+ instance: instance
7851
+ });
7852
+ }, [instance.getState().columnOrder]);
7853
+ React.useEffect(function () {
7854
+ props == null ? void 0 : props.onColumnPinningChanged == null ? void 0 : props.onColumnPinningChanged({
7855
+ columnPinning: instance.getState().columnPinning,
7856
+ //@ts-ignore
7857
+ instance: instance
7858
+ });
7859
+ }, [instance.getState().columnPinning]);
7860
+ React.useEffect(function () {
7861
+ props == null ? void 0 : props.onColumnVisibilityChanged == null ? void 0 : props.onColumnVisibilityChanged({
7862
+ columnPinning: instance.getState().columnVisibility,
7863
+ //@ts-ignore
7864
+ instance: instance
7865
+ });
7866
+ }, [instance.getState().columnVisibility]);
7842
7867
  return React__default.createElement(React__default.Fragment, null, React__default.createElement(material.Dialog, {
7843
7868
  PaperComponent: material.Box,
7844
7869
  TransitionComponent: material.Grow,