{"version":3,"file":"index-BE75HRn5.js","sources":["../../Assets/Scripts/components/tableOfContents/index.ts"],"sourcesContent":["const primaryHeaderHeight = 90;\nconst scrollOffset = 40;\n\nconst SELECTOR = \".js-table-of-contents\";\nconst CSS = {\n active: \"table-of-contents__link--active\",\n initialised: \"table-of-contents__items--initialised\",\n};\n\nconst instance = ($el: Element) => {\n const target = $el.getAttribute(\"data-target\") as string;\n\n if (!target) {\n return;\n }\n\n const $content = document.querySelector(target) as HTMLElement;\n\n if (!$content) {\n return;\n }\n\n const $headings = $content.querySelectorAll(\"h2\");\n\n if (!$headings.length || $headings.length == 1) {\n return;\n }\n\n const existingHeadings: string[] = [];\n const anchorLinks: HTMLElement[] = [];\n\n // Add all existing ids on the page to the existingHeadings array\n document.querySelectorAll(\"[id]\").forEach(($el) => {\n if ($el.id) {\n existingHeadings.push($el.id);\n }\n });\n\n //For each heading...\n $headings.forEach(($heading) => {\n // Add an id to the heading if it doesn't have one\n if (!$heading.textContent) {\n return;\n }\n\n if (!$heading.id) {\n let newId = \"\";\n const generatedId = $heading.textContent\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"\");\n\n // Ensure heading id is unique by appending the number of times it already appears in the array\n if (existingHeadings.includes(generatedId)) {\n const count = existingHeadings.filter(\n (heading) => heading === generatedId,\n ).length;\n newId = `${generatedId}-${count + 1}`;\n } else {\n newId = generatedId;\n }\n\n existingHeadings.push(generatedId);\n\n $heading.id = newId;\n }\n\n //Add an $anchorLink link to the table of contents\n const $anchorLink = document.createElement(\"a\");\n $anchorLink.href = `#${$heading.id}`;\n $anchorLink.textContent = $heading.textContent as string;\n $anchorLink.classList.add(\"table-of-contents__link\");\n $anchorLink.setAttribute(\"data-scroll\", \"\");\n $el.appendChild($anchorLink);\n anchorLinks.push($anchorLink);\n });\n\n window.addEventListener(\"scroll\", () => {\n const scrollTop = window.scrollY;\n\n // highlight the last scrolled to\n anchorLinks.forEach((link) => {\n link.classList.remove(CSS.active);\n });\n\n // then iterate backwards, on the first match highlight it and break\n let highlighted = false;\n for (let i = $headings.length - 1; i >= 0; i--) {\n if (\n scrollTop >\n ($headings[i] as HTMLHeadingElement).getBoundingClientRect().top -\n primaryHeaderHeight -\n scrollOffset\n ) {\n anchorLinks[i].classList.add(CSS.active);\n highlighted = true;\n break;\n }\n }\n\n // If nothing's highlighted, highlight the first link\n if (highlighted === false) {\n anchorLinks[0].classList.add(CSS.active);\n }\n });\n\n $el.classList.add(CSS.initialised);\n};\n\nconst tableOfContents = () => {\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\n instance($el);\n });\n};\n\nexport default tableOfContents;\n"],"names":["SELECTOR","CSS","instance","$el","target","$content","$headings","existingHeadings","anchorLinks","$heading","newId","generatedId","count","heading","$anchorLink","scrollTop","link","highlighted","i","tableOfContents"],"mappings":"AAGA,MAAMA,EAAW,wBACXC,EAAM,CACV,OAAQ,kCACR,YAAa,uCACf,EAEMC,EAAYC,GAAiB,CAC3B,MAAAC,EAASD,EAAI,aAAa,aAAa,EAE7C,GAAI,CAACC,EACH,OAGI,MAAAC,EAAW,SAAS,cAAcD,CAAM,EAE9C,GAAI,CAACC,EACH,OAGI,MAAAC,EAAYD,EAAS,iBAAiB,IAAI,EAEhD,GAAI,CAACC,EAAU,QAAUA,EAAU,QAAU,EAC3C,OAGF,MAAMC,EAA6B,CAAC,EAC9BC,EAA6B,CAAC,EAGpC,SAAS,iBAAiB,MAAM,EAAE,QAASL,GAAQ,CAC7CA,EAAI,IACWI,EAAA,KAAKJ,EAAI,EAAE,CAC9B,CACD,EAGSG,EAAA,QAASG,GAAa,CAE1B,GAAA,CAACA,EAAS,YACZ,OAGE,GAAA,CAACA,EAAS,GAAI,CAChB,IAAIC,EAAQ,GACZ,MAAMC,EAAcF,EAAS,YAC1B,SACA,EAAA,YAAA,EACA,QAAQ,OAAQ,GAAG,EACnB,QAAQ,cAAe,EAAE,EAGxB,GAAAF,EAAiB,SAASI,CAAW,EAAG,CAC1C,MAAMC,EAAQL,EAAiB,OAC5BM,GAAYA,IAAYF,CAAA,EACzB,OACFD,EAAQ,GAAGC,CAAW,IAAIC,EAAQ,CAAC,EAAA,MAE3BF,EAAAC,EAGVJ,EAAiB,KAAKI,CAAW,EAEjCF,EAAS,GAAKC,CAAA,CAIV,MAAAI,EAAc,SAAS,cAAc,GAAG,EAClCA,EAAA,KAAO,IAAIL,EAAS,EAAE,GAClCK,EAAY,YAAcL,EAAS,YACvBK,EAAA,UAAU,IAAI,yBAAyB,EACvCA,EAAA,aAAa,cAAe,EAAE,EAC1CX,EAAI,YAAYW,CAAW,EAC3BN,EAAY,KAAKM,CAAW,CAAA,CAC7B,EAEM,OAAA,iBAAiB,SAAU,IAAM,CACtC,MAAMC,EAAY,OAAO,QAGbP,EAAA,QAASQ,GAAS,CACvBA,EAAA,UAAU,OAAOf,EAAI,MAAM,CAAA,CACjC,EAGD,IAAIgB,EAAc,GAClB,QAASC,EAAIZ,EAAU,OAAS,EAAGY,GAAK,EAAGA,IAEvC,GAAAH,EACCT,EAAUY,CAAC,EAAyB,wBAAwB,IAC3D,GACA,GACF,CACAV,EAAYU,CAAC,EAAE,UAAU,IAAIjB,EAAI,MAAM,EACzBgB,EAAA,GACd,KAAA,CAKAA,IAAgB,IAClBT,EAAY,CAAC,EAAE,UAAU,IAAIP,EAAI,MAAM,CACzC,CACD,EAEGE,EAAA,UAAU,IAAIF,EAAI,WAAW,CACnC,EAEMkB,EAAkB,IAAM,CAC5B,SAAS,iBAAiBnB,CAAQ,EAAE,QAASG,GAAiB,CAC5DD,EAASC,CAAG,CAAA,CACb,CACH"}