@@ -82,10 +82,23 @@ const InternalTabsContext = createContext<Partial<TabsProps> & {
82
82
prevRef ?: RefObject < DOMRect | null > ,
83
83
selectedKey ?: Key | null
84
84
} > ( { } ) ;
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 > ( {
86
98
showTabs : true ,
87
99
menuId : '' ,
88
- valueId : ''
100
+ valueId : '' ,
101
+ tabs : [ ]
89
102
} ) ;
90
103
91
104
const tabs = style ( {
@@ -198,35 +211,57 @@ const tablist = style({
198
211
minWidth : 'min'
199
212
} ) ;
200
213
214
+ const tablistWrapper = style ( {
215
+ position : 'relative' ,
216
+ minWidth : 'min' ,
217
+ flexShrink : 0 ,
218
+ flexGrow : 0
219
+ } , getAllowedOverrides ( ) ) ;
220
+
201
221
export 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 ) ;
203
224
204
225
if ( showTabs ) {
205
226
return < TabListInner { ...props } /> ;
206
227
}
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
+ ) ;
208
243
}
209
244
210
245
function TabListInner < T extends object > ( props : TabListProps < T > ) {
211
246
let {
212
247
tablistRef,
248
+ orientation,
213
249
density,
214
250
labelBehavior,
215
251
'aria-label' : ariaLabel ,
216
252
'aria-labelledby' : ariaLabelledBy
217
253
} = useContext ( InternalTabsContext ) ?? { } ;
254
+ let { tabs, listRef} = useContext ( CollapseContext ) ?? { } ;
218
255
219
256
return (
220
257
< div
221
258
style = { props . UNSAFE_style }
222
259
className = {
223
260
( 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 > }
230
265
< RACTabList
231
266
{ ...props }
232
267
aria-label = { ariaLabel }
@@ -519,7 +554,7 @@ let HiddenTabs = function (props: {
519
554
size ?: string ,
520
555
density ?: 'compact' | 'regular'
521
556
} ) {
522
- let { listRef, items, size, density} = props ;
557
+ let { listRef, items = [ ] , size, density} = props ;
523
558
524
559
return (
525
560
< div
@@ -612,7 +647,7 @@ let TabsMenu = (props: {valueId: string, items: Array<Node<any>>, onSelectionCha
612
647
} ;
613
648
614
649
let 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 ;
616
651
let [ showItems , _setShowItems ] = useState ( true ) ;
617
652
showItems = orientation === 'vertical' ? true : showItems ;
618
653
let setShowItems = useCallback ( ( value : boolean ) => {
@@ -683,14 +718,7 @@ let CollapsingTabs = ({collection, containerRef, ...props}: {collection: Collect
683
718
} else {
684
719
contents = (
685
720
< >
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' ] } } >
694
722
{ props . children }
695
723
</ CollapseContext . Provider >
696
724
</ >
@@ -699,10 +727,7 @@ let CollapsingTabs = ({collection, containerRef, ...props}: {collection: Collect
699
727
700
728
return (
701
729
< 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 } } >
706
731
{ contents }
707
732
</ CollapseContext . Provider >
708
733
</ div >
0 commit comments