{"version":3,"sources":["webpack:///node_modules/webpack-polyfill-injector/src/loader.js","webpack:///src/app/utilities/init.js","webpack:///src/app/utilities/render.js","webpack:///src/app/utilities/sortBy.js","webpack:///src/app/utilities/removeDuplicateObjectsFromArray.js","webpack:///src/app/utilities/trapFocus.js","webpack:///src/app/constants/transitions.js","webpack:///src/app/components/Carousel/index.js","webpack:///src/app/components/HeroCarousel/index.js","webpack:///src/app/components/SlideToggle/index.js","webpack:///src/app/components/Tippy/index.js","webpack:///src/app/components/InPageNav/index.js","webpack:///src/app/react-components/Bulletins/Filters/index.js","webpack:///src/app/react-components/Bulletins/index.js","webpack:///src/app/index.js","webpack:///src/app/libraries/Sticky/index.js","webpack:///src/app/constants/breakpoints.js"],"names":["main","polyfills","call","window","single","args","container","console","error","multiple","props","ReactDOM","sortBy","alphabet","prop","array","arr","indexOf","removeDuplicateObjectsFromArray","JSON","stringify","CANDIDATES","trapFocus","node","trap","nodes","release","retrap","transitions","long","base","short","shorter","shortest","Carousel","animationDuration","gap","rewind","dragThreshold","keyboard","breakpoints","ArrowDisabler","mount","settings","Glide","controlItem","left","right","CustomComponent","Components","Events","itemCounter","remove","Build","processTabIndexes","slides","map","contains","slide","element","HeroCarousel","autoplay","hoverpause","type","list","add","SlideToggle","button","checkState","updateOnclickHandler","targetElementContentHeightPx","targetElementHeight","targetElement","style","active","expanded","slideToggle","btnText","Tippy","tippy","content","document","innerHTML","appendTo","aria","allowHTML","arrow","trigger","interactive","hideOnClick","placement","onShow","hideAll","exclude","instance","setTimeout","tippyBox","focusTrap","onHide","popperOptions","modifiers","name","options","fallbackPlacements","maxWidth","closeBtn","InPageNav","mq","checkMediaQuery","init","label","join","isRendered","wrap","stickyClass","reflow","offset","link","header","speed","speedAsDuration","Filters","labels","handleFilterChange","target","selectedField","className","key","htmlFor","id","onChange","value","selected","Bulletins","filter","errors","useEffect","fetch","then","setAllFilterFields","keys","entries","setSelectedFilters","setRenderedFilterFields","setCurrentPage","filterBulletins","Object","setRenderedBulletins","useEventListener","parse","reduce","length","setFilteredBulletins","filters","filteredFields","bulletins","selectedFilters","setQueryParams","onClick","aria-label","aria-live","href","title","aria-labelledby","bulletin","app","render","reinitJS","Sticky","selector","arguments","_classCallCheck","this","elements","version","vp","body","marginTop","stickyFor","stickyContainer","updateScrollTopPosition","run","_this","pageLoaded","clearInterval","forEach","renderElement","_this2","rect","sticky","onload","wrapElement","activate","height","width","push","initResizeEvents","initScrollEvents","setPosition","_this3","_this4","css","position","top","parentNode","display","classList","_this5","_this6","scrollTop","callback","property","properties","module","xs","sm","md","lg","xl","xxl","mediaQueries","exports","DPR"],"mappings":"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","file":"Assets/Discovery.Project.Website/V2019/js/app.js","sourcesContent":["// Webpack Polyfill Injector\nfunction main() {\n require(\"C:/Users/jzmrhal/Desktop/Projects/Christie's Discovery Website/FE/V2019/src/app/index.js\");\n}\nvar polyfills = function() {\n return [\n /* Array.prototype.find */ (\"find\"in Array.prototype\n) ? 0 : 1,\n /* Object.assign */ (\"assign\"in Object\n) ? 0 : 1,\n /* Promise */ (\"Promise\"in this\n) ? 0 : 1,\n /* fetch */ (\"fetch\"in this\n) ? 0 : 1\n ];\n}.call(window);\nif (polyfills.indexOf(1) === -1) {\n main();\n} else {\n var js = document.createElement('script');\n js.src = \"Assets/Discovery.Project.Website/V2019/js/polyfills.\" + polyfills.join('') + '.js';\n js.onload = main;\n js.onerror = function onError(message) {\n console.error('Could not load the polyfills: ' + message);\n };\n document.head.appendChild(js);\n}","// Initialization of Vanilla JS components\n\nexport default {\n single: (Component, container, ...args) => {\n try {\n if (container) {\n return new Component(container, ...args)\n }\n } catch (e) {\n console.error(e)\n }\n },\n multiple: (Component, containers, ...args) => {\n try {\n return [...containers].map(container => new Component(container, ...args))\n } catch (e) {\n console.error(e)\n }\n },\n}\n","// Rendering React components\n\nimport React from 'react'\nimport ReactDOM from 'react-dom'\n\nexport default {\n single: (Component, container, props) => {\n try {\n if (container) {\n const { componentDefinition } = container.dataset\n\n if (componentDefinition) {\n props.componentDefinition =\n window.componentDefinitions[componentDefinition]\n }\n\n ReactDOM.render(, container)\n }\n } catch (e) {\n console.error(e)\n }\n },\n multiple: (Component, containers, props) => {\n try {\n return [...containers].forEach(container => {\n const { componentDefinition } = container.dataset\n\n if (componentDefinition) {\n props[componentDefinition] =\n window.componentDefinitions[componentDefinition]\n }\n\n ReactDOM.render(\n ,\n container\n )\n })\n } catch (e) {\n console.error(e)\n }\n },\n}\n","const sortBy = {\n alphabet: prop => (a, b) => (a[prop] < b[prop] ? -1 : 1),\n array: (arr, prop) => (a, b) => arr.indexOf(a[prop]) - arr.indexOf(b[prop]),\n}\n\nexport default sortBy\n","const removeDuplicateObjectsFromArray = arr =>\n arr.filter(\n (v, i, a) => a.findIndex(t => JSON.stringify(t) === JSON.stringify(v)) === i\n )\n\nexport default removeDuplicateObjectsFromArray\n","const CANDIDATES = `\n a, button, input, select, textarea, svg, area, details, summary,\n iframe, object, embed,\n [tabindex], [contenteditable]\n`\n\n/**\n * Trap focus in a specific DOM node.\n */\nconst trapFocus = (focusNode, rootNode = document) => {\n const nodes = [...rootNode.querySelectorAll(CANDIDATES)].filter(\n node => !focusNode.contains(node) && node.getAttribute('tabindex') !== '-1'\n )\n const trap = () => nodes.forEach(node => node.setAttribute('tabindex', '-1'))\n const release = () => nodes.forEach(node => node.removeAttribute('tabindex'))\n\n trap()\n\n return {\n nodes,\n release,\n retrap: trap,\n }\n}\n\nexport default trapFocus\n","const transitions = {\n long: 2000,\n base: 1000,\n short: 500,\n shorter: 300,\n shortest: 150,\n}\n\nexport default transitions\n","import Glide from '@glidejs/glide'\n\nimport { breakpoints } from '../../constants/breakpoints'\nimport transitions from '../../constants/transitions'\n\nfunction Carousel(container) {\n const slidesCount = container.querySelectorAll('.glide__slide').length\n const itemCurrent = container.querySelector('.js-carousel-item-current')\n const itemCount = container.querySelector('.js-carousel-item-count')\n const itemCounter = container.querySelector('.js-carousel-item-counter')\n\n const options = {\n animationDuration: transitions.short,\n gap: 0,\n rewind: false,\n dragThreshold: false,\n keyboard: false,\n breakpoints: {\n [breakpoints.sm - 1]: {\n gap: 16,\n },\n },\n }\n\n const ArrowDisabler = (Glide, Components) => {\n return {\n mount() {\n // Only in effect when rewinding is disabled\n if (Glide.settings.rewind) return\n\n Glide.on(['mount.after', 'run'], () => {\n const controlItem = Components.Controls.items[0]\n\n // Set left arrow state\n const left = controlItem.querySelector('.glide__arrow--left')\n\n if (left) {\n if (Glide.index === 0) {\n left.setAttribute('disabled', '') // Disable on first slide\n } else {\n left.removeAttribute('disabled') // Enable on other slides\n }\n }\n\n // Set right arrow state\n const right = controlItem.querySelector('.glide__arrow--right')\n if (right) {\n // Glide.index is based on the active slide\n // For bound: true, there will be no empty space & the last slide will never become active\n // Hence add perView to correctly calculate the last slide\n const lastSlideIndex = Glide.settings.bound\n ? Glide.index + (Glide.settings.perView - 1)\n : Glide.index\n\n if (lastSlideIndex === Components.Sizes.length - 1) {\n right.setAttribute('disabled', '') // Disable on last slide\n } else {\n right.removeAttribute('disabled') // Disable on other slides\n }\n }\n })\n },\n }\n }\n\n const CustomComponent = (Glide, Components, Events) => {\n const { Build, Html } = Components\n\n Events.on('mount.after', () => {\n itemCounter.classList.remove('u-display-none')\n })\n\n Events.on('move', () => {\n // Toggle active class instantly on carousel move\n Build.activeClass()\n processTabIndexes(Html.slides)\n if (itemCurrent) itemCurrent.textContent = Glide.index + 1\n if (itemCount) itemCount.textContent = slidesCount\n })\n\n return {}\n }\n\n function processTabIndexes([...slides]) {\n slides.map(slide => {\n const isActiveSlide = slide.classList.contains('glide__slide--active')\n\n if (isActiveSlide) {\n slide.removeAttribute('aria-hidden')\n } else {\n slide.setAttribute('aria-hidden', 'true')\n }\n\n ;[...slide.querySelectorAll('a')].map(element => {\n if (isActiveSlide) {\n element.removeAttribute('tabindex')\n } else {\n element.setAttribute('tabindex', '-1')\n }\n })\n })\n }\n\n new Glide(container, options).mount({ ArrowDisabler, CustomComponent })\n}\n\nexport default Carousel\n","import Glide from '@glidejs/glide'\n\nimport transitions from '../../constants/transitions'\n\nfunction HeroCarousel(container) {\n const options = {\n autoplay: 4000,\n hoverpause: false,\n type: 'carousel',\n animationDuration: transitions.short,\n gap: 0,\n rewind: false,\n dragThreshold: false,\n keyboard: false,\n }\n\n const list = container.querySelector('.hero-carousel__list')\n const items = container.querySelectorAll('.hero-carousel__list-item')\n const shouldCarouselInit = items.length > 1\n\n if (shouldCarouselInit) {\n list.classList.add('ready')\n new Glide(container, options).mount()\n }\n}\n\nexport default HeroCarousel\n","import { debounce } from 'debounce'\n\n/*\n Toggle a limited height to a target element by pressing a button\n*/\n\nfunction SlideToggle(button) {\n const targetElement = document.getElementById(button.dataset.slideTarget)\n\n if (!targetElement) return\n\n const maxHeight = 250\n const collapsedHeight = maxHeight - 20\n const collapsedHeightPx = `${collapsedHeight}px`\n const btnTextOriginal = button.firstElementChild.textContent || ''\n const btnTextExpanded = button.dataset.slideLabelExpanded || ''\n let targetElementHeight = targetElement.offsetHeight\n let targetElementContentHeightPx = `${targetElement.scrollHeight}px`\n let expanded = false\n let active = false\n\n checkState()\n window.addEventListener('resize', debounce(checkState, 200))\n\n // Adobe Analytics\n const onclickHandler = button.getAttribute('onclick')\n\n if (onclickHandler) {\n updateOnclickHandler(btnTextOriginal)\n }\n\n function init() {\n active = true\n expanded = false\n targetElement.style.maxHeight = collapsedHeightPx\n targetElement.classList.add('active')\n\n button.addEventListener('click', slideToggle)\n }\n\n function destroy() {\n active = false\n expanded = false\n targetElement.style.maxHeight = ''\n targetElement.classList.remove('active', 'expanded')\n\n button.removeEventListener('click', slideToggle)\n button.firstElementChild.textContent = btnTextOriginal\n }\n\n function checkState() {\n targetElementContentHeightPx = `${targetElement.scrollHeight}px`\n targetElementHeight = targetElement.offsetHeight\n\n if (expanded) {\n targetElement.style.maxHeight = targetElementContentHeightPx\n }\n\n if (!active && targetElementHeight >= maxHeight) {\n init()\n }\n\n if (active && targetElementHeight < collapsedHeight) {\n destroy()\n }\n }\n\n function slideToggle() {\n targetElement.style.maxHeight = expanded\n ? collapsedHeightPx\n : targetElementContentHeightPx\n\n expanded\n ? targetElement.classList.remove('expanded')\n : targetElement.classList.add('expanded')\n\n button.firstElementChild.textContent = expanded\n ? btnTextOriginal\n : btnTextExpanded\n expanded = !expanded\n\n if (onclickHandler) {\n const btnText = expanded ? btnTextExpanded : btnTextOriginal\n updateOnclickHandler(btnText)\n }\n }\n\n function updateOnclickHandler(btnText) {\n button.setAttribute(\n 'onclick',\n onclickHandler.replace(/{OBJECT_ID}/g, btnText)\n )\n }\n}\n\nexport default SlideToggle\n","import tippy, { hideAll } from 'tippy.js'\nimport { trapFocus } from 'utilities'\n\nfunction Tippy(container) {\n let focusTrap\n\n tippy(container, {\n content(reference) {\n const id = reference.getAttribute('data-template')\n const template = document.getElementById(id)\n return template.innerHTML\n },\n appendTo: document.querySelector('main'),\n aria: {\n expanded: 'auto',\n content: 'auto',\n },\n allowHTML: true,\n arrow: true,\n trigger: 'click',\n interactive: true,\n hideOnClick: false,\n placement: 'bottom',\n onShow(instance) {\n hideAll({ exclude: instance })\n\n const tippyBox = instance.popper.querySelector('.tippy-box')\n\n setTimeout(() => {\n tippyBox.focus()\n focusTrap = trapFocus(tippyBox)\n }, 50)\n },\n onHide(instance) {\n focusTrap.release()\n instance.reference.focus()\n },\n popperOptions: {\n placement: 'bottom',\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: ['bottom'],\n },\n },\n ],\n },\n maxWidth: 'none',\n })\n\n const closeBtn = container._tippy.popper.querySelector('.js-tippy-close')\n\n closeBtn.onclick = function() {\n container._tippy.hide()\n }\n}\n\nexport default Tippy\n","import Gumshoe from 'gumshoejs/dist/gumshoe.polyfills'\nimport SmoothScroll from 'smooth-scroll'\nimport Sticky from '../../libraries/Sticky'\nimport { mediaQueries } from '../../constants/breakpoints'\nimport transitions from '../../constants/transitions'\n\nfunction InPageNav(container) {\n const sections = [...document.querySelectorAll('.js-section')]\n let isRendered = false\n\n if (sections.length) {\n const mq = window.matchMedia(mediaQueries.lg)\n\n mq.addListener(() => checkMediaQuery(mq))\n\n checkMediaQuery(mq)\n }\n\n function init() {\n renderNav()\n makeNavSticky()\n makeNavScrollControled()\n makeNavScrollSmooth()\n }\n\n function checkMediaQuery(mq) {\n if (mq.matches) {\n if (!isRendered) init()\n\n container.classList.remove('u-display-none')\n } else {\n container.classList.add('u-display-none')\n }\n }\n\n function renderNav() {\n const { label = '' } = container.dataset\n\n const navHTML = `\n \n `\n\n container.innerHTML = navHTML\n isRendered = true\n }\n\n function makeNavSticky() {\n new Sticky('.js-sticky', {\n wrap: true,\n stickyClass: 'is-sticky',\n })\n }\n\n function makeNavScrollControled() {\n new Gumshoe('.in-page-nav__btn', {\n reflow: true,\n offset: () => container.getBoundingClientRect().height,\n })\n\n document.addEventListener(\n 'gumshoeActivate',\n event => {\n const { link } = event.detail\n\n link.classList.add('active')\n link.setAttribute('aria-current', 'true')\n },\n false\n )\n\n document.addEventListener(\n 'gumshoeDeactivate',\n event => {\n const { link } = event.detail\n\n link.classList.remove('active')\n link.removeAttribute('aria-current')\n },\n false\n )\n }\n\n function makeNavScrollSmooth() {\n new SmoothScroll('.in-page-nav__btn', {\n header: `#${container.id}`,\n speed: transitions.short,\n speedAsDuration: true,\n })\n }\n}\n\nexport default InPageNav\n","/* eslint-disable jsx-a11y/no-onchange */\nimport React from 'react'\n\nfunction Filters({ filters, selectedFilters, handleFilterChange, labels }) {\n const handleOnChange = e => {\n handleFilterChange({\n name: e.target.name,\n selectedField: e.target.value,\n })\n }\n\n return (\n \n )\n}\n\nexport default Filters\n","import React, { useState, useEffect } from 'react'\nimport { useQueryParams, StringParam } from 'use-query-params'\nimport qs from 'query-string'\nimport useEventListener from '@use-it/event-listener'\n\nimport { removeDuplicateObjectsFromArray, sortBy } from 'utilities'\n\nimport Filters from './Filters'\n\nfunction Bulletins({ componentDefinition }) {\n if (!componentDefinition) return\n\n const { apiEndpoint, itemsPerPage, filters, labels } = componentDefinition\n\n // Set types of component's query parameters\n const [queryParams, setQueryParams] = useQueryParams(\n filters.reduce(\n (acc, filter) => ({ ...acc, [filter.name]: StringParam }),\n {}\n )\n )\n\n const [allFilterFields, setAllFilterFields] = useState([]) // All possible filter fields\n const [renderedFilterFields, setRenderedFilterFields] = useState([]) // All currently rendered filter fields\n const [selectedFilters, setSelectedFilters] = useState([]) // All currently selected filters\n\n const [allBulletins, setAllBulletins] = useState([]) // All possible bulletins\n const [filteredBulletins, setFilteredBulletins] = useState([]) // All filtered bulletins\n const [renderedBulletins, setRenderedBulletins] = useState([]) // All currently rendered bulletins\n\n const [errors, setErrors] = useState(false)\n const [currentPage, setCurrentPage] = useState(1)\n\n // 1. Fetch bulletins from API\n useEffect(() => {\n fetch(apiEndpoint)\n .then(res => res.json())\n .then(res => setAllBulletins(res))\n .catch(err => setErrors(err))\n }, [])\n\n // 2. Bulletins are fetched, all bulletins are set\n // Set all possible filter fields\n useEffect(() => {\n if (allBulletins.length) {\n setAllFilterFields(composeFiltersFromBulletins(allBulletins))\n }\n }, [allBulletins])\n\n // 3. All filter fields are set\n // Set filters that should be selected and those that should be rendered\n useEffect(() => {\n if (Object.keys(allFilterFields).length) {\n const selectedFilters = Object.entries(queryParams).reduce(\n (acc, [key, val]) => ({\n ...acc,\n [key]: val === undefined ? '' : val,\n }),\n {}\n )\n\n setSelectedFilters({ ...getEmptySelectedFilters(), ...selectedFilters })\n setRenderedFilterFields(allFilterFields)\n }\n }, [allFilterFields])\n\n // 4. Selected filters are set\n // (Re)set the current page and filter bulletins based on selected filters\n useEffect(() => {\n if (Object.keys(selectedFilters).length) {\n setCurrentPage(1)\n filterBulletins()\n }\n }, [selectedFilters])\n\n // 5. Filtered bulletins are set\n // Set rendered filters and bulletins\n useEffect(() => {\n if (filteredBulletins.length) {\n const filterFields = composeFiltersFromBulletins(filteredBulletins)\n\n if (Object.keys(selectedFilters).length) {\n setRenderedFilterFields(filterFields)\n }\n\n setRenderedBulletins(getRenderedBulletins())\n }\n }, [filteredBulletins])\n\n // When current page changes (load more button is pressed), render more bulletins\n useEffect(() => {\n if (Object.keys(selectedFilters).length) {\n setRenderedBulletins(getRenderedBulletins())\n }\n }, [currentPage])\n\n // When going through browser history (back/forward buttons), set selected filters based on query parameters\n useEventListener('popstate', () => {\n const queryParams = qs.parse(location.search)\n\n const selectedFilters = filters.reduce(\n (acc, filter) => ({\n ...acc,\n [filter.name]: queryParams[filter.name] || '',\n }),\n {}\n )\n\n setSelectedFilters({ ...getEmptySelectedFilters(), ...selectedFilters })\n })\n\n // Return empty (reset) selected filters\n const getEmptySelectedFilters = () =>\n filters.reduce(\n (acc, filter) => ({\n ...acc,\n [filter.name]: '',\n }),\n {}\n )\n\n // Return rendered bulletins based on the current page\n const getRenderedBulletins = () =>\n filteredBulletins.slice(0, itemsPerPage * currentPage)\n\n // On filter change, set selected filters and reflect it in query parameters\n const handleFilterChange = filter => {\n setSelectedFilters({\n ...selectedFilters,\n [filter.name]: filter.selectedField,\n })\n setQueryParams(\n {\n ...selectedFilters,\n [filter.name]: filter.selectedField,\n },\n 'pushIn'\n )\n }\n\n // Set filtered bulletins based on selected filters\n const filterBulletins = () => {\n const filteredBulletins = allBulletins.filter(bulletin => {\n const filteredBulletin = Object.entries(selectedFilters).filter(\n ([name, selectedField]) =>\n selectedField === bulletin[name].id || selectedField === ''\n )\n\n return filteredBulletin.length === Object.keys(selectedFilters).length\n })\n\n setFilteredBulletins(filteredBulletins)\n }\n\n // Compose filter fields based on passed set of bulletins\n const composeFiltersFromBulletins = bulletins => {\n const getAllFilterFields = (bulletins, field) => {\n let filteredFields = bulletins.reduce(\n (prev, current) => [...prev, current[field]],\n []\n )\n\n const filter = filters.find(filter => filter.name === field)\n\n filteredFields.sort(\n filter.sortOrder\n ? sortBy.array(filter.sortOrder, 'id')\n : sortBy.alphabet('label')\n )\n\n return removeDuplicateObjectsFromArray(filteredFields)\n }\n\n return filters.reduce(\n (acc, filter) => ({\n ...acc,\n [filter.name]: getAllFilterFields(bulletins, filter.name),\n }),\n {}\n )\n }\n\n // Reset all filters\n const clearAllFilters = () => {\n setQueryParams(\n filters.reduce(\n (acc, filter) => ({ ...acc, [filter.name]: undefined }),\n {}\n )\n )\n\n setSelectedFilters(getEmptySelectedFilters())\n }\n\n // Set (only) clicked filter to selected filters\n const handleBulletinFilterClick = (filter, selectedField) => {\n const selectedFilters = {\n ...getEmptySelectedFilters(),\n [filter]: selectedField,\n }\n\n setQueryParams(selectedFilters)\n setSelectedFilters(selectedFilters)\n }\n\n return errors ? (\n

Error: {errors}

\n ) : (\n
\n \n {labels.filterBy}\n

\n\n \n\n \n {labels.clearAllFilters}\n \n\n \n {renderedBulletins.map(bulletin => (\n
  • \n \n

    \n {bulletin.title}\n

    \n
    \n\n \n {filters.map(filter => (\n
  • \n \n handleBulletinFilterClick(\n filter.name,\n bulletin[filter.name].id\n )\n }\n className=\"bulletins__filter-link btn btn-unstyled\"\n >\n {bulletin[filter.name].label}\n \n
  • \n ))}\n \n \n ))}\n \n\n {renderedBulletins.length < filteredBulletins.length && (\n
    \n setCurrentPage(currentPage + 1)}\n >\n {labels.loadMore}\n \n
    \n )}\n
    \n )\n}\n\nexport default Bulletins\n","import 'what-input'\n\nimport { init, render } from 'utilities'\n\nimport Sticky from './libraries/Sticky'\n\nimport Carousel from 'components/Carousel'\nimport HeroCarousel from 'components/HeroCarousel'\nimport SlideToggle from 'components/SlideToggle'\nimport Tippy from 'components/Tippy'\nimport InPageNav from 'components/InPageNav'\n\nimport Bulletins from 'react-components/Bulletins'\n\nfunction app() {\n new Sticky('.js-sticky', {\n wrap: true,\n stickyClass: 'is-sticky',\n })\n\n init.single(InPageNav, document.getElementById('in-page-nav'))\n init.multiple(SlideToggle, document.querySelectorAll('.js-slide-toggle'))\n init.multiple(Carousel, document.querySelectorAll('.js-carousel'))\n init.multiple(HeroCarousel, document.querySelectorAll('.js-hero-carousel'))\n init.multiple(Tippy, document.querySelectorAll('.js-tippy'))\n\n render.single(Bulletins, document.getElementById('react__bulletins'), {})\n}\n\nwindow.reinitJS = app\n\napp()\n","// Using custom tweaked Sticky library due to:\n// - change wrapping element from to
    for semantic reasons\n// - do not set width of the wrapping element to prevent issues\n\n/* eslint-disable */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function')\n }\n}\n\n/**\n * Sticky.js\n * Library for sticky elements written in vanilla javascript. With this library you can easily set sticky elements on your website. It's also responsive.\n *\n * @version 1.2.0\n * @author Rafal Galus \n * @website https://rgalus.github.io/sticky-js/\n * @repo https://github.com/rgalus/sticky-js\n * @license https://github.com/rgalus/sticky-js/blob/master/LICENSE\n */\n\nvar Sticky = (function() {\n /**\n * Sticky instance constructor\n * @constructor\n * @param {string} selector - Selector which we can find elements\n * @param {string} options - Global options for sticky elements (could be overwritten by data-{option}=\"\" attributes)\n */\n function Sticky() {\n var selector =\n arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''\n var options =\n arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}\n\n _classCallCheck(this, Sticky)\n\n this.selector = selector\n this.elements = []\n\n this.version = '1.2.0'\n\n this.vp = this.getViewportSize()\n this.body = document.querySelector('body')\n\n this.options = {\n wrap: options.wrap || false,\n marginTop: options.marginTop || 0,\n stickyFor: options.stickyFor || 0,\n stickyClass: options.stickyClass || null,\n stickyContainer: options.stickyContainer || 'body',\n }\n\n this.updateScrollTopPosition = this.updateScrollTopPosition.bind(this)\n\n this.updateScrollTopPosition()\n window.addEventListener('load', this.updateScrollTopPosition)\n window.addEventListener('scroll', this.updateScrollTopPosition)\n\n this.run()\n }\n\n /**\n * Function that waits for page to be fully loaded and then renders & activates every sticky element found with specified selector\n * @function\n */\n\n Sticky.prototype.run = function run() {\n var _this = this\n\n // wait for page to be fully loaded\n var pageLoaded = setInterval(function() {\n if (document.readyState === 'complete') {\n clearInterval(pageLoaded)\n\n var elements = document.querySelectorAll(_this.selector)\n _this.forEach(elements, function(element) {\n return _this.renderElement(element)\n })\n }\n }, 10)\n }\n\n /**\n * Function that assign needed variables for sticky element, that are used in future for calculations and other\n * @function\n * @param {node} element - Element to be rendered\n */\n\n Sticky.prototype.renderElement = function renderElement(element) {\n var _this2 = this\n\n // create container for variables needed in future\n element.sticky = {}\n\n // set default variables\n element.sticky.active = false\n\n element.sticky.marginTop =\n parseInt(element.getAttribute('data-margin-top')) ||\n this.options.marginTop\n element.sticky.stickyFor =\n parseInt(element.getAttribute('data-sticky-for')) ||\n this.options.stickyFor\n element.sticky.stickyClass =\n element.getAttribute('data-sticky-class') || this.options.stickyClass\n element.sticky.wrap = element.hasAttribute('data-sticky-wrap')\n ? true\n : this.options.wrap\n // @todo attribute for stickyContainer\n // element.sticky.stickyContainer = element.getAttribute('data-sticky-container') || this.options.stickyContainer;\n element.sticky.stickyContainer = this.options.stickyContainer\n\n element.sticky.container = this.getStickyContainer(element)\n element.sticky.container.rect = this.getRectangle(element.sticky.container)\n\n element.sticky.rect = this.getRectangle(element)\n\n // fix when element is image that has not yet loaded and width, height = 0\n if (element.tagName.toLowerCase() === 'img') {\n element.onload = function() {\n return (element.sticky.rect = _this2.getRectangle(element))\n }\n }\n\n if (element.sticky.wrap) {\n this.wrapElement(element)\n }\n\n // activate rendered element\n this.activate(element)\n }\n\n /**\n * Wraps element into placeholder element\n * @function\n * @param {node} element - Element to be wrapped\n */\n\n Sticky.prototype.wrapElement = function wrapElement(element) {\n element.insertAdjacentHTML(\n 'beforebegin',\n '
    '\n )\n element.previousSibling.appendChild(element)\n }\n\n /**\n * Function that activates element when specified conditions are met and then initalise events\n * @function\n * @param {node} element - Element to be activated\n */\n\n Sticky.prototype.activate = function activate(element) {\n if (\n element.sticky.rect.top + element.sticky.rect.height <\n element.sticky.container.rect.top +\n element.sticky.container.rect.height &&\n element.sticky.stickyFor < this.vp.width &&\n !element.sticky.active\n ) {\n element.sticky.active = true\n }\n\n if (this.elements.indexOf(element) < 0) {\n this.elements.push(element)\n }\n\n if (!element.sticky.resizeEvent) {\n this.initResizeEvents(element)\n element.sticky.resizeEvent = true\n }\n\n if (!element.sticky.scrollEvent) {\n this.initScrollEvents(element)\n element.sticky.scrollEvent = true\n }\n\n this.setPosition(element)\n }\n\n /**\n * Function which is adding onResizeEvents to window listener and assigns function to element as resizeListener\n * @function\n * @param {node} element - Element for which resize events are initialised\n */\n\n Sticky.prototype.initResizeEvents = function initResizeEvents(element) {\n var _this3 = this\n\n element.sticky.resizeListener = function() {\n return _this3.onResizeEvents(element)\n }\n window.addEventListener('resize', element.sticky.resizeListener)\n }\n\n /**\n * Removes element listener from resize event\n * @function\n * @param {node} element - Element from which listener is deleted\n */\n\n Sticky.prototype.destroyResizeEvents = function destroyResizeEvents(element) {\n window.removeEventListener('resize', element.sticky.resizeListener)\n }\n\n /**\n * Function which is fired when user resize window. It checks if element should be activated or deactivated and then run setPosition function\n * @function\n * @param {node} element - Element for which event function is fired\n */\n\n Sticky.prototype.onResizeEvents = function onResizeEvents(element) {\n this.vp = this.getViewportSize()\n\n element.sticky.rect = this.getRectangle(element)\n element.sticky.container.rect = this.getRectangle(element.sticky.container)\n\n if (\n element.sticky.rect.top + element.sticky.rect.height <\n element.sticky.container.rect.top +\n element.sticky.container.rect.height &&\n element.sticky.stickyFor < this.vp.width &&\n !element.sticky.active\n ) {\n element.sticky.active = true\n } else if (\n element.sticky.rect.top + element.sticky.rect.height >=\n element.sticky.container.rect.top +\n element.sticky.container.rect.height ||\n (element.sticky.stickyFor >= this.vp.width && element.sticky.active)\n ) {\n element.sticky.active = false\n }\n\n this.setPosition(element)\n }\n\n /**\n * Function which is adding onScrollEvents to window listener and assigns function to element as scrollListener\n * @function\n * @param {node} element - Element for which scroll events are initialised\n */\n\n Sticky.prototype.initScrollEvents = function initScrollEvents(element) {\n var _this4 = this\n\n element.sticky.scrollListener = function() {\n return _this4.onScrollEvents(element)\n }\n window.addEventListener('scroll', element.sticky.scrollListener)\n }\n\n /**\n * Removes element listener from scroll event\n * @function\n * @param {node} element - Element from which listener is deleted\n */\n\n Sticky.prototype.destroyScrollEvents = function destroyScrollEvents(element) {\n window.removeEventListener('scroll', element.sticky.scrollListener)\n }\n\n /**\n * Function which is fired when user scroll window. If element is active, function is invoking setPosition function\n * @function\n * @param {node} element - Element for which event function is fired\n */\n\n Sticky.prototype.onScrollEvents = function onScrollEvents(element) {\n if (element.sticky.active) {\n this.setPosition(element)\n }\n }\n\n /**\n * Main function for the library. Here are some condition calculations and css appending for sticky element when user scroll window\n * @function\n * @param {node} element - Element that will be positioned if it's active\n */\n\n Sticky.prototype.setPosition = function setPosition(element) {\n // this.css(element, { position: '', width: '', top: '', left: '' })\n this.css(element, { position: '', top: '', left: '' })\n\n if (this.vp.height < element.sticky.rect.height || !element.sticky.active) {\n return\n }\n\n if (!element.sticky.rect.width) {\n element.sticky.rect = this.getRectangle(element)\n }\n\n if (element.sticky.wrap) {\n this.css(element.parentNode, {\n display: 'block',\n // width: element.sticky.rect.width + 'px',\n height: element.sticky.rect.height + 'px',\n })\n\n this.css(element, {\n width: element.parentNode.offsetWidth + 'px',\n })\n }\n\n if (\n element.sticky.rect.top === 0 &&\n element.sticky.container === this.body\n ) {\n this.css(element, {\n position: 'fixed',\n top: element.sticky.rect.top + 'px',\n left: element.sticky.rect.left + 'px',\n // width: element.sticky.rect.width + 'px',\n })\n } else if (\n this.scrollTop >\n element.sticky.rect.top - element.sticky.marginTop\n ) {\n this.css(element, {\n position: 'fixed',\n // width: element.sticky.rect.width + 'px',\n left: element.sticky.rect.left + 'px',\n })\n\n if (\n this.scrollTop + element.sticky.rect.height + element.sticky.marginTop >\n element.sticky.container.rect.top +\n element.sticky.container.offsetHeight\n ) {\n if (element.sticky.stickyClass) {\n element.classList.remove(element.sticky.stickyClass)\n }\n\n this.css(element, {\n top:\n element.sticky.container.rect.top +\n element.sticky.container.offsetHeight -\n (this.scrollTop + element.sticky.rect.height) +\n 'px',\n })\n } else {\n if (element.sticky.stickyClass) {\n element.classList.add(element.sticky.stickyClass)\n }\n\n this.css(element, { top: element.sticky.marginTop + 'px' })\n }\n } else {\n if (element.sticky.stickyClass) {\n element.classList.remove(element.sticky.stickyClass)\n }\n\n // this.css(element, { position: '', width: '', top: '', left: '' })\n this.css(element, { position: '', top: '', left: '' })\n\n if (element.sticky.wrap) {\n this.css(element.parentNode, {\n display: '',\n // width: '',\n height: '',\n })\n }\n }\n }\n\n /**\n * Function that updates element sticky rectangle (with sticky container), then activate or deactivate element, then update position if it's active\n * @function\n */\n\n Sticky.prototype.update = function update() {\n var _this5 = this\n\n this.forEach(this.elements, function(element) {\n element.sticky.rect = _this5.getRectangle(element)\n element.sticky.container.rect = _this5.getRectangle(\n element.sticky.container\n )\n\n _this5.activate(element)\n _this5.setPosition(element)\n })\n }\n\n /**\n * Destroys sticky element, remove listeners\n * @function\n */\n\n Sticky.prototype.destroy = function destroy() {\n var _this6 = this\n\n window.removeEventListener('load', this.updateScrollTopPosition)\n window.removeEventListener('scroll', this.updateScrollTopPosition)\n\n this.forEach(this.elements, function(element) {\n _this6.destroyResizeEvents(element)\n _this6.destroyScrollEvents(element)\n delete element.sticky\n })\n }\n\n /**\n * Function that returns container element in which sticky element is stuck (if is not specified, then it's stuck to body)\n * @function\n * @param {node} element - Element which sticky container are looked for\n * @return {node} element - Sticky container\n */\n\n Sticky.prototype.getStickyContainer = function getStickyContainer(element) {\n var container = element.parentNode\n\n while (\n !container.hasAttribute('data-sticky-container') &&\n !container.parentNode.querySelector(element.sticky.stickyContainer) &&\n container !== this.body\n ) {\n container = container.parentNode\n }\n\n return container\n }\n\n /**\n * Function that returns element rectangle & position (width, height, top, left)\n * @function\n * @param {node} element - Element which position & rectangle are returned\n * @return {object}\n */\n\n Sticky.prototype.getRectangle = function getRectangle(element) {\n // this.css(element, { position: '', width: '', top: '', left: '' })\n this.css(element, { position: '', top: '', left: '' })\n\n // var width = Math.max(\n // element.offsetWidth,\n // element.clientWidth,\n // element.scrollWidth\n // )\n var height = Math.max(\n element.offsetHeight,\n element.clientHeight,\n element.scrollHeight\n )\n\n var top = 0\n var left = 0\n\n do {\n top += element.offsetTop || 0\n left += element.offsetLeft || 0\n element = element.offsetParent\n } while (element)\n\n // return { top: top, left: left, width: width, height: height }\n return { top: top, left: left, height: height }\n }\n\n /**\n * Function that returns viewport dimensions\n * @function\n * @return {object}\n */\n\n Sticky.prototype.getViewportSize = function getViewportSize() {\n return {\n width: Math.max(\n document.documentElement.clientWidth,\n window.innerWidth || 0\n ),\n height: Math.max(\n document.documentElement.clientHeight,\n window.innerHeight || 0\n ),\n }\n }\n\n /**\n * Function that updates window scroll position\n * @function\n * @return {number}\n */\n\n Sticky.prototype.updateScrollTopPosition = function updateScrollTopPosition() {\n this.scrollTop =\n (window.pageYOffset || document.scrollTop) - (document.clientTop || 0) ||\n 0\n }\n\n /**\n * Helper function for loops\n * @helper\n * @param {array}\n * @param {function} callback - Callback function (no need for explanation)\n */\n\n Sticky.prototype.forEach = function forEach(array, callback) {\n for (var i = 0, len = array.length; i < len; i++) {\n callback(array[i])\n }\n }\n\n /**\n * Helper function to add/remove css properties for specified element.\n * @helper\n * @param {node} element - DOM element\n * @param {object} properties - CSS properties that will be added/removed from specified element\n */\n\n Sticky.prototype.css = function css(element, properties) {\n for (var property in properties) {\n if (properties.hasOwnProperty(property)) {\n element.style[property] = properties[property]\n }\n }\n }\n\n return Sticky\n})()\n\n/**\n * Export function that supports AMD, CommonJS and Plain Browser.\n */\n;(function(root, factory) {\n if (typeof exports !== 'undefined') {\n module.exports = factory\n } else if (typeof define === 'function' && define.amd) {\n define([], factory)\n } else {\n root.Sticky = factory\n }\n})(this, Sticky)\n","// const breakpoints = {\n// xs: 0,\n// md: 768,\n// lg: 1440,\n// xl: 1920,\n// }\n\nconst breakpoints = {\n xs: 0,\n sm: 415,\n md: 601,\n lg: 801,\n xl: 1025,\n xxl: 1441,\n}\n\nconst mediaQueries = {\n xs: '',\n sm: `(min-width: ${breakpoints.sm}px)`,\n md: `(min-width: ${breakpoints.md}px)`,\n lg: `(min-width: ${breakpoints.lg}px)`,\n xl: `(min-width: ${breakpoints.xl}px)`,\n xxl: `(min-width: ${breakpoints.xxl}px)`,\n}\n\n// CommonJS export used so breakpoints can be imported even in files\n// not supporting imports/exports such as package-scripts.js\n\nmodule.exports = {\n breakpoints,\n DPR: 3, // Device Pixel Ratio\n mediaQueries,\n}\n"],"sourceRoot":""}