{"version":3,"names":["CSS","container","content","tabCss","CalciteTabStyle0","Tab","this","guid","render","id","el","h","Host","key","labeledBy","class","scale","role","tabIndex","selected","connectedCallback","parentTabsEl","closest","disconnectedCallback","document","body","dispatchEvent","CustomEvent","detail","internalTabChangeHandler","event","targetTabsEl","composedPath","find","tagName","tab","getTabIndex","then","index","stopPropagation","Array","prototype","indexOf","call","nodeListToArray","parentElement","children","filter","matches","updateAriaInfo","tabIds","titleIds","ICON","chevronRight","chevronLeft","containerHasEndTabTitleOverflow","containerHasStartTabTitleOverflow","scrollButton","scrollButtonContainer","scrollBackwardContainerButton","scrollForwardContainerButton","tabTitleSlotWrapper","tabNavCss","CalciteTabNavStyle0","TabNav","effectiveDir","lastScrollWheelAxis","resizeObserver","createObserver","updateScrollingState","onTabTitleWheel","preventDefault","deltaX","deltaY","x","Math","abs","y","scrollBy","scrollByX","currentTarget","onSlotChange","intersectionObserver","disconnect","slottedElements","slotChangeGetAssignedElements","forEach","child","observe","calciteInternalTabNavSlotChange","emit","storeTabTitleWrapperRef","tabTitleContainerEl","root","threshold","scrollToTabTitles","direction","readTask","tabTitleContainer","containerBounds","getBoundingClientRect","tabTitles","from","querySelectorAll","reverse","closestToEdge","tabTitle","tabTitleBounds","containerEndX","width","tabTitleEndX","afterContainerEnd","crossingContainerEnd","beforeContainerStart","crossingContainerStart","scrollerButtonWidth","offsetAdjustment","offsetWidth","clientWidth","scrollTo","offsetLeft","left","behavior","scrollToNextTabTitles","scrollToPreviousTabTitles","handleTabFocus","destination","focused","focusElementInGroup","enabledTabTitles","scrollTabTitleIntoView","onTabTitleScroll","renderScrollButton","overflowDirection","bordered","messages","hasOverflowingStartTabTitle","hasOverflowingEndTabTitle","isEnd","hidden","appearance","nextTabTitles","previousTabTitles","iconFlipRtl","iconStart","kind","onClick","selectedTitleChanged","calciteInternalTabChange","selectedTabId","onMessagesChange","connectLocalized","connectMessages","componentWillLoad","storageKey","storageId","localStorage","getItem","storedTab","JSON","parse","setUpMessages","componentDidLoad","selectedTitle","componentWillRender","layout","getElementDir","componentDidRender","length","every","title","getTabIdentifier","disconnectLocalized","disconnectMessages","position","CSS_UTILITY","rtl","onScroll","onWheel","ref","onSlotchange","focusPreviousTabHandler","target","focusNextTabHandler","focusFirstTabHandler","focusLastTabHandler","internalActivateTabHandler","activatedTabTitle","getIndexOfTabTitle","isLTR","scrollPosition","scrollLeft","overflowingStartTabTitle","overflowingEndTabTitle","right","activateTabHandler","calciteTabChange","internalCloseTabHandler","closedTabTitleEl","handleTabTitleClose","updateTabTitles","getTabTitleById","globalInternalTabChangeHandler","syncId","effectiveLocaleChange","updateMessages","effectiveLocale","selectedTabIdChanged","undefined","setItem","stringify","parseInt","calciteSize24","calciteSize32","calciteSize44","isOverflowStart","isOverflowEnd","visibleWidth","totalContentWidth","scrollWidth","Promise","all","map","ids","filterDirectChildren","closed","selectionModified","visibleTabTitlesIndices","reduce","tabTitleIndices","totalVisibleTabTitles","closable","activateTab","closedTabTitleIndex","findIndex","nextTabTitleIndex","value","requestAnimationFrame","focus","closeButton","containerBottom","contentHasText","iconEnd","iconPresent","titleIcon","selectedIndicator","ICONS","close","tabTitleCss","CalciteTabTitleStyle0","TabTitle","closeClickHandler","closeTabTitleAndNotify","mutationObserver","updateHasText","calciteInternalTabIconChanged","selectedHandler","setupTextContentObserver","isBrowser","iconStartEl","flipRtl","icon","getIconScale","iconEndEl","controls","toAriaBoolean","disabled","InteractiveContainer","hasText","renderCloseButton","closeButtonEl","type","calciteInternalTabTitleRegister","updateHostInteraction","keyDownHandler","includes","calciteInternalTabsFocusNext","calciteInternalTabsFocusPrevious","calciteInternalTabsFocusFirst","calciteInternalTabsFocusLast","userTriggered","payload","calciteInternalTabsActivate","calciteTabsActivate","textContent","trim","childList","subtree","calciteInternalTabsClose","calciteTabsClose","SLOTS","titleGroup","tabsCss","CalciteTabsStyle0","Tabs","defaultSlotChangeHandler","tabs","setDefaultSlotRef","slotEl","handleInheritableProps","updateItems","calciteInternalTabNavSlotChangeHandler","titles","titlesWatcher","updateAriaSettings","tabsWatcher","getSlotAssignedElements","some","sort","a","b","localeCompare","tabDomIndexes","titleDomIndexes","indexInDOM","registryIndex","nav","querySelector","Fragment","name"],"sources":["src/components/tab/resources.ts","src/components/tab/tab.scss?tag=calcite-tab&encapsulation=shadow","src/components/tab/tab.tsx","src/components/tab-nav/resources.ts","src/components/tab-nav/tab-nav.scss?tag=calcite-tab-nav&encapsulation=shadow","src/components/tab-nav/tab-nav.tsx","src/components/tab-title/resources.ts","src/components/tab-title/tab-title.scss?tag=calcite-tab-title&encapsulation=shadow","src/components/tab-title/tab-title.tsx","src/components/tabs/resources.ts","src/components/tabs/tabs.scss?tag=calcite-tabs&encapsulation=shadow","src/components/tabs/tabs.tsx"],"sourcesContent":["export const CSS = {\n container: \"container\",\n content: \"content\",\n};\n","/**\n * CSS Custom Properties\n *\n * These properties can be overridden using the component's tag as selector.\n *\n * @prop --calcite-tab-content-block-padding: Specifies the block padding of the component's content in the `default` slot.\n */\n\n:host([selected]) {\n section,\n .container {\n @apply block;\n }\n}\n\n:host {\n @apply hidden h-full w-full;\n}\n\n:host([selected]) {\n @apply block h-full w-full overflow-auto;\n}\n\n.content {\n @apply box-border;\n padding-block: var(--calcite-internal-tab-content-block-padding);\n}\n\n.scale-s {\n --calcite-internal-tab-content-block-padding: var(--calcite-tab-content-block-padding, theme(\"spacing.1\"));\n @apply text-n2h;\n}\n\n.scale-m {\n --calcite-internal-tab-content-block-padding: var(--calcite-tab-content-block-padding, theme(\"spacing.2\"));\n @apply text-n1h;\n}\n\n.scale-l {\n --calcite-internal-tab-content-block-padding: var(--calcite-tab-content-block-padding, theme(\"spacing.[2.5]\"));\n @apply text-0h;\n}\n\nsection,\n.container {\n @apply hidden h-full w-full;\n}\n\n.container {\n @apply focus-base;\n\n &:focus {\n @apply focus-inset;\n }\n}\n\n@include base-component();\n","import { Component, Element, h, Host, Listen, Method, Prop, State, VNode } from \"@stencil/core\";\nimport { nodeListToArray } from \"../../utils/dom\";\nimport { guid } from \"../../utils/guid\";\nimport { Scale } from \"../interfaces\";\nimport { CSS } from \"./resources\";\nimport { TabChangeEventDetail } from \"./interfaces\";\n\n/**\n * @slot - A slot for adding custom content.\n */\n@Component({\n tag: \"calcite-tab\",\n styleUrl: \"tab.scss\",\n shadow: true,\n})\nexport class Tab {\n //--------------------------------------------------------------------------\n //\n // Properties\n //\n //--------------------------------------------------------------------------\n\n /**\n * Specifies a unique name for the component.\n *\n * When specified, use the same value on the `calcite-tab-title`.\n */\n @Prop({ reflect: true }) tab: string;\n\n /**\n * When `true`, the component's contents are selected.\n *\n * Only one tab can be selected within the `calcite-tabs` parent.\n */\n @Prop({ reflect: true, mutable: true }) selected = false;\n\n /**\n * Specifies the size of the component inherited from the parent `calcite-tabs`, defaults to `m`.\n *\n * @internal\n */\n @Prop() scale: Scale = \"m\";\n\n //--------------------------------------------------------------------------\n //\n // Lifecycle\n //\n //--------------------------------------------------------------------------\n\n render(): VNode {\n const id = this.el.id || this.guid;\n\n return (\n \n \n \n \n \n \n \n );\n }\n\n connectedCallback(): void {\n this.parentTabsEl = this.el.closest(\"calcite-tabs\");\n }\n\n disconnectedCallback(): void {\n // Dispatching to body in order to be listened by other elements that are still connected to the DOM.\n document.body?.dispatchEvent(\n new CustomEvent(\"calciteTabUnregister\", {\n detail: this.el,\n }),\n );\n }\n\n //--------------------------------------------------------------------------\n //\n // Event Listeners\n //\n //--------------------------------------------------------------------------\n\n @Listen(\"calciteInternalTabChange\", { target: \"body\" })\n internalTabChangeHandler(event: CustomEvent): void {\n const targetTabsEl = event\n .composedPath()\n .find((el: HTMLElement) => el.tagName === \"CALCITE-TABS\");\n\n // to allow `` to be nested we need to make sure this\n // `calciteTabChange` event was actually fired from a within the same\n // `` that is the a parent of this tab.\n if (targetTabsEl !== this.parentTabsEl) {\n return;\n }\n\n if (this.tab) {\n this.selected = this.tab === event.detail.tab;\n } else {\n this.getTabIndex().then((index) => {\n this.selected = index === event.detail.tab;\n });\n }\n event.stopPropagation();\n }\n\n //--------------------------------------------------------------------------\n //\n // Public Methods\n //\n //--------------------------------------------------------------------------\n\n /**\n * Returns the index of the component item within the tab array.\n */\n @Method()\n async getTabIndex(): Promise {\n return Array.prototype.indexOf.call(\n nodeListToArray(this.el.parentElement.children).filter((el) => el.matches(\"calcite-tab\")),\n this.el,\n );\n }\n\n //--------------------------------------------------------------------------\n //\n // Private State/Props\n //\n //--------------------------------------------------------------------------\n\n @Element() el: HTMLCalciteTabElement;\n\n parentTabsEl: HTMLCalciteTabsElement;\n\n guid = `calcite-tab-title-${guid()}`;\n\n @State() labeledBy: string;\n\n //--------------------------------------------------------------------------\n //\n // Private Methods\n //\n //--------------------------------------------------------------------------\n\n /**\n * @param tabIds\n * @param titleIds\n * @internal\n */\n @Method()\n async updateAriaInfo(tabIds: string[] = [], titleIds: string[] = []): Promise {\n this.labeledBy = titleIds[tabIds.indexOf(this.el.id)] || null;\n }\n}\n","export const ICON = {\n chevronRight: \"chevron-right\",\n chevronLeft: \"chevron-left\",\n} as const;\n\nexport const CSS = {\n container: \"tab-nav\",\n containerHasEndTabTitleOverflow: \"tab-nav--end-overflow\",\n containerHasStartTabTitleOverflow: \"tab-nav--start-overflow\",\n scrollButton: \"scroll-button\",\n scrollButtonContainer: \"scroll-button-container\",\n scrollBackwardContainerButton: \"scroll-button-container--backward\",\n scrollForwardContainerButton: \"scroll-button-container--forward\",\n tabTitleSlotWrapper: \"tab-titles-slot-wrapper\",\n};\n",":host {\n --calcite-internal-tab-nav-gradient-start-side: left;\n --calcite-internal-tab-nav-gradient-end-side: right;\n\n @apply relative flex;\n}\n\n.scale-s {\n --calcite-internal-tab-nav-scroller-button-width: #{$calcite-size-24};\n min-block-size: theme(\"spacing.6\");\n}\n\n.scale-m {\n --calcite-internal-tab-nav-scroller-button-width: #{$calcite-size-32};\n min-block-size: theme(\"spacing.8\");\n}\n\n.scale-l {\n --calcite-internal-tab-nav-scroller-button-width: #{$calcite-size-44};\n min-block-size: theme(\"spacing.11\");\n}\n\n.calcite--rtl {\n --calcite-internal-tab-nav-gradient-start-side: right;\n --calcite-internal-tab-nav-gradient-end-side: left;\n}\n\n$last-mask-color-stop-position: 51%; // we go beyond the half point to ensure the mask color stops overlap when both start and end are overflowing\n\n.tab-nav--start-overflow {\n .tab-titles-slot-wrapper {\n mask-image: linear-gradient(\n to var(--calcite-internal-tab-nav-gradient-end-side),\n transparent,\n transparent var(--calcite-internal-tab-nav-scroller-button-width),\n white var(--calcite-internal-tab-nav-scroller-button-width),\n white $last-mask-color-stop-position\n );\n }\n}\n\n.tab-nav--end-overflow {\n .tab-titles-slot-wrapper {\n mask-image: linear-gradient(\n to var(--calcite-internal-tab-nav-gradient-start-side),\n transparent,\n transparent var(--calcite-internal-tab-nav-scroller-button-width),\n white var(--calcite-internal-tab-nav-scroller-button-width),\n white $last-mask-color-stop-position\n );\n }\n}\n\n.tab-nav--start-overflow.tab-nav--end-overflow {\n .tab-titles-slot-wrapper {\n mask-image: linear-gradient(\n to var(--calcite-internal-tab-nav-gradient-end-side),\n transparent,\n transparent var(--calcite-internal-tab-nav-scroller-button-width),\n white var(--calcite-internal-tab-nav-scroller-button-width),\n white $last-mask-color-stop-position,\n transparent $last-mask-color-stop-position\n ),\n linear-gradient(\n to var(--calcite-internal-tab-nav-gradient-start-side),\n transparent,\n transparent var(--calcite-internal-tab-nav-scroller-button-width),\n white var(--calcite-internal-tab-nav-scroller-button-width),\n white $last-mask-color-stop-position,\n transparent $last-mask-color-stop-position\n );\n }\n}\n\n.tab-nav::-webkit-scrollbar {\n display: none;\n -ms-overflow-style: none;\n scrollbar-width: none;\n}\n\n:host([layout=\"center\"]) {\n ::slotted(calcite-tab-title) {\n display: flex;\n flex-grow: 1;\n flex-shrink: 0;\n min-inline-size: auto;\n white-space: nowrap;\n }\n\n ::slotted(calcite-tab-title[selected]) {\n overflow: unset;\n }\n}\n\n:host(:not([bordered])) {\n .scale-l {\n --calcite-internal-tab-nav-gap: var(--calcite-size-xxl);\n }\n .scale-m {\n --calcite-internal-tab-nav-gap: var(--calcite-size-xl);\n }\n .scale-s {\n --calcite-internal-tab-nav-gap: var(--calcite-size-lg);\n }\n\n .tab-titles-slot-wrapper {\n gap: var(--calcite-internal-tab-nav-gap);\n }\n}\n\n:host([layout=\"center\"]:not([bordered])) {\n .tab-titles-slot-wrapper {\n padding-inline: var(--calcite-spacing-xxl);\n }\n}\n\n.tab-nav,\n.tab-titles-slot-wrapper {\n @apply flex\n w-full\n justify-start\n whitespace-nowrap\n overflow-hidden;\n}\n\n.scroll-button-container {\n @apply absolute bottom-0 top-0;\n\n calcite-button {\n --calcite-offset-invert-focus: 1;\n --calcite-color-text-1: var(--calcite-color-text-3);\n\n block-size: 100%;\n\n &:hover {\n --calcite-color-text-1: unset;\n --calcite-color-foreground-1: var(--calcite-color-transparent-hover);\n --calcite-color-foreground-3: var(--calcite-color-transparent);\n }\n }\n}\n\n.scroll-button-container--forward {\n inset-inline-end: 0;\n z-index: var(--calcite-z-index);\n}\n\n.scroll-button-container--backward {\n inset-inline-start: 0;\n z-index: var(--calcite-z-index);\n}\n\n:host(:not([bordered])) {\n .scroll-button-container--backward,\n .scroll-button-container--forward {\n &::before {\n background-color: var(--calcite-color-border-3);\n content: \"\";\n inline-size: var(--calcite-border-width-sm);\n inset-block-start: var(--calcite-border-width-md);\n inset-block-end: var(--calcite-border-width-md);\n position: absolute;\n }\n }\n\n .scroll-button-container--backward::before {\n inset-inline-end: 0;\n }\n\n .scroll-button-container--forward::before {\n inset-inline-start: 0;\n }\n}\n\n@include base-component();\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n readTask,\n State,\n VNode,\n Watch,\n} from \"@stencil/core\";\nimport {\n calciteSize24,\n calciteSize32,\n calciteSize44,\n} from \"@esri/calcite-design-tokens/dist/es6/core\";\nimport {\n Direction,\n filterDirectChildren,\n focusElementInGroup,\n FocusElementInGroupDestination,\n getElementDir,\n slotChangeGetAssignedElements,\n} from \"../../utils/dom\";\nimport { createObserver } from \"../../utils/observers\";\nimport { Scale } from \"../interfaces\";\nimport { TabChangeEventDetail, TabCloseEventDetail } from \"../tab/interfaces\";\nimport { TabID, TabLayout, TabPosition } from \"../tabs/interfaces\";\nimport { connectLocalized, disconnectLocalized, LocalizedComponent } from \"../../utils/locale\";\nimport {\n connectMessages,\n disconnectMessages,\n setUpMessages,\n T9nComponent,\n updateMessages,\n} from \"../../utils/t9n\";\nimport { CSS_UTILITY } from \"../../utils/resources\";\nimport { CSS, ICON } from \"./resources\";\nimport { TabNavMessages } from \"./assets/tab-nav/t9n\";\n\n/**\n * @slot - A slot for adding `calcite-tab-title`s.\n */\n@Component({\n tag: \"calcite-tab-nav\",\n styleUrl: \"tab-nav.scss\",\n shadow: true,\n assetsDirs: [\"assets\"],\n})\nexport class TabNav implements LocalizedComponent, T9nComponent {\n //--------------------------------------------------------------------------\n //\n // Properties\n //\n //--------------------------------------------------------------------------\n\n /**\n * Specifies the name when saving selected `calcite-tab` data to `localStorage`.\n */\n @Prop({ reflect: true }) storageId: string;\n\n /**\n * Specifies text to update multiple components to keep in sync if one changes.\n */\n @Prop({ reflect: true }) syncId: string;\n\n /**\n * Specifies the component's selected `calcite-tab-title`.\n *\n * @readonly\n */\n @Prop({ mutable: true }) selectedTitle: HTMLCalciteTabTitleElement = null;\n\n @Watch(\"selectedTitle\")\n selectedTitleChanged(): void {\n this.calciteInternalTabChange.emit({\n tab: this.selectedTabId,\n });\n }\n\n /**\n * Specifies the size of the component inherited from the parent `calcite-tabs`, defaults to `m`.\n *\n * @internal\n */\n @Prop() scale: Scale = \"m\";\n\n /**\n * @internal\n */\n @Prop({ reflect: true, mutable: true }) layout: TabLayout = \"inline\";\n\n /**\n * Specifies the position of `calcite-tab-nav` and `calcite-tab-title` components in relation to, and is inherited from the parent `calcite-tabs`, defaults to `top`.\n *\n * @internal\n */\n @Prop() position: TabPosition = \"bottom\";\n\n /**\n * @internal\n */\n @Prop({ reflect: true, mutable: true }) bordered = false;\n\n /**\n * Made into a prop for testing purposes only.\n *\n * @internal\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messages: TabNavMessages;\n\n /**\n * Use this property to override individual strings used by the component.\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messageOverrides: Partial;\n\n @Watch(\"messageOverrides\")\n onMessagesChange(): void {\n /* wired up by t9n util */\n }\n\n //--------------------------------------------------------------------------\n //\n // Lifecycle\n //\n //--------------------------------------------------------------------------\n\n connectedCallback(): void {\n this.parentTabsEl = this.el.closest(\"calcite-tabs\");\n this.resizeObserver?.observe(this.el);\n connectLocalized(this);\n connectMessages(this);\n }\n\n async componentWillLoad(): Promise {\n const storageKey = `calcite-tab-nav-${this.storageId}`;\n if (localStorage && this.storageId && localStorage.getItem(storageKey)) {\n const storedTab = JSON.parse(localStorage.getItem(storageKey));\n this.selectedTabId = storedTab;\n }\n await setUpMessages(this);\n }\n\n componentDidLoad(): void {\n this.scrollTabTitleIntoView(this.selectedTitle, \"instant\");\n }\n\n componentWillRender(): void {\n const { parentTabsEl } = this;\n\n this.layout = parentTabsEl?.layout;\n this.bordered = parentTabsEl?.bordered;\n this.effectiveDir = getElementDir(this.el);\n }\n\n componentDidRender(): void {\n // if every tab title is active select the first tab.\n if (\n this.tabTitles.length &&\n this.tabTitles.every((title) => !title.selected) &&\n !this.selectedTabId\n ) {\n this.tabTitles[0].getTabIdentifier().then((tab) => {\n this.calciteInternalTabChange.emit({\n tab,\n });\n });\n }\n }\n\n disconnectedCallback(): void {\n this.resizeObserver?.disconnect();\n disconnectLocalized(this);\n disconnectMessages(this);\n }\n\n //--------------------------------------------------------------------------\n //\n // Render Methods\n //\n //--------------------------------------------------------------------------\n\n render(): VNode {\n return (\n \n \n {this.renderScrollButton(\"start\")}\n \n \n \n {this.renderScrollButton(\"end\")}\n \n \n );\n }\n\n //--------------------------------------------------------------------------\n //\n // Event Listeners\n //\n //--------------------------------------------------------------------------\n\n @Listen(\"calciteInternalTabsFocusPrevious\")\n focusPreviousTabHandler(event: CustomEvent): void {\n this.handleTabFocus(event, event.target as HTMLCalciteTabTitleElement, \"previous\");\n }\n\n @Listen(\"calciteInternalTabsFocusNext\")\n focusNextTabHandler(event: CustomEvent): void {\n this.handleTabFocus(event, event.target as HTMLCalciteTabTitleElement, \"next\");\n }\n\n @Listen(\"calciteInternalTabsFocusFirst\")\n focusFirstTabHandler(event: CustomEvent): void {\n this.handleTabFocus(event, event.target as HTMLCalciteTabTitleElement, \"first\");\n }\n\n @Listen(\"calciteInternalTabsFocusLast\")\n focusLastTabHandler(event: CustomEvent): void {\n this.handleTabFocus(event, event.target as HTMLCalciteTabTitleElement, \"last\");\n }\n\n @Listen(\"calciteInternalTabsActivate\")\n internalActivateTabHandler(event: CustomEvent): void {\n const activatedTabTitle = event.target as HTMLCalciteTabTitleElement;\n\n this.selectedTabId = event.detail.tab\n ? event.detail.tab\n : this.getIndexOfTabTitle(activatedTabTitle);\n event.stopPropagation();\n\n this.selectedTitle = activatedTabTitle;\n this.scrollTabTitleIntoView(activatedTabTitle);\n }\n\n private scrollTabTitleIntoView(\n activatedTabTitle: HTMLCalciteTabTitleElement,\n behavior: ScrollBehavior = \"smooth\",\n ): void {\n if (!activatedTabTitle) {\n return;\n }\n\n readTask(() => {\n const isLTR = this.effectiveDir === \"ltr\";\n const tabTitleContainer = this.tabTitleContainerEl;\n const containerBounds = tabTitleContainer.getBoundingClientRect();\n const tabTitleBounds = activatedTabTitle.getBoundingClientRect();\n const scrollPosition = tabTitleContainer.scrollLeft;\n const overflowingStartTabTitle = isLTR\n ? this.hasOverflowingStartTabTitle\n : this.hasOverflowingEndTabTitle;\n const overflowingEndTabTitle = isLTR\n ? this.hasOverflowingEndTabTitle\n : this.hasOverflowingStartTabTitle;\n\n if (\n tabTitleBounds.left <\n containerBounds.left + (overflowingStartTabTitle ? this.scrollerButtonWidth : 0)\n ) {\n const left =\n scrollPosition + (tabTitleBounds.left - containerBounds.left) - this.scrollerButtonWidth;\n tabTitleContainer.scrollTo({ left, behavior });\n } else if (\n tabTitleBounds.right >\n containerBounds.right - (overflowingEndTabTitle ? this.scrollerButtonWidth : 0)\n ) {\n const left =\n scrollPosition +\n (tabTitleBounds.right - containerBounds.right) +\n this.scrollerButtonWidth;\n tabTitleContainer.scrollTo({ left, behavior });\n }\n });\n }\n\n @Listen(\"calciteTabsActivate\")\n activateTabHandler(event: CustomEvent): void {\n this.calciteTabChange.emit();\n event.stopPropagation();\n }\n\n @Listen(\"calciteInternalTabsClose\")\n internalCloseTabHandler(event: CustomEvent): void {\n const closedTabTitleEl = event.target as HTMLCalciteTabTitleElement;\n this.handleTabTitleClose(closedTabTitleEl);\n event.stopPropagation();\n }\n\n /**\n * Check for active tabs on register and update selected\n *\n * @param event\n */\n @Listen(\"calciteInternalTabTitleRegister\")\n async updateTabTitles(event: CustomEvent): Promise {\n if ((event.target as HTMLCalciteTabTitleElement).selected) {\n this.selectedTabId = event.detail;\n this.selectedTitle = await this.getTabTitleById(this.selectedTabId);\n }\n }\n\n @Listen(\"calciteInternalTabChange\", { target: \"body\" })\n globalInternalTabChangeHandler(event: CustomEvent): void {\n if (\n this.syncId &&\n event.target !== this.el &&\n (event.target as HTMLCalciteTabNavElement).syncId === this.syncId &&\n this.selectedTabId !== event.detail.tab\n ) {\n this.selectedTabId = event.detail.tab;\n }\n event.stopPropagation();\n }\n\n //--------------------------------------------------------------------------\n //\n // Events\n //\n //--------------------------------------------------------------------------\n\n /**\n * Emits when the selected `calcite-tab` changes.\n */\n @Event({ cancelable: false }) calciteTabChange: EventEmitter;\n\n /**\n * @internal\n */\n @Event() calciteInternalTabNavSlotChange: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabChange: EventEmitter;\n\n //--------------------------------------------------------------------------\n //\n // Private State/Props\n //\n //--------------------------------------------------------------------------\n\n @Element() el: HTMLCalciteTabNavElement;\n\n @State() defaultMessages: TabNavMessages;\n\n @State() effectiveLocale = \"\";\n\n @Watch(\"effectiveLocale\")\n effectiveLocaleChange(): void {\n updateMessages(this, this.effectiveLocale);\n }\n\n @State() private hasOverflowingStartTabTitle = false;\n\n @State() private hasOverflowingEndTabTitle = false;\n\n @State() private selectedTabId: TabID;\n\n @Watch(\"selectedTabId\")\n async selectedTabIdChanged(): Promise {\n if (\n localStorage &&\n this.storageId &&\n this.selectedTabId !== undefined &&\n this.selectedTabId !== null\n ) {\n localStorage.setItem(`calcite-tab-nav-${this.storageId}`, JSON.stringify(this.selectedTabId));\n }\n\n this.calciteInternalTabChange.emit({\n tab: this.selectedTabId,\n });\n }\n\n private effectiveDir: Direction = \"ltr\";\n\n private lastScrollWheelAxis: \"x\" | \"y\" = \"x\";\n\n private parentTabsEl: HTMLCalciteTabsElement;\n\n private tabTitleContainerEl: HTMLDivElement;\n\n private intersectionObserver: IntersectionObserver;\n\n private resizeObserver = createObserver(\"resize\", () => {\n this.updateScrollingState();\n });\n\n private get scrollerButtonWidth(): number {\n const { scale } = this;\n return parseInt(scale === \"s\" ? calciteSize24 : scale === \"m\" ? calciteSize32 : calciteSize44);\n }\n\n //--------------------------------------------------------------------------\n //\n // Private Methods\n //\n //--------------------------------------------------------------------------\n\n private onTabTitleWheel = (event: WheelEvent): void => {\n event.preventDefault();\n\n const { deltaX, deltaY } = event;\n const x = Math.abs(deltaX);\n const y = Math.abs(deltaY);\n\n let scrollBy: number;\n\n if (x === y) {\n scrollBy = this.lastScrollWheelAxis === \"x\" ? deltaX : deltaY;\n } else if (x > y) {\n scrollBy = deltaX;\n this.lastScrollWheelAxis = \"x\";\n } else {\n scrollBy = deltaY;\n this.lastScrollWheelAxis = \"y\";\n }\n\n const scrollByX = (this.effectiveDir === \"rtl\" ? -1 : 1) * scrollBy;\n (event.currentTarget as HTMLDivElement).scrollBy(scrollByX, 0);\n };\n\n private onSlotChange = (event: Event): void => {\n this.intersectionObserver?.disconnect();\n\n const slottedElements = slotChangeGetAssignedElements(event, \"calcite-tab-title\");\n slottedElements.forEach((child) => {\n this.intersectionObserver?.observe(child);\n });\n this.calciteInternalTabNavSlotChange.emit(slottedElements);\n };\n\n private storeTabTitleWrapperRef = (el: HTMLDivElement) => {\n this.tabTitleContainerEl = el;\n this.intersectionObserver = createObserver(\"intersection\", () => this.updateScrollingState(), {\n root: el,\n threshold: [0, 0.5, 1],\n });\n };\n\n private updateScrollingState(): void {\n const tabTitleContainer = this.tabTitleContainerEl;\n\n if (!tabTitleContainer) {\n return;\n }\n\n let isOverflowStart: boolean;\n let isOverflowEnd: boolean;\n\n const scrollPosition = tabTitleContainer.scrollLeft;\n const visibleWidth = tabTitleContainer.clientWidth;\n const totalContentWidth = tabTitleContainer.scrollWidth;\n\n if (this.effectiveDir === \"ltr\") {\n isOverflowStart = scrollPosition > 0;\n isOverflowEnd = scrollPosition + visibleWidth < totalContentWidth;\n } else {\n isOverflowStart = scrollPosition < 0;\n isOverflowEnd = scrollPosition !== -(totalContentWidth - visibleWidth);\n }\n\n this.hasOverflowingStartTabTitle = isOverflowStart;\n this.hasOverflowingEndTabTitle = isOverflowEnd;\n }\n\n private scrollToTabTitles = (direction: \"forward\" | \"backward\"): void => {\n readTask(() => {\n const tabTitleContainer = this.tabTitleContainerEl;\n const containerBounds = tabTitleContainer.getBoundingClientRect();\n const tabTitles = Array.from(this.el.querySelectorAll(\"calcite-tab-title\"));\n const { effectiveDir } = this;\n\n if (direction === \"forward\") {\n tabTitles.reverse();\n }\n\n let closestToEdge: HTMLCalciteTabTitleElement = null;\n\n tabTitles.forEach((tabTitle) => {\n const tabTitleBounds = tabTitle.getBoundingClientRect();\n const containerEndX = containerBounds.x + containerBounds.width;\n const tabTitleEndX = tabTitleBounds.x + tabTitleBounds.width;\n\n if (\n (direction === \"forward\" && effectiveDir === \"ltr\") ||\n (direction === \"backward\" && effectiveDir === \"rtl\")\n ) {\n const afterContainerEnd = tabTitleBounds.x > containerEndX;\n\n if (afterContainerEnd) {\n closestToEdge = tabTitle;\n } else {\n const crossingContainerEnd =\n tabTitleEndX > containerEndX && tabTitleBounds.x > containerBounds.x;\n\n if (crossingContainerEnd) {\n closestToEdge = tabTitle;\n }\n }\n } else {\n const beforeContainerStart = tabTitleEndX < containerBounds.x;\n\n if (beforeContainerStart) {\n closestToEdge = tabTitle;\n } else {\n const crossingContainerStart =\n tabTitleEndX < containerEndX && tabTitleBounds.x < containerBounds.x;\n\n if (crossingContainerStart) {\n closestToEdge = tabTitle;\n }\n }\n }\n });\n\n if (closestToEdge) {\n const { scrollerButtonWidth } = this;\n const offsetAdjustment =\n (direction === \"forward\" && effectiveDir === \"ltr\") ||\n (direction === \"backward\" && effectiveDir === \"rtl\")\n ? -scrollerButtonWidth\n : closestToEdge.offsetWidth - tabTitleContainer.clientWidth + scrollerButtonWidth;\n const scrollTo = closestToEdge.offsetLeft + offsetAdjustment;\n\n tabTitleContainer.scrollTo({\n left: scrollTo,\n behavior: \"smooth\",\n });\n }\n });\n };\n\n private scrollToNextTabTitles = (): void => this.scrollToTabTitles(\"forward\");\n\n private scrollToPreviousTabTitles = (): void => this.scrollToTabTitles(\"backward\");\n\n handleTabFocus = (\n event: CustomEvent,\n el: HTMLCalciteTabTitleElement,\n destination: FocusElementInGroupDestination,\n ): void => {\n const focused = focusElementInGroup(\n this.enabledTabTitles,\n el,\n destination,\n );\n this.scrollTabTitleIntoView(focused, \"instant\");\n\n event.stopPropagation();\n };\n\n getIndexOfTabTitle(el: HTMLCalciteTabTitleElement, tabTitles = this.tabTitles): number {\n // In most cases, since these indexes correlate with tab contents, we want to consider all tab titles.\n // However, when doing relative index operations, it makes sense to pass in this.enabledTabTitles as the 2nd arg.\n return tabTitles.indexOf(el);\n }\n\n private onTabTitleScroll = (): void => {\n this.updateScrollingState();\n };\n\n async getTabTitleById(id: TabID): Promise {\n return Promise.all(this.tabTitles.map((el) => el.getTabIdentifier())).then((ids) => {\n return this.tabTitles[ids.indexOf(id)];\n });\n }\n\n get tabTitles(): HTMLCalciteTabTitleElement[] {\n return filterDirectChildren(this.el, \"calcite-tab-title\");\n }\n\n get enabledTabTitles(): HTMLCalciteTabTitleElement[] {\n return filterDirectChildren(\n this.el,\n \"calcite-tab-title:not([disabled])\",\n ).filter((tabTitle) => !tabTitle.closed);\n }\n\n private handleTabTitleClose(closedTabTitleEl: HTMLCalciteTabTitleElement): void {\n const { tabTitles } = this;\n const selectionModified = closedTabTitleEl.selected;\n\n const visibleTabTitlesIndices = tabTitles.reduce(\n (tabTitleIndices: number[], tabTitle, index) =>\n !tabTitle.closed ? [...tabTitleIndices, index] : tabTitleIndices,\n [],\n );\n const totalVisibleTabTitles = visibleTabTitlesIndices.length;\n\n if (totalVisibleTabTitles === 1 && tabTitles[visibleTabTitlesIndices[0]].closable) {\n tabTitles[visibleTabTitlesIndices[0]].closable = false;\n this.selectedTabId = visibleTabTitlesIndices[0];\n\n if (selectionModified) {\n tabTitles[visibleTabTitlesIndices[0]].activateTab();\n }\n } else if (totalVisibleTabTitles > 1) {\n const closedTabTitleIndex = tabTitles.findIndex((el) => el === closedTabTitleEl);\n\n const nextTabTitleIndex = visibleTabTitlesIndices.find(\n (value) => value > closedTabTitleIndex,\n );\n\n if (this.selectedTabId === closedTabTitleIndex) {\n this.selectedTabId = nextTabTitleIndex ? nextTabTitleIndex : totalVisibleTabTitles - 1;\n tabTitles[this.selectedTabId].activateTab();\n }\n }\n\n requestAnimationFrame(() => {\n tabTitles[this.selectedTabId].focus();\n });\n }\n\n private renderScrollButton = (overflowDirection: \"start\" | \"end\"): VNode => {\n const { bordered, messages, hasOverflowingStartTabTitle, hasOverflowingEndTabTitle, scale } =\n this;\n const isEnd = overflowDirection === \"end\";\n\n return (\n \n \n \n );\n };\n}\n","import { Scale } from \"../interfaces\";\n\nexport const CSS = {\n closeButton: \"close-button\",\n container: \"container\",\n containerBottom: \"container--bottom\",\n content: \"content\",\n contentHasText: \"content--has-text\",\n iconEnd: \"icon-end\",\n iconPresent: \"icon-present\",\n iconStart: \"icon-start\",\n titleIcon: \"calcite-tab-title--icon\",\n scale: (scale: Scale) => `scale-${scale}` as const,\n selectedIndicator: \"selected-indicator\",\n};\n\nexport const ICONS = {\n close: \"x\",\n} as const;\n",":host {\n @apply block outline-none;\n margin-inline-start: theme(\"margin.0\");\n}\n\n:host([layout=\"inline\"]) {\n @apply flex-initial;\n}\n\n:host([layout=\"center\"]) {\n @apply flex-auto;\n}\n\n.content {\n @apply flex items-center justify-center h-full mb-0.5 relative box-border;\n}\n\n.scale-s {\n .content {\n @apply text-n2h py-1;\n }\n .close-button {\n @apply w-5;\n }\n}\n\n.scale-m {\n .content {\n @apply text-n1h py-2;\n }\n .close-button {\n @apply w-7;\n }\n}\n\n.scale-l {\n .content {\n @apply text-0h py-2.5;\n }\n .close-button {\n @apply w-8;\n }\n}\n\n:host([closable]) .content {\n @apply border-b-color-transparent;\n}\n\n:host([layout=\"inline\"]),\n:host([layout=\"center\"]) {\n .content {\n @apply px-1;\n }\n}\n\n:host([layout=\"center\"]) .scale-s,\n:host([layout=\"center\"]) .scale-m,\n:host([layout=\"center\"]) .scale-l {\n @apply justify-center my-0 text-center;\n\n .content {\n @apply flex-auto flex-grow;\n }\n}\n\n.container {\n @apply relative \n box-border\n content-center\n cursor-pointer\n flex\n focus-base\n h-full\n justify-between\n px-0\n text-color-3\n text-n1h\n transition-default\n w-full;\n}\n\n.selected-indicator {\n @apply absolute\n block\n w-full\n h-0.5\n transition-default;\n inset-block-end: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n inline-size: 100%;\n}\n\n.container--bottom .selected-indicator {\n inset-block-end: unset;\n inset-block-start: 0;\n}\n\n:host([bordered]) .selected-indicator {\n inset-block-start: 0;\n inset-block-end: unset;\n inset-inline-start: -1px;\n inset-inline-end: 0;\n inline-size: calc(100% + var(--calcite-spacing-base));\n}\n\n:host([bordered]) .container:not(.container--bottom) {\n border-block-end: 1px solid transparent;\n}\n\n:host([bordered]:not([selected]):hover) .container:not(.container--bottom) {\n border-block-end: 1px solid var(--calcite-color-border-1);\n}\n\n:host([bordered]:not([selected]):hover:not(:focus)) {\n .selected-indicator {\n background-color: var(--calcite-color-foreground-2);\n }\n .container:not(.container--bottom) .selected-indicator {\n box-shadow: inset 0 1px var(--calcite-color-border-1);\n }\n .container.container--bottom .selected-indicator {\n box-shadow: inset 0 -1px var(--calcite-color-border-1);\n }\n}\n\n:host([bordered][selected]) .container::after {\n @apply absolute\n block\n w-full\n h-0.5\n transition-default;\n inset-block-end: -1px;\n inset-inline-start: 0;\n inset-inline-end: 0;\n inline-size: 100%;\n background: var(--calcite-color-foreground-1);\n content: \"\";\n}\n\n:host([bordered][selected]) .container.container--bottom::after {\n inset-block-start: -1px;\n}\n\n:host([bordered][selected]:hover) .container::after {\n background: var(--calcite-color-foreground-2);\n}\n\n:host([bordered][selected]:focus) .container::after {\n background: transparent;\n}\n\n:host([bordered]) .container--bottom .selected-indicator {\n inset-block-start: unset;\n inset-block-end: 0;\n}\n\n:host([selected]) .selected-indicator,\n:host([selected]:hover) .selected-indicator {\n @apply bg-brand;\n}\n\n:host(:hover) .selected-indicator {\n background-color: var(--calcite-color-border-3);\n}\n\n:host(:focus) .selected-indicator,\n:host(:active) .selected-indicator {\n background-color: var(--calcite-color-brand);\n}\n\n@media (forced-colors: active) {\n .selected-indicator {\n background-color: highlight;\n }\n}\n\n:host([closed]) {\n @apply hidden;\n}\n\n:host([selected]) .container {\n @apply text-color-1 border-color-transparent;\n}\n\n:host(:focus) .container {\n @apply focus-inset;\n\n &:focus-within {\n @apply focus-base;\n }\n}\n\n:host(:active),\n:host(:focus),\n:host(:hover) {\n a {\n @apply text-color-1 border-color-2 no-underline;\n }\n}\n\n@include disabled() {\n .container {\n @apply pointer-events-none opacity-50;\n }\n}\n\n.calcite-tab-title--icon {\n @apply relative\n m-0\n inline-flex\n self-center;\n & svg {\n @apply transition-default;\n }\n}\n\n.content--has-text {\n @apply p-1;\n}\n\n.content--has-text .calcite-tab-title--icon.icon-start {\n margin-inline-end: var(--calcite-spacing-sm);\n}\n\n.content--has-text .calcite-tab-title--icon.icon-end {\n margin-inline-start: var(--calcite-spacing-sm);\n}\n\n.close-button {\n @apply appearance-none\n bg-transparent\n border-none\n content-center\n cursor-pointer\n flex\n focus-base\n items-center\n justify-center\n h-full\n self-center\n text-color-3\n transition-default;\n margin-inline-start: var(--calcite-spacing-sm);\n margin-inline-end: var(--calcite-spacing-px);\n block-size: calc(100% - var(--calcite-spacing-xxs));\n\n &:focus {\n @apply focus-normal;\n }\n\n &:focus,\n &:hover {\n @apply text-color-1;\n background-color: var(--calcite-color-foreground-3);\n }\n\n &:active {\n @apply text-color-1;\n background-color: var(--calcite-color-foreground-3);\n }\n\n & calcite-icon {\n color: inherit;\n }\n}\n\n// compensate for spacing when no hastext and two icons\n:host([icon-start][icon-end]) {\n .calcite-tab-title--icon:first-child {\n margin-inline-end: var(--calcite-spacing-sm);\n }\n}\n\n// bordered styles\n:host([bordered]) .container {\n &:not(.container--bottom) .close-button {\n block-size: calc(100% - var(--calcite-spacing-px));\n margin-block-start: -1px;\n }\n .close-button {\n & calcite-icon {\n margin-block-start: var(--calcite-spacing-px);\n }\n\n &:focus,\n &:hover,\n &:active {\n box-shadow: 0 2px 0 0 var(--calcite-color-foreground-3);\n }\n }\n\n &.container--bottom .close-button {\n box-shadow: 0 -2px 0 0 transparent;\n & calcite-icon {\n margin-block-end: var(--calcite-spacing-px);\n }\n &:focus,\n &:hover,\n &:active {\n box-shadow: 0 -2px 0 0 var(--calcite-color-foreground-3);\n }\n }\n}\n\n:host([bordered][selected]) {\n box-shadow: inset 0 -1px var(--calcite-color-foreground-1);\n}\n\n:host([bordered]:not([selected])) .container .close-button {\n box-shadow: 0 2px 0 0 transparent;\n}\n\n:host([bordered]:hover) {\n .container {\n background-color: var(--calcite-color-foreground-2);\n }\n}\n\n:host([bordered]) .container {\n border-inline: var(--calcite-spacing-px) solid transparent;\n}\n\n:host([selected][bordered]) .container {\n border-inline-color: var(--calcite-color-border-1);\n}\n\n:host([layout=\"inline\"][bordered]),\n:host([layout=\"center\"][bordered]) {\n .scale-m {\n .content {\n @apply px-3;\n }\n }\n\n .scale-s {\n .content {\n @apply px-2;\n }\n }\n\n .scale-l {\n .content {\n @apply px-4;\n }\n }\n}\n\n:host([layout=\"inline\"][closable]) {\n .scale-s,\n .scale-m,\n .scale-l {\n .content {\n padding-inline-end: 0;\n }\n }\n}\n\n@media (forced-colors: active) {\n :host {\n outline-width: 0;\n outline-offset: 0;\n }\n\n :host(:focus) .container {\n outline-color: highlight;\n }\n\n :host([bordered]) .container {\n border-block-end-style: solid;\n }\n\n :host([bordered]) .container--bottom {\n border-block-start-style: solid;\n }\n\n :host([bordered][selected]) .container {\n border-block-end-style: none;\n }\n\n :host([bordered][selected]) .container--bottom {\n border-block-start-style: none;\n }\n\n .close-button {\n /* in high contrast the tab title outline covers the close button outline without a z-index */\n @apply z-default;\n }\n}\n\n@include base-component();\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n VNode,\n Watch,\n} from \"@stencil/core\";\nimport { getElementDir, toAriaBoolean, nodeListToArray } from \"../../utils/dom\";\nimport { guid } from \"../../utils/guid\";\nimport {\n InteractiveComponent,\n InteractiveContainer,\n updateHostInteraction,\n} from \"../../utils/interactive\";\nimport { createObserver } from \"../../utils/observers\";\nimport { FlipContext, Scale } from \"../interfaces\";\nimport { TabChangeEventDetail, TabCloseEventDetail } from \"../tab/interfaces\";\nimport { TabID, TabLayout, TabPosition } from \"../tabs/interfaces\";\nimport { connectLocalized, disconnectLocalized, LocalizedComponent } from \"../../utils/locale\";\nimport {\n connectMessages,\n disconnectMessages,\n setUpMessages,\n T9nComponent,\n updateMessages,\n} from \"../../utils/t9n\";\nimport { getIconScale } from \"../../utils/component\";\nimport { IconNameOrString } from \"../icon/interfaces\";\nimport { isBrowser } from \"../../utils/browser\";\nimport { TabTitleMessages } from \"./assets/tab-title/t9n\";\nimport { CSS, ICONS } from \"./resources\";\n\n/**\n * Tab-titles are optionally individually closable.\n */\n\n/**\n * @slot - A slot for adding text.\n */\n@Component({\n tag: \"calcite-tab-title\",\n styleUrl: \"tab-title.scss\",\n shadow: true,\n assetsDirs: [\"assets\"],\n})\nexport class TabTitle implements InteractiveComponent, LocalizedComponent, T9nComponent {\n //--------------------------------------------------------------------------\n //\n // Properties\n //\n //--------------------------------------------------------------------------\n\n /**\n * When `true`, the component and its respective `calcite-tab` contents are selected.\n *\n * Only one tab can be selected within the `calcite-tabs` parent.\n */\n @Prop({ reflect: true, mutable: true }) selected = false;\n\n @Watch(\"selected\")\n selectedHandler(): void {\n if (this.selected) {\n this.activateTab(false);\n }\n }\n\n /** When `true`, a close button is added to the component. */\n @Prop({ reflect: true }) closable = false;\n\n /** When `true`, does not display or position the component. */\n @Prop({ reflect: true, mutable: true }) closed = false;\n\n /** When `true`, interaction is prevented and the component is displayed with lower opacity. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Specifies an icon to display at the end of the component. */\n @Prop({ reflect: true }) iconEnd: IconNameOrString;\n\n /** Displays the `iconStart` and/or `iconEnd` as flipped when the element direction is right-to-left (`\"rtl\"`). */\n @Prop({ reflect: true }) iconFlipRtl: FlipContext;\n\n /** Specifies an icon to display at the start of the component. */\n @Prop({ reflect: true }) iconStart: IconNameOrString;\n\n /**\n * @internal\n */\n @Prop({ reflect: true, mutable: true }) layout: TabLayout;\n\n /**\n * Specifies the position of `calcite-tab-nav` and `calcite-tab-title` components in relation to, and is inherited from the parent `calcite-tabs`, defaults to `top`.\n *\n * @internal\n */\n @Prop() position: TabPosition = \"top\";\n\n /**\n * Specifies the size of the component inherited from the parent `calcite-tabs`, defaults to `m`.\n *\n * @internal\n */\n @Prop() scale: Scale = \"m\";\n\n /**\n * @internal\n */\n @Prop({ reflect: true, mutable: true }) bordered = false;\n\n /**\n * Specifies a unique name for the component.\n *\n * When specified, use the same value on the `calcite-tab`.\n */\n @Prop({ reflect: true }) tab: string;\n\n /**\n * Made into a prop for testing purposes only\n *\n * @internal\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messages: TabTitleMessages;\n\n /**\n * Use this property to override individual strings used by the component.\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messageOverrides: Partial;\n\n @Watch(\"messageOverrides\")\n onMessagesChange(): void {\n /* wired up by t9n util */\n }\n\n //--------------------------------------------------------------------------\n //\n // Lifecycle\n //\n //--------------------------------------------------------------------------\n\n connectedCallback(): void {\n connectLocalized(this);\n connectMessages(this);\n this.setupTextContentObserver();\n this.parentTabsEl = this.el.closest(\"calcite-tabs\");\n }\n\n disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n // Dispatching to body in order to be listened by other elements that are still connected to the DOM.\n document.body?.dispatchEvent(\n new CustomEvent(\"calciteTabTitleUnregister\", {\n detail: this.el,\n }),\n );\n this.resizeObserver?.disconnect();\n disconnectLocalized(this);\n disconnectMessages(this);\n }\n\n async componentWillLoad(): Promise {\n await setUpMessages(this);\n if (isBrowser()) {\n this.updateHasText();\n }\n if (this.tab && this.selected) {\n this.activateTab(false);\n }\n }\n\n componentWillRender(): void {\n if (this.parentTabsEl) {\n this.layout = this.parentTabsEl.layout;\n this.bordered = this.parentTabsEl.bordered;\n }\n }\n\n render(): VNode {\n const { el, closed } = this;\n const id = el.id || this.guid;\n\n const iconStartEl = (\n \n );\n\n const iconEndEl = (\n \n );\n\n return (\n \n \n this.resizeObserver?.observe(el)}\n >\n \n {this.iconStart ? iconStartEl : null}\n \n {this.iconEnd ? iconEndEl : null}\n \n {this.renderCloseButton()}\n \n \n \n \n );\n }\n\n renderCloseButton(): VNode {\n const { closable, messages } = this;\n\n return closable ? (\n (this.closeButtonEl = el)}\n title={messages.close}\n type=\"button\"\n >\n \n \n ) : null;\n }\n\n async componentDidLoad(): Promise {\n this.calciteInternalTabTitleRegister.emit(await this.getTabIdentifier());\n }\n\n componentDidRender(): void {\n updateHostInteraction(this);\n }\n\n //--------------------------------------------------------------------------\n //\n // Event Listeners\n //\n //--------------------------------------------------------------------------\n\n @Listen(\"calciteInternalTabChange\", { target: \"body\" })\n internalTabChangeHandler(event: CustomEvent): void {\n const targetTabsEl = event\n .composedPath()\n .find((el: HTMLElement) => el.tagName === \"CALCITE-TABS\");\n\n if (targetTabsEl !== this.parentTabsEl) {\n return;\n }\n\n if (this.tab) {\n this.selected = this.tab === event.detail.tab;\n } else {\n this.getTabIndex().then((index) => {\n this.selected = index === event.detail.tab;\n });\n }\n\n event.stopPropagation();\n }\n\n @Listen(\"click\")\n onClick(): void {\n this.activateTab();\n }\n\n @Listen(\"keydown\")\n keyDownHandler(event: KeyboardEvent): void {\n switch (event.key) {\n case \" \":\n case \"Enter\":\n if (!event.composedPath().includes(this.closeButtonEl)) {\n this.activateTab();\n event.preventDefault();\n }\n break;\n case \"ArrowRight\":\n event.preventDefault();\n if (getElementDir(this.el) === \"ltr\") {\n this.calciteInternalTabsFocusNext.emit();\n } else {\n this.calciteInternalTabsFocusPrevious.emit();\n }\n break;\n case \"ArrowLeft\":\n event.preventDefault();\n if (getElementDir(this.el) === \"ltr\") {\n this.calciteInternalTabsFocusPrevious.emit();\n } else {\n this.calciteInternalTabsFocusNext.emit();\n }\n break;\n case \"Home\":\n event.preventDefault();\n this.calciteInternalTabsFocusFirst.emit();\n break;\n case \"End\":\n event.preventDefault();\n this.calciteInternalTabsFocusLast.emit();\n break;\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Events\n //\n //--------------------------------------------------------------------------\n\n /**\n * Fires when a `calcite-tab` is selected.\n */\n @Event({ cancelable: false }) calciteTabsActivate: EventEmitter;\n\n /**\n * Fires when a `calcite-tab` is selected (`event.details`).\n *\n * @see [TabChangeEventDetail](https://github.com/Esri/calcite-design-system/blob/dev/src/components/tab/interfaces.ts#L1)\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabsActivate: EventEmitter;\n\n /**\n * Fires when a `calcite-tab` is closed.\n */\n @Event({ cancelable: false }) calciteTabsClose: EventEmitter;\n\n /**\n * Fires when `calcite-tab` is closed (`event.details`).\n *\n * @see [TabChangeEventDetail](https://github.com/Esri/calcite-design-system/blob/dev/src/components/tab/interfaces.ts)\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabsClose: EventEmitter;\n /**\n * @internal\n */\n\n @Event({ cancelable: false }) calciteInternalTabsFocusNext: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabsFocusPrevious: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabsFocusFirst: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabsFocusLast: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabTitleRegister: EventEmitter;\n\n /**\n * @internal\n */\n @Event({ cancelable: false }) calciteInternalTabIconChanged: EventEmitter;\n\n //--------------------------------------------------------------------------\n //\n // Public Methods\n //\n //--------------------------------------------------------------------------\n\n /**\n * Returns the index of the title within the `calcite-tab-nav`.\n */\n @Method()\n async getTabIndex(): Promise {\n return Array.prototype.indexOf.call(\n nodeListToArray(this.el.parentElement.children).filter((el) =>\n el.matches(\"calcite-tab-title\"),\n ),\n this.el,\n );\n }\n\n /**\n * @internal\n */\n @Method()\n async getTabIdentifier(): Promise {\n return this.tab ? this.tab : this.getTabIndex();\n }\n\n /**\n * @param tabIds\n * @param titleIds\n * @internal\n */\n @Method()\n async updateAriaInfo(tabIds: string[] = [], titleIds: string[] = []): Promise {\n this.controls = tabIds[titleIds.indexOf(this.el.id)] || null;\n }\n\n /**\n * This activates a tab in order for it and its associated tab-title be selected.\n *\n * @param userTriggered - when `true`, user-interaction events will be emitted in addition to internal events\n * @internal\n */\n @Method()\n async activateTab(userTriggered = true): Promise {\n if (this.disabled || this.closed) {\n return;\n }\n const payload = { tab: this.tab };\n this.calciteInternalTabsActivate.emit(payload);\n\n if (userTriggered) {\n // emit in the next frame to let internal events sync up\n requestAnimationFrame(() => this.calciteTabsActivate.emit());\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Private Methods\n //\n //--------------------------------------------------------------------------\n\n private closeClickHandler = (): void => {\n this.closeTabTitleAndNotify();\n };\n\n //--------------------------------------------------------------------------\n //\n // Private State/Props\n //\n //--------------------------------------------------------------------------\n\n @Element() el: HTMLCalciteTabTitleElement;\n\n /** watches for changing text content */\n mutationObserver: MutationObserver = createObserver(\"mutation\", () => this.updateHasText());\n\n @State() controls: string;\n\n @State() defaultMessages: TabTitleMessages;\n\n @State() effectiveLocale: \"\";\n\n @Watch(\"effectiveLocale\")\n effectiveLocaleChange(): void {\n updateMessages(this, this.effectiveLocale);\n }\n\n /** determine if there is slotted text for styling purposes */\n @State() hasText = false;\n\n closeButtonEl: HTMLButtonElement;\n\n parentTabsEl: HTMLCalciteTabsElement;\n\n resizeObserver = createObserver(\"resize\", () => {\n this.calciteInternalTabIconChanged.emit();\n });\n\n updateHasText(): void {\n this.hasText = this.el.textContent.trim().length > 0;\n }\n\n setupTextContentObserver(): void {\n this.mutationObserver?.observe(this.el, { childList: true, subtree: true });\n }\n\n closeTabTitleAndNotify(): void {\n this.closed = true;\n this.calciteInternalTabsClose.emit({ tab: this.tab });\n this.calciteTabsClose.emit();\n }\n\n guid = `calcite-tab-title-${guid()}`;\n}\n","export const SLOTS = {\n titleGroup: \"title-group\",\n};\n",":host {\n @apply flex flex-col;\n}\n\n:host([bordered]) {\n box-shadow: inset 0 1px 0 var(--calcite-color-border-1);\n background-color: var(--calcite-color-foreground-1);\n\n section {\n @apply border-color-1 border border-solid;\n }\n}\n\n:host([bordered][position=\"bottom\"]) {\n box-shadow:\n inset 0 1px 0 var(--calcite-color-border-1),\n inset 0 -1px 0 var(--calcite-color-border-1);\n}\n\n:host([bordered]:not([position=\"bottom\"])) ::slotted(calcite-tab-nav) {\n margin-block-end: -1px;\n}\n\n:host([bordered][scale=\"s\"]) section {\n @apply p-3;\n}\n\n:host([bordered][scale=\"m\"]) section {\n @apply p-2;\n}\n\n:host([bordered][scale=\"l\"]) section {\n @apply p-4;\n}\n\n:host([position=\"bottom\"]) {\n @apply flex-col-reverse;\n}\n\nsection {\n @apply border-t-color-1\n flex\n flex-grow\n overflow-hidden\n border-t;\n border-block-start-style: solid;\n}\n\n:host([position=\"bottom\"]) section {\n @apply border-b-color-1\n flex-col-reverse\n border-t-0\n border-b;\n}\n\n:host([position=\"bottom\"]:not([bordered])) section {\n border-block-end-style: solid;\n}\n\n@media (forced-colors: active) {\n :host([bordered]) section {\n @apply border-t-0\n border-b;\n }\n :host([position=\"bottom\"][bordered]) section {\n @apply border-t\n border-b-0;\n }\n}\n\n@include base-component();\n","import { Component, Element, Fragment, h, Listen, Prop, State, VNode, Watch } from \"@stencil/core\";\nimport { Scale } from \"../interfaces\";\nimport { getSlotAssignedElements, slotChangeGetAssignedElements } from \"../../utils/dom\";\nimport { TabLayout, TabPosition } from \"./interfaces\";\nimport { SLOTS } from \"./resources\";\n\n/**\n * @slot - A slot for adding `calcite-tab`s.\n * @slot title-group - A slot for adding a `calcite-tab-nav`.\n */\n@Component({\n tag: \"calcite-tabs\",\n styleUrl: \"tabs.scss\",\n shadow: true,\n})\nexport class Tabs {\n //--------------------------------------------------------------------------\n //\n // Public Properties\n //\n //--------------------------------------------------------------------------\n\n /**\n * Specifies the layout of the `calcite-tab-nav`, justifying the `calcite-tab-title`s to the start (`\"inline\"`), or across and centered (`\"center\"`).\n */\n @Prop({ reflect: true }) layout: TabLayout = \"inline\";\n\n /**\n * Specifies the position of `calcite-tab-nav` and `calcite-tab-title` components in relation to the `calcite-tabs`.\n */\n @Prop({ reflect: true }) position: TabPosition = \"top\";\n\n /**\n * Specifies the size of the component.\n */\n @Prop({ reflect: true }) scale: Scale = \"m\";\n\n @Watch(\"position\")\n @Watch(\"scale\")\n handleInheritableProps(): void {\n this.updateItems();\n }\n\n /**\n * When `true`, the component will display with a folder style menu.\n */\n @Prop() bordered = false;\n\n //--------------------------------------------------------------------------\n //\n // Event Listeners\n //\n //--------------------------------------------------------------------------\n\n @Listen(\"calciteInternalTabNavSlotChange\")\n calciteInternalTabNavSlotChangeHandler(event: CustomEvent): void {\n event.stopPropagation();\n if (event.detail.length !== this.titles.length) {\n this.titles = event.detail;\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Private State/Props\n //\n //--------------------------------------------------------------------------\n\n @Element() el: HTMLCalciteTabsElement;\n\n private defaultSlotChangeHandler = (event): void => {\n this.tabs = slotChangeGetAssignedElements(event, \"calcite-tab\");\n };\n\n private slotEl: HTMLSlotElement;\n\n /**\n *\n * Stores an array of ids of ``s to match up ARIA\n * attributes.\n */\n @State() titles: HTMLCalciteTabTitleElement[] = [];\n\n @Watch(\"titles\")\n titlesWatcher(): void {\n this.updateAriaSettings();\n this.updateItems();\n }\n\n /**\n *\n * Stores an array of ids of ``s to match up ARIA attributes.\n */\n @State() tabs: HTMLCalciteTabElement[] = [];\n\n @Watch(\"tabs\")\n tabsWatcher(): void {\n this.updateAriaSettings();\n this.updateItems();\n }\n\n //--------------------------------------------------------------------------\n //\n // Private Methods\n //\n //--------------------------------------------------------------------------\n\n /**\n *\n * Matches up elements from the internal `tabs` and `titles` to automatically\n * update the ARIA attributes and link `` and\n * `` components.\n */\n async updateAriaSettings(): Promise {\n let tabIds;\n let titleIds;\n const tabs = getSlotAssignedElements(this.slotEl, \"calcite-tab\");\n\n // determine if we are using `tab` based or `index` based tab identifiers.\n if (tabs.some((el) => el.tab) || this.titles.some((el) => el.tab)) {\n // if we are using `tab` based identifiers sort by `tab` to account for\n // possible out of order tabs and get the id of each tab\n tabIds = tabs.sort((a, b) => a.tab.localeCompare(b.tab)).map((el) => el.id);\n titleIds = this.titles.sort((a, b) => a.tab.localeCompare(b.tab)).map((el) => el.id);\n } else {\n // if we are using index based tabs then the `` and\n // `` might have been rendered out of order so the\n // order of `this.tabs` and `this.titles` might not reflect the DOM state,\n // and might not match each other so we need to get the index of all the\n // tabs and titles in the DOM order to match them up as a source of truth\n const tabDomIndexes = await Promise.all(tabs.map((el) => el.getTabIndex()));\n const titleDomIndexes = await Promise.all(this.titles.map((el) => el.getTabIndex()));\n\n // once we have the DOM order as a source of truth we can build the\n // matching tabIds and titleIds arrays\n tabIds = tabDomIndexes.reduce((ids, indexInDOM, registryIndex) => {\n ids[indexInDOM] = tabs[registryIndex].id;\n return ids;\n }, []);\n\n titleIds = titleDomIndexes.reduce((ids, indexInDOM, registryIndex) => {\n ids[indexInDOM] = this.titles[registryIndex].id;\n return ids;\n }, []);\n }\n\n // pass all our new aria information to each `` and\n // `` which will check if they can update their internal\n // `controlled` or `labeledBy` states and re-render if necessary\n tabs.forEach((el) => el.updateAriaInfo(tabIds, titleIds));\n this.titles.forEach((el) => el.updateAriaInfo(tabIds, titleIds));\n }\n\n private updateItems(): void {\n const { position, scale } = this;\n\n const nav = this.el.querySelector(\"calcite-tab-nav\");\n if (nav) {\n nav.position = position;\n nav.scale = scale;\n }\n\n Array.from(this.el.querySelectorAll(\"calcite-tab\")).forEach((tab: HTMLCalciteTabElement) => {\n if (tab.parentElement === this.el) {\n tab.scale = scale;\n }\n });\n\n Array.from(this.el.querySelectorAll(\"calcite-tab-nav > calcite-tab-title\")).forEach(\n (title: HTMLCalciteTabTitleElement) => {\n title.position = position;\n title.scale = scale;\n },\n );\n }\n\n private setDefaultSlotRef = (el) => (this.slotEl = el);\n\n //--------------------------------------------------------------------------\n //\n // Lifecycle\n //\n //--------------------------------------------------------------------------\n\n connectedCallback(): void {\n this.updateItems();\n }\n\n async componentWillLoad(): Promise {\n this.updateItems();\n }\n\n disconnectedCallback(): void {}\n\n render(): VNode {\n return (\n \n \n \n \n \n \n );\n }\n}\n"],"mappings":"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","ignoreList":[]}