{"version":3,"file":"bundle.js","sources":["node_modules/anchor-js/anchor.js","src/index.js"],"sourcesContent":["/* eslint-env amd */\n/* globals module:false */\n\n// https://github.com/umdjs/umd/blob/master/templates/returnExports.js\n(function (root, factory) {\n 'use strict';\n\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.AnchorJS = factory();\n root.anchors = new root.AnchorJS();\n }\n}(this, function () {\n 'use strict';\n\n function AnchorJS(options) {\n this.options = options || {};\n this.elements = [];\n\n /**\n * Assigns options to the internal options object, and provides defaults.\n * @param {Object} opts - Options object\n */\n function _applyRemainingDefaultOptions(opts) {\n opts.icon = opts.hasOwnProperty('icon') ? opts.icon : '\\ue9cb'; // Accepts characters (and also URLs?), like '#', '¶', '❡', or '§'.\n opts.visible = opts.hasOwnProperty('visible') ? opts.visible : 'hover'; // Also accepts 'always' & 'touch'\n opts.placement = opts.hasOwnProperty('placement') ? opts.placement : 'right'; // Also accepts 'left'\n opts.ariaLabel = opts.hasOwnProperty('ariaLabel') ? opts.ariaLabel : 'Anchor'; // Accepts any text.\n opts.class = opts.hasOwnProperty('class') ? opts.class : ''; // Accepts any class name.\n opts.base = opts.hasOwnProperty('base') ? opts.base : ''; // Accepts any base URI.\n // Using Math.floor here will ensure the value is Number-cast and an integer.\n opts.truncate = opts.hasOwnProperty('truncate') ? Math.floor(opts.truncate) : 64; // Accepts any value that can be typecast to a number.\n opts.titleText = opts.hasOwnProperty('titleText') ? opts.titleText : ''; // Accepts any text.\n }\n\n _applyRemainingDefaultOptions(this.options);\n\n /**\n * Checks to see if this device supports touch. Uses criteria pulled from Modernizr:\n * https://github.com/Modernizr/Modernizr/blob/da22eb27631fc4957f67607fe6042e85c0a84656/feature-detects/touchevents.js#L40\n * @return {Boolean} - true if the current device supports touch.\n */\n this.isTouchDevice = function() {\n return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);\n };\n\n /**\n * Add anchor links to page elements.\n * @param {String|Array|Nodelist} selector - A CSS selector for targeting the elements you wish to add anchor links\n * to. Also accepts an array or nodeList containing the relavant elements.\n * @return {this} - The AnchorJS object\n */\n this.add = function(selector) {\n var elements,\n elsWithIds,\n idList,\n elementID,\n i,\n index,\n count,\n tidyText,\n newTidyText,\n anchor,\n visibleOptionToUse,\n hrefBase,\n indexesToDrop = [];\n\n // We reapply options here because somebody may have overwritten the default options object when setting options.\n // For example, this overwrites all options but visible:\n //\n // anchors.options = { visible: 'always'; }\n _applyRemainingDefaultOptions(this.options);\n\n visibleOptionToUse = this.options.visible;\n if (visibleOptionToUse === 'touch') {\n visibleOptionToUse = this.isTouchDevice() ? 'always' : 'hover';\n }\n\n // Provide a sensible default selector, if none is given.\n if (!selector) {\n selector = 'h2, h3, h4, h5, h6';\n }\n\n elements = _getElements(selector);\n\n if (elements.length === 0) {\n return this;\n }\n\n _addBaselineStyles();\n\n // We produce a list of existing IDs so we don't generate a duplicate.\n elsWithIds = document.querySelectorAll('[id]');\n idList = [].map.call(elsWithIds, function assign(el) {\n return el.id;\n });\n\n for (i = 0; i < elements.length; i++) {\n if (this.hasAnchorJSLink(elements[i])) {\n indexesToDrop.push(i);\n continue;\n }\n\n if (elements[i].hasAttribute('id')) {\n elementID = elements[i].getAttribute('id');\n } else if (elements[i].hasAttribute('data-anchor-id')) {\n elementID = elements[i].getAttribute('data-anchor-id');\n } else {\n tidyText = this.urlify(elements[i].textContent);\n\n // Compare our generated ID to existing IDs (and increment it if needed)\n // before we add it to the page.\n newTidyText = tidyText;\n count = 0;\n do {\n if (index !== undefined) {\n newTidyText = tidyText + '-' + count;\n }\n\n index = idList.indexOf(newTidyText);\n count += 1;\n } while (index !== -1);\n index = undefined;\n idList.push(newTidyText);\n\n elements[i].setAttribute('id', newTidyText);\n elementID = newTidyText;\n }\n\n // The following code efficiently builds this DOM structure:\n // `\n // ;`\n anchor = document.createElement('a');\n anchor.className = 'anchorjs-link ' + this.options.class;\n anchor.setAttribute('aria-label', this.options.ariaLabel);\n anchor.setAttribute('data-anchorjs-icon', this.options.icon);\n if (this.options.titleText) {\n anchor.title = this.options.titleText;\n }\n // Adjust the href if there's a tag. See https://github.com/bryanbraun/anchorjs/issues/98\n hrefBase = document.querySelector('base') ? window.location.pathname + window.location.search : '';\n hrefBase = this.options.base || hrefBase;\n anchor.href = hrefBase + '#' + elementID;\n\n if (visibleOptionToUse === 'always') {\n anchor.style.opacity = '1';\n }\n\n if (this.options.icon === '\\ue9cb') {\n anchor.style.font = '1em/1 anchorjs-icons';\n\n // We set lineHeight = 1 here because the `anchorjs-icons` font family could otherwise affect the\n // height of the heading. This isn't the case for icons with `placement: left`, so we restore\n // line-height: inherit in that case, ensuring they remain positioned correctly. For more info,\n // see https://github.com/bryanbraun/anchorjs/issues/39.\n if (this.options.placement === 'left') {\n anchor.style.lineHeight = 'inherit';\n }\n }\n\n if (this.options.placement === 'left') {\n anchor.style.position = 'absolute';\n anchor.style.marginLeft = '-1em';\n anchor.style.paddingRight = '0.5em';\n elements[i].insertBefore(anchor, elements[i].firstChild);\n } else { // if the option provided is `right` (or anything else).\n anchor.style.paddingLeft = '0.375em';\n elements[i].appendChild(anchor);\n }\n }\n\n for (i = 0; i < indexesToDrop.length; i++) {\n elements.splice(indexesToDrop[i] - i, 1);\n }\n this.elements = this.elements.concat(elements);\n\n return this;\n };\n\n /**\n * Removes all anchorjs-links from elements targeted by the selector.\n * @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links,\n * OR a nodeList / array containing the DOM elements.\n * @return {this} - The AnchorJS object\n */\n this.remove = function(selector) {\n var index,\n domAnchor,\n elements = _getElements(selector);\n\n for (var i = 0; i < elements.length; i++) {\n domAnchor = elements[i].querySelector('.anchorjs-link');\n if (domAnchor) {\n // Drop the element from our main list, if it's in there.\n index = this.elements.indexOf(elements[i]);\n if (index !== -1) {\n this.elements.splice(index, 1);\n }\n // Remove the anchor from the DOM.\n elements[i].removeChild(domAnchor);\n }\n }\n return this;\n };\n\n /**\n * Removes all anchorjs links. Mostly used for tests.\n */\n this.removeAll = function() {\n this.remove(this.elements);\n };\n\n /**\n * Urlify - Refine text so it makes a good ID.\n *\n * To do this, we remove apostrophes, replace non-safe characters with hyphens,\n * remove extra hyphens, truncate, trim hyphens, and make lowercase.\n *\n * @param {String} text - Any text. Usually pulled from the webpage element we are linking to.\n * @return {String} - hyphen-delimited text for use in IDs and URLs.\n */\n this.urlify = function(text) {\n // Regex for finding the non-safe URL characters (many need escaping): & +$,:;=?@\"#{}|^~[`%!'<>]./()*\\ (newlines, tabs, backspace, & vertical tabs)\n var nonsafeChars = /[& +$,:;=?@\"#{}|^~[`%!'<>\\]\\.\\/\\(\\)\\*\\\\\\n\\t\\b\\v]/g,\n urlText;\n\n // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently,\n // even after setting options. This can be useful for tests or other applications.\n if (!this.options.truncate) {\n _applyRemainingDefaultOptions(this.options);\n }\n\n // Note: we trim hyphens after truncating because truncating can cause dangling hyphens.\n // Example string: // \" ⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n urlText = text.trim() // \"⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n .replace(/\\'/gi, '') // \"⚡⚡ Dont forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n .replace(nonsafeChars, '-') // \"⚡⚡-Dont-forget--URL-fragments-should-be-i18n-friendly--hyphenated--short--and-clean-\"\n .replace(/-{2,}/g, '-') // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-short-and-clean-\"\n .substring(0, this.options.truncate) // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-\"\n .replace(/^-+|-+$/gm, '') // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated\"\n .toLowerCase(); // \"⚡⚡-dont-forget-url-fragments-should-be-i18n-friendly-hyphenated\"\n\n return urlText;\n };\n\n /**\n * Determines if this element already has an AnchorJS link on it.\n * Uses this technique: http://stackoverflow.com/a/5898748/1154642\n * @param {HTMLElement} el - a DOM node\n * @return {Boolean} true/false\n */\n this.hasAnchorJSLink = function(el) {\n var hasLeftAnchor = el.firstChild && ((' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1),\n hasRightAnchor = el.lastChild && ((' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1);\n\n return hasLeftAnchor || hasRightAnchor || false;\n };\n\n /**\n * Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods).\n * It also throws errors on any other inputs. Used to handle inputs to .add and .remove.\n * @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links,\n * OR a nodeList / array containing the DOM elements.\n * @return {Array} - An array containing the elements we want.\n */\n function _getElements(input) {\n var elements;\n if (typeof input === 'string' || input instanceof String) {\n // See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array.\n elements = [].slice.call(document.querySelectorAll(input));\n // I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me.\n } else if (Array.isArray(input) || input instanceof NodeList) {\n elements = [].slice.call(input);\n } else {\n throw new Error('The selector provided to AnchorJS was invalid.');\n }\n return elements;\n }\n\n /**\n * _addBaselineStyles\n * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration.\n */\n function _addBaselineStyles() {\n // We don't want to add global baseline styles if they've been added before.\n if (document.head.querySelector('style.anchorjs') !== null) {\n return;\n }\n\n var style = document.createElement('style'),\n linkRule =\n ' .anchorjs-link {' +\n ' opacity: 0;' +\n ' text-decoration: none;' +\n ' -webkit-font-smoothing: antialiased;' +\n ' -moz-osx-font-smoothing: grayscale;' +\n ' }',\n hoverRule =\n ' *:hover > .anchorjs-link,' +\n ' .anchorjs-link:focus {' +\n ' opacity: 1;' +\n ' }',\n anchorjsLinkFontFace =\n ' @font-face {' +\n ' font-family: \"anchorjs-icons\";' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above\n ' src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format(\"truetype\");' +\n ' }',\n pseudoElContent =\n ' [data-anchorjs-icon]::after {' +\n ' content: attr(data-anchorjs-icon);' +\n ' }',\n firstStyleEl;\n\n style.className = 'anchorjs';\n style.appendChild(document.createTextNode('')); // Necessary for Webkit.\n\n // We place it in the head with the other style tags, if possible, so as to\n // not look out of place. We insert before the others so these styles can be\n // overridden if necessary.\n firstStyleEl = document.head.querySelector('[rel=\"stylesheet\"], style');\n if (firstStyleEl === undefined) {\n document.head.appendChild(style);\n } else {\n document.head.insertBefore(style, firstStyleEl);\n }\n\n style.sheet.insertRule(linkRule, style.sheet.cssRules.length);\n style.sheet.insertRule(hoverRule, style.sheet.cssRules.length);\n style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length);\n style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length);\n }\n }\n\n return AnchorJS;\n}));\n","import anchorJS from 'anchor-js';\n\nfunction gallerySetup() {\n document.querySelectorAll(\".gallery-image\").forEach((image) => {\n image.addEventListener(\"click\", _e => {\n let clazz = \"gallery-image--fullscreen\";\n let fullscreen_image = image.cloneNode(true);\n document.body.classList.add(clazz);\n fullscreen_image.classList.add(clazz);\n fullscreen_image.addEventListener(\"click\", () => {\n fullscreen_image.remove();\n document.body.classList.remove(clazz);\n });\n document.body.appendChild(fullscreen_image);\n setTimeout(() => {\n let source = fullscreen_image.querySelector(\"source\");\n if (source) {\n source.sizes = \"1500px\";\n }\n });\n });\n });\n}\n\ndocument.addEventListener('DOMContentLoaded', e => {\n var anchors = new anchorJS();\n anchors.options.placement = 'left';\n anchors.add('article > h1, article > h2, article > h3');\n\n gallerySetup();\n});\n"],"names":["root","factory","this","options","_applyRemainingDefaultOptions","opts","icon","hasOwnProperty","visible","placement","ariaLabel","class","base","truncate","Math","floor","titleText","_getElements","input","elements","String","slice","call","document","querySelectorAll","Array","isArray","NodeList","Error","isTouchDevice","window","DocumentTouch","add","selector","elsWithIds","idList","elementID","i","index","count","tidyText","newTidyText","anchor","visibleOptionToUse","hrefBase","indexesToDrop","length","head","querySelector","firstStyleEl","style","createElement","className","appendChild","createTextNode","undefined","insertBefore","sheet","insertRule","cssRules","_addBaselineStyles","map","el","id","hasAnchorJSLink","push","hasAttribute","getAttribute","urlify","textContent","indexOf","setAttribute","title","location","pathname","search","href","opacity","font","lineHeight","position","marginLeft","paddingRight","firstChild","paddingLeft","splice","concat","remove","domAnchor","removeChild","removeAll","text","trim","replace","substring","toLowerCase","hasLeftAnchor","hasRightAnchor","lastChild","module","exports","AnchorJS","anchors","addEventListener","e","anchorJS","forEach","image","_e","clazz","fullscreen_image","cloneNode","body","classList","setTimeout","source","sizes"],"mappings":"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"}