{"version":3,"file":"skyux-tabs-testing.mjs","sources":["../../../../../libs/components/tabs/testing/src/legacy/tabs/tabset-fixture.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-nav-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-group-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-harness.ts","../../../../../libs/components/tabs/testing/src/skyux-tabs-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux-sdk/testing';\n\nimport { SkyTabsetFixtureTab } from './tab-fixture-tab';\n\n/**\n * Allows interaction with a SKY UX tabset component.\n * @deprecated Use `SkyTabsetHarness` instead.\n * @internal\n */\nexport class SkyTabsetFixture {\n  /**\n   * The tabset component's ARIA label.\n   */\n  public get ariaLabel(): string | undefined {\n    const tabsetEl = this.#getTabsetEl();\n    return tabsetEl.getAttribute('aria-label') || undefined;\n  }\n\n  /**\n   * The tabset component's ARIA labelled by attribute.\n   */\n  public get ariaLabelledBy(): string | undefined {\n    const tabsetEl = this.#getTabsetEl();\n    return tabsetEl.getAttribute('aria-labelledby') || undefined;\n  }\n\n  /**\n   * The index of the currently selected tab.\n   */\n  public get activeTabIndex(): number {\n    const tabLinkEls = this.#getTabLinkEls();\n\n    for (let i = 0, n = tabLinkEls.length; i < n; i++) {\n      if (tabLinkEls.item(i).classList.contains('sky-btn-tab-selected')) {\n        return i;\n      }\n    }\n\n    /* safety check */\n    /* istanbul ignore next */\n    return -1;\n  }\n\n  #debugEl: DebugElement;\n  #fixture: ComponentFixture<unknown>;\n\n  constructor(fixture: ComponentFixture<unknown>, skyTestId: string) {\n    this.#fixture = fixture;\n    this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n      fixture,\n      skyTestId,\n      'sky-tabset',\n    );\n  }\n\n  /**\n   * Retrieves information about the tab at the specified index.\n   * @param tabIndex The index of the tab.\n   */\n  public getTab(tabIndex: number): SkyTabsetFixtureTab {\n    const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n    const active = this.activeTabIndex === tabIndex;\n    const disabled = tabLinkEl.classList.contains('sky-btn-tab-disabled');\n    const tabHeading = this.#getTextContent(\n      tabLinkEl.querySelector('.sky-tab-heading span')?.childNodes[0],\n    );\n    const tabHeaderCount = this.#getTextContent(\n      tabLinkEl.querySelector('.sky-tab-header-count'),\n    );\n\n    let permalinkValue: string | undefined;\n\n    if (tabLinkEl.href) {\n      const permalink = tabLinkEl.href.split('?')[1];\n      if (permalink) {\n        const permalinkParts = permalink.split('=');\n\n        permalinkValue = decodeURIComponent(permalinkParts[1]);\n      }\n    }\n\n    return {\n      active,\n      disabled,\n      permalinkValue,\n      tabHeaderCount,\n      tabHeading,\n    };\n  }\n\n  /**\n   * Clicks the tabset's \"new\" button.\n   */\n  public async clickNewButton(): Promise<void> {\n    await this.#clickButton('sky-tabset-btn-new');\n  }\n\n  /**\n   * Clicks the tabset's \"open\" button.\n   */\n  public async clickOpenButton(): Promise<void> {\n    await this.#clickButton('sky-tabset-btn-open');\n  }\n\n  /**\n   * Clicks the tab button at the specified index.\n   * @param tabIndex The index of the tab.\n   */\n  public async clickTab(tabIndex: number): Promise<void> {\n    const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n    tabLinkEl.click();\n\n    this.#fixture.detectChanges();\n    await this.#fixture.whenStable();\n  }\n\n  /**\n   * Click's the tab's close button at the specified index.\n   * @param tabIndex The index of the tab.\n   */\n  public async clickTabClose(tabIndex: number): Promise<void> {\n    const tabWrapperEl = this.#getTabsetEl().querySelectorAll(\n      `.sky-tabset-tabs .sky-btn-tab-wrapper`,\n    )[tabIndex];\n\n    const closeBtnEl = tabWrapperEl.querySelector(\n      '.sky-btn-tab-close',\n    ) as HTMLButtonElement;\n\n    if (!closeBtnEl) {\n      throw new Error('The specified tab does not have a close button.');\n    }\n\n    closeBtnEl.click();\n\n    this.#fixture.detectChanges();\n    await this.#fixture.whenStable();\n  }\n\n  async #clickButton(buttonCls: string): Promise<void> {\n    const tabsetEl = this.#getTabsetEl();\n\n    const newButtonEl = tabsetEl.querySelector(\n      `.sky-tabset-btns .${buttonCls}`,\n    ) as HTMLButtonElement;\n\n    newButtonEl.click();\n\n    this.#fixture.detectChanges();\n    await this.#fixture.whenStable();\n  }\n\n  #getTabsetEl(): HTMLDivElement {\n    const tabsetEl = this.#debugEl.query(By.css('.sky-tabset')).nativeElement;\n\n    return tabsetEl;\n  }\n\n  #getTabLinkEls(): NodeListOf<HTMLAnchorElement> {\n    return this.#getTabsetEl().querySelectorAll(\n      `.sky-tabset-tabs .sky-btn-tab`,\n    );\n  }\n\n  #getTabLinkEl(tabIndex: number): HTMLAnchorElement {\n    const tabLinkEl = this.#getTabLinkEls().item(tabIndex);\n\n    if (!tabLinkEl) {\n      throw new Error(`There is no tab at index ${tabIndex}.`);\n    }\n\n    return tabLinkEl;\n  }\n\n  #getTextContent(el: Element | Node | undefined | null): string | undefined {\n    return (el && el.textContent?.trim()) || undefined;\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabContentHarnessFilters } from './vertical-tab-content-harness-filters';\n\n/**\n * Harness for interacting with a vertical tab content in tests.\n */\nexport class SkyVerticalTabContentHarness extends SkyQueryableComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = '.sky-vertical-tab-content-pane';\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyVerticalTabContentHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyVerticalTabContentHarnessFilters,\n  ): HarnessPredicate<SkyVerticalTabContentHarness> {\n    return SkyVerticalTabContentHarness.getDataSkyIdPredicate(\n      filters,\n    ).addOption('tabId', filters.tabId, async (harness, tabId) => {\n      const harnessId = await harness.getTabId();\n      return await HarnessPredicate.stringMatches(harnessId, tabId);\n    });\n  }\n\n  /**\n   * Gets the tab content's id.\n   * @internal\n   */\n  public async getTabId(): Promise<string | null> {\n    return await (await this.host()).getAttribute('id');\n  }\n\n  /**\n   * Whether the tab content is visible.\n   */\n  public async isVisible(): Promise<boolean> {\n    return !(await (await this.host()).hasClass('sky-vertical-tab-hidden'));\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarnessFilters } from './sectioned-form-section-content-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form content in tests.\n */\nexport class SkySectionedFormSectionContentHarness extends SkyVerticalTabContentHarness {\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkySectionedFormSectionContentHarness` that meets certain criteria.\n   */\n  public static override with(\n    filters: SkySectionedFormSectionContentHarnessFilters,\n  ): HarnessPredicate<SkySectionedFormSectionContentHarness> {\n    return super.with(\n      filters,\n    ) as HarnessPredicate<SkySectionedFormSectionContentHarness>;\n  }\n\n  /**\n   * Whether the section content is visible.\n   */\n  public override async isVisible(): Promise<boolean> {\n    return await super.isVisible();\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\n\n/**\n * Harness for interacting with a vertical tab button in tests.\n */\nexport class SkyVerticalTabButtonHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-vertical-tab';\n\n  #tabButton = this.locatorFor('a.sky-vertical-tab');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyVerticalTabButtonHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyVerticalTabButtonHarnessFilters,\n  ): HarnessPredicate<SkyVerticalTabButtonHarness> {\n    return new HarnessPredicate(SkyVerticalTabButtonHarness, filters).addOption(\n      'tabHeading',\n      filters.tabHeading,\n      async (harness, heading) => {\n        const tabHeading = await harness.getTabHeading();\n        return tabHeading === heading;\n      },\n    );\n  }\n\n  /**\n   * Clicks the tab button to activate the tab.\n   */\n  public async click(): Promise<void> {\n    return await (await this.#tabButton()).click();\n  }\n\n  /**\n   * Gets the `SkyVerticalTabContentHarness` for this tab.\n   */\n  public async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n    return await this.documentRootLocatorFactory().locatorFor(\n      SkyVerticalTabContentHarness.with({ tabId: await this.getTabId() }),\n    )();\n  }\n\n  /**\n   * Gets the tab header count.\n   */\n  public async getTabHeaderCount(): Promise<number> {\n    const value = (\n      await (await this.locatorFor('.sky-vertical-tab-count')()).text()\n    ).trim();\n\n    // get value between parentheses\n    const rx = /\\(([^)]+)\\)/;\n\n    return Number(value.match(rx)?.[1]);\n  }\n\n  /**\n   * Gets the tab heading text.\n   */\n  public async getTabHeading(): Promise<string> {\n    return (\n      await (await this.locatorFor('.sky-vertical-tab-heading-value')()).text()\n    ).trim();\n  }\n\n  /**\n   * Gets the id of the content controlled by this tab.\n   * @internal\n   */\n  public async getTabId(): Promise<string> {\n    return (\n      (await (await this.#tabButton()).getAttribute('aria-controls')) ||\n      /* istanbul ignore next */\n      ''\n    );\n  }\n\n  /**\n   * Whether the tab is active.\n   */\n  public async isActive(): Promise<boolean> {\n    return await (await this.#tabButton()).hasClass('sky-vertical-tab-active');\n  }\n\n  /**\n   * Whether the tab is disabled.\n   */\n  public async isDisabled(): Promise<boolean> {\n    return await (\n      await this.#tabButton()\n    ).hasClass('sky-vertical-tabset-button-disabled');\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabButtonHarness } from '../vertical-tabset/vertical-tab-button-harness';\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form section component in tests.\n */\nexport class SkySectionedFormSectionHarness extends SkyVerticalTabButtonHarness {\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkySectionedFormSectionHarness` that meets certain criteria.\n   */\n  public static override with(\n    filters: SkySectionedFormSectionHarnessFilters,\n  ): HarnessPredicate<SkySectionedFormSectionHarness> {\n    return SkySectionedFormSectionHarness.getDataSkyIdPredicate(\n      filters,\n    ).addOption(\n      'sectionHeading',\n      filters.sectionHeading,\n      async (harness, heading) => {\n        const sectionHeading = await harness.getSectionHeading();\n        return sectionHeading === heading;\n      },\n    );\n  }\n\n  /**\n   * Clicks the section to activate.\n   */\n  public override async click(): Promise<void> {\n    await super.click();\n  }\n\n  /**\n   * Gets the `SkySectionedFormSectionContentHarness` for this section.\n   */\n  public async getSectionContent(): Promise<SkySectionedFormSectionContentHarness> {\n    return await this.documentRootLocatorFactory().locatorFor(\n      SkySectionedFormSectionContentHarness.with({\n        tabId: await this.getTabId(),\n      }),\n    )();\n  }\n\n  /**\n   * Gets the section heading.\n   */\n  public async getSectionHeading(): Promise<string> {\n    return await this.getTabHeading();\n  }\n\n  /**\n   * Gets the section item count.\n   */\n  public async getSectionItemCount(): Promise<number> {\n    return await this.getTabHeaderCount();\n  }\n\n  /**\n   * Gets the harness for this tab.\n   * Replacing with getSectionContent.\n   * @internal\n   */\n  /* istanbul ignore next */\n  public override async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n    return await super.getTabContent();\n  }\n\n  /**\n   * Gets the tab header count.\n   * Replacing with getSectionItemCount.\n   * @internal\n   */\n  public override async getTabHeaderCount(): Promise<number> {\n    return await super.getTabHeaderCount();\n  }\n\n  /**\n   * Gets the tab heading text.\n   * Replacing with getSectionHeading.\n   * @internal\n   */\n  public override async getTabHeading(): Promise<string> {\n    return await super.getTabHeading();\n  }\n\n  /**\n   * Whether the section is active.\n   */\n  public override async isActive(): Promise<boolean> {\n    return await super.isActive();\n  }\n\n  /**\n   * Whether the section is disabled.\n   * This isn't used on sectioned forms.\n   * @internal\n   */\n  /* istanbul ignore next */\n  public override async isDisabled(): Promise<boolean> {\n    return await super.isDisabled();\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkySectionedFormHarnessFilters } from './sectioned-form-harness-filters';\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarness } from './sectioned-form-section-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form component in tests.\n */\nexport class SkySectionedFormHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-sectioned-form';\n\n  #getTabs = this.locatorForOptional('div.sky-sectioned-form-tabs');\n  #getContent = this.locatorForOptional('div.sky-sectioned-form-content');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkySectionedFormHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkySectionedFormHarnessFilters,\n  ): HarnessPredicate<SkySectionedFormHarness> {\n    return SkySectionedFormHarness.getDataSkyIdPredicate(filters);\n  }\n\n  /**\n   * Gets the `SkySectionedFormSectionHarness` for the currently active section.\n   */\n  public async getActiveSection(): Promise<\n    SkySectionedFormSectionHarness | undefined\n  > {\n    const sections = await this.getSections();\n\n    if (sections) {\n      for (const section of sections) {\n        if (await section.isActive()) {\n          return section;\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  public async getActiveSectionContent(): Promise<\n    SkySectionedFormSectionContentHarness | undefined\n  > {\n    if (await this.#getContent()) {\n      const contents = await this.locatorForAll(\n        SkySectionedFormSectionContentHarness,\n      )();\n      for (const content of contents) {\n        if (await content.isVisible()) {\n          return content;\n        }\n      }\n      return undefined;\n    }\n\n    throw new Error('Unable to find active content because it is not visible.');\n  }\n\n  /**\n   * Gets the tab width as a CSS `flex-basis` value (for example, `200px`),\n   * or `null` when no width is set. The width is only applied in the desktop\n   * layout, so this returns `null` in the mobile layout and when the tabs\n   * pane is not rendered at all.\n   */\n  public async getTabWidth(): Promise<string | null> {\n    const tabs = await this.#getTabs();\n    if (!tabs) {\n      return null;\n    }\n\n    const styleAttribute = await tabs.getAttribute('style');\n    const styleMatch = styleAttribute?.match(/flex-basis:\\s*([^;]+)/i);\n\n    return styleMatch?.[1]?.trim() ?? null;\n  }\n\n  /**\n   * Gets a specific section based on the filter criteria.\n   * @param filters The filter criteria.\n   */\n  public async getSection(\n    filters: SkySectionedFormSectionHarnessFilters,\n  ): Promise<SkySectionedFormSectionHarness> {\n    return await this.locatorFor(\n      SkySectionedFormSectionHarness.with(filters),\n    )();\n  }\n\n  /**\n   * Gets an array of sections based on the filter criteria.\n   * If no filter is provided, returns all sections.\n   * @param filters The optional filter criteria.\n   */\n  public async getSections(\n    filters?: SkySectionedFormSectionHarnessFilters,\n  ): Promise<SkySectionedFormSectionHarness[]> {\n    if (!(await this.isSectionsVisible())) {\n      throw new Error(\n        'Unable to find any sectioned form sections because they are not visible.',\n      );\n    }\n    return await this.locatorForAll(\n      SkySectionedFormSectionHarness.with(filters || {}),\n    )();\n  }\n\n  /**\n   * Whether the section tabs are visible.\n   * In mobile view, sectioned forms collapse to just content pane.\n   */\n  public async isSectionsVisible(): Promise<boolean> {\n    const tabs = await this.#getTabs();\n\n    if (tabs) {\n      return !(await tabs.hasClass('sky-sectioned-form-tabs-hidden'));\n    }\n    return false;\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyTabContentHarnessFilters } from './tab-content-harness-filters';\n\n/**\n * Harness for interacting with a tab component in tests.\n */\nexport class SkyTabContentHarness extends SkyQueryableComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-tab';\n\n  #getTab = this.locatorFor('.sky-tab');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyTabContentHarness` that meets certain criteria.\n   * @internal\n   */\n  public static with(\n    filters: SkyTabContentHarnessFilters,\n  ): HarnessPredicate<SkyTabContentHarness> {\n    return new HarnessPredicate(SkyTabContentHarness, filters).addOption(\n      'tabId',\n      filters.tabId,\n      async (harness, tabId) => {\n        const harnessId = await harness.getTabId();\n        return await HarnessPredicate.stringMatches(harnessId, tabId);\n      },\n    );\n  }\n\n  /**\n   * Gets the tab's layout.\n   */\n  public async getLayout(): Promise<string> {\n    return (await (await this.host()).getAttribute('layout')) || 'none';\n  }\n\n  /**\n   * @internal\n   */\n  public async getTabId(): Promise<string | null> {\n    return await (await this.#getTab()).getAttribute('id');\n  }\n\n  /**\n   * Whether the tab content is visible.\n   */\n  public async isVisible(): Promise<boolean> {\n    return !(await (await this.#getTab()).getProperty<boolean>('hidden'));\n  }\n}\n","import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\n\n/**\n * Harness for interacting with a tab button component in tests.\n */\nexport class SkyTabButtonHarness extends ComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-tab-button';\n\n  #getTabButton = this.locatorFor('a.sky-btn-tab');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyTabButtonHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyTabButtonHarnessFilters,\n  ): HarnessPredicate<SkyTabButtonHarness> {\n    return new HarnessPredicate(SkyTabButtonHarness, filters).addOption(\n      'tabHeading',\n      filters.tabHeading,\n      async (harness, tabHeading) => {\n        const harnessTabHeading = await harness.getTabHeading();\n        return await HarnessPredicate.stringMatches(\n          harnessTabHeading,\n          tabHeading,\n        );\n      },\n    );\n  }\n\n  /**\n   * Clicks the tab button.\n   */\n  public async click(): Promise<void> {\n    return await (await this.#getTabButton()).click();\n  }\n\n  /**\n   * Clicks the remove tab button if it is visible.\n   */\n  public async clickRemoveButton(): Promise<void> {\n    if (await this.isInWizardTabset()) {\n      throw new Error('Cannot use remove tab button in a wizard tabset.');\n    }\n    const button = await this.locatorForOptional('.sky-btn-tab-close')();\n    if (!button) {\n      throw new Error('Unable to find remove tab button.');\n    }\n    return await button.click();\n  }\n\n  /**\n   * Gets the permalink that the page routes to when the tab is clicked.\n   */\n  public async getPermalink(): Promise<string | null> {\n    if (await this.isInWizardTabset()) {\n      throw new Error(\n        'Cannot get permalink for tab button in a wizard tabset.',\n      );\n    }\n    return await (await this.#getTabButton()).getAttribute('href');\n  }\n\n  /**\n   * Gets the `SkyTabContentHarness` controlled by this tab button.\n   */\n  public async getTabContentHarness(): Promise<SkyTabContentHarness> {\n    return await this.documentRootLocatorFactory().locatorFor(\n      SkyTabContentHarness.with({ tabId: await this.getTabId() }),\n    )();\n  }\n\n  /**\n   * Gets the tab heading.\n   */\n  public async getTabHeading(): Promise<string> {\n    return (\n      // eslint-disable-next-line @cspell/spellchecker\n      await (await this.locatorFor('.sky-tab-heading > span[skyid]')()).text()\n    );\n  }\n\n  /**\n   * Gets whether the tab button is active.\n   */\n  public async isActive(): Promise<boolean> {\n    return await (await this.#getTabButton()).hasClass('sky-btn-tab-selected');\n  }\n\n  /**\n   * Gets whether the tab button is disabled.\n   */\n  public async isDisabled(): Promise<boolean> {\n    return await (await this.#getTabButton()).hasClass('sky-btn-tab-disabled');\n  }\n\n  /**\n   * Whether the tab button is in a Wizard tabset.\n   */\n  public async isInWizardTabset(): Promise<boolean> {\n    return await (await this.#getTabButton()).hasClass('sky-btn-tab-wizard');\n  }\n\n  /**\n   * Gets the id of the content controlled by this tab.\n   * @internal\n   */\n  public async getTabId(): Promise<string> {\n    return (\n      (await (await this.#getTabButton()).getAttribute('aria-controls')) ||\n      /* istanbul ignore next */\n      ''\n    );\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport {\n  SkyDropdownHarness,\n  SkyDropdownMenuHarness,\n} from '@skyux/popovers/testing';\nimport { SkyTabsetButtonsDisplayMode } from '@skyux/tabs';\n\nimport { SkyTabButtonHarness } from './tab-button-harness';\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\nimport { SkyTabsetHarnessFilters } from './tabset-harness-filters';\n\n/**\n * Harness for interacting with a tabset component in tests.\n */\nexport class SkyTabsetHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-tabset';\n\n  #getTabset = this.locatorFor('.sky-tabset');\n  #getTabDropdown = this.locatorFor(SkyDropdownHarness);\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyTabsetHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyTabsetHarnessFilters,\n  ): HarnessPredicate<SkyTabsetHarness> {\n    return SkyTabsetHarness.getDataSkyIdPredicate(filters);\n  }\n\n  /**\n   * In `dropdown` mode, clicks the dropdown tab to open the tab dropdown menu.\n   */\n  public async clickDropdownTab(): Promise<void> {\n    if (!((await this.getMode()) === 'dropdown')) {\n      throw new Error(\n        'Cannot click dropdown tab button, tab is not in dropdown mode.',\n      );\n    }\n    const button = await this.locatorFor(SkyDropdownHarness)();\n    return await button.clickDropdownButton();\n  }\n\n  /**\n   * Clicks the new tab button if visible.\n   */\n  public async clickNewTabButton(): Promise<void> {\n    if (await this.isWizardTabset()) {\n      throw new Error('Cannot use new tab button in a wizard tabset.');\n    }\n\n    const newTabButton = await this.locatorForOptional(\n      'button.sky-tabset-btn-new',\n    )();\n\n    if (!newTabButton) {\n      throw new Error('Unable to find the new tab button.');\n    }\n\n    return await newTabButton.click();\n  }\n\n  /**\n   * Clicks the open tab button if visible.\n   */\n  public async clickOpenTabButton(): Promise<void> {\n    if (await this.isWizardTabset()) {\n      throw new Error('Cannot use open tab button in a wizard tabset.');\n    }\n\n    const openTabButton = await this.locatorForOptional(\n      'button.sky-tabset-btn-open',\n    )();\n\n    if (!openTabButton) {\n      throw new Error('Unable to find the open tab button.');\n    }\n\n    return await openTabButton.click();\n  }\n\n  /**\n   * Clicks a tab button with a `tabHeading` matching the input.\n   */\n  public async clickTabButton(tabHeading: string): Promise<void> {\n    const tabButton = await this.getTabButtonHarness({\n      tabHeading: tabHeading,\n    });\n    return await tabButton.click();\n  }\n\n  /**\n   * Gets the active tab button harness.\n   */\n  public async getActiveTabButton(): Promise<SkyTabButtonHarness | null> {\n    const tabButtonHarnesses = await this.getTabButtonHarnesses();\n\n    for (const harness of tabButtonHarnesses) {\n      if (await harness.isActive()) {\n        return harness;\n      }\n    }\n\n    /* istanbul ignore next */\n    return null;\n  }\n\n  /**\n   * Gets the tabset aria-label value.\n   */\n  public async getAriaLabel(): Promise<string | null> {\n    return await (await this.#getTabset()).getAttribute('aria-label');\n  }\n\n  /**\n   * Gets the tabset aria-labelledby value.\n   */\n  public async getAriaLabelledBy(): Promise<string | null> {\n    return await (await this.#getTabset()).getAttribute('aria-labelledby');\n  }\n\n  /**\n   * Gets the tabset's display mode.\n   */\n  public async getMode(): Promise<SkyTabsetButtonsDisplayMode> {\n    if (await (await this.#getTabset()).hasClass('sky-tabset-mode-tabs')) {\n      return 'tabs';\n    }\n    return 'dropdown';\n  }\n\n  /**\n   * Gets a specific tab button based on the filter criteria.\n   * @param filters The filter criteria.\n   */\n  public async getTabButtonHarness(\n    filters: SkyTabButtonHarnessFilters,\n  ): Promise<SkyTabButtonHarness> {\n    if ((await this.getMode()) === 'dropdown') {\n      const menu = await this.#getDropdownMenu();\n      return await menu.queryHarness(SkyTabButtonHarness.with(filters));\n    }\n    return await this.locatorFor(SkyTabButtonHarness.with(filters))();\n  }\n\n  /**\n   * Gets an array of tab button harnesses based on the filter criteria.\n   * If no filter is provided, returns all tab button harnesses.\n   * @param filters The optional filter criteria.\n   */\n  public async getTabButtonHarnesses(\n    filters?: SkyTabButtonHarnessFilters,\n  ): Promise<SkyTabButtonHarness[]> {\n    if ((await this.getMode()) === 'dropdown') {\n      const menu = await this.#getDropdownMenu();\n      return await menu.queryHarnesses(SkyTabButtonHarness.with(filters || {}));\n    } else {\n      return await this.locatorForAll(\n        SkyTabButtonHarness.with(filters || {}),\n      )();\n    }\n  }\n\n  /**\n   * Gets a tab content harness for the tab with the given `tabHeading`.\n   */\n  public async getTabContentHarness(\n    tabHeading: string,\n  ): Promise<SkyTabContentHarness> {\n    const tabButton = await this.getTabButtonHarness({\n      tabHeading: tabHeading,\n    });\n    const id = await tabButton.getTabId();\n    return await this.locatorFor(SkyTabContentHarness.with({ tabId: id }))();\n  }\n\n  /**\n   * Whether the tabset is a Wizard component.\n   */\n  public async isWizardTabset(): Promise<boolean> {\n    return (\n      (await (await this.host()).getAttribute('data-tab-style')) === 'wizard'\n    );\n  }\n\n  async #getDropdownMenu(): Promise<SkyDropdownMenuHarness> {\n    const dropdown = await this.#getTabDropdown();\n    if (!(await dropdown?.isOpen())) {\n      throw new Error(\n        'Cannot get tab button when tabs is in dropdown mode and is closed.',\n      );\n    }\n    return await dropdown.getDropdownMenu();\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport { SkyTabsetNavButtonType } from '@skyux/tabs';\n\nimport { SkyTabsetNavButtonHarnessFilters } from './tabset-nav-button-harness-filters';\n\n/**\n * Harness to interact with tabset nav buttons in wizard style tabset tests.\n */\nexport class SkyTabsetNavButtonHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-tabset-nav-button';\n\n  #button = this.locatorFor('button');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyTabsetNavButtonHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyTabsetNavButtonHarnessFilters,\n  ): HarnessPredicate<SkyTabsetNavButtonHarness> {\n    return SkyTabsetNavButtonHarness.getDataSkyIdPredicate(filters).addOption(\n      'buttonType',\n      filters.buttonType,\n      async (harness, buttonType) => {\n        const harnessButtonType = await harness.getButtonType();\n        return await HarnessPredicate.stringMatches(\n          harnessButtonType,\n          buttonType,\n        );\n      },\n    );\n  }\n\n  /**\n   * Clicks the button.\n   */\n  public async click(): Promise<void> {\n    return await (await this.#button()).click();\n  }\n\n  /**\n   * Gets the button text.\n   */\n  public async getButtonText(): Promise<string> {\n    return await (await this.#button()).text();\n  }\n\n  /**\n   * Gets the button type.\n   */\n  public async getButtonType(): Promise<SkyTabsetNavButtonType | null> {\n    return (await (\n      await this.host()\n    ).getAttribute('data-button-type')) as SkyTabsetNavButtonType;\n  }\n\n  /**\n   * Whether the button is disabled.\n   */\n  public async isDisabled(): Promise<boolean> {\n    return (await (await this.#button()).getAttribute('disabled')) !== null;\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\n\n/**\n * Harness for interacting with a vertical tabset group in tests.\n */\nexport class SkyVerticalTabsetGroupHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-vertical-tabset-group';\n\n  #button = this.locatorFor('button.sky-vertical-tabset-button');\n  #header = this.locatorFor('.sky-vertical-tabset-group-header');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyVerticalTabsetGroupHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyVerticalTabsetGroupHarnessFilters,\n  ): HarnessPredicate<SkyVerticalTabsetGroupHarness> {\n    return new HarnessPredicate(\n      SkyVerticalTabsetGroupHarness,\n      filters,\n    ).addOption(\n      'groupHeading',\n      filters.groupHeading,\n      async (harness, heading) => {\n        return (await harness.getGroupHeading()) === heading;\n      },\n    );\n  }\n\n  /**\n   * Clicks the group button to toggle its expanded state.\n   */\n  public async click(): Promise<void> {\n    return await (await this.#button()).click();\n  }\n\n  /**\n   * Gets the group heading text.\n   */\n  public async getGroupHeading(): Promise<string> {\n    return (await (await this.#button()).text()).trim();\n  }\n\n  /**\n   * Gets a specific vertical tab based on the filter criteria.\n   * @param filters The filter criteria.\n   */\n  public async getVerticalTab(\n    filters: SkyVerticalTabButtonHarnessFilters,\n  ): Promise<SkyVerticalTabButtonHarness> {\n    return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n  }\n\n  /**\n   * Gets an array of vertical tab buttons based on the filter criteria.\n   * If no filter is provided, returns all vertical tab buttons.\n   * @param filters The optional filter criteria.\n   */\n  public async getVerticalTabs(\n    filters?: SkyVerticalTabButtonHarnessFilters,\n  ): Promise<SkyVerticalTabButtonHarness[]> {\n    return await this.locatorForAll(\n      SkyVerticalTabButtonHarness.with(filters || {}),\n    )();\n  }\n\n  /**\n   * Whether a tab under this group is active.\n   */\n  public async isActive(): Promise<boolean> {\n    return await (\n      await this.#header()\n    ).hasClass('sky-vertical-tabset-group-header-active');\n  }\n\n  /**\n   * Whether the group is disabled.\n   */\n  public async isDisabled(): Promise<boolean> {\n    return await (\n      await this.#button()\n    ).hasClass('sky-vertical-tabset-button-disabled');\n  }\n\n  /**\n   * Whether the group is expanded.\n   */\n  public async isOpen(): Promise<boolean> {\n    return (\n      (await (await this.#button()).getAttribute('aria-expanded')) === 'true'\n    );\n  }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\nimport { SkyVerticalTabsetGroupHarness } from './vertical-tabset-group-harness';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\nimport { SkyVerticalTabsetHarnessFilters } from './vertical-tabset-harness-filters';\n\n/**\n * Harness for interacting with the vertical tabset component in tests.\n */\nexport class SkyVerticalTabsetHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-vertical-tabset';\n\n  #showTabsButton = this.locatorForOptional(\n    '.sky-vertical-tabset-content > button.sky-vertical-tabset-show-tabs-btn',\n  );\n  #tabsContainer = this.locatorFor('.sky-vertical-tabset-group-container');\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyVerticalTabsetHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyVerticalTabsetHarnessFilters,\n  ): HarnessPredicate<SkyVerticalTabsetHarness> {\n    return SkyVerticalTabsetHarness.getDataSkyIdPredicate(filters);\n  }\n\n  /**\n   * Click the show tabs button in mobile view.\n   */\n  public async clickShowTabsButton(): Promise<void> {\n    const showTabsButton = await this.#showTabsButton();\n    if (showTabsButton) {\n      await showTabsButton.click();\n    }\n  }\n\n  /**\n   * Gets the `SkyVerticalTabButtonHarness` of the currently active tab.\n   */\n  public async getActiveTab(): Promise<\n    SkyVerticalTabButtonHarness | undefined\n  > {\n    const tabs = await this.getTabs();\n    if (tabs) {\n      for (const tab of tabs) {\n        if (await tab.isActive()) {\n          return tab;\n        }\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Gets the `SkyVerticalTabContentHarness` for the currently active tab.\n   */\n  public async getActiveTabContent(): Promise<\n    SkyVerticalTabContentHarness | undefined\n  > {\n    // in mobile view tabs are not rendered.\n    if (!(await this.isTabsVisible())) {\n      const contents = await this.locatorForAll(SkyVerticalTabContentHarness)();\n      for (const content of contents) {\n        if (await content.isVisible()) {\n          return content;\n        }\n      }\n    }\n\n    const activeTab = await this.getActiveTab();\n    if (activeTab) {\n      return await activeTab.getTabContent();\n    }\n    return undefined;\n  }\n\n  /**\n   * Gets the aria-label.\n   */\n  public async getAriaLabel(): Promise<string | null> {\n    return await (\n      await this.locatorFor('span.sky-vertical-tabset-tablist')()\n    ).getAttribute('aria-label');\n  }\n\n  /**\n   * Gets the aria-labelledby.\n   */\n  public async getAriaLabelledBy(): Promise<string | null> {\n    return await (\n      await this.locatorFor('span.sky-vertical-tabset-tablist')()\n    ).getAttribute('aria-labelledby');\n  }\n\n  /**\n   * Gets a specific vertical tabset group based on the filter criteria.\n   * @param filters The filter criteria.\n   */\n  public async getGroup(\n    filters: SkyVerticalTabsetGroupHarnessFilters,\n  ): Promise<SkyVerticalTabsetGroupHarness | undefined> {\n    return await this.locatorFor(SkyVerticalTabsetGroupHarness.with(filters))();\n  }\n\n  /**\n   * Gets an array of vertical tabset groups based on the filter criteria.\n   * If no filter is provided, returns all vertical tabset groups.\n   * @param filters The optional filter criteria.\n   */\n  public async getGroups(\n    filters?: SkyVerticalTabsetGroupHarnessFilters,\n  ): Promise<SkyVerticalTabsetGroupHarness[]> {\n    // open tablist if in mobile view\n    if (!(await this.isTabsVisible())) {\n      await this.clickShowTabsButton();\n    }\n\n    return await this.locatorForAll(\n      SkyVerticalTabsetGroupHarness.with(filters || {}),\n    )();\n  }\n\n  /**\n   * Gets the text in the show tabs button in mobile view.\n   */\n  public async getShowTabsText(): Promise<string | undefined> {\n    const showTabsButton = await this.#showTabsButton();\n\n    // check if it is in mobile view\n    if (showTabsButton) {\n      return (await await showTabsButton.text()).trim();\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Gets the tab width as a CSS `flex-basis` value (for example, `200px`),\n   * or `null` when no width is set. The width is only applied in the desktop\n   * layout, so this returns `null` in the mobile layout.\n   */\n  public async getTabWidth(): Promise<string | null> {\n    const styleAttribute = await (\n      await this.#tabsContainer()\n    ).getAttribute('style');\n    const styleMatch = styleAttribute?.match(/flex-basis:\\s*([^;]+)/i);\n\n    return styleMatch?.[1]?.trim() ?? null;\n  }\n\n  /**\n   * Gets a specific vertical tab button based on the filter criteria.\n   * @param filters The filter criteria.\n   */\n  public async getTab(\n    filters: SkyVerticalTabButtonHarnessFilters,\n  ): Promise<SkyVerticalTabButtonHarness> {\n    return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n  }\n\n  /**\n   * Gets an array of vertical tab buttons based on the filter criteria.\n   * If no filter is provided, returns all vertical tab buttons.\n   * @param filters The optional filter criteria.\n   */\n  public async getTabs(\n    filters?: SkyVerticalTabButtonHarnessFilters,\n  ): Promise<SkyVerticalTabButtonHarness[]> {\n    // open tablist if in mobile view\n    if (!(await this.isTabsVisible())) {\n      await this.clickShowTabsButton();\n    }\n\n    return await this.locatorForAll(\n      SkyVerticalTabButtonHarness.with(filters || {}),\n    )();\n  }\n\n  /**\n   * Whether the tabs are visible.\n   * In mobile view, vertical tabsets collapse to just the content pane\n   * with a button to show the tabs.\n   */\n  public async isTabsVisible(): Promise<boolean> {\n    const showTabsButton = await this.#showTabsButton();\n    if (showTabsButton) {\n      return false;\n    }\n    return true;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}