UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

1 lines 65.5 kB
{"version":3,"file":"igniteui-angular-tabs.mjs","sources":["../../../projects/igniteui-angular/tabs/src/tabs/tabs.base.ts","../../../projects/igniteui-angular/tabs/src/tabs/tab-item.directive.ts","../../../projects/igniteui-angular/tabs/src/tabs/tab-content.directive.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-content.component.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-content.component.html","../../../projects/igniteui-angular/tabs/src/tabs/tab-header.directive.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs.directive.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tabs.component.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tabs.component.html","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-header.component.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-header.component.html","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-item.component.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tab-item.component.html","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tabs.directives.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/public_api.ts","../../../projects/igniteui-angular/tabs/src/tabs/tabs/tabs.module.ts","../../../projects/igniteui-angular/tabs/src/igniteui-angular-tabs.ts"],"sourcesContent":["import { QueryList, TemplateRef } from '@angular/core';\n\n/** @hidden */\nexport abstract class IgxTabsBase {\n public items: QueryList<IgxTabItemBase>;\n public selectedIndex: number;\n public abstract selectTab(tab: IgxTabItemBase, selected: boolean);\n}\n\n/** @hidden */\nexport abstract class IgxTabItemBase {\n public disabled: boolean;\n public selected: boolean;\n public headerTemplate: TemplateRef<any>;\n public panelTemplate: TemplateRef<any>;\n public headerComponent: IgxTabHeaderBase;\n public panelComponent: IgxTabContentBase;\n}\n\n/** @hidden */\nexport abstract class IgxTabHeaderBase {\n public nativeElement: HTMLElement;\n}\n\n/** @hidden */\nexport abstract class IgxTabContentBase {\n public nativeElement: HTMLElement;\n}\n\n","import { ContentChild, Directive, EventEmitter, Input, Output, TemplateRef, ViewChild, booleanAttribute, inject } from '@angular/core';\nimport { IgxTabHeaderBase, IgxTabItemBase, IgxTabContentBase, IgxTabsBase } from './tabs.base';\nimport { CarouselAnimationDirection, IgxSlideComponentBase } from 'igniteui-angular/carousel';\n\n@Directive()\nexport abstract class IgxTabItemDirective implements IgxTabItemBase, IgxSlideComponentBase {\n /** @hidden */\n private tabs = inject(IgxTabsBase);\n\n /** @hidden */\n @ContentChild(IgxTabHeaderBase)\n public headerComponent: IgxTabHeaderBase;\n\n /** @hidden */\n @ContentChild(IgxTabContentBase)\n public panelComponent: IgxTabContentBase;\n\n /** @hidden */\n @ViewChild('headerTemplate', { static: true })\n public headerTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('panelTemplate', { static: true })\n public panelTemplate: TemplateRef<any>;\n\n /**\n * Output to enable support for two-way binding on [(selected)]\n */\n @Output()\n public selectedChange = new EventEmitter<boolean>();\n\n /**\n * Disables the item.\n */\n @Input({ transform: booleanAttribute })\n public disabled = false;\n\n /** @hidden */\n public direction = CarouselAnimationDirection.NONE;\n /** @hidden */\n public previous: boolean;\n\n private _selected = false;\n\n /**\n * Gets/Sets whether an item is selected.\n */\n @Input({ transform: booleanAttribute })\n public get selected(): boolean {\n return this._selected;\n }\n\n public set selected(value: boolean) {\n if (this._selected !== value) {\n this._selected = value;\n this.tabs.selectTab(this, this._selected);\n this.selectedChange.emit(this._selected);\n }\n }\n}\n","import { Directive, ElementRef, HostBinding, inject } from '@angular/core';\nimport { IgxTabItemDirective } from './tab-item.directive';\nimport { IgxTabContentBase } from './tabs.base';\n\n@Directive()\nexport abstract class IgxTabContentDirective implements IgxTabContentBase {\n /** @hidden */\n public tab = inject(IgxTabItemDirective);\n /** @hidden */\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /** @hidden */\n @HostBinding('attr.role')\n public role = 'tabpanel';\n\n /** @hidden */\n @HostBinding('attr.tabindex')\n public get tabIndex() {\n return this.tab.selected ? 0 : -1;\n }\n\n /** @hidden */\n @HostBinding('style.z-index')\n public get zIndex() {\n return this.tab.selected ? 'auto' : -1;\n }\n\n /** @hidden */\n public get nativeElement() {\n return this.elementRef.nativeElement;\n }\n}\n","import { Component, HostBinding } from '@angular/core';\nimport { IgxTabContentDirective } from '../tab-content.directive';\nimport { IgxTabContentBase } from '../tabs.base';\n\n@Component({\n selector: 'igx-tab-content',\n templateUrl: 'tab-content.component.html',\n providers: [{ provide: IgxTabContentBase, useExisting: IgxTabContentComponent }],\n imports: []\n})\nexport class IgxTabContentComponent extends IgxTabContentDirective {\n /** @hidden */\n @HostBinding('class.igx-tabs__panel')\n public cssClass = true;\n}\n","@if (tab.selected || tab.previous) {\n <ng-content></ng-content>\n}\n","\nimport { Directive, ElementRef, HostBinding, HostListener, inject } from '@angular/core';\nimport { PlatformUtil } from 'igniteui-angular/core';\nimport { IgxTabItemDirective } from './tab-item.directive';\nimport { IgxTabHeaderBase, IgxTabsBase } from './tabs.base';\n\n@Directive()\nexport abstract class IgxTabHeaderDirective implements IgxTabHeaderBase {\n /** @hidden */\n protected tabs = inject(IgxTabsBase);\n /** @hidden */\n public tab = inject(IgxTabItemDirective);\n /** @hidden */\n private elementRef = inject(ElementRef<HTMLElement>);\n /** @hidden */\n protected platform = inject(PlatformUtil);\n\n /** @hidden */\n @HostBinding('attr.role')\n public role = 'tab';\n\n /** @hidden */\n @HostBinding('attr.tabindex')\n public get tabIndex() {\n return this.tab.selected ? 0 : -1;\n }\n\n /** @hidden */\n @HostBinding('attr.aria-selected')\n public get ariaSelected() {\n return this.tab.selected;\n }\n\n /** @hidden */\n @HostBinding('attr.aria-disabled')\n public get ariaDisabled() {\n return this.tab.disabled;\n }\n\n /** @hidden */\n @HostListener('click')\n public onClick() {\n if (this.tab.panelComponent) {\n this.tabs.selectTab(this.tab, true);\n }\n }\n\n /** @hidden */\n public get nativeElement() {\n return this.elementRef.nativeElement;\n }\n}\n","import {\n AfterViewInit, ContentChildren, Directive, EventEmitter,\n Input, OnDestroy, Output, QueryList, booleanAttribute,\n inject\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { IBaseEventArgs, ɵIgxDirectionality } from 'igniteui-angular/core';\nimport { IgxTabItemDirective } from './tab-item.directive';\nimport { IgxTabContentBase, IgxTabsBase } from './tabs.base';\nimport { IgxCarouselComponentBase, CarouselAnimationDirection } from 'igniteui-angular/carousel';\n\nexport interface ITabsBaseEventArgs extends IBaseEventArgs {\n readonly owner: IgxTabsDirective;\n}\n\nexport interface ITabsSelectedIndexChangingEventArgs extends ITabsBaseEventArgs {\n cancel: boolean;\n readonly oldIndex: number;\n newIndex: number;\n}\n\nexport interface ITabsSelectedItemChangeEventArgs extends ITabsBaseEventArgs {\n readonly oldItem: IgxTabItemDirective;\n readonly newItem: IgxTabItemDirective;\n}\n\n@Directive()\nexport abstract class IgxTabsDirective extends IgxCarouselComponentBase implements IgxTabsBase, AfterViewInit, OnDestroy {\n /** @hidden */\n public dir = inject(ɵIgxDirectionality);\n\n /**\n * Gets/Sets the index of the selected item.\n * Default value is 0 if contents are defined otherwise defaults to -1.\n */\n @Input()\n public get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n public set selectedIndex(value: number) {\n if (this._selectedIndex !== value) {\n let newIndex = value;\n const oldIndex = this._selectedIndex;\n const args: ITabsSelectedIndexChangingEventArgs = {\n owner: this,\n cancel: false,\n oldIndex,\n newIndex\n };\n this.selectedIndexChanging.emit(args);\n\n if (!args.cancel) {\n newIndex = args.newIndex;\n this._selectedIndex = newIndex;\n this.selectedIndexChange.emit(this._selectedIndex);\n }\n\n this.updateSelectedTabs(oldIndex);\n }\n }\n\n /**\n * Enables/disables the transition animation of the contents.\n */\n @Input({ transform: booleanAttribute })\n public disableAnimation = false;\n\n /**\n * Output to enable support for two-way binding on [(selectedIndex)]\n */\n @Output()\n public selectedIndexChange = new EventEmitter<number>();\n\n /**\n * Emitted when the selected index is about to change.\n */\n @Output()\n public selectedIndexChanging = new EventEmitter<ITabsSelectedIndexChangingEventArgs>();\n\n /**\n * Emitted when the selected item is changed.\n */\n @Output()\n public selectedItemChange = new EventEmitter<ITabsSelectedItemChangeEventArgs>();\n\n /**\n * Returns the items.\n */\n @ContentChildren(IgxTabItemDirective)\n public items: QueryList<IgxTabItemDirective>;\n\n /**\n * Gets the selected item.\n */\n public get selectedItem(): IgxTabItemDirective {\n return this.items && this.selectedIndex >= 0 && this.selectedIndex < this.items.length ?\n this.items.get(this.selectedIndex) : null;\n }\n\n /** @hidden */\n @ContentChildren(IgxTabContentBase, { descendants: true })\n public panels: QueryList<IgxTabContentBase>;\n\n /** @hidden */\n protected override currentItem: IgxTabItemDirective;\n /** @hidden */\n protected override previousItem: IgxTabItemDirective;\n /** @hidden */\n protected componentName: string;\n\n private _selectedIndex = -1;\n private _itemChanges$: Subscription;\n\n /** @hidden */\n public ngAfterViewInit(): void {\n if (this._selectedIndex === -1) {\n const hasSelectedTab = this.items.some((tab, i) => {\n if (tab.selected) {\n this._selectedIndex = i;\n }\n return tab.selected;\n });\n\n if (!hasSelectedTab && this.hasPanels) {\n this._selectedIndex = 0;\n }\n }\n\n // Use promise to avoid expression changed after check error\n Promise.resolve().then(() => {\n this.updateSelectedTabs(null, false);\n });\n\n this._itemChanges$ = this.items.changes.subscribe(() => {\n this.onItemChanges();\n });\n\n this.setAttributes();\n }\n\n /** @hidden */\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this._itemChanges$) {\n this._itemChanges$.unsubscribe();\n }\n }\n\n /** @hidden */\n public selectTab(tab: IgxTabItemDirective, selected: boolean): void {\n if (!this.items) {\n return;\n }\n\n const tabs = this.items.toArray();\n\n if (selected) {\n const index = tabs.indexOf(tab);\n if (index > -1) {\n this.selectedIndex = index;\n }\n } else {\n if (tabs.every(t => !t.selected)) {\n this.selectedIndex = -1;\n }\n }\n }\n\n /** @hidden */\n protected getPreviousElement(): HTMLElement {\n return this.previousItem.panelComponent.nativeElement;\n }\n\n /** @hidden */\n protected getCurrentElement(): HTMLElement {\n return this.currentItem.panelComponent.nativeElement;\n }\n\n /** @hidden */\n protected scrollTabHeaderIntoView() {\n }\n\n /** @hidden */\n protected onItemChanges() {\n this.setAttributes();\n\n // Check if there is selected tab\n let selectedIndex = -1;\n this.items.some((tab, i) => {\n if (tab.selected) {\n selectedIndex = i;\n }\n return tab.selected;\n });\n\n if (selectedIndex >= 0) {\n // Set the selected index to the tab that has selected=true\n Promise.resolve().then(() => {\n this.selectedIndex = selectedIndex;\n });\n } else {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n // Select the tab on the same index the previous selected tab was\n Promise.resolve().then(() => {\n this.updateSelectedTabs(null);\n });\n } else if (this.selectedIndex >= this.items.length) {\n // Select the last tab\n Promise.resolve().then(() => {\n this.selectedIndex = this.items.length - 1;\n });\n }\n }\n }\n\n private setAttributes() {\n this.items.forEach(item => {\n if (item.panelComponent && !item.headerComponent.nativeElement.getAttribute('id')) {\n const id = this.getNextTabId();\n const tabHeaderId = `${this.componentName}-header-${id}`;\n const tabPanelId = `${this.componentName}-content-${id}`;\n\n this.setHeaderAttribute(item, 'id', tabHeaderId);\n this.setHeaderAttribute(item, 'aria-controls', tabPanelId);\n this.setPanelAttribute(item, 'id', tabPanelId);\n this.setPanelAttribute(item, 'aria-labelledby', tabHeaderId);\n }\n });\n }\n\n private setHeaderAttribute(item: IgxTabItemDirective, attrName: string, value: string) {\n item.headerComponent.nativeElement.setAttribute(attrName, value);\n }\n\n private setPanelAttribute(item: IgxTabItemDirective, attrName: string, value: string) {\n item.panelComponent.nativeElement.setAttribute(attrName, value);\n }\n\n private get hasPanels() {\n return this.panels && this.panels.length;\n }\n\n private updateSelectedTabs(oldSelectedIndex: number, raiseEvent = true) {\n if (!this.items) {\n return;\n }\n\n let newTab: IgxTabItemDirective;\n const oldTab = this.currentItem;\n\n // First select the new tab\n if (this._selectedIndex >= 0 && this._selectedIndex < this.items.length) {\n newTab = this.items.get(this._selectedIndex);\n newTab.selected = true;\n }\n // Then unselect the other tabs\n this.items.forEach((tab, i) => {\n if (i !== this._selectedIndex) {\n tab.selected = false;\n }\n });\n\n if (this._selectedIndex !== oldSelectedIndex) {\n this.scrollTabHeaderIntoView();\n this.triggerPanelAnimations(oldSelectedIndex);\n\n if (raiseEvent && newTab !== oldTab) {\n this.selectedItemChange.emit({\n owner: this,\n newItem: newTab,\n oldItem: oldTab\n });\n }\n }\n }\n\n private triggerPanelAnimations(oldSelectedIndex: number) {\n const item = this.items.get(this._selectedIndex);\n\n if (item &&\n !this.disableAnimation &&\n this.hasPanels &&\n this.currentItem &&\n !this.currentItem.selected) {\n item.direction = (!this.dir.rtl && this._selectedIndex > oldSelectedIndex) ||\n (this.dir.rtl && this._selectedIndex < oldSelectedIndex)\n ? CarouselAnimationDirection.NEXT : CarouselAnimationDirection.PREV;\n\n if (this.previousItem && this.previousItem.previous) {\n this.previousItem.previous = false;\n }\n this.currentItem.direction = item.direction;\n\n this.previousItem = this.currentItem;\n this.currentItem = item;\n this.triggerAnimations();\n } else {\n this.currentItem = item;\n }\n }\n\n /** @hidden */\n protected abstract getNextTabId();\n}\n","import { AfterViewInit, Component, ElementRef, HostBinding, inject, Input, NgZone, OnDestroy, ViewChild } from '@angular/core';\nimport { IgxTabsBase } from '../tabs.base';\nimport { IgxTabsDirective } from '../tabs.directive';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { IgxIconButtonDirective, IgxRippleDirective } from 'igniteui-angular/directives';\nimport { IgxIconComponent } from 'igniteui-angular/icon';\nimport { getResizeObserver, PlatformUtil } from 'igniteui-angular/core';\n\nexport const IgxTabsAlignment = {\n start: 'start',\n end: 'end',\n center: 'center',\n justify: 'justify'\n} as const;\n\n/** @hidden */\nconst enum TabScrollButtonStyle {\n Enabled = 'enabled',\n Disabled = 'disabled',\n NotDisplayed = 'not_displayed'\n}\n\nexport type IgxTabsAlignment = (typeof IgxTabsAlignment)[keyof typeof IgxTabsAlignment];\n\n/** @hidden */\nlet NEXT_TAB_ID = 0;\n\n/**\n * Tabs component is used to organize or switch between similar data sets.\n *\n * @igxModule IgxTabsModule\n *\n * @igxTheme igx-tabs-theme\n *\n * @igxKeywords tabs\n *\n * @igxGroup Layouts\n *\n * @remarks\n * The Ignite UI for Angular Tabs component places tabs at the top and allows for scrolling when there are multiple tab items on the screen.\n *\n * @example\n * ```html\n * <igx-tabs>\n * <igx-tab-item>\n * <igx-tab-header>\n * <igx-icon igxTabHeaderIcon>folder</igx-icon>\n * <span igxTabHeaderLabel>Tab 1</span>\n * </igx-tab-header>\n * <igx-tab-content>\n * Content 1\n * </igx-tab-content>\n * </igx-tab-item>\n * ...\n * </igx-tabs>\n * ```\n */\n@Component({\n selector: 'igx-tabs',\n templateUrl: 'tabs.component.html',\n providers: [{ provide: IgxTabsBase, useExisting: IgxTabsComponent }],\n imports: [IgxRippleDirective, IgxIconComponent, NgClass, NgTemplateOutlet, IgxIconButtonDirective]\n})\n\nexport class IgxTabsComponent extends IgxTabsDirective implements AfterViewInit, OnDestroy {\n private ngZone = inject(NgZone);\n private platform = inject(PlatformUtil);\n\n\n /**\n * Gets/Sets the tab alignment. Defaults to `start`.\n */\n @Input()\n public get tabAlignment(): string | IgxTabsAlignment {\n return this._tabAlignment;\n }\n\n public set tabAlignment(value: string | IgxTabsAlignment) {\n this._tabAlignment = value;\n requestAnimationFrame(() => {\n this.updateScrollButtons();\n this.realignSelectedIndicator();\n });\n }\n\n /**\n * Determines the tab activation.\n * When set to auto, the tab is instantly selected while navigating with the Left/Right Arrows, Home or End keys and the corresponding panel is displayed.\n * When set to manual, the tab is only focused. The selection happens after pressing Space or Enter.\n * Defaults is auto.\n */\n @Input()\n public activation: 'auto' | 'manual' = 'auto';\n\n /** @hidden */\n @ViewChild('headerContainer', { static: true })\n public headerContainer: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('viewPort', { static: true })\n public viewPort: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('itemsWrapper', { static: true })\n public itemsWrapper: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('itemsContainer', { static: true })\n public itemsContainer: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('selectedIndicator')\n public selectedIndicator: ElementRef<HTMLElement>;\n\n /** @hidden */\n @ViewChild('scrollPrevButton')\n public scrollPrevButton: ElementRef<HTMLButtonElement>;\n\n /** @hidden */\n @ViewChild('scrollNextButton')\n public scrollNextButton: ElementRef<HTMLButtonElement>;\n\n /** @hidden */\n @HostBinding('class.igx-tabs')\n public defaultClass = true;\n\n /** @hidden */\n public offset = 0;\n\n /** @hidden */\n protected override componentName = 'igx-tabs';\n\n private _tabAlignment: string | IgxTabsAlignment = 'start';\n private _resizeObserver: ResizeObserver;\n\n /** @hidden @internal */\n public override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n\n this.ngZone.runOutsideAngular(() => {\n if (this.platform.isBrowser) {\n this._resizeObserver = new (getResizeObserver())(() => {\n this.updateScrollButtons();\n this.realignSelectedIndicator();\n });\n this._resizeObserver.observe(this.headerContainer.nativeElement);\n this._resizeObserver.observe(this.viewPort.nativeElement);\n }\n });\n }\n\n /** @hidden @internal */\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n\n this.ngZone.runOutsideAngular(() => {\n this._resizeObserver?.disconnect();\n });\n }\n\n /** @hidden */\n public scrollPrev() {\n this.scroll(false);\n }\n\n /** @hidden */\n public scrollNext() {\n this.scroll(true);\n }\n\n /** @hidden */\n public realignSelectedIndicator() {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n const header = this.items.get(this.selectedIndex).headerComponent.nativeElement;\n this.alignSelectedIndicator(header, 0);\n }\n }\n\n /** @hidden */\n public resolveHeaderScrollClasses() {\n return {\n 'igx-tabs__header-scroll--start': this.tabAlignment === 'start',\n 'igx-tabs__header-scroll--end': this.tabAlignment === 'end',\n 'igx-tabs__header-scroll--center': this.tabAlignment === 'center',\n 'igx-tabs__header-scroll--justify': this.tabAlignment === 'justify',\n };\n }\n\n /** @hidden */\n protected override scrollTabHeaderIntoView() {\n if (this.selectedIndex >= 0) {\n const tabItems = this.items.toArray();\n const tabHeaderNativeElement = tabItems[this.selectedIndex].headerComponent.nativeElement;\n\n // Scroll left if there is need\n if (this.getElementOffset(tabHeaderNativeElement) < this.offset) {\n this.scrollElement(tabHeaderNativeElement, false);\n }\n\n // Scroll right if there is need\n const viewPortOffsetWidth = this.viewPort.nativeElement.offsetWidth;\n const delta = (this.getElementOffset(tabHeaderNativeElement) + tabHeaderNativeElement.offsetWidth) - (viewPortOffsetWidth + this.offset);\n\n // Fix for IE 11, a difference is accumulated from the widths calculations\n if (delta > 1) {\n this.scrollElement(tabHeaderNativeElement, true);\n }\n\n this.alignSelectedIndicator(tabHeaderNativeElement);\n } else {\n this.hideSelectedIndicator();\n }\n }\n\n /** @hidden */\n protected getNextTabId() {\n return NEXT_TAB_ID++;\n }\n\n /** @hidden */\n protected override onItemChanges() {\n super.onItemChanges();\n\n Promise.resolve().then(() => {\n this.updateScrollButtons();\n });\n }\n\n private alignSelectedIndicator(element: HTMLElement, duration = 0.3): void {\n if (this.selectedIndicator) {\n this.selectedIndicator.nativeElement.style.visibility = 'visible';\n this.selectedIndicator.nativeElement.style.transitionDuration = duration > 0 ? `${duration}s` : 'initial';\n this.selectedIndicator.nativeElement.style.width = `${element.offsetWidth}px`;\n this.selectedIndicator.nativeElement.style.transform = `translate(${element.offsetLeft}px)`;\n }\n }\n\n private hideSelectedIndicator(): void {\n if (this.selectedIndicator) {\n this.selectedIndicator.nativeElement.style.visibility = 'hidden';\n }\n }\n\n private scroll(scrollNext: boolean): void {\n const tabsArray = this.items.toArray();\n\n for (let index = 0; index < tabsArray.length; index++) {\n const tab = tabsArray[index];\n const element = tab.headerComponent.nativeElement;\n if (scrollNext) {\n if (element.offsetWidth + this.getElementOffset(element) > this.viewPort.nativeElement.offsetWidth + this.offset) {\n this.scrollElement(element, scrollNext);\n break;\n }\n } else {\n if (this.getElementOffset(element) >= this.offset) {\n this.scrollElement(tabsArray[index - 1].headerComponent.nativeElement, scrollNext);\n break;\n }\n }\n }\n }\n\n private scrollElement(element: any, scrollNext: boolean): void {\n const viewPortWidth = this.viewPort.nativeElement.offsetWidth;\n\n this.offset = (scrollNext) ? element.offsetWidth + this.getElementOffset(element) - viewPortWidth : this.getElementOffset(element);\n this.viewPort.nativeElement.scrollLeft = this.getOffset(this.offset);\n this.updateScrollButtons();\n }\n\n private updateScrollButtons() {\n const itemsContainerWidth = this.getTabItemsContainerWidth();\n\n const scrollPrevButtonStyle = this.resolveLeftScrollButtonStyle(itemsContainerWidth);\n this.setScrollButtonStyle(this.scrollPrevButton.nativeElement, scrollPrevButtonStyle);\n\n const scrollNextButtonStyle = this.resolveRightScrollButtonStyle(itemsContainerWidth);\n this.setScrollButtonStyle(this.scrollNextButton.nativeElement, scrollNextButtonStyle);\n }\n\n private setScrollButtonStyle(button: HTMLButtonElement, buttonStyle: TabScrollButtonStyle) {\n if (buttonStyle === TabScrollButtonStyle.Enabled) {\n button.disabled = false;\n button.style.display = '';\n } else if (buttonStyle === TabScrollButtonStyle.Disabled) {\n button.disabled = true;\n button.style.display = '';\n } else if (buttonStyle === TabScrollButtonStyle.NotDisplayed) {\n button.style.display = 'none';\n }\n }\n private resolveLeftScrollButtonStyle(itemsContainerWidth: number): TabScrollButtonStyle {\n const headerContainerWidth = this.headerContainer.nativeElement.offsetWidth;\n const offset = this.offset;\n\n if (offset === 0) {\n // Fix for IE 11, a difference is accumulated from the widths calculations.\n if (itemsContainerWidth - headerContainerWidth <= 1) {\n return TabScrollButtonStyle.NotDisplayed;\n }\n return TabScrollButtonStyle.Disabled;\n } else {\n return TabScrollButtonStyle.Enabled;\n }\n }\n\n private resolveRightScrollButtonStyle(itemsContainerWidth: number): TabScrollButtonStyle {\n const viewPortWidth = this.viewPort.nativeElement.offsetWidth;\n const headerContainerWidth = this.headerContainer.nativeElement.offsetWidth;\n const offset = this.offset;\n const total = offset + viewPortWidth;\n\n // Fix for IE 11, a difference is accumulated from the widths calculations.\n if (itemsContainerWidth - headerContainerWidth <= 1 && offset === 0) {\n return TabScrollButtonStyle.NotDisplayed;\n }\n\n if (itemsContainerWidth > total) {\n return TabScrollButtonStyle.Enabled;\n } else {\n return TabScrollButtonStyle.Disabled;\n }\n }\n\n private getTabItemsContainerWidth() {\n // We use this hacky way to get the width of the itemsContainer,\n // because there is inconsistency in IE we cannot use offsetWidth or scrollOffset.\n const itemsContainerChildrenCount = this.itemsContainer.nativeElement.children.length;\n let itemsContainerWidth = 0;\n\n if (itemsContainerChildrenCount > 1) {\n const lastTab = this.itemsContainer.nativeElement.children[itemsContainerChildrenCount - 1] as HTMLElement;\n itemsContainerWidth = this.getElementOffset(lastTab) + lastTab.offsetWidth;\n }\n\n return itemsContainerWidth;\n }\n\n private getOffset(offset: number): number {\n return this.dir.rtl ? -offset : offset;\n }\n\n private getElementOffset(element: HTMLElement): number {\n return this.dir.rtl ? this.itemsWrapper.nativeElement.offsetWidth - element.offsetLeft - element.offsetWidth : element.offsetLeft;\n }\n}\n","<div #headerContainer class=\"igx-tabs__header\">\n <button #scrollPrevButton type=\"button\" igxIconButton=\"flat\" igxRipple tabindex=\"-1\" class=\"igx-tabs__header-button\" (click)=\"scrollPrev()\">\n <igx-icon family=\"default\" name=\"prev\"></igx-icon>\n </button>\n <div #viewPort class=\"igx-tabs__header-content\">\n <div #itemsWrapper class=\"igx-tabs__header-wrapper\" role=\"tablist\">\n <div #itemsContainer class=\"igx-tabs__header-scroll\" [ngClass]=\"resolveHeaderScrollClasses()\">\n @for (tab of items; track tab; let i = $index) {\n <ng-container *ngTemplateOutlet=\"tab.headerTemplate\"></ng-container>\n }\n </div>\n @if (items.length > 0) {\n <div #selectedIndicator class=\"igx-tabs__header-active-indicator\">\n </div>\n }\n </div>\n </div>\n <button #scrollNextButton type=\"button\" igxIconButton=\"flat\" igxRipple tabindex=\"-1\" class=\"igx-tabs__header-button\" (click)=\"scrollNext()\">\n <igx-icon family=\"default\" name=\"next\"></igx-icon>\n </button>\n</div>\n<div class=\"igx-tabs__panels\">\n @for (tab of items; track tab; let i = $index) {\n <ng-container *ngTemplateOutlet=\"tab.panelTemplate\"></ng-container>\n }\n</div>\n","import { AfterViewInit, Component, HostBinding, HostListener, NgZone, OnDestroy, inject } from '@angular/core';\nimport { IgxTabHeaderDirective } from '../tab-header.directive';\nimport { IgxTabHeaderBase } from '../tabs.base';\nimport { IgxTabsComponent } from './tabs.component';\nimport { getResizeObserver, ɵIgxDirectionality } from 'igniteui-angular/core';\n\n@Component({\n selector: 'igx-tab-header',\n templateUrl: 'tab-header.component.html',\n providers: [{ provide: IgxTabHeaderBase, useExisting: IgxTabHeaderComponent }],\n standalone: true\n})\nexport class IgxTabHeaderComponent extends IgxTabHeaderDirective implements AfterViewInit, OnDestroy {\n protected override tabs = inject(IgxTabsComponent);\n private ngZone = inject(NgZone);\n private dir = inject(ɵIgxDirectionality);\n\n /** @hidden @internal */\n @HostBinding('class.igx-tabs__header-item--selected')\n public get provideCssClassSelected(): boolean {\n return this.tab.selected;\n }\n\n /** @hidden @internal */\n @HostBinding('class.igx-tabs__header-item--disabled')\n public get provideCssClassDisabled(): boolean {\n return this.tab.disabled;\n }\n\n /** @hidden @internal */\n @HostBinding('class.igx-tabs__header-item')\n public cssClass = true;\n\n private _resizeObserver: ResizeObserver;\n\n /** @hidden @internal */\n @HostListener('keydown', ['$event'])\n public keyDown(event: KeyboardEvent) {\n let unsupportedKey = false;\n const itemsArray = this.tabs.items.toArray();\n const previousIndex = itemsArray.indexOf(this.tab);\n let newIndex = previousIndex;\n const hasDisabledItems = itemsArray.some((item) => item.disabled);\n\n switch (event.key) {\n case this.platform.KEYMAP.ARROW_RIGHT:\n newIndex = this.getNewSelectionIndex(newIndex, itemsArray, event.key, hasDisabledItems);\n break;\n case this.platform.KEYMAP.ARROW_LEFT:\n newIndex = this.getNewSelectionIndex(newIndex, itemsArray, event.key, hasDisabledItems);\n break;\n case this.platform.KEYMAP.HOME:\n event.preventDefault();\n newIndex = 0;\n while (itemsArray[newIndex].disabled && newIndex < itemsArray.length) {\n newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;\n }\n break;\n case this.platform.KEYMAP.END:\n event.preventDefault();\n newIndex = itemsArray.length - 1;\n while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex > 0) {\n newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;\n }\n break;\n case this.platform.KEYMAP.ENTER:\n case this.platform.KEYMAP.SPACE:\n event.preventDefault();\n if (this.tabs.activation === 'manual') {\n this.nativeElement.click();\n }\n unsupportedKey = true;\n break;\n default:\n unsupportedKey = true;\n break;\n }\n\n if (!unsupportedKey) {\n itemsArray[newIndex].headerComponent.nativeElement.focus({ preventScroll: true });\n if (this.tabs.activation === 'auto') {\n this.tabs.selectedIndex = newIndex;\n }\n }\n }\n\n /** @hidden @internal */\n public ngAfterViewInit(): void {\n this.ngZone.runOutsideAngular(() => {\n if (this.platform.isBrowser) {\n this._resizeObserver = new (getResizeObserver())(() => {\n this.tabs.realignSelectedIndicator();\n });\n this._resizeObserver.observe(this.nativeElement);\n }\n });\n }\n\n /** @hidden @internal */\n public ngOnDestroy(): void {\n this.ngZone.runOutsideAngular(() => {\n this._resizeObserver?.disconnect();\n });\n }\n\n private getNewSelectionIndex(newIndex: number, itemsArray: any[], key: string, hasDisabledItems: boolean): number {\n if ((key === this.platform.KEYMAP.ARROW_RIGHT && !this.dir.rtl) || (key === this.platform.KEYMAP.ARROW_LEFT && this.dir.rtl)) {\n newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;\n while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex < itemsArray.length) {\n newIndex = newIndex === itemsArray.length - 1 ? 0 : newIndex + 1;\n }\n } else {\n newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;\n while (hasDisabledItems && itemsArray[newIndex].disabled && newIndex >= 0) {\n newIndex = newIndex === 0 ? itemsArray.length - 1 : newIndex - 1;\n }\n }\n return newIndex;\n }\n}\n","<ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n\n<div class=\"igx-tabs__header-item-inner\">\n <ng-content></ng-content>\n</div>\n\n<ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n","import { Component } from '@angular/core';\nimport { IgxTabItemDirective } from '../tab-item.directive';\n\n@Component({\n selector: 'igx-tab-item',\n templateUrl: 'tab-item.component.html',\n providers: [{ provide: IgxTabItemDirective, useExisting: IgxTabItemComponent }],\n standalone: true\n})\nexport class IgxTabItemComponent extends IgxTabItemDirective {\n\n}\n","<ng-template #headerTemplate>\n <ng-content select=\"igx-tab-header\"></ng-content>\n</ng-template>\n<ng-template #panelTemplate>\n <ng-content select=\"igx-tab-content\"></ng-content>\n</ng-template>\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: 'igx-tab-header-label,[igxTabHeaderLabel]',\n standalone: true\n})\nexport class IgxTabHeaderLabelDirective { }\n\n@Directive({\n selector: 'igx-tab-header-icon,[igxTabHeaderIcon]',\n standalone: true\n})\nexport class IgxTabHeaderIconDirective { }\n","import { IgxPrefixDirective, IgxSuffixDirective } from 'igniteui-angular/input-group';\nimport { IgxTabContentComponent } from './tab-content.component';\nimport { IgxTabHeaderComponent } from './tab-header.component';\nimport { IgxTabItemComponent } from './tab-item.component';\nimport { IgxTabsComponent } from './tabs.component';\nimport { IgxTabHeaderIconDirective, IgxTabHeaderLabelDirective } from './tabs.directives';\n\nexport * from './tabs.component';\nexport * from './tab-item.component';\nexport * from './tab-header.component';\nexport * from './tabs.directives';\nexport * from './tab-content.component';\nexport {\n ITabsSelectedIndexChangingEventArgs,\n ITabsSelectedItemChangeEventArgs\n} from '../tabs.directive'\n\n/* NOTE: Tabs directives collection for ease-of-use import in standalone components scenario */\nexport const IGX_TABS_DIRECTIVES = [\n IgxTabsComponent,\n IgxTabItemComponent,\n IgxTabHeaderComponent,\n IgxTabContentComponent,\n IgxTabHeaderLabelDirective,\n IgxTabHeaderIconDirective,\n IgxPrefixDirective,\n IgxSuffixDirective\n] as const;\n","import { NgModule } from '@angular/core';\nimport { IGX_TABS_DIRECTIVES } from './public_api';\n\n/**\n * @hidden\n * IMPORTANT: The following is NgModule exported for backwards-compatibility before standalone components\n */\n@NgModule({\n imports: [\n ...IGX_TABS_DIRECTIVES\n ],\n exports: [\n ...IGX_TABS_DIRECTIVES\n ]\n})\nexport class IgxTabsModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["ɵIgxDirectionality","i1.IgxTabsComponent","i2.IgxTabItemComponent","i3.IgxTabHeaderComponent","i4.IgxTabContentComponent","i5.IgxTabHeaderLabelDirective","i5.IgxTabHeaderIconDirective"],"mappings":"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