{"version":3,"sources":["../../js/modules/ToggleClass.js","../../js/modules/SpecialtyScrolls.js","../../js/modules/Menu.js","../../js/modules/Masonry.js","../../js/utils/parseDomArgs.js","../../js/modules/XScroll.js","../../js/modules/Carousel.js","../../js/modules/ExpandToggle.js","../../js/globals.js"],"names":["ToggleClass","[object Object]","this","body","document","toggleElements","boundOnClick","onClick","bind","querySelectorAll","forEach","el","addEventListener","removeEventListener","e","src","target","closest","tElemPos","tSelector","tClass","tTrigger","tToggleText","dataset","evt","Event","window","dispatchEvent","activeText","innerText","toggle","tclass","length","childEl","classList","SpecialtyScrolls","linksToTop","scrollToTop","event","preventDefault","scroll","top","left","behavior","Menu","menuToggles","searchToggles","menuOpen","searchOpen","escListener","boundToggleMenu","toggleMenu","boundToggleSearch","toggleSearch","boundEscHandler","escHandler","remove","addEscListener","removeEscListener","key","closeAll","Masonry","grid","children","console","warn","gridChildren","Array","from","resize","child","wrapper","height","getBoundingClientRect","rowSpan","Math","ceil","style","gridRowEnd","parseDomArgs","args","defaultArgs","dataKey","Object","keys","filter","k","indexOf","reduce","obj","replace","toLowerCase","val","XScroll","options","offset","theme","xscrollEl","querySelector","controls","xscroll","contains","innerWidth","addOffset","alignheights","alignHeights","init","firstSlide","firstElementChild","clone","cloneNode","removeAttribute","appendChild","maxHeight","inners","innerHeight","opts","mouseDrag","autoHeight","container","loop","nav","items","responsive","768","1200","tnsSettings","getScrollerOptions","tns","setupControls","events","on","updateControls","btn","goTo","xscrollNav","slideCount","index","setAttribute","Carousel","center","carouselEl","carousel","hasClone","onInit","removeFocus","setFocus","createClone","slideItems","slide","a","add","cloneSlide","item","goto","ExpandToggle","content","toggleContent","innerHTML","log"],"mappings":"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","sourcesContent":["/**\n * A general class that allows you to declaratively set a class toggle on a button or other\n * clickable element.\n */\nclass ToggleClass {\n constructor() {\n this.body = document.body;\n this.toggleElements = [];\n this.boundOnClick = this.onClick.bind(this);\n }\n\n /**\n * Get all of the elements with the toggle class, and attach their event listeners.\n *\n * @return void\n */\n init() {\n this.toggleElements = document.querySelectorAll('.js-toggle-class');\n this.toggleElements.forEach(el => el.addEventListener('click', this.boundOnClick));\n }\n\n /**\n * Remove event listeners and reset the array of toggleElements.\n *\n * @return void\n */\n deinit() {\n this.toggleElements.forEach(el => el.removeEventListener('click', this.boundOnClick));\n this.toggleElements = [];\n }\n\n /**\n * Handle the click on the toggle trigger element.\n *\n * @param {Object} e Event data.\n *\n * @return void\n */\n onClick(e) {\n const src = e.target.closest('.js-toggle-class');\n const { tElemPos, tSelector, tClass, tTrigger, tToggleText } = src.dataset;\n\n if (tTrigger) {\n const evt = new Event(tTrigger);\n window.dispatchEvent(evt);\n }\n\n if (tToggleText) {\n const activeText = src.innerText;\n src.innerText = tToggleText;\n src.dataset.tToggleText = activeText;\n }\n\n // Since modifying classes on the body is common, check for that selector first.\n if (tSelector === 'body') {\n this.toggle(this.body, tClass);\n return;\n }\n\n // Depending on the position of the element, determine the element that should have its class\n // toggled and toggle it.\n switch (tElemPos) {\n case 'child':\n this.toggle(src.querySelectorAll(tSelector), tClass);\n break;\n case 'parent':\n this.toggle(src.closest(tSelector), tClass);\n break;\n default:\n this.toggle(src, tClass);\n break;\n }\n }\n\n /**\n * Toggle a class on an element or a NodeList of elements.\n *\n * @param {Element|NodeList} el Can be a singular element, or a NodeList of elements.\n * @param {String} tclass The class to apply to the elements.\n *\n * @return void\n */\n toggle(el, tclass) {\n // Since el can be a NodeList, check if it is and, if so, iterate to toggle the class on all\n // elements in the NodeList. Otherwise, el should just be a singular element so we can toggle\n // the class directly on it.\n if (el.length > 1) {\n el.forEach(childEl => childEl.classList.toggle(tclass));\n return;\n }\n\n el.classList.toggle(tclass);\n }\n}\n\nexport default ToggleClass;\n","/**\n * Handle scrolls to specific points on the page.\n */\nclass SpecialtyScrolls {\n constructor() {\n // Anchors that have an href of \"#top\" should smooth scroll to the top of the page.\n this.linksToTop = [];\n }\n\n /**\n * Get and set all of the specialty links and init them.\n *\n * @return void\n */\n init() {\n this.linksToTop = document.querySelectorAll('a[href=\"#top\"]');\n this.linksToTop.forEach(el => el.addEventListener('click', this.scrollToTop));\n }\n\n /**\n * Remove event listeners and reset the array of specialty links.\n *\n * @return void\n */\n deinit() {\n this.linksToTop.forEach(el => el.removeEventListener('click', this.scrollToTop));\n this.linksToTop = [];\n }\n\n /**\n * Smooth scroll the page up to the top.\n *\n * @param {object} event Click event data\n *\n * @return void\n */\n scrollToTop(event = null) {\n if (typeof event === 'object') {\n event.preventDefault();\n }\n\n window.scroll({\n top: 0,\n left: 0,\n behavior: 'smooth',\n });\n }\n}\n\nexport default SpecialtyScrolls;\n","/**\n * Handles all the menu overlays and triggers, including the main nav and search.\n */\nclass Menu {\n constructor() {\n this.body = document.body;\n this.menuToggles = document.querySelectorAll('.js-toggle-menu');\n this.searchToggles = document.querySelectorAll('.js-toggle-search');\n\n // State.\n this.menuOpen = false;\n this.searchOpen = false;\n this.escListener = false;\n\n // Bound methods.\n this.boundToggleMenu = this.toggleMenu.bind(this);\n this.boundToggleSearch = this.toggleSearch.bind(this);\n this.boundEscHandler = this.escHandler.bind(this);\n }\n\n /**\n * Init the menu toggles and add event listeners.\n *\n * @return void\n */\n init() {\n this.menuToggles.forEach(el => el.addEventListener('click', this.boundToggleMenu));\n this.searchToggles.forEach(el => el.addEventListener('click', this.boundToggleSearch));\n }\n\n /**\n * Remove event listeners.\n *\n * @return void\n */\n deinit() {\n this.menuToggles.forEach(el => el.removeEventListener('click', this.boundToggleMenu));\n this.searchToggles.forEach(el => el.removeEventListener('click', this.boundToggleSearch));\n }\n\n /**\n * Toggles the active menu class, removing the active search class in the process. Also adds a\n * listener for the \"esc\" key to hide the menu.\n *\n * @return void.\n */\n toggleMenu() {\n this.menuOpen = !this.menuOpen;\n this.searchOpen = false;\n this.body.classList.remove('js-menu-search-open');\n this.body.classList.toggle('js-menu-open');\n\n // If the menu is open, set up the listener for tbhe esc key. Otherwise, remove that listener.\n if (this.menuOpen && !this.escListener) {\n this.addEscListener();\n } else if (!this.menuOpen) {\n this.removeEscListener();\n }\n }\n\n /**\n * Toggles the active searc class, removing the active menu class in the process. Also adds a\n * listener for the \"esc\" key to hide the search.\n *\n * @return void.\n */\n toggleSearch() {\n this.searchOpen = !this.searchOpen;\n this.menuOpen = false;\n this.body.classList.remove('js-menu-open');\n this.body.classList.toggle('js-menu-search-open');\n\n // If the searc is open, set up the listener for tbhe esc key. Otherwise, remove that listener.\n if (this.searchOpen && !this.escListener) {\n this.addEscListener();\n } else if (!this.searchOpen) {\n this.removeEscListener();\n }\n }\n\n /**\n * Closes both the menu and the search, and removes the listener for the \"esc\" keypress.\n *\n * @return void\n */\n closeAll() {\n this.menuOpen = false;\n this.searchOpen = false;\n this.body.classList.remove('js-menu-search-open');\n this.body.classList.remove('js-menu-open');\n this.removeEscListener();\n }\n\n /**\n * Handler for the `keydown` event, listening for a keypress of the \"esc\" key. On this event, we\n * should close the menu and search overlays.\n *\n * @param {Object} event Event object.\n * @param {string} event.key The key pressed.\n *\n * @return void\n */\n escHandler({ key }) {\n if (key === 'Escape') {\n this.closeAll();\n }\n }\n\n /**\n * Attach the listener for the \"esc\" keypress.\n *\n * @return void\n */\n addEscListener() {\n document.addEventListener('keydown', this.boundEscHandler);\n this.escListener = true;\n }\n\n /**\n * Remove the listener for the \"esc\" keypress.\n *\n * @return void\n */\n removeEscListener() {\n document.removeEventListener('keydown', this.boundEscHandler);\n this.escListener = false;\n }\n}\n\nexport default Menu;\n","class Masonry {\n constructor(el) {\n this.grid = el;\n\n if (el.children.length < 1) {\n console.warn('The masonry parent has no children.');\n return;\n }\n\n this.gridChildren = Array.from(el.children);\n\n this.resize();\n }\n\n resize() {\n this.gridChildren.forEach(child => {\n const wrapper = child.children;\n\n if (wrapper.length < 1) {\n return;\n }\n\n const { height } = wrapper[0].getBoundingClientRect();\n const rowHeight = 20;\n const rowGap = 20;\n const rowSpan = Math.ceil((height + rowGap) / (rowHeight + rowGap));\n child.style.gridRowEnd = `span ${rowSpan}`;\n });\n }\n}\n\nexport default Masonry;\n","/**\n * Parse args from a DOM element's `data-` attribute properties.\n *\n * @param {object} args A map of arguments, assumed to have been mapped from a DOM element's\n * `dataset` property.\n * @param {object} defaultArgs Default options.\n * @param {object} dataKey The prepended key from the DOM element's data attributes.\n *\n * @return object\n */\nexport const parseDomArgs = (args, defaultArgs, dataKey) => {\n const domArgs = Object.keys(args)\n .filter(k => k.indexOf(dataKey) === 0)\n .reduce((obj, k) => {\n const key = k.replace(dataKey, '').toLowerCase();\n let val = args[k];\n\n if (val === 'true') {\n val = true;\n } else if (val === 'false') {\n val = false;\n }\n\n return { ...obj, [key]: val };\n }, {});\n\n return { ...defaultArgs, ...domArgs };\n};\n","import { tns } from 'tiny-slider/src/tiny-slider';\nimport { parseDomArgs } from '../utils/parseDomArgs';\n\nclass XScroll {\n constructor(el) {\n const defaultOptions = {\n offset: false,\n\n // The `theme` refers to the number of visible items in the xscroller at one time. Available\n // themes include:\n // - 'default' Two and a half items on desktop, one on mobile.\n // - 'people' Four items on deskotp, responsively cascading down.\n theme: 'default',\n };\n\n this.options = parseDomArgs(el.dataset, defaultOptions, 'xscroll');\n\n this.xscrollEl = el.querySelector('[data-xscroller]');\n this.controls = el.querySelectorAll('button[data-xscroll-nav]');\n this.xscroll = null;\n\n // If there's no scroller element, or the scroller has already been initialized, get out.\n if (!this.xscrollEl || this.xscrollEl.classList.contains('tns-slider')) {\n return;\n }\n\n if (this.options.offset && window.innerWidth > 768) {\n this.addOffset();\n }\n\n if (this.options.alignheights) {\n this.alignHeights();\n }\n\n this.init();\n }\n\n addOffset() {\n const firstSlide = this.xscrollEl.firstElementChild;\n\n if (!firstSlide) {\n return;\n }\n\n const clone = firstSlide.cloneNode();\n clone.removeAttribute('id');\n clone.classList.remove('tns-slide-active');\n this.xscrollEl.appendChild(clone);\n }\n\n /**\n * If the `alignheights` option is set, make each element's heights consistent.\n *\n * @return void\n */\n alignHeights() {\n let maxHeight = 0;\n const inners = this.xscrollEl.querySelectorAll(this.options.alignheights);\n\n inners.forEach(el => {\n el.removeAttribute('style');\n const { height: innerHeight } = el.getBoundingClientRect();\n if (innerHeight > maxHeight) {\n maxHeight = innerHeight;\n }\n });\n\n if (maxHeight > 0) {\n inners.forEach(el => (el.style.height = `${maxHeight}px`));\n }\n }\n\n getScrollerOptions() {\n const opts = {\n mouseDrag: true,\n autoHeight: false,\n container: this.xscrollEl,\n loop: false,\n nav: false,\n controls: false,\n items: 1.25,\n responsive: {\n 768: {\n items: 1.5,\n },\n 1200: {\n items: 2.4,\n },\n },\n };\n\n if (this.options.theme === 'people') {\n opts.items = 1.75;\n opts.responsive = {\n 768: {\n items: 3,\n },\n 1200: {\n items: 4,\n },\n };\n }\n\n return opts;\n }\n\n init() {\n const tnsSettings = this.getScrollerOptions();\n this.xscroll = tns(tnsSettings);\n this.setupControls();\n this.xscroll.events.on('indexChanged', this.updateControls.bind(this));\n }\n\n setupControls() {\n this.controls.forEach(btn =>\n btn.addEventListener('click', () => this.xscroll.goTo(btn.dataset.xscrollNav)),\n );\n }\n\n updateControls({ items, slideCount, index }) {\n if (index === 0) {\n this.controls.forEach(btn => {\n if (btn.dataset.xscrollNav === 'prev') {\n btn.setAttribute('disabled', true);\n } else {\n btn.removeAttribute('disabled');\n }\n });\n } else if (index + items >= slideCount) {\n this.controls.forEach(btn => {\n if (btn.dataset.xscrollNav === 'next') {\n btn.setAttribute('disabled', true);\n } else {\n btn.removeAttribute('disabled');\n }\n });\n } else {\n this.controls.forEach(btn => btn.removeAttribute('disabled'));\n }\n }\n}\n\nexport default XScroll;\n","import { tns } from 'tiny-slider/src/tiny-slider';\nimport { parseDomArgs } from '../utils/parseDomArgs';\n\nclass Carousel {\n constructor(el) {\n const defaultOptions = {\n items: 1,\n center: true,\n mouseDrag: true,\n autoHeight: false,\n responsive: {\n 768: {\n items: 2,\n },\n },\n };\n\n this.options = parseDomArgs(el.dataset, defaultOptions, 'carousel');\n\n this.el = el;\n this.carouselEl = el.querySelector('[data-carousel]');\n this.carousel = null;\n this.hasClone = false;\n\n // If there's no carousel element, or if the carousel has already been initialized, get out.\n if (!this.carouselEl || this.carouselEl.classList.contains('tns-slider')) {\n return;\n }\n\n this.init();\n }\n\n init() {\n // Tiny Slider options that aren't customizable.\n this.carousel = tns({\n ...this.options,\n nav: false,\n controls: false,\n container: this.carouselEl,\n onInit: this.onInit.bind(this),\n });\n\n this.setupControls();\n this.carousel.events.on('transitionStart', this.removeFocus.bind(this));\n this.carousel.events.on('transitionEnd', this.setFocus.bind(this));\n }\n\n onInit(carousel) {\n this.createClone(carousel);\n this.setFocus(carousel);\n }\n\n removeFocus({ slideItems }) {\n Array.from(slideItems).forEach(slide => slide.classList.remove('slide--focus'));\n }\n\n setFocus({ slideItems, index }) {\n const tabbable = this.carouselEl.querySelectorAll('a');\n tabbable.forEach(a => a.setAttribute('tabindex', '-1'));\n\n slideItems[index].classList.add('slide--focus');\n slideItems[index].querySelectorAll('a').forEach(a => a.removeAttribute('tabindex'));\n }\n\n createClone({ slideItems, slideCount }) {\n const cloneSlide = slideItems.item(slideCount - 1).cloneNode(true);\n cloneSlide.removeAttribute('id');\n cloneSlide.classList.add('tns-cloned-node');\n this.carouselEl.appendChild(cloneSlide);\n }\n\n setupControls() {\n const navButtons = this.el.querySelectorAll('button[data-goto]');\n navButtons.forEach(btn => {\n btn.addEventListener('click', () => this.carousel.goTo(btn.dataset.goto));\n btn.addEventListener('keyup.enter', () => this.carousel.goTo(btn.dataset.goto));\n });\n }\n}\n\nexport default Carousel;\n","class ExpandToggle {\n constructor(el) {\n if (!el) {\n return;\n }\n\n const toggle = el.querySelector('.js-expandable-toggle');\n const content = el.querySelector('.js-expandable-content');\n\n if (!toggle || !content) {\n return;\n }\n\n this.toggle = toggle;\n this.content = content;\n\n this.init();\n }\n\n init() {\n this.toggle.addEventListener('click', this.toggleContent.bind(this));\n }\n\n deinit() {\n if (this.toggle) {\n this.toggle.removeEventListener('click', this.toggleContent.bind(this));\n }\n }\n\n toggleContent() {\n if (this.toggle.innerHTML === 'Show more') {\n this.content.classList.add('shown');\n this.toggle.innerHTML = 'Show less';\n } else {\n this.content.classList.remove('shown');\n this.toggle.innerHTML = 'Show more';\n }\n }\n}\n\nexport default ExpandToggle;\n","// Import single runners.\nimport ToggleClass from './modules/ToggleClass';\nimport SpecialtyScrolls from './modules/SpecialtyScrolls';\nimport Menu from './modules/Menu';\n\n// Import modules for multiple elements.\nimport Masonry from './modules/Masonry';\nimport XScroll from './modules/XScroll';\nimport Carousel from './modules/Carousel';\nimport ExpandToggle from './modules/ExpandToggle';\n\n// Kickoff ҹɫÍõ³¯scripts once the DOM has loaded. You can add this function as a callback to the\n// `DOMContentLoaded` event (like we're doing below) or call this function at the end of the\n// document to ensure that the DOM has been rendered.\nconst onDomLoad = () => {\n console.log('ҹɫÍõ³¯global scripts: initialized'); // eslint-disable-line\n\n //--------------------------------------------\n //\n // These modules run once on a page; all selectors and context run inside the class itself. They\n // should all include an `init` method and a `deinit` method that can be called. You can set up\n // a variable to manage the singular instances of these modules if you'd like.\n //\n //--------------------------------------------\n new ToggleClass().init();\n new SpecialtyScrolls().init();\n new Menu().init();\n\n //--------------------------------------------\n //\n // These modules can be reused and may have multiple instances on a page.\n //\n //--------------------------------------------\n\n // Expand toggles.\n const expandToggles = document.querySelectorAll('.js-expandable');\n expandToggles.forEach(el => new ExpandToggle(el));\n};\n\n// Certain modules should only be run once the window `load` event fires to ensure that all assets\n// have loaded. Each of the following modules have positioning implications that require an\n// accurate calculation of DOM nodes that are spaced by loaded imagery.\nconst onWindowLoad = () => {\n // Masonry\n const masonryEls = document.querySelectorAll('.js-grid-masonry');\n masonryEls.forEach(el => new Masonry(el));\n\n // Carousels.\n const carousels = document.querySelectorAll('.js-carousel');\n carousels.forEach(el => new Carousel(el));\n\n // Horizontal scrolls\n const xScrollers = document.querySelectorAll('.js-xscroll');\n xScrollers.forEach(el => new XScroll(el));\n};\n\n// For our purposes, we'll hook up these callbacks to the appropriate events. You can feel free to\n// call the functions in the appropriate place in your application.\nwindow.addEventListener('DOMContentLoaded', onDomLoad);\nwindow.addEventListener('load', onWindowLoad);\n"]}