{"version":3,"file":"helpers-4326c399.js","sources":["../../../src/js/modules/helpers.js"],"sourcesContent":["import FetchWrapper from './fetch-wrapper.js';\nconst thisWebsiteAPI = new FetchWrapper(`${window.location.protocol}//${window.location.host}` );\n\n/**\n * Returns the type of interactions the device supports (click / mouseover)\n * @returns {string}\n */\nfunction interactionType() {\n\tlet interactionType = 'mouseover';\n\n\tif( window.matchMedia('(hover: hover)') ) { // desktop\n\t\tinteractionType = 'mouseover'; }\n\tif( window.matchMedia('(hover: none) and (pointer: coarse)') ) { // touchscreen\n\t\tinteractionType = 'click'; }\n\tif( window.matchMedia('(hover: none) and (pointer: fine)') ) { // stylus\n\t\tinteractionType = 'click'; }\n\tif( window.matchMedia('(hover: hover) and (pointer: coarse)') ) { // Wii/Kinect/etc\n\t\tinteractionType = 'mouseover'; }\n\tif( window.matchMedia('(hover: hover) and (pointer: fine)') ) { // mouse\n\t\tinteractionType = 'mouseover'; }\n\n\treturn interactionType;\n}\n\n/**\n * Add and update a data attribute on the HTML element to indicate the state of the page's scroll\n */\nfunction windowHasScrolled() {\n\tconst html = document.querySelector('html');\n\n\tif (window.scrollY > 0) {\n\t\thtml.dataset.pageHasScrolled = 'true';\n\t} else {\n\t\thtml.dataset.pageHasScrolled = 'false';\n\t}\n}\n\n/**\n * Enable animated \"intro\" on blocks that scroll into view\n */\nfunction scrollAnimatedBlocks() {\n\tif (!!window.IntersectionObserver) {\n\t\tdocument.querySelector('html').dataset.supportsIntersectionObserver = 'true';\n\n\t\tlet observer = new IntersectionObserver((watchList, observer) => {\n\t\t\twatchList.forEach(watchedElement => {\n\t\t\t\tif (watchedElement.isIntersecting) {\n\t\t\t\t\t// console.log(watchedElement);\n\t\t\t\t\twatchedElement.target.dataset.inViewport = 'true';\n\t\t\t\t\tobserver.unobserve(watchedElement.target);\n\t\t\t\t}\n\t\t\t});\n\t\t}, {rootMargin: \"0px 0px -20% 0px\"});\n\n\t\tdocument.querySelectorAll('[data-scroll-reveal]').forEach(watchTarget => {\n\t\t\tobserver.observe(watchTarget);\n\t\t});\n\t} else { console.log('doesnt supportsIntersectionObserver') }\n}\n\n/**\n * Indicate to users that Sprig forms are doing something when submitted\n */\nfunction sprigFormWatcher() {\n\tdocument.querySelectorAll('form[sprig]').forEach(sprigForm => {\n\t\tsprigForm.insertAdjacentHTML('beforeend', `\n\t\t\t\n\t\t\t\t

Please wait

\n\t\t\t\t\n\t\t\t
\n\t\t`);\n\n\t\tlet dialog = sprigForm.querySelector('.sprigActionFeedback');\n\n\t\tdialog.querySelector('button').addEventListener('click', () => {\n\t\t\tdialog.close();\n\t\t});\n\n\t\tsprigForm.addEventListener('submit', () => {\n\t\t\tdialog.showModal();\n\t\t});\n\t});\n}\n\n/**\n * Take a link with a class of `popup` and create a modal displaying higher resolution of the thumbnail image\n *\n * @param {Node} popupLink\n */\nfunction handlePopupImageLink( popupLink ) {\n\tpopupLink.addEventListener('click', (e) => {\n\t\te.preventDefault();\n\t\tlet parser = new DOMParser();\n\n\t\tlet clickedLink = e.currentTarget;\n\t\tclickedLink.dataset.fetchStatus = \"loading\";\n\n\t\tthisWebsiteAPI\n\t\t\t.getHtml(clickedLink.getAttribute('href'))\n\t\t\t.then(response => {\n\t\t\t\tlet responseAsDom = parser.parseFromString(response, \"text/html\");\n\t\t\t\tlet imageWeWant = responseAsDom.querySelector('#ajaxcontent').outerHTML;\n\n\t\t\t\tdocument.querySelector('body').insertAdjacentHTML(\n\t\t\t\t\t'afterbegin',\n\t\t\t\t\t`\n\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t${imageWeWant}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t`);\n\n\t\t\t\tlet lightbox = document.querySelector('#lightbox');\n\t\t\t\tlightbox.showModal();\n\t\t\t\tclickedLink.dataset.fetchStatus = 'loaded';\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t});\n\n\t\t// remove the entire thing from the DOM when closed, to stop the video from continuing to play\n\t\tdocument.querySelector('#lightbox').addEventListener(\"close\", e => {\n\t\t\te.target.remove();\n\t\t});\n\t})\n}\n\n/**\n * Activate all links that have a class `popup`\n */\nfunction popupImages() {\n\tdocument.querySelectorAll('a[data-popup=\"image\"]').forEach( popupLink => {\n\t\thandlePopupImageLink( popupLink );\n\t});\n}\n\n/**\n * Adds a relative age in days to DOM elements that are annotated with some sort of date\n *\n * @param {string} targetElement - The selector of the element we're matching against\n * @param {string} outputTarget - The selector of the sub-element we append a relative time to\n *\n * @example data-date-posted=\"2023-06-23T09:43:58+01:00\"\n */\nfunction relativeAges(targetElement, outputTarget) {\n\tconst utcDate = new Date();\n\tconst isoDate = utcDate.toISOString();\n\tconst rtf1 = new Intl.RelativeTimeFormat(\n\t\t'en-GB',\n\t\t{ numeric: 'auto' }\n\t);\n\n\tdocument\n\t\t.querySelectorAll( targetElement )\n\t\t.forEach(item => {\n\t\t\tconst prodDate = new Date(item.dataset.dateCreated);\n\t\t\tconst dateInUTC = new Date(isoDate);\n\n\t\t\tlet differenceInDays = Math.abs(dateInUTC.getDate() - prodDate.getDate());\n\t\t\tlet output = rtf1.format(0 - differenceInDays, 'day')\n\n\t\t\tif (differenceInDays > 6) {\n\t\t\t\titem\n\t\t\t\t\t.querySelector(':scope ' + outputTarget)\n\t\t\t\t\t.insertAdjacentHTML(\n\t\t\t\t\t\t'beforeend',\n\t\t\t\t\t\t`(${output})`\n\t\t\t\t\t);\n\t\t\t}\n\t\t});\n}\n\n/**\n * Add event listeners for all \n */\nfunction handleDialog() {\n\tdocument.querySelectorAll('button[data-show-dialog]').forEach(\n\t\tdialogButton => {\n\t\t\tdialogButton.addEventListener('click', event => {\n\t\t\t\tlet targetDialog = \"#\" + event.target.dataset.showDialog;\n\t\t\t\tdocument.querySelector( targetDialog ).showModal();\n\t\t\t});\n\t\t}\n\t);\n}\n\n/* Fire functions on load */\nrelativeAges('[data-date-posted]','.meta');\nwindowHasScrolled();\nsprigFormWatcher();\npopupImages();\nscrollAnimatedBlocks();\nhandleDialog();\n\n/* Hook functions up to event listeners, so they update things as needed later */\nwindow.addEventListener('scroll', function() {\n\twindowHasScrolled();\n});\n"],"names":["thisWebsiteAPI","FetchWrapper","windowHasScrolled","html","scrollAnimatedBlocks","observer","watchList","watchedElement","watchTarget","sprigFormWatcher","sprigForm","dialog","handlePopupImageLink","popupLink","e","parser","clickedLink","response","imageWeWant","error","popupImages","relativeAges","targetElement","outputTarget","isoDate","rtf1","item","prodDate","dateInUTC","differenceInDays","output","handleDialog","dialogButton","event","targetDialog"],"mappings":"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"}