@@ -12,6 +12,8 @@ import {
1212import { getDirection } from '../utils/index.js' ;
1313import { swapStates , toggleState } from '../utils/element-internals.js' ;
1414import { isFocusableElement } from '../utils/focusable-element.js' ;
15+ import type { Tab } from '../tab/tab.js' ;
16+ import { isTab } from '../tab/tab.options.js' ;
1517import { TablistOrientation } from './tablist.options.js' ;
1618
1719/**
@@ -105,10 +107,25 @@ export class BaseTablist extends FASTElement {
105107 }
106108
107109 /**
110+ * Content slotted in the tab slot.
108111 * @internal
109112 */
110113 @observable
111- public tabs ! : HTMLElement [ ] ;
114+ public slottedTabs ! : Node [ ] ;
115+
116+ /**
117+ * Updates the tabs property when content in the tabs slot changes.
118+ * @internal
119+ */
120+ public slottedTabsChanged ( prev : Node [ ] | undefined , next : Node [ ] | undefined ) : void {
121+ this . tabs = ( next ?. filter ( tab => isTab ( tab ) ) as Tab [ ] ) ?? [ ] ;
122+ }
123+
124+ /**
125+ * @internal
126+ */
127+ @observable
128+ public tabs ! : Tab [ ] ;
112129 /**
113130 * @internal
114131 */
@@ -134,7 +151,7 @@ export class BaseTablist extends FASTElement {
134151 * A reference to the active tab
135152 * @public
136153 */
137- public activetab ! : HTMLElement ;
154+ public activetab ! : Tab ;
138155
139156 private prevActiveTabIndex : number = 0 ;
140157 private activeTabIndex : number = 0 ;
@@ -163,10 +180,11 @@ export class BaseTablist extends FASTElement {
163180 protected setTabs ( ) : void {
164181 this . activeTabIndex = this . getActiveIndex ( ) ;
165182
166- this . tabs . forEach ( ( tab : HTMLElement , index : number ) => {
183+ const hasStartSlot = this . tabs . some ( tab => tab . start . assignedNodes ( ) . length > 0 ) ;
184+
185+ this . tabs . forEach ( ( tab : Tab , index : number ) => {
167186 if ( tab . slot === 'tab' ) {
168187 const isActiveTab = this . activeTabIndex === index && isFocusableElement ( tab ) ;
169-
170188 const tabId : string = this . tabIds [ index ] ;
171189 tab . setAttribute ( 'id' , tabId ) ;
172190 tab . setAttribute ( 'aria-selected' , isActiveTab ? 'true' : 'false' ) ;
@@ -177,6 +195,10 @@ export class BaseTablist extends FASTElement {
177195 this . activetab = tab ;
178196 this . activeid = tabId ;
179197 }
198+ // Only set the data-hasIndent attribute if the tab has a start slot and the orientation is vertical
199+ if ( hasStartSlot && this . orientation === TablistOrientation . vertical ) {
200+ tab . setAttribute ( 'data-hasIndent' , '' ) ;
201+ }
180202 }
181203 } ) ;
182204 }
@@ -195,7 +217,7 @@ export class BaseTablist extends FASTElement {
195217 }
196218
197219 private handleTabClick = ( event : MouseEvent ) : void => {
198- const selectedTab = event . currentTarget as HTMLElement ;
220+ const selectedTab = event . currentTarget as Tab ;
199221 if ( selectedTab . nodeType === Node . ELEMENT_NODE && isFocusableElement ( selectedTab ) ) {
200222 this . prevActiveTabIndex = this . activeTabIndex ;
201223 this . activeTabIndex = this . tabs . indexOf ( selectedTab ) ;
@@ -269,8 +291,8 @@ export class BaseTablist extends FASTElement {
269291 }
270292 }
271293
272- private activateTabByIndex ( group : HTMLElement [ ] , index : number ) {
273- const tab : HTMLElement = group [ index ] as HTMLElement ;
294+ private activateTabByIndex ( group : Tab [ ] , index : number ) {
295+ const tab = group [ index ] ;
274296 this . activetab = tab ;
275297 this . prevActiveTabIndex = this . activeTabIndex ;
276298 this . activeTabIndex = index ;
0 commit comments