UNPKG

govuk-frontend

Version:

GOV.UK Frontend contains the code you need to start building a user interface for government platforms and services.

1 lines 23.6 kB
{"version":3,"file":"tabs.mjs","sources":["../../../../src/govuk/components/tabs/tabs.mjs"],"sourcesContent":["import { getBreakpoint, getFragmentFromUrl } from '../../common/index.mjs'\nimport { ElementError } from '../../errors/index.mjs'\nimport { GOVUKFrontendComponent } from '../../govuk-frontend-component.mjs'\n\n/**\n * Tabs component\n *\n * @preserve\n */\nexport class Tabs extends GOVUKFrontendComponent {\n /** @private */\n $tabs\n\n /** @private */\n $tabList\n\n /** @private */\n $tabListItems\n\n /** @private */\n jsHiddenClass = 'govuk-tabs__panel--hidden'\n\n /** @private */\n changingHash = false\n\n /** @private */\n boundTabClick\n\n /** @private */\n boundTabKeydown\n\n /** @private */\n boundOnHashChange\n\n /**\n * @private\n * @type {MediaQueryList | null}\n */\n mql = null\n\n /**\n * @param {Element | null} $root - HTML element to use for tabs\n */\n constructor($root) {\n super($root)\n\n const $tabs = this.$root.querySelectorAll('a.govuk-tabs__tab')\n if (!$tabs.length) {\n throw new ElementError({\n component: Tabs,\n identifier: 'Links (`<a class=\"govuk-tabs__tab\">`)'\n })\n }\n\n this.$tabs = $tabs\n\n // Save bound functions so we can remove event listeners during teardown\n this.boundTabClick = this.onTabClick.bind(this)\n this.boundTabKeydown = this.onTabKeydown.bind(this)\n this.boundOnHashChange = this.onHashChange.bind(this)\n\n const $tabList = this.$root.querySelector('.govuk-tabs__list')\n const $tabListItems = this.$root.querySelectorAll(\n 'li.govuk-tabs__list-item'\n )\n\n if (!$tabList) {\n throw new ElementError({\n component: Tabs,\n identifier: 'List (`<ul class=\"govuk-tabs__list\">`)'\n })\n }\n\n if (!$tabListItems.length) {\n throw new ElementError({\n component: Tabs,\n identifier: 'List items (`<li class=\"govuk-tabs__list-item\">`)'\n })\n }\n\n this.$tabList = $tabList\n this.$tabListItems = $tabListItems\n\n this.setupResponsiveChecks()\n }\n\n /**\n * Setup viewport resize check\n *\n * @private\n */\n setupResponsiveChecks() {\n const breakpoint = getBreakpoint('tablet')\n\n if (!breakpoint.value) {\n throw new ElementError({\n component: Tabs,\n identifier: `CSS custom property (\\`${breakpoint.property}\\`) on pseudo-class \\`:root\\``\n })\n }\n\n // Media query list for GOV.UK Frontend tablet breakpoint\n this.mql = window.matchMedia(`(min-width: ${breakpoint.value})`)\n\n // MediaQueryList.addEventListener isn't supported by Safari < 14 so we need\n // to be able to fall back to the deprecated MediaQueryList.addListener\n if ('addEventListener' in this.mql) {\n this.mql.addEventListener('change', () => this.checkMode())\n } else {\n // @ts-expect-error Property 'addListener' does not exist\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.mql.addListener(() => this.checkMode())\n }\n\n this.checkMode()\n }\n\n /**\n * Setup or teardown handler for viewport resize check\n *\n * @private\n */\n checkMode() {\n if (this.mql?.matches) {\n this.setup()\n } else {\n this.teardown()\n }\n }\n\n /**\n * Setup tab component\n *\n * @private\n */\n setup() {\n this.$tabList.setAttribute('role', 'tablist')\n\n this.$tabListItems.forEach(($item) => {\n $item.setAttribute('role', 'presentation')\n })\n\n this.$tabs.forEach(($tab) => {\n // Set HTML attributes\n this.setAttributes($tab)\n\n // Handle events\n $tab.addEventListener('click', this.boundTabClick, true)\n $tab.addEventListener('keydown', this.boundTabKeydown, true)\n\n // Remove old active panels\n this.hideTab($tab)\n })\n\n // Show either the active tab according to the URL's hash or the first tab\n const $activeTab = this.getTab(window.location.hash) ?? this.$tabs[0]\n\n this.showTab($activeTab)\n\n // Handle hashchange events\n window.addEventListener('hashchange', this.boundOnHashChange, true)\n }\n\n /**\n * Teardown tab component\n *\n * @private\n */\n teardown() {\n this.$tabList.removeAttribute('role')\n\n this.$tabListItems.forEach(($item) => {\n $item.removeAttribute('role')\n })\n\n this.$tabs.forEach(($tab) => {\n // Remove events\n $tab.removeEventListener('click', this.boundTabClick, true)\n $tab.removeEventListener('keydown', this.boundTabKeydown, true)\n\n // Unset HTML attributes\n this.unsetAttributes($tab)\n })\n\n // Remove hashchange event handler\n window.removeEventListener('hashchange', this.boundOnHashChange, true)\n }\n\n /**\n * Handle hashchange event\n *\n * @private\n * @returns {void | undefined} Returns void, or undefined when prevented\n */\n onHashChange() {\n const hash = window.location.hash\n const $tabWithHash = this.getTab(hash)\n if (!$tabWithHash) {\n return\n }\n\n // Prevent changing the hash\n if (this.changingHash) {\n this.changingHash = false\n return\n }\n\n // Show either the active tab according to the URL's hash or the first tab\n const $previousTab = this.getCurrentTab()\n if (!$previousTab) {\n return\n }\n\n this.hideTab($previousTab)\n this.showTab($tabWithHash)\n $tabWithHash.focus()\n }\n\n /**\n * Hide panel for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n hideTab($tab) {\n this.unhighlightTab($tab)\n this.hidePanel($tab)\n }\n\n /**\n * Show panel for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n showTab($tab) {\n this.highlightTab($tab)\n this.showPanel($tab)\n }\n\n /**\n * Get tab link by hash\n *\n * @private\n * @param {string} hash - Hash fragment including #\n * @returns {HTMLAnchorElement | null} Tab link\n */\n getTab(hash) {\n return this.$root.querySelector(`a.govuk-tabs__tab[href=\"${hash}\"]`)\n }\n\n /**\n * Set tab link and panel attributes\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n setAttributes($tab) {\n const panelId = getFragmentFromUrl($tab.href)\n if (!panelId) {\n return\n }\n\n // Set tab attributes\n $tab.setAttribute('id', `tab_${panelId}`)\n $tab.setAttribute('role', 'tab')\n $tab.setAttribute('aria-controls', panelId)\n $tab.setAttribute('aria-selected', 'false')\n $tab.setAttribute('tabindex', '-1')\n\n // Set panel attributes\n const $panel = this.getPanel($tab)\n if (!$panel) {\n return\n }\n\n $panel.setAttribute('role', 'tabpanel')\n $panel.setAttribute('aria-labelledby', $tab.id)\n $panel.classList.add(this.jsHiddenClass)\n }\n\n /**\n * Unset tab link and panel attributes\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n unsetAttributes($tab) {\n // unset tab attributes\n $tab.removeAttribute('id')\n $tab.removeAttribute('role')\n $tab.removeAttribute('aria-controls')\n $tab.removeAttribute('aria-selected')\n $tab.removeAttribute('tabindex')\n\n // unset panel attributes\n const $panel = this.getPanel($tab)\n if (!$panel) {\n return\n }\n\n $panel.removeAttribute('role')\n $panel.removeAttribute('aria-labelledby')\n $panel.classList.remove(this.jsHiddenClass)\n }\n\n /**\n * Handle tab link clicks\n *\n * @private\n * @param {MouseEvent} event - Mouse click event\n * @returns {void} Returns void\n */\n onTabClick(event) {\n const $currentTab = this.getCurrentTab()\n const $nextTab = event.currentTarget\n\n if (!$currentTab || !($nextTab instanceof HTMLAnchorElement)) {\n return\n }\n\n event.preventDefault()\n\n this.hideTab($currentTab)\n this.showTab($nextTab)\n this.createHistoryEntry($nextTab)\n }\n\n /**\n * Update browser URL hash fragment for tab\n *\n * - Allows back/forward to navigate tabs\n * - Avoids page jump when hash changes\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n createHistoryEntry($tab) {\n const $panel = this.getPanel($tab)\n if (!$panel) {\n return\n }\n\n // Save and restore the id so the page doesn't jump when a user clicks a tab\n // (which changes the hash)\n const panelId = $panel.id\n $panel.id = ''\n this.changingHash = true\n window.location.hash = panelId\n $panel.id = panelId\n }\n\n /**\n * Handle tab keydown event\n *\n * - Press right arrow for next tab\n * - Press left arrow for previous tab\n *\n * @private\n * @param {KeyboardEvent} event - Keydown event\n */\n onTabKeydown(event) {\n switch (event.key) {\n // 'Left' and 'Right' required for Edge 16 support.\n case 'ArrowLeft':\n case 'Left':\n this.activatePreviousTab()\n event.preventDefault()\n break\n case 'ArrowRight':\n case 'Right':\n this.activateNextTab()\n event.preventDefault()\n break\n }\n }\n\n /**\n * Activate next tab\n *\n * @private\n */\n activateNextTab() {\n const $currentTab = this.getCurrentTab()\n if (!$currentTab?.parentElement) {\n return\n }\n\n const $nextTabListItem = $currentTab.parentElement.nextElementSibling\n if (!$nextTabListItem) {\n return\n }\n\n const $nextTab = $nextTabListItem.querySelector('a.govuk-tabs__tab')\n if (!$nextTab) {\n return\n }\n\n this.hideTab($currentTab)\n this.showTab($nextTab)\n $nextTab.focus()\n this.createHistoryEntry($nextTab)\n }\n\n /**\n * Activate previous tab\n *\n * @private\n */\n activatePreviousTab() {\n const $currentTab = this.getCurrentTab()\n if (!$currentTab?.parentElement) {\n return\n }\n\n const $previousTabListItem =\n $currentTab.parentElement.previousElementSibling\n if (!$previousTabListItem) {\n return\n }\n\n const $previousTab = $previousTabListItem.querySelector('a.govuk-tabs__tab')\n if (!$previousTab) {\n return\n }\n\n this.hideTab($currentTab)\n this.showTab($previousTab)\n $previousTab.focus()\n this.createHistoryEntry($previousTab)\n }\n\n /**\n * Get tab panel for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n * @returns {Element | null} Tab panel\n */\n getPanel($tab) {\n const panelId = getFragmentFromUrl($tab.href)\n if (!panelId) {\n return null\n }\n\n return this.$root.querySelector(`#${panelId}`)\n }\n\n /**\n * Show tab panel for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n showPanel($tab) {\n const $panel = this.getPanel($tab)\n if (!$panel) {\n return\n }\n\n $panel.classList.remove(this.jsHiddenClass)\n }\n\n /**\n * Hide tab panel for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n hidePanel($tab) {\n const $panel = this.getPanel($tab)\n if (!$panel) {\n return\n }\n\n $panel.classList.add(this.jsHiddenClass)\n }\n\n /**\n * Unset 'selected' state for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n unhighlightTab($tab) {\n if (!$tab.parentElement) {\n return\n }\n\n $tab.setAttribute('aria-selected', 'false')\n $tab.parentElement.classList.remove('govuk-tabs__list-item--selected')\n $tab.setAttribute('tabindex', '-1')\n }\n\n /**\n * Set 'selected' state for tab link\n *\n * @private\n * @param {HTMLAnchorElement} $tab - Tab link\n */\n highlightTab($tab) {\n if (!$tab.parentElement) {\n return\n }\n\n $tab.setAttribute('aria-selected', 'true')\n $tab.parentElement.classList.add('govuk-tabs__list-item--selected')\n $tab.setAttribute('tabindex', '0')\n }\n\n /**\n * Get current tab link\n *\n * @private\n * @returns {HTMLAnchorElement | null} Tab link\n */\n getCurrentTab() {\n return this.$root.querySelector(\n '.govuk-tabs__list-item--selected a.govuk-tabs__tab'\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-tabs'\n}\n"],"names":["Tabs","GOVUKFrontendComponent","constructor","$root","$tabs","$tabList","$tabListItems","jsHiddenClass","changingHash","boundTabClick","boundTabKeydown","boundOnHashChange","mql","querySelectorAll","length","ElementError","component","identifier","onTabClick","bind","onTabKeydown","onHashChange","querySelector","setupResponsiveChecks","breakpoint","getBreakpoint","value","property","window","matchMedia","addEventListener","checkMode","addListener","_this$mql","matches","setup","teardown","_this$getTab","setAttribute","forEach","$item","$tab","setAttributes","hideTab","$activeTab","getTab","location","hash","showTab","removeAttribute","removeEventListener","unsetAttributes","$tabWithHash","$previousTab","getCurrentTab","focus","unhighlightTab","hidePanel","highlightTab","showPanel","panelId","getFragmentFromUrl","href","$panel","getPanel","id","classList","add","remove","event","$currentTab","$nextTab","currentTarget","HTMLAnchorElement","preventDefault","createHistoryEntry","key","activatePreviousTab","activateNextTab","parentElement","$nextTabListItem","nextElementSibling","$previousTabListItem","previousElementSibling","moduleName"],"mappings":"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"}