{"version":3,"file":"sections-poi.949f90f14b25fa425e97.js","mappings":"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","sources":["webpack://silverstripe-base/./themes/app/src/scripts/common/ajax.js","webpack://silverstripe-base/./node_modules/a11y-dialog/dist/a11y-dialog.esm.js","webpack://silverstripe-base/./themes/app/src/scripts/components/modal.js","webpack://silverstripe-base/./themes/app/src/scripts/react/common/icons.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/Context.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/LocationCard.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/LocationList.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/Sidebar.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/MapMarker.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/Map.js","webpack://silverstripe-base/./themes/app/src/scripts/react/poi/index.js","webpack://silverstripe-base/./themes/app/src/sections/poi.js"],"sourcesContent":["import wretch from 'wretch'\nimport QueryStringAddon from 'wretch/addons/queryString'\n\nwretch.options({\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n})\n\nexport default wretch().addon(QueryStringAddon)\n","var focusableSelectors = [\n 'a[href]:not([tabindex^=\"-\"])',\n 'area[href]:not([tabindex^=\"-\"])',\n 'input:not([type=\"hidden\"]):not([type=\"radio\"]):not([disabled]):not([tabindex^=\"-\"])',\n 'input[type=\"radio\"]:not([disabled]):not([tabindex^=\"-\"])',\n 'select:not([disabled]):not([tabindex^=\"-\"])',\n 'textarea:not([disabled]):not([tabindex^=\"-\"])',\n 'button:not([disabled]):not([tabindex^=\"-\"])',\n 'iframe:not([tabindex^=\"-\"])',\n 'audio[controls]:not([tabindex^=\"-\"])',\n 'video[controls]:not([tabindex^=\"-\"])',\n '[contenteditable]:not([tabindex^=\"-\"])',\n '[tabindex]:not([tabindex^=\"-\"])',\n];\n\nvar TAB_KEY = 'Tab';\nvar ESCAPE_KEY = 'Escape';\n\n/**\n * Define the constructor to instantiate a dialog\n *\n * @constructor\n * @param {Element} element\n */\nfunction A11yDialog(element) {\n // Prebind the functions that will be bound in addEventListener and\n // removeEventListener to avoid losing references\n this._show = this.show.bind(this);\n this._hide = this.hide.bind(this);\n this._maintainFocus = this._maintainFocus.bind(this);\n this._bindKeypress = this._bindKeypress.bind(this);\n\n this.$el = element;\n this.shown = false;\n this._id = this.$el.getAttribute('data-a11y-dialog') || this.$el.id;\n this._previouslyFocused = null;\n this._listeners = {};\n\n // Initialise everything needed for the dialog to work properly\n this.create();\n}\n\n/**\n * Set up everything necessary for the dialog to be functioning\n *\n * @param {(NodeList | Element | string)} targets\n * @return {this}\n */\nA11yDialog.prototype.create = function () {\n this.$el.setAttribute('aria-hidden', true);\n this.$el.setAttribute('aria-modal', true);\n this.$el.setAttribute('tabindex', -1);\n\n if (!this.$el.hasAttribute('role')) {\n this.$el.setAttribute('role', 'dialog');\n }\n\n // Keep a collection of dialog openers, each of which will be bound a click\n // event listener to open the dialog\n this._openers = $$('[data-a11y-dialog-show=\"' + this._id + '\"]');\n this._openers.forEach(\n function (opener) {\n opener.addEventListener('click', this._show);\n }.bind(this)\n );\n\n // Keep a collection of dialog closers, each of which will be bound a click\n // event listener to close the dialog\n const $el = this.$el;\n\n this._closers = $$('[data-a11y-dialog-hide]', this.$el)\n // This filter is necessary in case there are nested dialogs, so that\n // only closers from the current dialog are retrieved and effective\n .filter(function (closer) {\n // Testing for `[aria-modal=\"true\"]` is not enough since this attribute\n // and the collect of closers is done at instantation time, when nested\n // dialogs might not have yet been instantiated. Note that if the dialogs\n // are manually instantiated, this could still fail because none of these\n // selectors would match; this would cause closers to close all parent\n // dialogs instead of just the current one\n return closer.closest('[aria-modal=\"true\"], [data-a11y-dialog]') === $el\n })\n .concat($$('[data-a11y-dialog-hide=\"' + this._id + '\"]'));\n\n this._closers.forEach(\n function (closer) {\n closer.addEventListener('click', this._hide);\n }.bind(this)\n );\n\n // Execute all callbacks registered for the `create` event\n this._fire('create');\n\n return this\n};\n\n/**\n * Show the dialog element, disable all the targets (siblings), trap the\n * current focus within it, listen for some specific key presses and fire all\n * registered callbacks for `show` event\n *\n * @param {CustomEvent} event\n * @return {this}\n */\nA11yDialog.prototype.show = function (event) {\n // If the dialog is already open, abort\n if (this.shown) {\n return this\n }\n\n // Keep a reference to the currently focused element to be able to restore\n // it later\n this._previouslyFocused = document.activeElement;\n this.$el.removeAttribute('aria-hidden');\n this.shown = true;\n\n // Set the focus to the dialog element\n moveFocusToDialog(this.$el);\n\n // Bind a focus event listener to the body element to make sure the focus\n // stays trapped inside the dialog while open, and start listening for some\n // specific key presses (TAB and ESC)\n document.body.addEventListener('focus', this._maintainFocus, true);\n document.addEventListener('keydown', this._bindKeypress);\n\n // Execute all callbacks registered for the `show` event\n this._fire('show', event);\n\n return this\n};\n\n/**\n * Hide the dialog element, enable all the targets (siblings), restore the\n * focus to the previously active element, stop listening for some specific\n * key presses and fire all registered callbacks for `hide` event\n *\n * @param {CustomEvent} event\n * @return {this}\n */\nA11yDialog.prototype.hide = function (event) {\n // If the dialog is already closed, abort\n if (!this.shown) {\n return this\n }\n\n this.shown = false;\n this.$el.setAttribute('aria-hidden', 'true');\n\n // If there was a focused element before the dialog was opened (and it has a\n // `focus` method), restore the focus back to it\n // See: https://github.com/KittyGiraudel/a11y-dialog/issues/108\n if (this._previouslyFocused && this._previouslyFocused.focus) {\n this._previouslyFocused.focus();\n }\n\n // Remove the focus event listener to the body element and stop listening\n // for specific key presses\n document.body.removeEventListener('focus', this._maintainFocus, true);\n document.removeEventListener('keydown', this._bindKeypress);\n\n // Execute all callbacks registered for the `hide` event\n this._fire('hide', event);\n\n return this\n};\n\n/**\n * Destroy the current instance (after making sure the dialog has been hidden)\n * and remove all associated listeners from dialog openers and closers\n *\n * @return {this}\n */\nA11yDialog.prototype.destroy = function () {\n // Hide the dialog to avoid destroying an open instance\n this.hide();\n\n // Remove the click event listener from all dialog openers\n this._openers.forEach(\n function (opener) {\n opener.removeEventListener('click', this._show);\n }.bind(this)\n );\n\n // Remove the click event listener from all dialog closers\n this._closers.forEach(\n function (closer) {\n closer.removeEventListener('click', this._hide);\n }.bind(this)\n );\n\n // Execute all callbacks registered for the `destroy` event\n this._fire('destroy');\n\n // Keep an object of listener types mapped to callback functions\n this._listeners = {};\n\n return this\n};\n\n/**\n * Register a new callback for the given event type\n *\n * @param {string} type\n * @param {Function} handler\n */\nA11yDialog.prototype.on = function (type, handler) {\n if (typeof this._listeners[type] === 'undefined') {\n this._listeners[type] = [];\n }\n\n this._listeners[type].push(handler);\n\n return this\n};\n\n/**\n * Unregister an existing callback for the given event type\n *\n * @param {string} type\n * @param {Function} handler\n */\nA11yDialog.prototype.off = function (type, handler) {\n var index = (this._listeners[type] || []).indexOf(handler);\n\n if (index > -1) {\n this._listeners[type].splice(index, 1);\n }\n\n return this\n};\n\n/**\n * Iterate over all registered handlers for given type and call them all with\n * the dialog element as first argument, event as second argument (if any). Also\n * dispatch a custom event on the DOM element itself to make it possible to\n * react to the lifecycle of auto-instantiated dialogs.\n *\n * @access private\n * @param {string} type\n * @param {CustomEvent} event\n */\nA11yDialog.prototype._fire = function (type, event) {\n var listeners = this._listeners[type] || [];\n var domEvent = new CustomEvent(type, { detail: event });\n\n this.$el.dispatchEvent(domEvent);\n\n listeners.forEach(\n function (listener) {\n listener(this.$el, event);\n }.bind(this)\n );\n};\n\n/**\n * Private event handler used when listening to some specific key presses\n * (namely ESCAPE and TAB)\n *\n * @access private\n * @param {Event} event\n */\nA11yDialog.prototype._bindKeypress = function (event) {\n // This is an escape hatch in case there are nested dialogs, so the keypresses\n // are only reacted to for the most recent one\n const focused = document.activeElement;\n if (focused && focused.closest('[aria-modal=\"true\"]') !== this.$el) return\n\n // If the dialog is shown and the ESCAPE key is being pressed, prevent any\n // further effects from the ESCAPE key and hide the dialog, unless its role\n // is 'alertdialog', which should be modal\n if (\n this.shown &&\n event.key === ESCAPE_KEY &&\n this.$el.getAttribute('role') !== 'alertdialog'\n ) {\n event.preventDefault();\n this.hide(event);\n }\n\n // If the dialog is shown and the TAB key is being pressed, make sure the\n // focus stays trapped within the dialog element\n if (this.shown && event.key === TAB_KEY) {\n trapTabKey(this.$el, event);\n }\n};\n\n/**\n * Private event handler used when making sure the focus stays within the\n * currently open dialog\n *\n * @access private\n * @param {Event} event\n */\nA11yDialog.prototype._maintainFocus = function (event) {\n // If the dialog is shown and the focus is not within a dialog element (either\n // this one or another one in case of nested dialogs) or within an element\n // with the `data-a11y-dialog-focus-trap-ignore` attribute, move it back to\n // its first focusable child.\n // See: https://github.com/KittyGiraudel/a11y-dialog/issues/177\n if (\n this.shown &&\n !event.target.closest('[aria-modal=\"true\"]') &&\n !event.target.closest('[data-a11y-dialog-ignore-focus-trap]')\n ) {\n moveFocusToDialog(this.$el);\n }\n};\n\n/**\n * Convert a NodeList into an array\n *\n * @param {NodeList} collection\n * @return {Array}\n */\nfunction toArray(collection) {\n return Array.prototype.slice.call(collection)\n}\n\n/**\n * Query the DOM for nodes matching the given selector, scoped to context (or\n * the whole document)\n *\n * @param {String} selector\n * @param {Element} [context = document]\n * @return {Array}\n */\nfunction $$(selector, context) {\n return toArray((context || document).querySelectorAll(selector))\n}\n\n/**\n * Set the focus to the first element with `autofocus` with the element or the\n * element itself\n *\n * @param {Element} node\n */\nfunction moveFocusToDialog(node) {\n var focused = node.querySelector('[autofocus]') || node;\n\n focused.focus();\n}\n\n/**\n * Get the focusable children of the given element\n *\n * @param {Element} node\n * @return {Array}\n */\nfunction getFocusableChildren(node) {\n return $$(focusableSelectors.join(','), node).filter(function (child) {\n return !!(\n child.offsetWidth ||\n child.offsetHeight ||\n child.getClientRects().length\n )\n })\n}\n\n/**\n * Trap the focus inside the given element\n *\n * @param {Element} node\n * @param {Event} event\n */\nfunction trapTabKey(node, event) {\n var focusableChildren = getFocusableChildren(node);\n var focusedItemIndex = focusableChildren.indexOf(document.activeElement);\n\n // If the SHIFT key is being pressed while tabbing (moving backwards) and\n // the currently focused item is the first one, move the focus to the last\n // focusable item from the dialog element\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableChildren[focusableChildren.length - 1].focus();\n event.preventDefault();\n // If the SHIFT key is not being pressed (moving forwards) and the currently\n // focused item is the last one, move the focus to the first focusable item\n // from the dialog element\n } else if (\n !event.shiftKey &&\n focusedItemIndex === focusableChildren.length - 1\n ) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n}\n\nfunction instantiateDialogs() {\n $$('[data-a11y-dialog]').forEach(function (node) {\n new A11yDialog(node);\n });\n}\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', instantiateDialogs);\n } else {\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(instantiateDialogs);\n } else {\n window.setTimeout(instantiateDialogs, 16);\n }\n }\n}\n\nexport { A11yDialog as default };\n","import '@styles/components/modal.css'\nimport ajax from '@common/ajax'\nimport { on, off } from 'delegated-events'\nimport A11yDialog from 'a11y-dialog'\n\nconst generateTemplate = (id, useDefaultClose = true, useCustomClose = false, title = false) => {\n const role = useDefaultClose ? 'dialog' : 'alertdialog'\n const labeledBy = title ? 'aria-labelledby=\"modal-title\"' : ''\n\n const html = `\n
\n
\n\n ${\n useCustomClose === false\n ? ''\n : ''\n }\n\n
\n \n \n \n
\n
\n `\n\n return html\n}\n\nconst populateModal = async (opts = {}, modalEl) => {\n const type = opts.type\n const title = opts.title ?? ''\n const url = opts.url\n\n let modalContent = ''\n\n if (type === 'video') {\n modalContent = `\n
\n

Watch ${title}

\n
\n \n
\n
\n `\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n }\n\n if (type === 'content') {\n modalContent = await ajax.get(url).text()\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n }\n}\n\nconst handleModal = (e) => {\n e.preventDefault()\n\n const triggerEl = e.target.closest('[data-modal]')\n\n openModal({\n type: triggerEl.dataset.modal,\n title: triggerEl.dataset.modalTitle,\n url: triggerEl.href,\n updateUrl: triggerEl.dataset.modalUpdateUrl ?? false,\n useDefaultClose: triggerEl.dataset.modalDisableDefaultClose === undefined,\n useCustomClose: triggerEl.dataset.modalUseCustomClose !== undefined,\n })\n\n return false\n}\n\nconst openModal = (opts = {}) => {\n const type = opts.type\n const title = opts.title ?? false\n const useCustomClose = opts.useCustomClose ?? false\n let useDefaultClose = opts.useDefaultClose ?? true\n\n if (type === 'video') {\n useDefaultClose = false\n }\n\n if (type === 'subscribe') {\n useDefaultClose = false\n }\n\n const id = `modal-${Math.floor(Math.random() * Date.now())}`\n const template = generateTemplate(id, useDefaultClose, useCustomClose, title)\n const node = document.createRange().createContextualFragment(template)\n\n document.body.append(node)\n\n const modalEl = document.getElementById(id)\n const modal = new A11yDialog(modalEl)\n\n const hideModal = () => {\n modal.hide()\n }\n\n if (useCustomClose) {\n on('click', '.modal-custom-close', hideModal)\n }\n\n const currentUrl = opts.defaultUrl ?? window.location.href\n\n modal.on('show', () => {\n document.documentElement.classList.add('has-modal-active')\n\n if (opts.updateUrl !== false) {\n window.history.replaceState({}, '', opts.updateUrl)\n }\n })\n\n modal.on('hide', () => {\n document.documentElement.classList.remove('has-modal-active')\n\n modal.destroy()\n\n if (opts.updateUrl !== false) {\n window.history.replaceState({}, '', currentUrl)\n }\n\n if (useCustomClose) {\n off('click', '.modal-custom-close', hideModal)\n }\n })\n\n modal.on('destroy', (el) => {\n el.remove()\n })\n\n modal.show()\n\n populateModal(\n {\n type: type,\n url: opts.url ?? false,\n updateUrl: opts.updateUrl,\n defaultUrl: opts.defaultUrl,\n },\n modalEl\n )\n}\n\nexport default {\n init: () => {\n const clickArgs = ['click', '[data-modal]', handleModal]\n off(...clickArgs)\n on(...clickArgs)\n\n // If we have video modals, load the YouTube API\n if (document.querySelectorAll('[data-modal=\"video\"]').length) {\n const tag = document.createElement('script')\n tag.src = 'https://www.youtube.com/iframe_api'\n\n const firstScriptTag = document.getElementsByTagName('script')[0]\n\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag)\n }\n },\n openModal,\n}\n","export function IconMapPin({ className }) {\n return (\n \n \n \n \n )\n}\n\nexport function IconArrowRight({ className }) {\n return (\n \n \n \n )\n}\n\nexport function IconArrowTopRight({ className }) {\n return (\n \n \n \n )\n}\n\nexport function IconMapMarker({ className }) {\n return (\n \n \n \n )\n}\n\nexport function IconFitlerGroupOpen({ className }) {\n return (\n \n \n \n \n )\n}\n\nexport function IconFitlerGroupClose({ className }) {\n return (\n \n \n \n \n )\n}\n","import React from 'react'\n\nconst AppStateContext = React.createContext()\nconst AppDispatchContext = React.createContext()\n\nfunction appReducer(state, action) {\n switch (action.type) {\n case 'setLocations': {\n return {\n ...state,\n locations: action.payload,\n }\n }\n case 'setSelectedLocation': {\n return {\n ...state,\n selectedLocation: action.payload,\n mapVisible: true,\n }\n }\n case 'setSidebarOpen': {\n return {\n ...state,\n sidebarOpen: action.payload,\n }\n }\n case 'setMapVisible': {\n return {\n ...state,\n mapVisible: action.payload,\n }\n }\n default: {\n throw new Error(`Unhandled action type: ${action.type}`)\n }\n }\n}\n\nfunction AppProvider({ children }) {\n const [state, dispatch] = React.useReducer(appReducer, {\n locations: [],\n selectedLocation: null,\n sidebarOpen: true,\n mapVisible: window.matchMedia('(min-width: 768px)').matches,\n })\n\n return (\n \n {children}\n \n )\n}\n\nfunction useAppState() {\n const context = React.useContext(AppStateContext)\n\n if (context === undefined) {\n throw new Error('useAppState must be used within a AppProvider')\n }\n\n return context\n}\n\nfunction useAppDispatch() {\n const context = React.useContext(AppDispatchContext)\n\n if (context === undefined) {\n throw new Error('useAppDispatch must be used within a AppProvider')\n }\n\n return context\n}\n\nexport { AppProvider, useAppState, useAppDispatch }\n","import { IconArrowTopRight, IconMapPin } from '@react/common/icons'\n\nfunction LocationCard({ location, onClick }) {\n return (\n \n
\n {location.thumbnail && (\n {location.title}\n )}\n
\n\n
\n
\n

\n {location.title}\n

\n\n
\n \n\n
\n {location.address}\n
\n {location.city}, {location.state} {location.zip}\n
\n
\n
\n\n \n View {location.title}\n \n \n
\n \n )\n}\n\nexport default LocationCard\n","import { useAppState, useAppDispatch } from './Context'\nimport LocationCard from './LocationCard'\n\nfunction LocationList() {\n const dispatch = useAppDispatch()\n const { locations } = useAppState()\n\n const handleClick = (location) => {\n dispatch({ type: 'setSelectedLocation', payload: location })\n }\n\n return (\n
\n {locations.map((location) => (\n handleClick(location)} />\n ))}\n
\n )\n}\n\nexport default LocationList\n","import LocationList from './LocationList'\nimport { useRef, useEffect } from 'react'\nimport { useAppState, useAppDispatch } from './Context'\n\nfunction Sidebar({ breadcrumbs, headline, content }) {\n const contentRef = useRef()\n const dispatch = useAppDispatch()\n const { sidebarOpen, mapVisible } = useAppState()\n\n const handleResize = () => {\n if (contentRef.current) {\n document.getElementById('app').style.setProperty('--map-top-offset', `${contentRef.current.offsetHeight}px`)\n }\n }\n\n useEffect(() => {\n window.addEventListener('resize', handleResize)\n\n handleResize()\n\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [])\n\n const handleSidebarToggle = () => {\n dispatch({ type: 'setSidebarOpen', payload: !sidebarOpen })\n }\n\n const handleMapToggle = () => {\n dispatch({ type: 'setMapVisible', payload: !mapVisible })\n }\n\n return (\n \n )\n}\n\nexport default Sidebar\n","import { useState, useEffect } from 'react'\nimport { useAppState, useAppDispatch } from './Context'\nimport { IconMapMarker } from '@react/common/icons'\n\nfunction MapMarker({ location }) {\n const [isSelected, setIsSelected] = useState(false)\n const { selectedLocation } = useAppState()\n const dispatch = useAppDispatch()\n\n useEffect(() => {\n if (selectedLocation === location) {\n setIsSelected(true)\n } else {\n setIsSelected(false)\n }\n }, [selectedLocation])\n\n const handleClick = (location) => {\n if (selectedLocation === location) {\n dispatch({ type: 'setSelectedLocation', payload: null })\n } else {\n dispatch({ type: 'setSelectedLocation', payload: location })\n }\n }\n\n return (\n
\n handleClick(location)}\n >\n \n \n
\n )\n}\n\nexport default MapMarker\n","import GoogleMapReact from 'google-map-react'\nimport { useAppState, useAppDispatch } from './Context'\nimport { useEffect, useRef, useState } from 'react'\nimport MapMarker from './MapMarker'\n\nconst defaultMapCenter = {\n lat: 43.0983671,\n lng: -75.2487004,\n}\n\nconst mapOptions = {\n maxZoom: 18,\n fullscreenControl: false,\n zoomControlOptions: {\n position: 9, // google.maps.ControlPosition.RIGHT_BOTTOM\n },\n}\n\nfunction Map({ apiKey }) {\n const mapRef = useRef()\n const dispatch = useAppDispatch()\n const [map, setMap] = useState()\n const [maps, setMaps] = useState()\n const { locations, mapVisible, selectedLocation } = useAppState()\n\n useEffect(() => {\n if (map && selectedLocation) {\n map.panTo(new maps.LatLng(selectedLocation.lat, selectedLocation.lng))\n }\n }, [map, selectedLocation])\n\n const handleOutsideClick = (e) => {\n if (!e.target.closest('.map-location')) {\n dispatch({ type: 'setSelectedLocation', payload: null })\n }\n }\n\n const apiIsLoaded = (map, maps) => {\n setMap(map)\n setMaps(maps)\n\n const bounds = new maps.LatLngBounds()\n\n locations.forEach((location) => {\n if (!location.excludeFromMapBoundsCenter) {\n bounds.extend(new maps.LatLng(location.lat, location.lng))\n }\n })\n\n map.setCenter(bounds.getCenter())\n map.fitBounds(bounds)\n\n maps.event.addListenerOnce(map, 'idle', () => {\n mapRef.current.classList.remove('is-loading')\n })\n }\n\n return (\n \n
\n apiIsLoaded(map, maps)}\n >\n {locations.map((location) => (\n \n ))}\n \n
\n \n )\n}\n\nexport default Map\n","import { useEffect } from 'react'\nimport { useAppDispatch } from './Context'\nimport Sidebar from './Sidebar'\nimport Map from './Map'\n\nfunction App({ data }) {\n const dispatch = useAppDispatch()\n\n useEffect(() => {\n dispatch({ type: 'setLocations', payload: data.locations })\n\n document.getElementById('app').classList.add('is-init')\n }, [])\n\n return (\n
\n
\n \n \n
\n
\n )\n}\n\nexport default App\n","import ReactDOM from 'react-dom'\nimport App from '@react/poi'\nimport { AppProvider } from '@react/poi/Context'\nimport modal from '@scripts/components/modal'\n\nconst el = document.getElementById('app')\nconst data = JSON.parse(el.dataset.json)\n\nmodal.init()\n\nReactDOM.render(\n \n \n ,\n el\n)\n"],"names":["wretch","headers","addon","QueryStringAddon","focusableSelectors","A11yDialog","element","this","_show","show","bind","_hide","hide","_maintainFocus","_bindKeypress","$el","shown","_id","getAttribute","id","_previouslyFocused","_listeners","create","$$","selector","context","collection","document","querySelectorAll","Array","prototype","slice","call","moveFocusToDialog","node","querySelector","focus","instantiateDialogs","forEach","setAttribute","hasAttribute","_openers","opener","addEventListener","_closers","filter","closer","closest","concat","_fire","event","activeElement","removeAttribute","body","removeEventListener","destroy","on","type","handler","push","off","index","indexOf","splice","listeners","domEvent","CustomEvent","detail","dispatchEvent","listener","focused","key","preventDefault","focusableChildren","join","child","offsetWidth","offsetHeight","getClientRects","length","getFocusableChildren","focusedItemIndex","shiftKey","trapTabKey","target","readyState","window","requestAnimationFrame","setTimeout","handleModal","e","triggerEl","openModal","dataset","modal","title","modalTitle","url","href","updateUrl","modalUpdateUrl","useDefaultClose","undefined","modalDisableDefaultClose","useCustomClose","modalUseCustomClose","opts","arguments","Math","floor","random","Date","now","template","generateTemplate","createRange","createContextualFragment","append","modalEl","getElementById","hideModal","currentUrl","defaultUrl","location","documentElement","classList","add","history","replaceState","remove","el","async","modalContent","innerHTML","ajax","text","populateModal","init","clickArgs","tag","createElement","src","firstScriptTag","getElementsByTagName","parentNode","insertBefore","IconMapPin","_ref","className","_jsxs","viewBox","children","_jsx","d","fill","IconArrowRight","_ref2","xmlns","stroke","strokeWidth","IconArrowTopRight","_ref3","IconMapMarker","_ref4","IconFitlerGroupOpen","_ref5","IconFitlerGroupClose","_ref6","AppStateContext","React","AppDispatchContext","appReducer","state","action","locations","payload","selectedLocation","mapVisible","sidebarOpen","Error","AppProvider","dispatch","matchMedia","matches","Provider","value","useAppState","useAppDispatch","onClick","detailsUrl","thumbnail","loading","alt","address","city","zip","map","LocationCard","handleClick","breadcrumbs","headline","content","contentRef","useRef","handleResize","current","style","setProperty","useEffect","ref","dangerouslySetInnerHTML","__html","handleSidebarToggle","handleMapToggle","LocationList","isSelected","setIsSelected","useState","defaultMapCenter","lat","lng","mapOptions","maxZoom","fullscreenControl","zoomControlOptions","position","apiKey","mapRef","setMap","maps","setMaps","panTo","LatLng","GoogleMapReact","bootstrapURLKeys","defaultCenter","defaultZoom","options","yesIWantToUseGoogleMapApiInternals","onGoogleApiLoaded","apiIsLoaded","bounds","LatLngBounds","excludeFromMapBoundsCenter","extend","setCenter","getCenter","fitBounds","addListenerOnce","MapMarker","data","Sidebar","Map","JSON","parse","json","ReactDOM","App"],"sourceRoot":""}