@@ -12,6 +12,7 @@ import { useDefaultProps } from '../DefaultPropsProvider';
1212import { duration } from '../styles/createTransitions' ;
1313import { getTransitionProps } from '../transitions/utils' ;
1414import { useForkRef } from '../utils' ;
15+ import useSlot from '../utils/useSlot' ;
1516import { getCollapseUtilityClass } from './collapseClasses' ;
1617
1718const useUtilityClasses = ( ownerState ) => {
@@ -149,6 +150,8 @@ const Collapse = React.forwardRef(function Collapse(inProps, ref) {
149150 onExited,
150151 onExiting,
151152 orientation = 'vertical' ,
153+ slots = { } ,
154+ slotProps = { } ,
152155 style,
153156 timeout = duration . standard ,
154157 // eslint-disable-next-line react/prop-types
@@ -292,6 +295,41 @@ const Collapse = React.forwardRef(function Collapse(inProps, ref) {
292295 }
293296 } ;
294297
298+ const externalForwardedProps = {
299+ slots,
300+ slotProps,
301+ component,
302+ } ;
303+
304+ const [ RootSlot , rootSlotProps ] = useSlot ( 'root' , {
305+ ref : handleRef ,
306+ className : clsx ( classes . root , className ) ,
307+ elementType : CollapseRoot ,
308+ externalForwardedProps,
309+ ownerState,
310+ additionalProps : {
311+ style : {
312+ [ isHorizontal ? 'minWidth' : 'minHeight' ] : collapsedSize ,
313+ ...style ,
314+ } ,
315+ } ,
316+ } ) ;
317+
318+ const [ WrapperSlot , wrapperSlotProps ] = useSlot ( 'wrapper' , {
319+ ref : wrapperRef ,
320+ className : classes . wrapper ,
321+ elementType : CollapseWrapper ,
322+ externalForwardedProps,
323+ ownerState,
324+ } ) ;
325+
326+ const [ WrapperInnerSlot , wrapperInnerSlotProps ] = useSlot ( 'wrapperInner' , {
327+ className : classes . wrapperInner ,
328+ elementType : CollapseWrapperInner ,
329+ externalForwardedProps,
330+ ownerState,
331+ } ) ;
332+
295333 return (
296334 < TransitionComponent
297335 in = { inProp }
@@ -307,39 +345,26 @@ const Collapse = React.forwardRef(function Collapse(inProps, ref) {
307345 { ...other }
308346 >
309347 { /* Destructure child props to prevent the component's "ownerState" from being overridden by incomingOwnerState. */ }
310- { ( state , { ownerState : incomingOwnerState , ...restChildProps } ) => (
311- < CollapseRoot
312- as = { component }
313- className = { clsx (
314- classes . root ,
315- {
348+ { ( state , { ownerState : incomingOwnerState , ...restChildProps } ) => {
349+ const stateOwnerState = { ... ownerState , state } ;
350+ return (
351+ < RootSlot
352+ { ... rootSlotProps }
353+ className = { clsx ( rootSlotProps . className , {
316354 [ classes . entered ] : state === 'entered' ,
317355 [ classes . hidden ] : state === 'exited' && ! inProp && collapsedSize === '0px' ,
318- } ,
319- className ,
320- ) }
321- style = { {
322- [ isHorizontal ? 'minWidth' : 'minHeight' ] : collapsedSize ,
323- ...style ,
324- } }
325- ref = { handleRef }
326- ownerState = { { ...ownerState , state } }
327- { ...restChildProps }
328- >
329- < CollapseWrapper
330- ownerState = { { ...ownerState , state } }
331- className = { classes . wrapper }
332- ref = { wrapperRef }
356+ } ) }
357+ ownerState = { stateOwnerState }
358+ { ...restChildProps }
333359 >
334- < CollapseWrapperInner
335- ownerState = { { ...ownerState , state } }
336- className = { classes . wrapperInner }
337- >
338- { children }
339- </ CollapseWrapperInner >
340- </ CollapseWrapper >
341- </ CollapseRoot >
342- ) }
360+ < WrapperSlot { ...wrapperSlotProps } ownerState = { stateOwnerState } >
361+ < WrapperInnerSlot { ...wrapperInnerSlotProps } ownerState = { stateOwnerState } >
362+ { children }
363+ </ WrapperInnerSlot >
364+ </ WrapperSlot >
365+ </ RootSlot >
366+ ) ;
367+ } }
343368 </ TransitionComponent >
344369 ) ;
345370} ) ;
@@ -421,6 +446,24 @@ Collapse.propTypes /* remove-proptypes */ = {
421446 * @default 'vertical'
422447 */
423448 orientation : PropTypes . oneOf ( [ 'horizontal' , 'vertical' ] ) ,
449+ /**
450+ * The props used for each slot inside.
451+ * @default {}
452+ */
453+ slotProps : PropTypes . shape ( {
454+ root : PropTypes . oneOfType ( [ PropTypes . func , PropTypes . object ] ) ,
455+ wrapper : PropTypes . oneOfType ( [ PropTypes . func , PropTypes . object ] ) ,
456+ wrapperInner : PropTypes . oneOfType ( [ PropTypes . func , PropTypes . object ] ) ,
457+ } ) ,
458+ /**
459+ * The components used for each slot inside.
460+ * @default {}
461+ */
462+ slots : PropTypes . shape ( {
463+ root : PropTypes . elementType ,
464+ wrapper : PropTypes . elementType ,
465+ wrapperInner : PropTypes . elementType ,
466+ } ) ,
424467 /**
425468 * @ignore
426469 */
0 commit comments