{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./client/src/entries/global/index.js","webpack:///./client/src/components/header/index.js","webpack:///./client/src/components/header/header.js","webpack:///./client/src/components/menu/index.js","webpack:///./client/src/components/menu/Menu.js","webpack:///./client/src/components/back-to-top/index.js","webpack:///./client/src/components/back-to-top/BackToTop.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","4","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","manager","ComponentManager","components","header","menu","backToTop","document","addEventListener","initComponents","class","Header","querySelector","target","controller","querySelectorAll","options","config","initMobileToggle","this","children","attributes","ariapopup","popup","AriaPopup","Component","Menu","menus","subMenuSelector","element","transformHashesToButtons","applyPopups","HTMLElement","hasLinks","Array","from","forEach","link","parent","parentNode","button","createElement","innerHTML","innerText","insertBefore","removeChild","map","firstElementChild","filter","BackToTop","initBackToTop","siteHeader","scrollPos","innerHeight","classList","add","offsetHeight","remove","lastKnownScrollPosition","ticking","scrollY","requestAnimationFrame","setButtonVisibility"],"mappings":"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","file":"js/global.96d4e4a37426ff699e0a.bundle.min.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t4: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/wp-content/themes/georgetown-ccf-data/client/build/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([418,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/**\n * Core global JS.\n */\nimport { ComponentManager } from 'js-component-framework';\nimport header from 'components/header';\nimport menu from 'components/menu';\nimport backToTop from 'components/back-to-top';\n\n// Import SCSS\nimport 'scss/index.scss';\nimport 'scss/fonts.css';\n\n// Create instance of the component manager using `georgetown-ccf-data`\nconst manager = new ComponentManager('georgetown-ccf-data');\nconst components = [header, menu, backToTop];\n\n// Initialize components\ndocument.addEventListener('DOMContentLoaded', () => {\n manager.initComponents(components);\n});\n\nif (module.hot) {\n module.hot.accept();\n // This is required for HMR, otherwise you'll need to refresh\n // the page to see JS changes\n manager.initComponents(components);\n}\n","import Header from './header';\n\nexport default {\n name: 'Header',\n class: Header,\n querySelector: {\n target: '.global-header__menu-target',\n controller: '.global-header__menu-controller',\n },\n querySelectorAll: {},\n options: {},\n};\n","import { Component } from 'js-component-framework';\nimport AriaPopup from 'js-component-framework/lib/plugins/AriaPopup';\n\n/**\n * Component for site header\n */\nexport default class Header extends Component {\n /**\n * Start the component\n */\n constructor(config) {\n super(config);\n this.initMobileToggle();\n }\n\n /**\n * Applies AriaPopup module to this.children.target and this.children.controller\n */\n initMobileToggle() {\n const { controller, target } = this.children;\n const { options: { ariapopup: attributes } } = this;\n\n // Do nothing if there is no controller and target\n if (!controller || !target) {\n return;\n }\n\n this.popup = new AriaPopup({\n controller,\n target,\n attributes,\n });\n }\n}\n","import Menu from './Menu';\n\nconst config = {\n name: 'siteMenu',\n class: Menu,\n querySelector: {},\n querySelectorAll: {\n menus: '.menu-item-has-children',\n },\n options: {\n subMenuSelector: '.sub-menu',\n // For options,\n // @see https://github.com/alleyinteractive/js-component-framework/blob/master/src/plugins/AriaPopup.js#L17\n // ariapopup: {},\n },\n};\n\nexport default config;\n","import { Component } from 'js-component-framework';\nimport AriaPopup from 'js-component-framework/lib/plugins/AriaPopup';\n\n/*\n * Component for popup menus.\n *\n * Expected config:\n *\n * querySelectorAll: {\n * menus: [],\n * },\n * options: {\n * subMenuSelector: '',\n * }\n */\nexport default class Menu extends Component {\n /**\n * Looks for all anchor tags within the menu that are linked to #.\n * Replaces them with buttons, which are semantically appropriate.\n * @param {object} options.element HTMLElement to search for anchors without\n * links.\n */\n static transformHashesToButtons({ element }) {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n\n const hasLinks = element.querySelectorAll('a[href=\"#\"]');\n\n Array.from(hasLinks)\n .forEach((link) => {\n const parent = link.parentNode;\n const button = document.createElement('button');\n button.innerHTML = link.innerText;\n parent.insertBefore(button, link);\n parent.removeChild(link);\n });\n }\n\n /**\n * Given an array of menus and a submenu to search for, applies the AriaPopup\n * libary to each menu.\n * @param {array} options.menus Menus that contain a controller\n * (first element child) and a\n * target (element that matches\n * subMenuSelector).\n * @param {string} options.subMenuSelector Selector for target within menu.\n * @return {array} Initialized menus.\n */\n static applyPopups({ menus, subMenuSelector }) {\n if (!menus || !subMenuSelector) {\n return false;\n }\n\n return Array.from(menus)\n .map((menu) => {\n const controller = menu.firstElementChild;\n const target = menu.querySelector(subMenuSelector);\n return {\n controller,\n target,\n };\n })\n // Only include pairs with targets\n .filter(({ controller, target }) => (controller && target))\n // Apply AriaPopup to all pairs\n .map(({ controller, target }) => new AriaPopup({ controller, target }));\n }\n\n /**\n * Start the component\n */\n constructor(config) {\n super(config);\n\n /**\n * Initialize variables from configuration\n */\n const {\n children: { menus = [] },\n options: { subMenuSelector = false },\n element,\n } = this;\n\n // Must run before all other functions as this will destroy any\n // anchor elements in the dom.\n Menu.transformHashesToButtons({ element });\n\n // Create controller - target relationships with popup menus.\n Menu.applyPopups({ menus, subMenuSelector });\n }\n}\n","import BackToTop from './BackToTop';\n\nexport default {\n name: 'BackToTop',\n class: BackToTop,\n querySelector: {\n button: '#back-to-top',\n },\n querySelectorAll: {},\n options: {},\n};\n","import { Component } from 'js-component-framework';\n\n/**\n * Component for site header\n */\nexport default class BackToTop extends Component {\n /**\n * Start the component\n */\n constructor(config) {\n super(config);\n this.initBackToTop();\n\n this.siteHeader = document.querySelector('#masthead');\n }\n\n setButtonVisibility(scrollPos) {\n const {\n button,\n } = this.children;\n\n if (scrollPos > window.innerHeight) {\n button.classList.add('show');\n }\n if (scrollPos < (this.siteHeader.offsetHeight + 1)) {\n button.classList.remove('show');\n }\n }\n\n initBackToTop() {\n let lastKnownScrollPosition = 0;\n let ticking = false;\n\n // Checks user scroll amount\n document.addEventListener('scroll', () => {\n lastKnownScrollPosition = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(() => {\n this.setButtonVisibility(lastKnownScrollPosition);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n }\n}\n"],"sourceRoot":""}