@@ -82,10 +82,23 @@ const InternalTabsContext = createContext<Partial<TabsProps> & {
8282 prevRef ?: RefObject < DOMRect | null > ,
8383 selectedKey ?: Key | null
8484} > ( { } ) ;
85- const CollapseContext = createContext ( {
85+
86+ interface CollapseContextType {
87+ showTabs : boolean ,
88+ menuId : string ,
89+ valueId : string ,
90+ ariaLabel ?: string | undefined ,
91+ ariaDescribedBy ?: string | undefined ,
92+ tabs : Array < Node < any > > ,
93+ listRef ?: RefObject < HTMLDivElement | null > ,
94+ onSelectionChange ?: ( key : Key ) => void
95+ }
96+
97+ const CollapseContext = createContext < CollapseContextType > ( {
8698 showTabs : true ,
8799 menuId : '' ,
88- valueId : ''
100+ valueId : '' ,
101+ tabs : [ ]
89102} ) ;
90103
91104const tabs = style ( {
@@ -198,35 +211,57 @@ const tablist = style({
198211 minWidth : 'min'
199212} ) ;
200213
214+ const tablistWrapper = style ( {
215+ position : 'relative' ,
216+ minWidth : 'min' ,
217+ flexShrink : 0 ,
218+ flexGrow : 0
219+ } , getAllowedOverrides ( ) ) ;
220+
201221export function TabList < T extends object > ( props : TabListProps < T > ) : ReactNode | null {
202- let { showTabs} = useContext ( CollapseContext ) ?? { } ;
222+ let { showTabs, menuId, valueId, tabs, listRef, onSelectionChange, ariaLabel, ariaDescribedBy} = useContext ( CollapseContext ) ?? { } ;
223+ let { density, orientation, labelBehavior} = useContext ( InternalTabsContext ) ;
203224
204225 if ( showTabs ) {
205226 return < TabListInner { ...props } /> ;
206227 }
207- return null ;
228+
229+ return (
230+ < div className = { tablistWrapper ( null , props . styles ) } >
231+ { listRef && < div className = { tablist ( { orientation, labelBehavior, density} ) } >
232+ < HiddenTabs items = { tabs } density = { density } listRef = { listRef } />
233+ </ div > }
234+ < TabsMenu
235+ id = { menuId }
236+ valueId = { valueId }
237+ items = { tabs }
238+ onSelectionChange = { onSelectionChange }
239+ aria-label = { ariaLabel }
240+ aria-describedby = { ariaDescribedBy } />
241+ </ div >
242+ ) ;
208243}
209244
210245function TabListInner < T extends object > ( props : TabListProps < T > ) {
211246 let {
212247 tablistRef,
248+ orientation,
213249 density,
214250 labelBehavior,
215251 'aria-label' : ariaLabel ,
216252 'aria-labelledby' : ariaLabelledBy
217253 } = useContext ( InternalTabsContext ) ?? { } ;
254+ let { tabs, listRef} = useContext ( CollapseContext ) ?? { } ;
218255
219256 return (
220257 < div
221258 style = { props . UNSAFE_style }
222259 className = {
223260 ( props . UNSAFE_className || '' ) +
224- style ( {
225- position : 'relative' ,
226- flexGrow : 0 ,
227- flexShrink : 0 ,
228- minWidth : 'min'
229- } , getAllowedOverrides ( ) ) ( null , props . styles ) } >
261+ tablistWrapper ( null , props . styles ) } >
262+ { listRef && < div className = { tablist ( { orientation, labelBehavior, density} ) } >
263+ < HiddenTabs items = { tabs } density = { density } listRef = { listRef } />
264+ </ div > }
230265 < RACTabList
231266 { ...props }
232267 aria-label = { ariaLabel }
@@ -519,7 +554,7 @@ let HiddenTabs = function (props: {
519554 size ?: string ,
520555 density ?: 'compact' | 'regular'
521556} ) {
522- let { listRef, items, size, density} = props ;
557+ let { listRef, items = [ ] , size, density} = props ;
523558
524559 return (
525560 < div
@@ -612,7 +647,7 @@ let TabsMenu = (props: {valueId: string, items: Array<Node<any>>, onSelectionCha
612647} ;
613648
614649let CollapsingTabs = ( { collection, containerRef, ...props } : { collection : Collection < Node < unknown > > , containerRef : any } & TabsProps ) => {
615- let { density = 'regular' , orientation = 'horizontal' , labelBehavior = 'show ', onSelectionChange} = props ;
650+ let { orientation = 'horizontal' , onSelectionChange} = props ;
616651 let [ showItems , _setShowItems ] = useState ( true ) ;
617652 showItems = orientation === 'vertical' ? true : showItems ;
618653 let setShowItems = useCallback ( ( value : boolean ) => {
@@ -683,14 +718,7 @@ let CollapsingTabs = ({collection, containerRef, ...props}: {collection: Collect
683718 } else {
684719 contents = (
685720 < >
686- < TabsMenu
687- id = { menuId }
688- valueId = { valueId }
689- items = { children }
690- onSelectionChange = { onSelectionChange }
691- aria-label = { props [ 'aria-label' ] }
692- aria-describedby = { props [ 'aria-labelledby' ] } />
693- < CollapseContext . Provider value = { { showTabs : false , menuId, valueId} } >
721+ < CollapseContext . Provider value = { { showTabs : false , tabs : children , menuId, valueId, listRef : listRef , onSelectionChange, ariaLabel : props [ 'aria-label' ] , ariaDescribedBy : props [ 'aria-labelledby' ] } } >
694722 { props . children }
695723 </ CollapseContext . Provider >
696724 </ >
@@ -699,10 +727,7 @@ let CollapsingTabs = ({collection, containerRef, ...props}: {collection: Collect
699727
700728 return (
701729 < div style = { props . UNSAFE_style } className = { ( props . UNSAFE_className || '' ) + tabs ( { orientation} , props . styles ) } ref = { containerRef } >
702- < div className = { tablist ( { orientation, labelBehavior, density} ) } >
703- < HiddenTabs items = { children } density = { density } listRef = { listRef } />
704- </ div >
705- < CollapseContext . Provider value = { { showTabs : true , menuId, valueId} } >
730+ < CollapseContext . Provider value = { { showTabs : true , menuId, valueId, tabs : children , listRef : listRef } } >
706731 { contents }
707732 </ CollapseContext . Provider >
708733 </ div >
0 commit comments