govuk-frontend
Version:
GOV.UK Frontend contains the code you need to start building a user interface for government platforms and services.
1 lines • 4.07 kB
Source Map (JSON)
{"version":3,"file":"skip-link.mjs","sources":["../../../../src/govuk/components/skip-link/skip-link.mjs"],"sourcesContent":["import { setFocus } from '../../common/index.mjs'\nimport { Component } from '../../component.mjs'\nimport { ElementError } from '../../errors/index.mjs'\n\n/**\n * Skip link component\n *\n * @preserve\n * @augments Component<HTMLAnchorElement>\n */\nexport class SkipLink extends Component {\n static elementType = HTMLAnchorElement\n\n /**\n * @param {Element | null} $root - HTML element to use for skip link\n * @throws {ElementError} when $root is not set or the wrong type\n * @throws {ElementError} when $root.hash does not contain a hash\n * @throws {ElementError} when the linked element is missing or the wrong type\n */\n constructor($root) {\n super($root)\n\n const hash = this.$root.hash\n const href = this.$root.getAttribute('href') ?? ''\n\n // Return early for external URLs or links to other pages\n if (\n this.$root.origin !== window.location.origin ||\n this.$root.pathname !== window.location.pathname\n ) {\n return\n }\n\n const linkedElementId = hash.replace('#', '')\n\n // Check link path matching current page\n if (!linkedElementId) {\n throw new ElementError(\n `Skip link: Target link (\\`href=\"${href}\"\\`) has no hash fragment`\n )\n }\n\n const $linkedElement = document.getElementById(linkedElementId)\n\n // Check for link target element\n if (!$linkedElement) {\n throw new ElementError({\n component: SkipLink,\n element: $linkedElement,\n identifier: `Target content (\\`id=\"${linkedElementId}\"\\`)`\n })\n }\n\n /**\n * Focus the linked element on click\n *\n * Adds a helper CSS class to hide native focus styles,\n * but removes it on blur to restore native focus styles\n */\n this.$root.addEventListener('click', () =>\n setFocus($linkedElement, {\n onBeforeFocus() {\n $linkedElement.classList.add('govuk-skip-link-focused-element')\n },\n onBlur() {\n $linkedElement.classList.remove('govuk-skip-link-focused-element')\n }\n })\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-skip-link'\n}\n"],"names":["SkipLink","Component","constructor","$root","_this$$root$getAttrib","hash","href","getAttribute","origin","window","location","pathname","linkedElementId","replace","ElementError","$linkedElement","document","getElementById","component","element","identifier","addEventListener","setFocus","onBeforeFocus","classList","add","onBlur","remove","elementType","HTMLAnchorElement","moduleName"],"mappings":";;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,QAAQ,SAASC,SAAS,CAAC;AAGtC;AACF;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,KAAK,EAAE;AAAA,IAAA,IAAAC,qBAAA;IACjB,KAAK,CAACD,KAAK,CAAC;AAEZ,IAAA,MAAME,IAAI,GAAG,IAAI,CAACF,KAAK,CAACE,IAAI;AAC5B,IAAA,MAAMC,IAAI,GAAA,CAAAF,qBAAA,GAAG,IAAI,CAACD,KAAK,CAACI,YAAY,CAAC,MAAM,CAAC,KAAA,IAAA,GAAAH,qBAAA,GAAI,EAAE;IAGlD,IACE,IAAI,CAACD,KAAK,CAACK,MAAM,KAAKC,MAAM,CAACC,QAAQ,CAACF,MAAM,IAC5C,IAAI,CAACL,KAAK,CAACQ,QAAQ,KAAKF,MAAM,CAACC,QAAQ,CAACC,QAAQ,EAChD;AACA,MAAA;AACF,IAAA;IAEA,MAAMC,eAAe,GAAGP,IAAI,CAACQ,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAG7C,IAAI,CAACD,eAAe,EAAE;AACpB,MAAA,MAAM,IAAIE,YAAY,CACpB,CAAA,gCAAA,EAAmCR,IAAI,2BACzC,CAAC;AACH,IAAA;AAEA,IAAA,MAAMS,cAAc,GAAGC,QAAQ,CAACC,cAAc,CAACL,eAAe,CAAC;IAG/D,IAAI,CAACG,cAAc,EAAE;MACnB,MAAM,IAAID,YAAY,CAAC;AACrBI,QAAAA,SAAS,EAAElB,QAAQ;AACnBmB,QAAAA,OAAO,EAAEJ,cAAc;QACvBK,UAAU,EAAE,yBAAyBR,eAAe,CAAA,IAAA;AACtD,OAAC,CAAC;AACJ,IAAA;IAQA,IAAI,CAACT,KAAK,CAACkB,gBAAgB,CAAC,OAAO,EAAE,MACnCC,QAAQ,CAACP,cAAc,EAAE;AACvBQ,MAAAA,aAAaA,GAAG;AACdR,QAAAA,cAAc,CAACS,SAAS,CAACC,GAAG,CAAC,iCAAiC,CAAC;MACjE,CAAC;AACDC,MAAAA,MAAMA,GAAG;AACPX,QAAAA,cAAc,CAACS,SAAS,CAACG,MAAM,CAAC,iCAAiC,CAAC;AACpE,MAAA;AACF,KAAC,CACH,CAAC;AACH,EAAA;AAMF;AAjEa3B,QAAQ,CACZ4B,WAAW,GAAGC,iBAAiB;AAD3B7B,QAAQ,CAgEZ8B,UAAU,GAAG,iBAAiB;;;;"}