{"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;;;;"}