{"version":3,"mappings":"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","names":["_hoisted_1","render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","IconAlert","IconClockOutline","IconClose$1","changeCase","slug","x","convertDurationToHumanReadableTime","duration","pattern","time","timeDuration","decodeContent","content","txt","result","formatDuration","d","hours","remainder","minutes","seconds","formatTimeDuration","str","parts","intToWord","int","isAbsoluteUrl","url","redirectUnsupportedBrowser","router","title","browser","browsers","support","i","agent","version","params","slugToTitle","word","stripTags","upperCaseWords","first","useMainStore","defineStore","type","value","id","item","obj","globalAudioMuted","ref","useA11y","store","setValue","firstFocusable","lastFocusable","detectKeyboardUser","els","el","event","findFocusable","focusFirstChild","nextTick","target","unref","focusable","focusSkip","keyboardHandler","e","focusableElements","trappedElement","useAnalytics","ga4Event","interval","anchors","buttons","untagged","elem","gaData","eventData","useCheckAncestry","hasSpanNine","findAncestor","node","instance","ancestor","useSpacingState","props","$style","computed","dataLoaded","loaded","checkTime","endsTomorrow","start","end","tomorrow","d1","format","d2","date","showMinutes","formatted","useDateFormat","dateTime","month","formatDate","weekday","formatDates","dates","temp","begin","formatTime","showMeridiem","startMeridiem","showMeridies","includeWeekday","options","useHandleError","useRouter","component","msg","shouldRoute","path","handleEscKey","selected","handleClickOutside","useFilterInteractions","isKeyboardUser","storeToRefs","clickListener","keyListener","onBeforeUnmount","onMounted","selection","refs","useImageProxy","width","full","useMetaData","defaultMetaDescription","defaultMetaTitle","purgeMetaTags","setMetaDescription","description","metaTags","setMetaTags","tagDef","tag","key","useNavigation","emit","useRouteParent","route","useRoute","useScreenSize","innerHeight","innerWidth","mobileBreakpoint","tabletBreakpoint","handleResize","onUnmounted","useScrollAnchor","marginTop","isFocusable","shouldSkip","uid","useUniqueIdentifier","cookieName","expiry","appConfig","inject","cookieContent","show","data","icons","getCookie","shouldShow","watch","close","setCookie","_a","row","attrs","useAttrs","__props","getProperties","properties","getTarget","isInternal","footerNav","isMobile","style","useCssModule","get_block_class","block","get_grid_class","count","get_row_class","_createStaticVNode","IconLoading","eventListQuery","__emit","mainMenu","checkIsSamePath","handleError","useBootstrap","events","today","error","useQuery","gql","exhibitionsOnViewQuery","exhibitions","IconLogo","IconMagnify","IconMenu","logoSrc","pushItem","logoCanvases","captureElement","renderedCanvas","capturedCanvas","captureDOMIntoCanvas","handleScroll","html2canvas","canvas","match","element","drawCapturedCanvas","ctx","headerBottom","logoIcon","logoOffset","logoHeight","logoBottom","scrollOffset","captureOffsetY","scrolledContentUnderLogoHeight","blankSpaceHeight","searchQuery","startSearch","trapFocus","search","mounted","updateSearchState","state","theClass","sendEvent","overlay","routing","showBanner","menu","activeItem","frame","lastAct","main","offset","searchActive","showMenu","showLogoIconG","resized","escKey","frameClass","yPos","setOffset","overlayState","routingState","val","changeActiveItem","unsetActiveItem","setActiveItem","getLimit","getSubmenuClass","getSubmenuType","EventList","SubNav","ExhibitionsOnView","handleSamePath","banner","toggleMenu","useAudioStore","AudioPlayer","defineAsyncComponent","__vitePreload","audioStore","getCurrentInstance","announcement","savedPosition","tracks","initAnalytics","scrollToAnchor","activeLinks","announcer","isPreviewLogin","page","scrollToName","name","selector","hasHash","hash","__expose","scrollTo","position","watchActiveLinks","unWatchActiveLinks","preventFocus","onUpdated","changeClass","action","closeOverlay","anchor","skipTo","unfocusLink","link","artworkSubtypes","artInvestigationSubtypes","artMakingSubtypes","ArticlePost","ArticleSection","ArtworkPost","ArtworkTerm","ArtworkTermArtist","ArtworkSection","AudioSection","AudioTracks","AudioPlaylists","AudioPlaylist","AudioTrack","CalendarEvent","CalendarSeries","CalendarSection","CollectionOnline","ExhibitionsArchive","ExhibitionsPage","ExhibitionsPost","FindingAidsCollection","FindingAidsFile","FindingAidsRequest","FindingAidsSeries","Home","LearningThroughArtPostInvestigation","LearningThroughArtPostMaking","LearningThroughArtInvestigation","LearningThroughArtCurriculum","LearningThroughArtMaking","LearningThroughArtTaxonomy","NewsPost","NewsSection","NotFound","PageController","PlanYourVisit","PressReleasePost","PressReleaseSection","PublicationPost","PublicationSection","Search","n","TeachingMaterialsPackage","TeachingMaterialsTopic","TeachingMaterialsSection","VideoPost","VideoSection","VideoTaxonomy","routes","_createRouter","createWebHistory","to","from","resolve","next","setBoolean","newPath","normalizePath","logError","navTopic","navPackage","open","travels","updateAudioState","pathname","createRouter","IconClose","lightbox","binding","proxySource","box","htmlToElement","container","desc","image","span","trigger","wrap","evt","activateLightbox","checkCloseEvent","app","toggleInert","gaEvent","string","skipLink","mainNav","passcode","authPlugin","opContext","villusClient","createClient","defaultPlugins","batch","pinia","createPinia","createApp","App","getMatchedComponents","record","routerReady","promises","err"],"ignoreList":[],"sources":["../../src/assets/svgs/IconAlert.svg?component","../../src/assets/svgs/IconClockOutline.svg?component","../../src/assets/svgs/IconClose.svg?component","../../src/utils.js","../../src/stores/mainStore.js","../../src/composables/Common.js","../../src/components/common/Banner.vue","../../src/components/common/PreparedAnchor.vue","../../src/components/navigation/FooterNav.vue","../../src/assets/svgs/IconLoading.svg?component","../../src/queries/EventListQuery.js","../../src/components/common/EventList.vue","../../src/queries/ExhibitionsOnViewQuery.js","../../src/components/exhibitions/ExhibitionsOnView.vue","../../src/assets/svgs/IconLogo.svg?component","../../src/assets/svgs/IconMagnify.svg?component","../../src/assets/svgs/IconMenu.svg?component","../../src/assets/svgs/media/Guggenheim_Symbol_Gray_RGB.svg?url","../../src/components/navigation/NavLogo.vue","../../src/components/search/SearchForm.vue","../../src/components/search/SearchModal.vue","../../src/components/navigation/SubNav.vue","../../src/components/navigation/MainNav.vue","../../src/stores/audioStore.ts","../../src/App.vue","../../src/config/app.js","../../src/router.js","../../src/assets/svgs/IconClose.js","../../src/components/directives/Lightbox.ts","../../src/vue-villus.js","../../src/main.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\",\n height: \"16\",\n fill: \"none\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"#111\",\n d: \"M8.667 9.333H7.334V6h1.333v3.333Zm0 2.667H7.334v-1.334h1.333V12Zm-8 2h14.667L8 1.333.667 14Z\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"16\",\n height: \"16\",\n fill: \"none\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"#111\",\n d: \"M8 13.333A5.334 5.334 0 1 0 8 2.666a5.334 5.334 0 0 0 0 10.667Zm0-12a6.667 6.667 0 0 1 0 13.334c-3.687 0-6.667-3-6.667-6.667A6.667 6.667 0 0 1 8 1.333Zm.333 3.334v3.5l3 1.78-.5.82-3.5-2.1v-4h1Z\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", { d: \"m12.666 4.273-.94-.94L8 7.06 4.273 3.333l-.94.94L7.06 8l-3.727 3.727.94.94L8 8.94l3.726 3.727.94-.94L8.94 8l3.726-3.727Z\" }, null, -1)\n ])))\n}\nexport default { render: render }","export function changeCase(slug) {\n const s = slug[0].toUpperCase() + slug.slice(1);\n\n return s.replace(/(-.)/g, x => x[1].toUpperCase());\n}\n\n/**\n * Converts datetime duration into accessible human readable time\n * @param {*} duration\n */\nexport function convertDurationToHumanReadableTime(duration) {\n const pattern = /H*(\\d*)M*(\\d*)S*(\\d*)/;\n const time = duration.match(pattern);\n let timeDuration = [];\n\n if (time[1].length) {\n timeDuration.push(`${time[1]} hour${time[1] > 1 ? 's' : ''}`);\n }\n\n if (time[2].length) {\n timeDuration.push(`${time[2]} minute${time[2] > 1 ? 's' : ''}`);\n }\n\n if (time[3].length) {\n timeDuration.push(`${time[3]} second${time[3] > 1 ? 's' : ''}`);\n }\n\n return timeDuration.join(' ');\n}\n\nexport function decodeContent(content) {\n const txt = document.createElement('textarea');\n\n txt.innerHTML = content.replace(/<[^>]*>/g, '');\n const result = txt.value;\n\n txt.remove();\n\n return result;\n}\n\n/**\n * Format duration in milliseconds to hh:mm:ss\n */\nexport function formatDuration(d) {\n const hours = Math.floor(d / (1000 * 60 * 60));\n let remainder = d % (1000 * 60 * 60);\n let result = '';\n\n const minutes = Math.floor(remainder / (1000 * 60));\n remainder = d % (1000 * 60);\n\n const seconds = Math.floor(remainder / 1000);\n\n if (hours > 0) {\n result = `${hours}:`;\n }\n\n if (minutes > 0) {\n if (minutes <= 9) {\n result = `${result}0${minutes}:`;\n } else {\n result = `${result}${minutes}:`;\n }\n } else {\n result = `${result}00:`;\n }\n\n if (seconds > 0) {\n if (seconds <= 9) {\n result = `${result}0${seconds}`;\n } else {\n result = `${result}${seconds}`;\n }\n } else {\n result = `${result}00`;\n }\n\n return result;\n}\n\n/**\n * Parses an HH:MM:SS string and returns the datetime duration in machine-readable duration time component scale format.\n * https://www.w3.org/TR/2014/REC-html5-20141028/infrastructure.html#duration-time-component\n *\n * @param {*} str\n */\nexport function formatTimeDuration(str) {\n let result = '';\n\n if (str) {\n const parts = str.split(':');\n const seconds = parts.pop();\n const minutes = parts.pop();\n const hours = parts.pop();\n\n result += parseInt(hours) ? `H${hours}` : '';\n result += parseInt(minutes) ? `M${minutes}` : '';\n result += parseInt(seconds) ? `S${seconds}` : '';\n }\n\n return result;\n}\n\n/**\n * Returns a cookie by name\n * @param {*} value\n */\nexport function getCookie(value) {\n return document.cookie.split(';').filter(item => item.includes(value));\n}\n\n/**\n *\n * @param {*} string\n */\nexport function intToWord(int) {\n const words = [\n 'zero',\n 'one',\n 'two',\n 'three',\n 'four',\n 'five',\n 'six',\n 'seven',\n 'eight',\n 'nine',\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen'\n ];\n\n return words[int];\n}\n\n/**\n * Tests wether or not a URL is absolute:\n *\n * 'http://example.com' // true - regular http absolute URL\n * 'HTTP://EXAMPLE.COM' // true - HTTP upper-case absolute URL\n * 'https://www.exmaple.com' // true - secure http absolute URL\n * 'ftp://example.com/file.txt' // true - file transfer absolute URL\n * '//cdn.example.com/lib.js' // true - protocol-relative absolute URL\n * '/myfolder/test.txt' // false - relative URL\n * 'test' // false - also relative URL\n * @param {*} dt\n */\nexport function isAbsoluteUrl(url) {\n const pattern = new RegExp('^(?:[a-z]+:)?//', 'i');\n\n return pattern.test(url);\n}\n\nexport function redirectUnsupportedBrowser(router, title) {\n const browser = navigator.userAgent;\n const browsers = {\n 1: { edge: /Edge\\/([\\d\\.]*)/ },\n 2: { chrome: /Chrome\\/([\\d\\.]*)/ },\n 3: { firefox: /Firefox\\/([\\d\\.]*)/ },\n 4: { ie: /MSIE ([\\d\\.]*)/ },\n 5: { safari: /Version\\/([\\d\\.]*)/ }\n };\n const support = appConfig.browserSupport;\n\n // use methods that are available to older browsers\n // order is important\n for (let i = 1; i < 6; i++) {\n const agent = Object.keys(browsers[i])[0];\n const pattern = browsers[i][agent];\n const version = browser.match(pattern);\n\n browsers[i][agent] = version ? Number(version[1].split('.')[0]) : version;\n }\n\n if (!browser.match(/Mobile/)) {\n for (let i = 1; i < 6; i++) {\n const agent = Object.keys(browsers[i])[0];\n\n if (browsers[i][agent]) {\n // check against versions saved in wp options\n if (Number(support[agent]) > browsers[i][agent]) {\n router.push({ path: '/browser-not-supported' });\n\n const params = {\n click_type: 'unsupported_browser',\n component: 'router.js',\n content_group: 'error',\n link_text: `${agent}_${browsers[i][agent]}`,\n gtm_tag: 'interaction'\n };\n\n window.dataLayer.push({\n event: 'ga4-event',\n name: 'error',\n params\n });\n }\n break;\n }\n }\n }\n}\n\n// Convert slugs to readable titles\nexport function slugToTitle(str) {\n return str\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n// Remove HTML tags from a string, cleaning up any leftover whitespace.\nexport function stripTags(str) {\n return str.replace(/(<([^>]+)>)/gi, '').trim();\n}\n\n// https://gist.github.com/hagemann/382adfc57adbd5af078dc93feef01fe1\nexport function slugify(string) {\n const a = 'à áäâãåăæçèéëêǵḧìÃïîḿńǹñòóöôœṕŕßśșțùúüûǘẃáºÃ¿ÅºÂ·/_,:;';\n const b = 'aaaaaaaaceeeeghiiiimnnnoooooprssstuuuuuwxyz------';\n const p = new RegExp(a.split('').join('|'), 'g');\n\n return string\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(p, c => b.charAt(a.indexOf(c))) // Replace special characters\n .replace(/&/g, '-and-') // Replace & with 'and'\n .replace(/[^\\w\\-]+/g, '') // Remove all non-word characters\n .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start of text\n .replace(/-+$/, ''); // Trim - from end of text\n}\n\n/**\n * Uppercase the first letter of each word.\n */\nexport function upperCaseWords(str) {\n return str.replace(/[^\\s]+/g, function(word) {\n return word.replace(/^./, function(first) {\n return first.toUpperCase();\n });\n });\n}\n","import { defineStore } from 'pinia';\n\n// TODO: GUGG Typescript\n// interface State {\n// announcement: String;\n// cart: Array;\n// collectionArtworks: Array;\n// currentSlide: Array;\n// dataLoaded: Boolean;\n// isKeyboardUser: Boolean;\n// logoCanvases: Array;\n// overlay: Boolean;\n// routing: Boolean;\n// savedPosition: Boolean;\n// showBanner: Boolean;\n// token: String;\n// useBootstrap: Boolean;\n// yPos: Number;\n// }\n\nexport const useMainStore = defineStore('mainStore', {\n state: () => ({\n announcement: '',\n cart: [],\n collectionArtworks: [],\n currentSlide: [],\n dataLoaded: false,\n isKeyboardUser: false,\n logoCanvases: [],\n overlay: false,\n routing: false,\n savedPosition: false,\n showBanner: true,\n token: '',\n useBootstrap: false,\n yPos: 0,\n }),\n actions: {\n pushItem({ type, value }) {\n this[type].push(value);\n },\n setBoolean(value) {\n this[value] = !this[value];\n },\n setListItem({ type, id, value }) {\n this[type] = [...this[type].filter((item) => item.id !== id), { id, value }];\n },\n setValue({ type, value }) {\n this[type] = value;\n },\n emptyCart() {\n this.cart = [];\n },\n updateCart(obj) {\n if (obj.checked) {\n this.cart.push(obj.file);\n }\n\n if (!obj.checked) {\n for (let i = 0; i < this.cart.length; i++) {\n if (this.cart[i].uid === obj.file.uid) {\n this.cart.splice(i, 1);\n }\n }\n }\n },\n },\n});\n","import { decodeContent, stripTags } from '@/utils';\nimport { computed, nextTick, onBeforeUnmount, onMounted, onUnmounted, ref, unref } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useMainStore } from '@/stores/mainStore.js';\nimport { useRoute } from 'vue-router';\nimport { useRouter } from 'vue-router';\n\nexport const globalAudioMuted = ref(true);\n\n// A11y\nexport function useA11y() {\n const store = useMainStore();\n const { setValue } = store;\n\n let firstFocusable = false;\n let lastFocusable = false;\n\n const detectKeyboardUser = () => {\n const els = [...document.getElementsByTagName('a'), ...document.getElementsByTagName('button')];\n\n ['click', 'keydown'].map((type) => {\n if (els) {\n Array.from(els).forEach((el) => {\n el.addEventListener(type, (event) => {\n // Event.detail is the click count, keydown enter also triggers click\n if (event.type === 'keydown' && event.code === 'Enter' && event.detail === 0) {\n setValue({ type: 'isKeyboardUser', value: true });\n }\n\n if (event.type === 'click' && event.detail > 0) {\n setValue({ type: 'isKeyboardUser', value: false });\n }\n });\n });\n }\n });\n };\n\n const findFocusable = (el) => {\n return el.querySelectorAll(\n 'a[href]:not(a[id^=\"anchor-link\"]):not([aria-hidden=\"true\"]), area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, [tabindex=\"0\"], [contenteditable]',\n );\n };\n\n const focusFirstChild = (el) => {\n // TODO: Add check for el in $refs and fallback to ID?\n nextTick().then(() => {\n const target = document.getElementById(unref(el));\n\n if (target) {\n const focusable = findFocusable(target);\n\n if (focusable.length) {\n focusable[0].focus();\n }\n }\n });\n };\n\n const focusSkip = () => {\n document.getElementById('skip-link').focus();\n };\n\n const keyboardHandler = (e) => {\n if (e.key === 'Tab' || e.code === 'Tab') {\n if (e.shiftKey && document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable.focus();\n }\n\n if (!e.shiftKey && document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable.focus();\n }\n }\n };\n\n const trapFocus = (target = null) => {\n let focusableElements;\n let trappedElement;\n\n if (target) {\n focusableElements = findFocusable(target);\n\n if (focusableElements.length > 0) {\n firstFocusable = focusableElements[0];\n lastFocusable = focusableElements[focusableElements.length - 1];\n firstFocusable.focus();\n trappedElement = target;\n trappedElement.addEventListener('keydown', keyboardHandler);\n }\n }\n\n if (!target) {\n if (trappedElement) {\n trappedElement.removeEventListener('keydown', keyboardHandler);\n }\n }\n };\n\n return {\n detectKeyboardUser,\n findFocusable,\n focusFirstChild,\n focusSkip,\n keyboardHandler,\n trapFocus,\n };\n}\n\n// Analytics\nexport function useAnalytics() {\n const ga4Event = (params) => {\n window.dataLayer.push({\n event: 'ga4-event',\n name: 'click',\n params,\n });\n };\n\n const initAnalytics = () => {\n const interval = window.setInterval(() => {\n const anchors = window.document.body.querySelectorAll('a[ga4-event]:not([ga-init])');\n const buttons = window.document.body.querySelectorAll('button[ga4-event]:not([ga-init])');\n const untagged = [...anchors, ...buttons];\n\n if (untagged.length > 0) {\n untagged.forEach((elem) => {\n elem.setAttribute('ga-init', '');\n\n if (elem.hasAttribute('ga4-event')) {\n const gaData = elem.getAttribute('ga4-event');\n\n if (gaData) {\n try {\n const eventData = JSON.parse(gaData);\n\n elem.addEventListener('click', () => {\n ga4Event(eventData);\n });\n } catch {\n // eslint-disable-next-line\n console.warn('Cannot parse: ' + gaData);\n }\n }\n }\n });\n }\n\n if (untagged.length === 0) {\n clearInterval(interval);\n }\n }, 100);\n };\n\n return { ga4Event, initAnalytics };\n}\n\n// CheckAncestry\nexport function useCheckAncestry() {\n const hasSpanNine = ref(false);\n\n const findAncestor = (node) => {\n if (node && node.vnode.el.id === 'app') {\n return false;\n }\n\n if (node && node.refs.mainContent) {\n return node.refs.mainContent;\n }\n\n return node ? findAncestor(node.parent) : null;\n };\n\n const hasSpanNineAncestor = (instance) => {\n const ancestor = findAncestor(instance.parent);\n\n if (ancestor) {\n if (ancestor.vnode && ancestor.vnode.__v_isVNode) {\n hasSpanNine.value = ancestor.vnode.el.classList.contains('span-nine');\n }\n\n if (!ancestor.vnode) {\n if (ancestor.classList) {\n hasSpanNine.value = ancestor.classList.contains('span-nine');\n }\n\n if (!ancestor.classList) {\n hasSpanNine.value = ancestor._.attrs.class.includes('span-nine');\n }\n }\n }\n };\n\n return { findAncestor, hasSpanNine, hasSpanNineAncestor };\n}\n\nexport function useSpacingState(props, $style) {\n return computed(() => {\n switch (props.spacingState) {\n case 'Inset':\n return $style.inset;\n case 'Column':\n return $style.column;\n case 'Full Screen':\n case 'None':\n default:\n return $style.fullScreen;\n }\n });\n}\n\n// DataLoaded\nexport function dataLoaded(loaded = true) {\n const store = useMainStore();\n const { setValue } = store;\n\n if (loaded) {\n window.dataLayer.push({\n event: 'data-loaded',\n });\n }\n\n setValue({ type: 'dataLoaded', value: loaded });\n}\n\n// DateFormat\n/**\n * Parse time and returns it as HH:MM\n * @param {string} time\n * @returns {string}\n */\nconst checkTime = (time) => {\n let hours;\n let minutes = '00';\n\n if (time.indexOf(':') > -1) {\n hours = time.split(':')[0];\n minutes = time.split(':')[1];\n\n if (hours.length === 1) {\n hours = '0' + hours;\n }\n }\n\n if (time.indexOf(':') === -1) {\n if (time.length === 1) {\n hours = '0' + time;\n }\n\n if (time.length === 2) {\n hours = time;\n }\n }\n\n return `${hours}:${minutes}`;\n};\n\n/**\n * Determines if \"start\" value ends tomorrow\n * @param {object} start\n * @param {object} end\n * @returns {boolean}\n */\nconst endsTomorrow = (start, end) => {\n const tomorrow = new Date(`${start.isoDate}T00:00:00`);\n\n tomorrow.setDate(tomorrow.getDate() + 1);\n\n const d1 = format(tomorrow);\n const d2 = end.isoDate || false;\n\n return d1 === d2;\n};\n\n/**\n * Returns formatted string from Date object\n * @param {Date} date\n * @param {boolean} showMinutes\n * @returns {string}\n */\nconst format = (date, showMinutes = false) => {\n // en-GB = \"20/12/2023\"\n const formatted = date.toLocaleDateString('en-GB').split('/').reverse().join('-');\n\n if (showMinutes) {\n // it-IT = \"02:03:04\"\n return formatted + ' ' + date.toLocaleTimeString('it-IT');\n }\n\n return formatted;\n};\n\nexport function useDateFormat() {\n /**\n * CalendarDay\n * CalendarMonth\n * DateLine\n * SiteSearchList\n * EventSummary\n * @param {*} date\n * @returns {string}\n */\n const dateTime = (date) => {\n if (!(date instanceof Date)) {\n if (date.isoDate) {\n const temp = date.time\n ? `${date.isoDate}T${checkTime(date.time)}:00`\n : `${date.isoDate}T00:00:00`;\n\n return temp;\n }\n\n if (!date.isoDate) {\n const month = new Date(`${date.month} 1, 2023`).getMonth() + 1;\n const temp = date.time\n ? `${date.year}-${month}-${date.day}T${checkTime(date.time)}:00`\n : `${date.year}-${month}-${date.day}T00:00:00`;\n\n return temp;\n }\n }\n\n return date.toISOString();\n };\n\n /**\n * CalendarDay\n * CalendarEvent\n * CalendarSection\n * ExhibitionSlider\n * GuggenFlyout\n * ArticleSummary\n * @param {*} date\n * @param {boolean} weekday\n * @returns {Date || string}\n */\n const formatDate = (date, weekday = false) => {\n if (!(date instanceof Date)) {\n return weekday\n ? `${date.weekday}, ${date.month} ${date.day}, ${date.year}`\n : `${date.month} ${date.day}, ${date.year}`;\n }\n\n return date;\n };\n\n /**\n * CalendarEvent\n * DateLine\n * SiteSearchList\n * EventSummary\n * @param {*} dates\n * @returns {string}\n */\n const formatDates = (dates) => {\n if (!Array.isArray(dates)) {\n const temp = dates;\n dates = [];\n dates.push(temp);\n }\n\n const begin = dates[0].start;\n const end = dates[dates.length - 1].start;\n\n // If no valid end date, return only formatted start\n if (end === begin) {\n return formatDate(begin);\n }\n\n if (`${begin.month} ${begin.day} ${begin.year}` === `${end.month} ${end.day} ${end.year}`) {\n return formatDate(begin);\n }\n\n if (begin.year === end.year) {\n if (begin.month === end.month) {\n return `${begin.month} ${begin.day}–${end.day}, ${end.year}`;\n }\n\n return `${begin.month} ${begin.day}–${end.month} ${end.day}, ${end.year}`;\n }\n\n return `${begin.month} ${begin.day}, ${begin.year}–${end.month} ${end.day}, ${end.year}`;\n };\n\n /**\n * CalendarDay\n * CalendarMonth\n * @param {object} date\n * @param {boolean} showMeridiem\n * @returns {string}\n */\n const formatTime = (date, showMeridiem = true) =>\n showMeridiem ? `${date.time} ${date.meridiem}` : date.time;\n\n /**\n * CalendarEvent\n * EventSummary\n * @param {*} dates\n * @returns {string}\n */\n const formatTimeSpan = (dates) => {\n if (!Array.isArray(dates)) {\n const temp = dates;\n dates = [];\n dates.push(temp);\n }\n\n const begin = dates[0].start;\n const end =\n dates[0].start === dates[dates.length - 1].end ||\n dates[dates.length - 1].end === null ||\n dates[dates.length - 1].end === ''\n ? null\n : dates[dates.length - 1].end;\n\n const startMeridiem = begin.meridiem;\n const showMeridies = end && startMeridiem !== end.meridiem;\n\n // Ends tomorrow at 12 am (midnight)\n if (end && endsTomorrow(begin, end) && `${end.time} ${end.meridiem}` === '12 am') {\n return `${formatTime(begin)} ${begin.timezone} to Midnight`;\n }\n\n return end\n ? `${formatTime(begin, showMeridies)}–${formatTime(end)} ${begin.timezone}`\n : `${formatTime(begin)} ${begin.timezone}`;\n };\n\n /**\n * Format JS Date to \"Tuesday(optional), February 4, 2023\"\n * @param {Date} date\n * @param {boolean} includeWeekday\n * @returns {string}\n */\n const formatToString = (date, includeWeekday = false) => {\n let options = {\n day: 'numeric',\n year: 'numeric',\n month: 'long',\n };\n\n if (includeWeekday) {\n options = { weekday: 'long', ...options };\n }\n\n return date.toLocaleString('en-US', options);\n };\n\n return {\n dateTime,\n formatDate,\n formatDates,\n formatTime,\n formatTimeSpan,\n formatToString,\n };\n}\n\n// ErrorHandler\nexport function useHandleError() {\n const router = useRouter();\n\n const handleError = (component, msg, shouldRoute = true, path = false) => {\n const params = {\n click_type: 'component_error',\n component,\n content_group: 'error',\n link_text: msg,\n gtm_tag: 'interaction',\n };\n\n window.dataLayer.push({\n event: 'ga4-event',\n name: 'error',\n params,\n });\n\n if (shouldRoute && path) {\n router.push({ path: `${path}` });\n }\n\n if (shouldRoute && !path) {\n router.push({ name: 'NotFound' });\n }\n };\n\n return { handleError };\n}\n\n// FilterInteractions\nfunction handleEscKey(event, selected, handleClickOutside) {\n if (event.key === 'Escape' && selected.value) {\n selected.value = '';\n document.removeEventListener('click', handleClickOutside);\n }\n}\n\nexport function useFilterInteractions(selected) {\n const store = useMainStore();\n const { isKeyboardUser } = storeToRefs(store);\n\n const { focusFirstChild } = useA11y();\n\n const clickListener = new AbortController();\n const keyListener = new AbortController();\n\n function handleClickOutside() {\n selected.value = '';\n document.removeEventListener('click', handleClickOutside);\n }\n\n onBeforeUnmount(() => {\n clickListener.abort();\n keyListener.abort();\n });\n onMounted(() =>\n nextTick(() =>\n document.addEventListener(\n 'keydown',\n (event) => handleEscKey(event, selected, handleClickOutside),\n { signal: keyListener.signal },\n ),\n ),\n );\n\n const selectNav = (selection, refs) => {\n selected.value = selected.value === selection ? '' : selection;\n document.addEventListener('click', handleClickOutside);\n refs.forEach((ref) => {\n if (ref) {\n ref.addEventListener('click', (event) => event.stopPropagation(), {\n signal: clickListener.signal,\n });\n }\n });\n\n if (isKeyboardUser.value && selected.value) {\n focusFirstChild(selection);\n }\n\n if (!selected.value) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n\n return { selectNav };\n}\n\n// ImageProxy\nexport function useImageProxy() {\n const proxySource = (path, width, full = null) => {\n if (path) {\n if (full || !path.includes('weserv')) {\n return path;\n }\n\n if (path.includes('weserv')) {\n return width\n ? `${path}&w=${width}`\n : `${path}&w=${window.innerWidth < 960 ? window.innerWidth : 1280}`;\n }\n }\n\n return '';\n };\n\n return { proxySource };\n}\n\n// Metadata\nexport function useMetaData() {\n const store = useMainStore();\n const { setValue } = store;\n\n const defaultMetaDescription =\n 'Visit the Frank Lloyd Wright–designed Guggenheim Museum in NYC, part of a UNESCO World Heritage Site. See the renowned permanent collection and special exhibitions.';\n const defaultMetaTitle = 'The Guggenheim Museums and Foundation';\n\n const purgeMetaTags = () => {\n Array.from(document.querySelectorAll('[data-app-meta]')).map((el) =>\n el.parentNode.removeChild(el),\n );\n };\n\n const setMetaDescription = (description = '') => {\n purgeMetaTags();\n\n const metaDescription = description ? stripTags(description) : defaultMetaDescription;\n const metaTags = [\n {\n name: 'description',\n content: metaDescription,\n },\n ];\n\n setMetaTags(metaTags);\n };\n\n const setMetaTags = (metaTags) => {\n metaTags\n .map((tagDef) => {\n const tag = document.createElement('meta');\n\n Object.keys(tagDef).forEach((key) => {\n tag.setAttribute(key, tagDef[key]);\n });\n tag.setAttribute('data-app-meta', '');\n\n return tag;\n })\n .forEach((tag) => document.head.appendChild(tag));\n };\n\n const setMetaTitle = (title = '') => {\n setValue({\n type: 'announcement',\n value: `The ${title} page has loaded. Skip to main content.`,\n });\n document.title = title ? `${decodeContent(title)} | ${defaultMetaTitle}` : defaultMetaTitle;\n };\n\n return {\n setMetaDescription,\n setMetaTitle,\n };\n}\n\n// Navigation\nexport function useNavigation() {\n const { findFocusable } = useA11y();\n const router = useRouter();\n\n const checkIsSamePath = (url, emit, event) => {\n if (\n url === router.currentRoute.value.fullPath ||\n router.currentRoute.value.hash ||\n router.currentRoute.value.query\n ) {\n emit('isSamePath');\n }\n\n if (event && event.key === 'Enter') {\n // handles keyboard activation\n if (url.includes('#')) {\n router.push({ path: url.split('#')[0], hash: `#${url.split('#')[1]}` });\n\n nextTick().then(() => {\n const target = document.querySelector(`#${url.split('#')[1]}`);\n const firstFocusable = findFocusable(target)[0];\n\n firstFocusable.focus();\n });\n }\n\n if (url.includes('?q=')) {\n router.push({ path: url.split('#')[0], query: { q: `${url.split('?q=')[1]}` } });\n }\n }\n };\n\n return { checkIsSamePath };\n}\n\n// RouteParent\nexport function useRouteParent() {\n const route = useRoute();\n\n const parent = route.matched[route.matched.length - 1].name.toString();\n\n return { parent };\n}\n\n// ScreenSize\nexport function useScreenSize() {\n const innerHeight = ref(window.innerHeight);\n const innerWidth = ref(window.innerWidth);\n const mobileBreakpoint = 960;\n const tabletBreakpoint = 915;\n\n onMounted(() => window.addEventListener('resize', handleResize));\n onUnmounted(() => window.removeEventListener('resize', handleResize));\n\n const handleResize = () => {\n innerHeight.value = window.innerHeight;\n innerWidth.value = window.innerWidth;\n };\n\n const isDesktop = () => innerWidth.value >= tabletBreakpoint;\n\n const isMobile = () => innerWidth.value < mobileBreakpoint;\n\n const isTablet = () => mobileBreakpoint < innerWidth.value && innerWidth.value < tabletBreakpoint;\n\n return { isDesktop, isMobile, isTablet };\n}\n\n// ScrollAnchor\nexport function useScrollAnchor() {\n const { findFocusable } = useA11y();\n\n const scrollToAnchor = (target) => {\n if (target) {\n const marginTop = parseFloat(getComputedStyle(target).marginTop);\n\n window.scrollTo(0, target.offsetTop - marginTop - 100);\n let isFocusable = false;\n let shouldSkip = false;\n\n findFocusable(document.querySelector('#content')).forEach((item) => {\n if (shouldSkip) {\n return;\n }\n\n if (item.isSameNode(target)) {\n isFocusable = true;\n shouldSkip = true;\n }\n });\n\n if (!isFocusable) {\n target.setAttribute('tabindex', 0);\n }\n\n target.focus();\n target.removeAttribute('tabindex');\n }\n };\n\n return { scrollToAnchor };\n}\n\n// UniqueIdentifier\nlet uid = 0;\n\nexport function useUniqueIdentifier() {\n const incrementUid = () => {\n uid += 1;\n };\n\n incrementUid();\n\n return { uid: uid };\n}\n","<template>\n <div v-if=\"data && data.text && show\" id=\"guggen-banner\" :class=\"$style.banner\">\n <div :class=\"$style.frame\">\n <h2 v-if=\"data.heading\">{{ data.heading }}</h2>\n <aside>\n <component :is=\"icons[data.icon]\" v-if=\"data.icon\"></component>\n <div v-html=\"data.text\"></div>\n </aside>\n <button aria-label=\"Close alert\" class=\"button-reset\" @click=\"close(data.id)\">\n <IconClose></IconClose>\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { AppConfig } from '@/types/global.interface';\nimport { computed, inject, onMounted, ref, watch } from 'vue';\nimport IconAlert from '@/assets/svgs/IconAlert.svg?component';\nimport IconClockOutline from '@/assets/svgs/IconClockOutline.svg?component';\nimport IconClose from '@/assets/svgs/IconClose.svg?component';\nimport { storeToRefs } from 'pinia';\nimport { useA11y } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore.js';\nimport { useRoute } from 'vue-router';\n\ninterface Data {\n background_color: string;\n heading: string;\n icon: string;\n id: string;\n targets: Array<string>;\n text: string;\n text_color: string;\n text_hover_color: string;\n}\n\nconst appConfig = inject<AppConfig>('appConfig');\nconst cookieName = 'guggenBanner';\nconst expiry = 'Tue, Jan 19 2038 08:14:07 GMT'; // Epochalypse.\n\nconst cookieContent = ref();\nconst show = ref();\n\nconst { focusFirstChild } = useA11y();\nconst store = useMainStore();\nconst route = useRoute();\n\nconst { isKeyboardUser } = storeToRefs(store);\nconst { setValue } = store;\n\nconst data = computed<Data>(() => appConfig.banner);\nconst path = computed(() => route.path);\n\nconst icons = {\n IconAlert,\n IconClockOutline,\n};\n\nonMounted(() => {\n setValue({ type: 'showBanner', value: false });\n if (document.cookie.split(';').some((item) => item.trim().startsWith(`${cookieName}=`))) {\n getCookie();\n }\n\n shouldShow();\n});\n\nwatch(path, () => {\n shouldShow();\n});\n\nfunction close(id: string): void {\n setValue({ type: 'showBanner', value: false });\n cookieContent.value = id;\n show.value = false;\n setCookie();\n\n if (isKeyboardUser.value) {\n focusFirstChild('main-nav');\n }\n}\n\nfunction getCookie(): void {\n cookieContent.value = document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${cookieName}=`))\n ?.split('=')[1];\n}\n\nfunction setCookie(): void {\n document.cookie = `\n ${cookieName}=${cookieContent.value};\n domain=${document.location.hostname};\n expires=${expiry}; path=/; SameSite=None; Secure\n `;\n}\n\nfunction shouldShow(): undefined {\n show.value = true;\n\n if (cookieContent.value && cookieContent.value === data.value.id) {\n setValue({ type: 'showBanner', value: false });\n show.value = false;\n\n return;\n }\n\n if (data.value.targets && !data.value.targets.length) {\n setValue({ type: 'showBanner', value: true });\n return;\n }\n\n if (\n data.value.targets &&\n data.value.targets.includes('/calendar') &&\n path.value.startsWith('/event/')\n ) {\n setValue({ type: 'showBanner', value: true });\n return;\n }\n\n if (data.value.targets && data.value.targets.includes('/homepage') && path.value === '/') {\n setValue({ type: 'showBanner', value: true });\n return;\n }\n\n if (\n data.value.targets &&\n data.value.targets.findIndex(\n (target: string) =>\n (target === '/' && path.value === target) ||\n (target !== '/' && path.value.startsWith(target)),\n ) === -1\n ) {\n setValue({ type: 'showBanner', value: false });\n show.value = false;\n\n return;\n }\n}\n</script>\n\n<style lang=\"scss\" module>\n.banner {\n background: v-bind('data.background_color');\n color: v-bind('data.text_color');\n position: relative;\n z-index: get-zindex(menu) - 1;\n\n a {\n color: v-bind('data.text_color');\n\n &:hover {\n color: v-bind('data.text_hover_color');\n }\n }\n\n aside {\n display: flex;\n }\n\n button {\n position: absolute;\n right: 0.5rem;\n top: 0.5rem;\n\n &:hover {\n cursor: pointer;\n\n svg {\n path {\n fill: v-bind('data.text_hover_color');\n }\n }\n }\n\n &:focus {\n @include focus-outline;\n\n & {\n outline-color: v-bind('data.text_hover_color');\n }\n }\n }\n\n .frame {\n @include container;\n\n & {\n padding: 2rem 1rem;\n position: relative;\n }\n }\n\n h2 {\n @include heading-4;\n\n & {\n color: v-bind('data.text_color');\n margin-top: 0;\n }\n }\n\n h2 + aside {\n margin: 1rem 0 0 0;\n }\n\n p {\n margin: 0;\n }\n\n svg {\n flex-shrink: 0;\n height: 1.25rem;\n margin: 0;\n vertical-align: sub;\n width: 1.25rem;\n\n path {\n fill: v-bind('data.text_color');\n }\n }\n\n svg + p {\n margin-left: 0.5rem;\n }\n}\n\n@media (min-width: $break-point) {\n .banner {\n button {\n right: 0.875rem;\n top: 1.5rem;\n }\n\n .frame {\n h2 {\n font-size: 1.75rem;\n }\n }\n }\n}\n</style>\n","<template>\n <router-link v-if=\"isInternal\" :ga4-event=\"ga4Data\" :to=\"getProperties\">\n <slot></slot>\n </router-link>\n <a v-else :ga4-event=\"ga4Data\" :href=\"props.to\" :target=\"getTarget\" rel=\"noopener\">\n <slot></slot>\n </a>\n</template>\n\n<script setup lang=\"ts\">\nimport { AppConfig } from '@/types/global.interface';\nimport { computed, inject, useAttrs } from 'vue';\nimport { isAbsoluteUrl } from '@/utils.js';\nimport { RouterLink } from 'vue-router';\n\nconst attrs = useAttrs();\n\nconst props = withDefaults(\n defineProps<{\n to?: Object;\n ga4Data?: string;\n }>(),\n { to: RouterLink.props.to }\n);\n\nconst appConfig = inject<AppConfig>('appConfig');\n\nconst getProperties = computed(() => {\n const properties = {\n hash: props.to.includes('#') ? `#${props.to.split('#')[1]}` : '',\n path: props.to.includes(appConfig.homeUrl) ? props.to.replace(appConfig.homeUrl, '/') : props.to,\n };\n\n if (props.to.includes('?q=')) {\n properties.query = { q: `${props.to.split('?q=')[1]}` };\n }\n\n return properties;\n});\n\nconst getTarget = computed(() =>\n isAbsoluteUrl(props.to) && !props.to.includes(appConfig.homeUrl) ? attrs.behavior : undefined\n);\n\nconst isInternal = computed(\n () =>\n !isAbsoluteUrl(props.to) || (isAbsoluteUrl(props.to) && props.to.includes(appConfig.homeUrl))\n);\n</script>\n","<template>\n <footer id=\"gugg-footer\" aria-label=\"Footer\" :class=\"$style.footer\" role=\"contentinfo\">\n <div v-for=\"(row, idx) in footerNav.rows\" :key=\"idx\" :class=\"$style.row\">\n <div :class=\"get_row_class(row)\">\n <div\n v-for=\"(block, indx) in row.blocks\"\n :key=\"indx\"\n :class=\"[get_block_class(block), $style.block]\"\n >\n <h3 v-if=\"block.heading\">{{ block.heading }}</h3>\n <span v-if=\"block.type === 'text' && block.text\" v-html=\"block.text\"></span>\n <PreparedAnchor\n v-if=\"block.type === 'text' && block.more.more_link && block.more.more_link_text\"\n class=\"more-link\"\n :ga4-data='`{\"click_type\": \"navigation\",\"component\": \"FooterNav\",\"gtm_tag\": \"navigation\",\"link_text\": \"${block.more.more_link_text}\",\"link_url\": \"${block.more.more_link}\"}`'\n :to=\"block.more.more_link\"\n :behavior=\"block.more.more_link_behavior\"\n >\n {{ block.more.more_link_text }}\n </PreparedAnchor>\n <ul\n v-if=\"\n (block.type === 'link_list' || block.type === 'legalese' || block.type === 'social') &&\n block.links && block.links.length\n \"\n >\n <li v-for=\"(link, index) in block.links\" :key=\"index\">\n <PreparedAnchor\n :ga4-data='`{\"click_type\": \"navigation\",\"component\": \"FooterNav\",\"gtm_tag\": \"navigation\",\"link_text\": \"${link.link_text}\",\"link_url\": \"${link.link}\"}`'\n :to=\"link.link\"\n :behavior=\"link.link_behavior\"\n >\n {{ link.link_text }}\n </PreparedAnchor>\n </li>\n </ul>\n <p v-if=\"block.type === 'legalese'\">\n © {{ appConfig.today.year }} The Solomon R. Guggenheim Foundation\n </p>\n <div\n v-if=\"block.type === 'constellation' || block.type === 'logo'\"\n :class=\"{ [$style.logoGrid]: block.heading?.includes('Partners') }\"\n >\n <picture\n v-for=\"(logo, key) in block.logos\"\n :class=\"{\n [get_grid_class(block.logos.length)]: !block.heading?.includes('Partners'),\n }\"\n :key=\"key\"\n >\n <PreparedAnchor v-if=\"logo.link\" :to=\"logo.link\" :behavior=\"logo.link_behavior\">\n <img\n :alt=\"logo.alt\"\n :src=\"logo.src\"\n :class=\"[{ [$style.unesco]: block.heading?.includes('Unesco') }]\"\n loading=\"lazy\"\n />\n </PreparedAnchor>\n <img\n v-if=\"!logo.link\"\n :alt=\"logo.alt\"\n :src=\"logo.src\"\n :class=\"[{ [$style.unesco]: block.heading?.includes('Unesco') }]\"\n loading=\"lazy\"\n />\n </picture>\n </div>\n <div v-if=\"block.type === 'partners'\">\n <img\n :alt=\"isMobile() ? block.partners.mobile_logo.alt : block.partners.desktop_logo.alt\"\n :src=\"isMobile() ? block.partners.mobile_logo.src : block.partners.desktop_logo.src\"\n loading=\"lazy\"\n />\n </div>\n </div>\n </div>\n </div>\n </footer>\n</template>\n\n<script setup lang=\"ts\">\nimport { AppConfig } from '@/types/global.interface';\nimport { inject, useCssModule } from 'vue';\nimport PreparedAnchor from '@/components/common/PreparedAnchor.vue';\nimport { useScreenSize } from '@/composables/Common.js';\n\ninterface Block {\n heading?: string;\n links?: Array<{\n link: string;\n link_behavior: string;\n link_text: string;\n }>;\n logo?: {\n alt: string;\n src: string;\n };\n more?: {\n more_link: string;\n more_link_behavior: string;\n more_link_text: string;\n };\n text?: string;\n type: string;\n}\n\ninterface Blocks {\n blocks: Array<Block>;\n}\n\ninterface FooterNav {\n rows: Array<Blocks>;\n}\n\nconst appConfig = inject<AppConfig>('appConfig');\nconst footerNav = inject<FooterNav>('footerNav');\n\nconst { isMobile } = useScreenSize();\nconst style = useCssModule();\n\nfunction get_block_class(block: Block): string {\n return style[block.type];\n}\n\nfunction get_grid_class(count): string {\n if (isMobile()) {\n return 'span-twelve';\n }\n const cols = 12 / count;\n switch (cols) {\n case 12:\n return 'span-twelve';\n case 6:\n return 'span-six';\n case 4:\n return 'span-four';\n case 3:\n return 'span-three';\n }\n}\n\nfunction get_row_class(row: Blocks): string {\n if ('constellation' === row['blocks'][0]['type'] || 'logo' === row['blocks'][0]['type']) {\n return `container ${style.logos}`;\n }\n\n return 'container grid';\n}\n</script>\n\n<style lang=\"scss\" module>\n.block {\n border-bottom: 1px solid $pale-gray;\n grid-column: span 12;\n padding: 1rem;\n}\n\n.constellation {\n a {\n display: block;\n }\n\n div {\n display: grid;\n grid-template-columns: auto;\n row-gap: 1.25rem;\n }\n\n img {\n height: px-to-rem(34.4);\n }\n}\n\n.footer {\n @include body-2;\n\n & {\n background: $black;\n color: $white-smoke;\n margin-top: 4rem;\n padding: 2.5rem 0 6rem;\n }\n\n a {\n color: $white-smoke;\n text-decoration: none;\n\n &:active {\n color: $light-gray;\n }\n\n &:focus {\n background-color: $white-smoke;\n color: $black;\n\n img {\n filter: invert(1);\n outline: 5px solid #000; // #000 as it's opposite of #fff\n }\n\n &:active {\n background-color: $white;\n color: $light-gray;\n }\n\n &:hover {\n background-color: $silver;\n color: $medium-gray;\n }\n }\n\n &:hover {\n color: $silver;\n text-decoration: underline;\n }\n }\n\n :global(.button-secondary) {\n background-color: $black;\n border-color: $white-smoke;\n color: $white-smoke;\n\n svg {\n fill: $white-smoke;\n }\n\n &:hover {\n background-color: $white-hover;\n border-color: $white-hover;\n color: $black;\n text-decoration: underline;\n\n svg {\n fill: $black;\n }\n }\n\n &:active {\n background-color: $white-pressed;\n border-color: $white-pressed;\n color: $black;\n\n svg {\n fill: $black;\n }\n }\n\n &:focus {\n background-color: $black;\n color: $white;\n outline-color: $white;\n }\n }\n\n h3 {\n @include body-2;\n\n & {\n color: $white-smoke;\n font-weight: $bold;\n margin-top: 0;\n }\n }\n\n li {\n list-style: none;\n margin-top: 0.75rem;\n }\n\n :global(.more-link) {\n @include body-2;\n\n & {\n color: $white-smoke;\n font-weight: $bold;\n padding-bottom: 0;\n padding-top: 0;\n text-transform: none;\n }\n\n &:focus {\n color: $black;\n\n &:after {\n color: $black;\n }\n }\n\n &:hover {\n svg {\n fill: $black;\n }\n }\n\n &:active {\n svg {\n fill: $black;\n }\n }\n }\n\n p {\n @include body-2;\n }\n\n .partners {\n img {\n margin: 2rem 0;\n max-height: px-to-rem(325);\n }\n }\n\n ul {\n @include body-2;\n\n & {\n margin-left: 0;\n padding-left: 0;\n }\n }\n}\n\n.logo {\n > div {\n margin-top: 2rem;\n }\n\n img {\n height: px-to-rem(82);\n }\n\n svg {\n margin-top: 2rem;\n height: px-to-rem(82);\n }\n}\n\n.logoGrid {\n column-gap: 2rem;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n justify-items: center;\n margin-bottom: 3rem;\n row-gap: 2rem;\n\n img {\n height: 2.5rem;\n\n &.unesco {\n height: px-to-rem(82);\n max-width: initial;\n }\n }\n}\n\n.logos {\n > div {\n margin-top: 0;\n }\n}\n\n.row {\n &:last-of-type {\n .block {\n &:last-of-type {\n border-bottom: none;\n padding-bottom: 0;\n }\n }\n }\n}\n\n.text {\n p {\n margin-top: 0.75rem;\n }\n\n a {\n &:hover {\n text-decoration: underline;\n }\n }\n\n p {\n :global(.button-secondary) {\n margin-top: 1.5rem;\n }\n }\n}\n\n@media (min-width: $break-point) {\n .block {\n border-bottom: none;\n margin: 0;\n padding: 0;\n }\n\n .constellation {\n div {\n display: flex;\n justify-content: space-between;\n }\n }\n\n .footer {\n margin-top: 6rem;\n padding: 1.625rem 0 6rem;\n\n li,\n :global(.more-link) {\n margin-top: 0.5rem;\n }\n\n .partners {\n img {\n margin: px-to-rem(12) 0;\n max-height: px-to-rem(87);\n }\n }\n }\n\n .legalese {\n display: flex;\n\n ul {\n display: flex;\n gap: 2rem;\n margin-top: 0;\n\n li {\n margin-top: 0;\n }\n }\n\n p {\n margin-left: auto;\n margin-top: 0;\n }\n }\n\n .link_list {\n grid-column: span 3;\n margin-top: 0;\n }\n\n .logoGrid {\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n }\n\n .more {\n white-space: pre-wrap;\n }\n\n .row {\n border-bottom: 1px solid $pale-gray;\n margin-bottom: px-to-rem(28);\n padding-bottom: px-to-rem(28);\n\n &:last-of-type {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n }\n\n :global(.container) {\n padding: 0 2rem;\n }\n }\n\n .social {\n grid-column: span 4;\n margin-top: 0;\n\n ul {\n display: block;\n }\n }\n\n .text {\n grid-column: span 4;\n margin-top: 0;\n\n p {\n margin-top: 0.5rem;\n }\n }\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 50 50\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createStaticVNode(\"<path stroke=\\\"#ECECEC\\\" stroke-linecap=\\\"round\\\" stroke-width=\\\"3\\\" d=\\\"M43.715 24a19.499 19.499 0 1 1-39 0\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"3s\\\" from=\\\"0 24 24\\\" repeatCount=\\\"indefinite\\\" to=\\\"360 24 24\\\" type=\\\"rotate\\\"></animateTransform></path><path stroke=\\\"#111\\\" stroke-linecap=\\\"round\\\" stroke-width=\\\"3\\\" d=\\\"M11.715 24a12.501 12.501 0 0 1 25 0\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"3s\\\" from=\\\"0 24 24\\\" repeatCount=\\\"indefinite\\\" to=\\\"-360 24 24\\\" type=\\\"rotate\\\"></animateTransform></path><path stroke=\\\"#ECECEC\\\" stroke-linecap=\\\"round\\\" stroke-width=\\\"3\\\" d=\\\"M19.715 24a4.5 4.5 0 0 0 9 0\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"3s\\\" from=\\\"0 24 24\\\" repeatCount=\\\"indefinite\\\" to=\\\"360 24 24\\\" type=\\\"rotate\\\"></animateTransform></path>\", 3)\n ])))\n}\nexport default { render: render }","export const eventListQuery = `\n query($first: Int, $today: String, $tomorrow: String) {\n eventOccurrences(first: $first, where: { dateEnd: $tomorrow, dateStart: $today }) {\n nodes {\n start {\n day\n meridiem\n month\n time\n timezone\n year\n }\n eventSlug\n title\n }\n }\n }\n`;\n","<template>\n <div v-if=\"events\">\n <h2 class=\"heading-4\" v-html=\"title\"></h2>\n <ul v-if=\"events.length\" :class=\"$style.list\">\n <li v-for=\"(event, key) in events\" :key=\"key\" class=\"space-22-27-above\">\n <router-link\n :class=\"$style.title\"\n :to=\"{\n name: 'CalendarEvent',\n params: {\n slug: event.eventSlug,\n },\n }\"\n @click=\"\n $emit('close');\n checkIsSamePath(event.eventSlug, emit);\n \"\n @keydown.enter=\"\n $emit('close');\n checkIsSamePath(event.eventSlug, emit, $event);\n \"\n >\n {{ event.title }}\n </router-link>\n <time :class=\"$style.label\" v-html=\"format(event.start)\"></time>\n </li>\n <li>\n <router-link\n :to=\"{\n name: 'CalendarSection',\n }\"\n :class=\"[$style.link, 'more-link']\"\n @click=\"\n $emit('close');\n checkIsSamePath('/calendar', emit);\n \"\n @keydown.enter=\"\n $emit('close');\n checkIsSamePath('/calendar', emit, $event);\n \"\n >\n {{ link }}\n </router-link>\n </li>\n </ul>\n <div v-if=\"!events.length\">\n <p class=\"body-2\">There are no upcoming events.</p>\n <p>\n <router-link\n :to=\"{\n name: 'CalendarSection',\n }\"\n class=\"more-link\"\n @click=\"checkIsSamePath('/calendar', emit)\"\n @keydown.enter=\"checkIsSamePath('/calendar', emit, $event)\"\n >\n {{ link }}\n </router-link>\n </p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { AppConfig, MainMenu } from '@/types/global.interface';\nimport { computed, inject, ref } from 'vue';\nimport { eventListQuery } from '@/queries/EventListQuery';\nimport gql from 'graphql-tag';\nimport { storeToRefs } from 'pinia';\nimport { useHandleError, useNavigation } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore.js';\nimport { useQuery } from 'villus';\n\ninterface EventDate {\n day: string;\n meridiem: string;\n month: string;\n time: string;\n timezone: string;\n}\n\nconst emit = defineEmits({ close: null, isSamePath: false });\nconst props = withDefaults(\n defineProps<{\n limit: string;\n link: string;\n showDates?: boolean;\n title?: string;\n }>(),\n {\n limit: '3',\n link: 'Browse all events',\n showDates: false,\n title: 'Upcoming Events',\n },\n);\n\nconst appConfig = inject<AppConfig>('appConfig');\nconst mainMenu = inject<MainMenu>('mainMenu');\n\nconst { checkIsSamePath } = useNavigation();\nconst { handleError } = useHandleError();\nconst store = useMainStore();\nconst { useBootstrap } = storeToRefs(store);\n\nconst events = ref([]);\nconst shouldSkip = ref(true);\n\nconst today = computed(() => appConfig.today.isoDate);\n\nconst { data, error } = useQuery({\n onData: (data) => {\n if (data && Object.keys(data).length) {\n events.value = data.eventOccurrences.nodes;\n }\n\n if (!data) {\n handleError('EventList', error);\n }\n },\n query: gql`\n ${eventListQuery}\n `,\n skip: shouldSkip,\n variables: {\n first: +props.limit,\n today: today,\n },\n});\n\nif (useBootstrap.value) {\n shouldSkip.value = true;\n events.value = mainMenu.events;\n}\n\nif (!useBootstrap.value) {\n shouldSkip.value = false;\n}\n\nfunction format(date: EventDate): string {\n return `${date.month} ${date.day}, ${date.time} ${date.meridiem} ${date.timezone}`;\n}\n</script>\n\n<style lang=\"scss\" module>\n.heading {\n @include heading-5;\n\n & {\n margin-top: 0;\n }\n}\n\n.label {\n @include body-2;\n @include space-0-above;\n\n & {\n color: $black;\n display: block;\n text-transform: none;\n }\n}\n\n.link {\n &:global(.more-link) {\n @include space-22-27-above;\n }\n}\n\n.list {\n margin: 0;\n padding: 0;\n\n li {\n list-style: none;\n }\n}\n\n.title {\n @include heading-5;\n\n & {\n display: inline-block;\n margin-top: 0;\n text-decoration: none;\n }\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n@media (min-width: $break-point) {\n .label {\n text-align: left;\n }\n .title {\n margin-top: 0;\n }\n}\n</style>\n","export const exhibitionsOnViewQuery = `\n query getExhibitionsOnView($first: Int) {\n exhibitions(first: $first, where: { order: \"ASC\", orderKey: \"end_date\", site: \"solomon-r-guggenheim-museum\", state: \"on view\" }) {\n nodes {\n dates {\n end {\n day\n month\n year\n }\n label\n start {\n day\n month\n year\n }\n }\n slug\n title\n }\n }\n }\n`;\n","<template>\n <section v-if=\"exhibitions && exhibitions.length\">\n <h2 class=\"heading-4\" v-html=\"title\"></h2>\n <ul v-if=\"exhibitions.length\" :class=\"$style.list\">\n <li v-for=\"(exhibition, key) in exhibitions\" :key=\"key\" class=\"space-22-27-above\">\n <router-link\n :to=\"{\n name: 'ExhibitionsPost',\n params: { slug: exhibition.slug },\n }\"\n :ga4-event=\"\n JSON.stringify({\n click_type: 'title',\n component: 'ExhibitionsOnView',\n content_group: 'exhibition',\n gtm_tag: 'link',\n link_text: `${exhibition.title}`,\n link_url: `${exhibition.slug}`,\n })\n \"\n @click=\"\n $emit('close');\n checkIsSamePath(exhibition.slug, emit);\n \"\n @keydown.enter=\"\n $emit('close');\n checkIsSamePath(exhibition.slug, emit, $event);\n \"\n >\n {{ exhibition.title }}\n </router-link>\n <span :class=\"$style.label\" v-html=\"format(exhibition.dates)\"></span>\n </li>\n </ul>\n <router-link\n :class=\"[$style.link, 'more-link']\"\n :to=\"{ name: 'ExhibitionsPage' }\"\n :ga4-event=\"\n JSON.stringify({\n click_type: 'link',\n component: 'ExhibitionsOnView',\n content_group: 'exhibition',\n gtm_tag: 'link',\n link_text: `${link}`,\n link_url: '/exhibitions',\n })\n \"\n @click=\"\n $emit('close');\n checkIsSamePath('/exhibitions', emit);\n \"\n @keydown.enter=\"\n $emit('close');\n checkIsSamePath('/exhibitions', emit, $event);\n \"\n >\n {{ link }}\n </router-link>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { Exhibition, ExhibitionDates } from '@/types/exhibition.interface';\nimport { exhibitionsOnViewQuery } from '@/queries/ExhibitionsOnViewQuery';\nimport gql from 'graphql-tag';\nimport { inject, ref } from 'vue';\nimport { MainMenu } from '@/types/global.interface';\nimport { storeToRefs } from 'pinia';\nimport { useHandleError, useNavigation } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore.js';\nimport { useQuery } from 'villus';\n\ninterface DateObject {\n day: string;\n month: string;\n year: string;\n}\n\ninterface ExhibitionDates {\n label: string;\n end: DateObject;\n start: DateObject;\n}\n\nconst emit = defineEmits({ close: null, isSamePath: false });\nconst props = withDefaults(\n defineProps<{\n limit?: string;\n link?: string;\n title?: string;\n }>(),\n {\n limit: '3',\n link: 'Browse all exhibitions',\n title: 'Exhibitions on View',\n }\n);\n\nconst mainMenu = inject<MainMenu>('mainMenu');\n\nconst { checkIsSamePath } = useNavigation();\n\nconst store = useMainStore();\nconst { handleError } = useHandleError();\n\nconst { useBootstrap } = storeToRefs(store);\n\nconst exhibitions = ref<Array<Exhibition>>([]);\nconst shouldSkip = ref(true);\n\nif (useBootstrap.value) {\n shouldSkip.value = true;\n exhibitions.value = mainMenu.exhibitions;\n}\n\nif (!useBootstrap.value) {\n shouldSkip.value = false;\n}\n\nconst { data, error } = useQuery({\n onData: data => {\n if (data && Object.keys(data).length) {\n exhibitions.value = data.exhibitions.nodes;\n }\n\n if (!data || Object.keys(data).length === 0) {\n handleError('ExhibitionsOnView', error, false);\n }\n },\n query: gql`${exhibitionsOnViewQuery}`,\n skip: shouldSkip,\n variables: { first: +props.limit },\n});\n\nfunction format(dates: ExhibitionDates): string {\n if (dates.label) {\n return dates.label;\n }\n\n return `Through ${dates.end.month} ${dates.end.day}, ${dates.end.year}`;\n}\n</script>\n\n<style lang=\"scss\">\n@use '@/styles/links.module.scss' as *;\n</style>\n\n<style lang=\"scss\" module>\n.label {\n @include body-2;\n @include space-0-above;\n\n & {\n color: $black;\n display: block;\n }\n}\n.link {\n &:global(.more-link) {\n @include space-22-27-above;\n }\n}\n.list {\n margin: 2rem 0 0;\n padding: 0;\n\n li {\n list-style: none;\n }\n}\n\n@media (min-width: $break-point) {\n .list {\n column-gap: $column-gutter-large;\n display: grid;\n grid-template-columns: repeat(v-bind('exhibitions.length'), 1fr);\n }\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 1000 238.55\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n d: \"M0 48.64C0 21.07 20.82 0 48 0c18.36 0 35.7 10.91 42.08 26.49H68.7c-3.91-4.92-12.05-8.96-20.63-8.96-16.46 0-27.88 12.43-27.88 31.1s11.48 30.78 28.2 30.78c15.2 0 25.67-8.89 27.19-23.34H42.15V39.98h51.6v10.41c0 28.77-18.36 46.62-46.24 46.62S0 76.83 0 48.64Zm217.05 0c0-27.57 20.82-48.64 48-48.64 18.36 0 35.7 10.91 42.08 26.49h-21.38c-3.91-4.92-12.05-8.96-20.63-8.96-16.46 0-27.88 12.43-27.88 31.1s11.48 30.78 28.2 30.78c15.2 0 25.67-8.89 27.19-23.34H259.2V39.98h51.6v10.41c0 28.77-18.36 46.62-46.24 46.62s-47.5-20.19-47.5-48.38Zm114.61 0c0-27.57 20.82-48.64 48-48.64 18.36 0 35.7 10.91 42.08 26.49h-21.38c-3.91-4.92-12.05-8.96-20.63-8.96-16.46 0-27.88 12.43-27.88 31.1s11.48 30.78 28.2 30.78c15.2 0 25.67-8.89 27.19-23.34h-33.43V39.98h51.6v10.41c0 28.77-18.36 46.62-46.24 46.62s-47.5-20.19-47.5-48.38ZM451.77 1.51h63.4v16.4h-43.53v22.08h40.18v16.09h-40.18V79.1h43.59v16.4h-63.46V1.51Zm91.47 0h17.41l40.5 59.17h.88V1.51h19.87V95.5h-17.22l-40.69-59.3h-.88v59.3h-19.87V1.51Zm214.67 0h63.4v16.4h-43.53v22.08h40.18v16.09h-40.18V79.1h43.59v16.4h-63.46V1.51Zm91.47 0h19.87V95.5h-19.87V1.51Zm47.8 0h24.98l25.86 64.91h.95l25.92-64.91H1000V95.5h-19.43V34.19h-.95L955.21 95.5h-13.5l-24.29-61.31h-.95V95.5h-19.3V1.51ZM117.25 61.69V1.51h19.81v58.54c0 11.99 7.25 19.49 19.11 19.49s19.11-7.51 19.11-19.49V1.51h19.81v60.18c0 21.57-15.08 35.33-38.92 35.33s-38.92-13.75-38.92-35.33ZM649.73 1.51h19.87V40.3h40.31V1.51h19.81V95.5h-19.81V56.64H669.6V95.5h-19.87V1.51ZM11.46 143.04h10.92l51.23 74.18h.88v-74.18h11.3v93.99H74.62l-50.98-73.81h-.88v73.81h-11.3v-93.99Zm107.53 0h56.5v10.09h-45.2v31.41h42.19v10.09h-42.19v32.3h45.83v10.09h-57.13v-93.99Zm78.59 0h11.43l19.59 76.58h.94l19.96-76.58h12.74l20.03 76.58h.88l19.59-76.58h11.36l-25.43 93.99H276.8l-20.47-78.66h-.88l-20.53 78.66h-11.86l-25.49-93.99ZM381.3 198.3l-33.77-55.26h12.93l26.12 44.03h.88l25.99-44.03h13.06l-33.9 55.26v38.73h-11.3V198.3Zm175.88-55.26h31.14c19.78 0 32.52 11.36 32.52 28.64 0 12.55-6.72 21.95-17.89 26.18l21.28 39.17h-13.18l-19.65-36.78c-1 .06-1.95.06-2.95.06h-19.96v36.71h-11.3v-93.99Zm30.89 47.06c13.37 0 21.35-7.07 21.35-18.42s-8.04-18.55-21.47-18.55h-19.46v36.97h19.59Zm67.15-47.06h11.3v40.18h.88l41.88-40.18h15.19l-46.59 44.28 47.28 49.71h-14.88l-42.88-45.54-.88.06v45.48h-11.3v-93.99ZM436.05 190.1c0-27.88 20.32-48.57 47.65-48.57s47.59 20.69 47.59 48.57-20.2 48.45-47.59 48.45-47.65-20.63-47.65-48.45Zm47.65 37.85c20.64 0 35.97-16.09 35.97-37.85s-15.34-37.97-35.97-37.97-36.03 16.15-36.03 37.97 15.34 37.85 36.03 37.85Z\",\n style: {\"stroke-width\":\"0\"}\n }, null, -1)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 16 16\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", { d: \"M6.333 2a4.333 4.333 0 0 1 3.294 7.153l.18.18h.526l3.334 3.334-1 1-3.334-3.334v-.526l-.18-.18A4.333 4.333 0 1 1 6.333 2Zm0 1.333c-1.666 0-3 1.334-3 3 0 1.667 1.334 3 3 3 1.667 0 3-1.333 3-3 0-1.666-1.333-3-3-3Z\" }, null, -1)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"#111\",\n d: \"M2 4h12v1.333H2V4Zm0 3.333h12v1.334H2V7.333Zm0 3.334h12V12H2v-1.333Z\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20id='Artwork'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201000%201000'%3e%3cdefs%3e%3cstyle%3e.cls-1{fill:%23C1CAD7;stroke-width:0px;}%3c/style%3e%3c/defs%3e%3cpath%20class='cls-1'%20d='m500,466.29h191.82c1.92,10.96,2.98,22.21,2.98,33.71,0,107.42-87.39,194.8-194.8,194.81v-228.52Zm498.87,0h-264.37c1.58,11.02,2.44,22.26,2.44,33.71,0,130.66-106.3,236.95-236.95,236.95s-236.95-106.3-236.95-236.95,106.3-236.95,236.95-236.95c23.43,0,46.06,3.45,67.44,9.82V4.52C545.81,1.61,523.77.06,501.37,0,225.23-.75.76,222.49,0,498.63c-.76,276.14,222.49,500.61,498.63,501.37,276.14.76,500.61-222.48,501.37-498.63.03-11.79-.35-23.49-1.12-35.08Z'/%3e%3c/svg%3e\"","<template>\n <div :class=\"$style.container\">\n <div id=\"logo-branded-g\" :class=\"$style.wrapper\">\n <svg :class=\"$style.mask\">\n <defs>\n <mask id=\"logo-mask\">\n <image :href=\"logoSrc\" />\n </mask>\n </defs>\n </svg>\n <div :class=\"$style.render\">\n <canvas\n ref=\"renderedCanvas\"\n :width=\"isMobile.value ? 33 : 50\"\n :height=\"isMobile.value ? 33 : 50\"\n ></canvas>\n </div>\n <div :class=\"$style.background\">\n <img :src=\"logoSrc\" alt=\"Logo\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport html2canvas from 'html2canvas';\nimport logoSrc from '@/assets/svgs/media/Guggenheim_Symbol_Gray_RGB.svg?url';\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useMainStore } from '@/stores/mainStore';\nimport { useRoute } from 'vue-router';\nimport { useHandleError, useScreenSize } from '@/composables/Common.js';\n\nconst { handleError } = useHandleError();\nconst { isMobile } = useScreenSize();\nconst route = useRoute();\nconst store = useMainStore();\n\nconst { pushItem } = store;\nconst { dataLoaded, logoCanvases } = storeToRefs(store);\n\nconst captureElement = ref<HTMLElement | null>(null);\nconst renderedCanvas = ref(null);\n\nlet capturedCanvas = null;\n\nwatch(dataLoaded, (loaded) => {\n if (loaded) {\n nextTick().then(() => captureDOMIntoCanvas());\n }\n});\n\nonMounted(() => {\n captureElement.value = document.getElementById('main');\n window.addEventListener('scroll', handleScroll);\n});\n\nonBeforeUnmount(() => {\n window.removeEventListener('scroll', handleScroll);\n});\n\nasync function captureDOMIntoCanvas(): void {\n nextTick(() => {\n html2canvas(captureElement.value, { scale: 1 })\n .then((canvas) => {\n const match = logoCanvases.value.find((element) => element.url === route.path);\n\n capturedCanvas = match ? match.canvas : canvas;\n\n if (!match && canvas.height !== 0 && canvas.width !== 0) {\n pushItem({ type: 'logoCanvases', value: { url: route.path, canvas } });\n }\n\n drawCapturedCanvas();\n })\n .catch((error) => {\n handleError('NavLogo', `Error capturing content: ${error}`, false);\n });\n });\n}\n\nfunction drawCapturedCanvas(): void {\n if (!capturedCanvas || !renderedCanvas.value) {\n return;\n }\n\n const ctx = renderedCanvas.value.getContext('2d', { willReadFrequently: true });\n const header = document.getElementById('main-nav');\n const headerBottom = header.clientHeight;\n const logoIcon = document.getElementById('logo-branded-g');\n const logoOffset = logoIcon.getBoundingClientRect().top;\n const logoHeight = logoIcon.clientHeight;\n const logoBottom = logoOffset + logoHeight;\n const scrollOffset = window.scrollY;\n\n // Calculate where to start capturing from #main\n const captureOffsetY = Math.max(0, scrollOffset - headerBottom);\n\n // Calculate blank area to simulate the space between header and content\n const scrolledContentUnderLogoHeight = Math.max(0, scrollOffset - (headerBottom - logoBottom));\n const blankSpaceHeight = Math.max(0, logoHeight - scrolledContentUnderLogoHeight);\n\n // Clear canvas before each draw\n ctx.clearRect(0, 0, renderedCanvas.value.width, renderedCanvas.value.height);\n\n // Draw the portion of #main that should appear as scrolling under the header\n ctx.drawImage(\n capturedCanvas,\n 0, // Start x position of the portion to capture\n captureOffsetY, // Start y position of the portion to capture\n 250, // Width of the portion to capture (stretch)\n logoIcon.clientHeight - blankSpaceHeight, // Height of the portion to capture\n 0, // x position in canvas to draw\n blankSpaceHeight, // y position in canvas to draw, after blank space\n renderedCanvas.value.width, // width (stretch)\n renderedCanvas.value.height - blankSpaceHeight, // height\n );\n}\n\nfunction handleScroll(): void {\n drawCapturedCanvas();\n}\n</script>\n\n<style lang=\"scss\" module>\n.container {\n align-items: flex-start;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n left: 0;\n position: relative;\n top: 0;\n right: 0;\n\n .wrapper {\n position: absolute;\n height: px-to-rem(33);\n width: px-to-rem(33);\n\n .mask {\n height: 100%;\n position: absolute;\n width: 100%;\n\n image {\n height: px-to-rem(33);\n width: px-to-rem(33);\n }\n }\n\n .render {\n height: 100%;\n mask: url(#logo-mask);\n overflow: hidden;\n position: absolute;\n width: 100%;\n z-index: 1000;\n -webkit-mask: url(#logo-mask);\n\n canvas {\n filter: blur(10px) saturate(2.6);\n height: px-to-rem(33);\n transform: scale(3);\n width: px-to-rem(33);\n -webkit-filter: blur(10px) saturate(2.6);\n }\n }\n\n .background {\n height: 100%;\n position: absolute;\n width: 100%;\n z-index: 999;\n\n img {\n display: block;\n position: relative;\n }\n }\n }\n}\n\n@media (min-width: $break-point) {\n .container {\n .wrapper {\n width: px-to-rem(50);\n height: px-to-rem(50);\n\n .mask {\n image {\n width: px-to-rem(50);\n height: px-to-rem(50);\n }\n }\n\n .render {\n canvas {\n width: px-to-rem(50);\n height: px-to-rem(50);\n }\n }\n }\n }\n}\n</style>\n","<template>\n <form\n action=\"\"\n :class=\"[$style.search, { [$style.archives]: type === 'archives' }]\"\n role=\"search\"\n @click.stop\n @keypress.enter.prevent=\"$emit('search-state', false)\"\n >\n <div>\n <label v-if=\"props.showLabel\" for=\"searchInput\" class=\"heading-4\">Search</label>\n <p v-if=\"props.preHint\" class=\"body-2\">{{ props.preHint }}</p>\n <input\n id=\"searchInput\"\n v-model=\"searchQuery\"\n :class=\"$style.searchInput\"\n enterkeyhint=\"search\"\n :ga4-event=\"\n JSON.stringify({\n click_type: 'search',\n component: 'SearchModal',\n content_group: 'search',\n gtm_tag: 'interaction',\n link_text: '(submit)',\n })\n \"\n type=\"search\"\n @keypress.enter.prevent=\"startSearch()\"\n />\n <input v-if=\"props.type\" name=\"post_type\" :value=\"props.type\" type=\"hidden\" />\n </div>\n <button\n :aria-label=\"searchQuery ? `Search for ${searchQuery}` : null\"\n class=\"button-primary\"\n type=\"submit\"\n @click.prevent=\"startSearch()\"\n @keypress.enter.prevent=\"startSearch()\"\n >\n <IconMagnify></IconMagnify>\n </button>\n <p v-if=\"props.postHint\" class=\"body-2\">{{ props.postHint }}</p>\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { AppConfig } from '@/types/global.interface';\nimport IconMagnify from '@/assets/svgs/IconMagnify.svg?component';\nimport { inject, onMounted, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { useScreenSize } from '@/composables/Common.js';\n\nconst appConfig = inject<AppConfig>('appConfig');\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst { isMobile } = useScreenSize();\n\nconst searchQuery = ref('');\n\nconst emit = defineEmits({\n mounted: false,\n 'search-state': null,\n});\n\nconst props = withDefaults(\n defineProps<{\n placeholder?: string;\n postHint?: string;\n preHint?: string;\n showLabel?: boolean;\n type?: string;\n }>(),\n {\n placeholder: 'Search Guggenheim.org',\n postHint: '',\n preHint: '',\n showLabel: true,\n type: '',\n },\n);\n\nonMounted(() => {\n emit('mounted', true);\n searchQuery.value = route.query.s || null;\n});\n\nfunction startSearch(): void {\n if (isMobile()) {\n window.location.href = `${appConfig.homeUrl}search?s=${searchQuery.value}&page=1${props.type ? `&post_type=${props.type}` : ''}`;\n }\n\n if (!isMobile()) {\n props.type\n ? router.push({\n name: 'Search',\n query: { s: searchQuery.value, page: 1, post_type: props.type },\n })\n : router.push({ name: 'Search', query: { s: searchQuery.value, page: 1 } });\n }\n\n emit('search-state', false);\n}\n</script>\n\n<style lang=\"scss\" module>\n.search {\n align-items: flex-end;\n display: flex;\n flex-wrap: wrap;\n margin-top: 1rem;\n max-width: 870px;\n width: 100%;\n\n button[type='submit'] {\n height: 52px;\n margin: 0;\n padding-bottom: 0;\n padding: 0;\n\n svg {\n height: 2rem;\n padding: 0 40px;\n }\n }\n\n > div {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n width: 100%;\n }\n\n input[type='search'] {\n flex: 1;\n margin-right: 1rem;\n width: inherit;\n\n &::-webkit-search-cancel-button {\n margin-left: 1rem;\n }\n }\n\n input {\n &::-webkit-search-cancel-button {\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 4.27325L11.7263 3.33325L7.99967 7.05992L4.27301 3.33325L3.33301 4.27325L7.05967 7.99992L3.33301 11.7266L4.27301 12.6666L7.99967 8.93992L11.7263 12.6666L12.6663 11.7266L8.93967 7.99992L12.6663 4.27325Z' fill='%23111111'/%3E%3C/svg%3E\");\n height: 1rem;\n position: relative;\n right: px-to-rem(10);\n width: 1rem;\n }\n }\n\n label {\n flex-basis: 100%;\n }\n\n p {\n flex-basis: 100%;\n margin-left: 0;\n margin-top: px-to-rem(6);\n }\n\n &.archives {\n flex-wrap: initial;\n\n p {\n @include space-8-10-above;\n }\n\n .search-input {\n @include space-8-10-above;\n }\n }\n}\n.search-input {\n @include body-1;\n\n & {\n -webkit-appearance: none;\n border: 2px solid $black;\n border-radius: 0;\n display: inline-block;\n grid-column: span 9;\n outline: none;\n padding: px-to-rem(10) 0 px-to-rem(10) 1rem;\n }\n}\n\n@media (min-width: $break-point) {\n .search {\n input[type='search'] {\n width: auto;\n }\n }\n}\n</style>\n","<template>\n <div\n ref=\"search\"\n :class=\"$style.background\"\n :aria-modal=\"active && 'true'\"\n :role=\"active && 'dialog'\"\n @click.prevent=\"$emit('search-state', !active)\"\n >\n <div :class=\"$style.frame\">\n <div :class=\"$style.wrapper\">\n <SearchForm @mounted=\"mounted\" @search-state=\"updateSearchState\"></SearchForm>\n </div>\n <button\n aria-label=\"Close\"\n :class=\"$style.close\"\n type=\"button\"\n :ga4-event=\"\n JSON.stringify({\n click_type: 'search',\n component: 'SearchModal',\n content_group: 'search',\n gtm_tag: 'interaction',\n link_text: '(close)',\n })\n \"\n @click.prevent=\"$emit('search-state', false)\"\n >\n <IconClose></IconClose>\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport IconClose from '@/assets/svgs/IconClose.svg?component';\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\nimport SearchForm from '@/components/search/SearchForm.vue';\nimport { useA11y } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore.js';\n\ndefineProps<{\n active: boolean;\n}>();\n\nconst store = useMainStore();\nconst { setValue } = store;\nconst { trapFocus } = useA11y();\n\nconst search = ref(null);\n\nconst emit = defineEmits({\n 'search-state': null,\n});\n\nonBeforeUnmount(() => {\n trapFocus();\n document.documentElement.classList.remove('noscroll');\n setValue({ type: 'isKeyboardUser', value: false });\n});\n\nonMounted(() => {\n document.documentElement.classList.add('noscroll');\n});\n\nfunction mounted(): void {\n trapFocus(search.value);\n}\n\nfunction updateSearchState(state: string): void {\n emit('search-state', state);\n}\n</script>\n\n<style lang=\"scss\" module>\n.background {\n background: $white;\n height: 100vh;\n left: 0;\n position: fixed;\n top: 0;\n width: 100vw;\n}\n\n.close {\n background: transparent;\n border: 0;\n cursor: pointer;\n height: 2.5rem;\n outline: none;\n padding: 0;\n position: absolute;\n right: 0;\n top: 2rem;\n width: 2.5rem;\n\n svg {\n fill: $black;\n }\n}\n\n.frame {\n margin: 0 auto;\n max-width: 870px;\n position: relative;\n width: 100%;\n}\n\n.wrapper {\n display: flex;\n align-items: center;\n height: 100vh;\n justify-content: center;\n padding: 1rem;\n}\n\n@media (min-width: $break-point) {\n .close {\n right: -1rem;\n }\n\n .wrapper {\n padding: 0;\n }\n}\n</style>\n","<template>\n <div :class=\"theClass\">\n <h2 v-if=\"data.heading && data.display_heading === '1'\" class=\"heading-4\">\n {{ data.heading }}\n </h2>\n <ul v-if=\"data.type === 'link_list' && data.links && data.links.length\">\n <li v-for=\"(link, index) in data.links\" :key=\"index\" class=\"space-22-27-above\">\n <PreparedAnchor\n class=\"child\"\n :to=\"link.link\"\n :behavior=\"link.link_behavior\"\n @click=\"\n sendEvent(link.link_text, link.link);\n checkIsSamePath(link.link, emit);\n \"\n @keydown.enter=\"\n sendEvent(link.link_text, link.link);\n checkIsSamePath(link.link, emit, $event);\n \"\n >\n {{ link.link_text }}\n </PreparedAnchor>\n </li>\n </ul>\n <div v-if=\"data.type === 'text' && data.text\" v-html=\"data.text\"></div>\n <PreparedAnchor\n v-if=\"data.more.more_link && data.more.more_link_text\"\n :class=\"[$style.link, 'more-link']\"\n :to=\"data.more.more_link\"\n :behavior=\"data.more.more_link_behavior\"\n @click=\"\n sendEvent(data.more.more_link_text, data.more.more_link);\n checkIsSamePath(data.more.more_link, emit);\n \"\n @keydown.enter=\"\n sendEvent(data.more.more_link_text, data.more.more_link);\n checkIsSamePath(data.more.more_link, emit, $event);\n \"\n >\n {{ data.more.more_link_text }}\n </PreparedAnchor>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport PreparedAnchor from '@/components/common/PreparedAnchor.vue';\nimport { useAnalytics, useNavigation } from '@/composables/Common.js';\n\nconst emit = defineEmits(['isSamePath']);\nconst props = defineProps<{\n data: {\n display_heading: string;\n heading: string;\n links: Array<{\n link: string;\n link_behavior: string;\n link_text: string;\n }>;\n more: {\n more_link: string;\n more_link_behavior: string;\n more_link_text: string;\n };\n text: string;\n type: string;\n };\n}>();\n\nconst { checkIsSamePath } = useNavigation();\nconst { ga4Event } = useAnalytics();\n\nconst theClass = computed(() => {\n return (props.data.heading && props.data.display_heading === '0') || !props.data.heading\n ? 'no-heading'\n : '';\n});\n\nfunction sendEvent(str: string, url: string): void {\n ga4Event({\n click_type: 'navigation',\n component: 'SubNav',\n gtm_tag: 'navigation',\n link_text: str,\n link_url: url,\n });\n}\n</script>\n\n<style lang=\"scss\" module>\n.link {\n &:global(.more-link) {\n @include space-22-27-above;\n }\n}\n</style>\n","<template>\n <div id=\"main-nav\" ref=\"frame\" :class=\"$style.frame\">\n <div v-if=\"menu.main.items\" :class=\"$style.nav\">\n <nav aria-label=\"Main Navigation\" :class=\"$style.main\">\n <PreparedAnchor\n aria-label=\"Guggenheim - Home\"\n :class=\"[$style.logo, logoState ? $style.logoNavActive : $style.logoIconActive]\"\n :to=\"'/'\"\n @click=\"unsetActiveItem()\"\n >\n <div :class=\"$style.logoWrapper\">\n <IconLogo\n :class=\"[$style.logoIcon, { [$style.logoVisible]: !showLogoIconG }]\"\n ></IconLogo>\n </div>\n <div :class=\"$style.logoWrapper\">\n <NavLogo\n :class=\"[$style.logoIconG, { [$style.logoVisible]: showLogoIconG }]\"\n ></NavLogo>\n </div>\n </PreparedAnchor>\n <ul\n id=\"main-menu\"\n ref=\"main\"\n :aria-hidden=\"isMobile() && !showMenu\"\n aria-labelledby=\"burger-icon\"\n :class=\"[{ [$style.active]: showMenu }, $style.top]\"\n >\n <li v-if=\"isMobile() && activeItem\">\n <button\n aria-label=\"Close Submenu\"\n :class=\"$style.back\"\n @click=\"\n activeItem = null;\n sendEvent('Close Small Submenu');\n \"\n ></button>\n </li>\n <li v-if=\"showMenu\">\n <button\n aria-controls=\"main-menu\"\n aria-expanded=\"true\"\n aria-label=\"Close Main Menu\"\n :class=\"$style.close\"\n @click=\"\n showMenu = !showMenu;\n unsetActiveItem();\n sendEvent('Close Small Menu');\n \"\n >\n <IconClose></IconClose>\n </button>\n </li>\n <li v-if=\"showMenu\"><div :class=\"$style.menu\">Menu</div></li>\n <li\n v-for=\"(item, index) in menu.main.items\"\n :key=\"index\"\n :class=\"[{ [$style.active]: activeItem === `main-${index}` }]\"\n >\n <button\n v-if=\"item.type === 'parent' && (!isMobile() || showMenu)\"\n :id=\"`${item.link_text.toLowerCase()}-menu`\"\n :aria-controls=\"`${item.link_text.toLowerCase()}-submenu`\"\n :aria-expanded=\"activeItem === `main-${index}` ? 'true' : 'false'\"\n :class=\"[{ [$style.active]: activeItem === `main-${index}` }, $style.parent]\"\n @click=\"\n changeActiveItem(`main-${index}`);\n sendEvent(\n `${activeItem === `main-${index}` ? 'Open' : 'Close'} ${item.link_text} Submenu`,\n );\n \"\n >\n {{ item.link_text }}\n </button>\n <PreparedAnchor\n v-if=\"item.type === 'link' && (!isMobile() || showMenu)\"\n :behavior=\"item.link_behavior\"\n :class=\"$style.parent\"\n :to=\"item.link\"\n @click=\"\n unsetActiveItem();\n sendEvent(item.link_text, item.link);\n \"\n >\n {{ item.link_text }}\n </PreparedAnchor>\n <div\n v-if=\"item.submenus\"\n v-show=\"activeItem === `main-${index}`\"\n :id=\"`${item.link_text.toLowerCase()}-submenu`\"\n :aria-hidden=\"activeItem != `main-${index}`\"\n :aria-labelledby=\"`${item.link_text.toLowerCase()}-menu`\"\n :class=\"[{ [$style.wide]: item.submenus.length > 4 }, $style.submenu]\"\n :inert=\"activeItem !== `main-${index}`\"\n >\n <component\n :is=\"getSubmenuType(submenu.type)\"\n v-for=\"(submenu, subIndex) in item.submenus\"\n :key=\"subIndex\"\n :class=\"[\n getSubmenuClass(item),\n 'mainnav',\n {\n [$style.exhibitions]:\n item.type === 'parent' &&\n item.link_text === 'Exhibitions' &&\n submenu.type === 'text',\n },\n ]\"\n :data=\"submenu.type === 'link_list' || submenu.type === 'text' ? submenu : null\"\n :layout=\"submenu.type === 'on_view' ? 'vertical' : null\"\n :limit=\"getLimit(submenu.type)\"\n :link=\"submenu.more.more_link_text || undefined\"\n :title=\"\n (submenu.type === 'event_list' || submenu.type === 'on_view') &&\n submenu.heading != ''\n ? submenu.heading\n : null\n \"\n @isSamePath=\"handleSamePath()\"\n ></component>\n </div>\n </li>\n </ul>\n </nav>\n <nav aria-label=\"Utility Navigation\" :class=\"$style.util\">\n <ul>\n <li v-for=\"(item, index) in menu.utility.items\" :key=\"index\">\n <PreparedAnchor\n v-if=\"item.template === 'link'\"\n :to=\"item.link\"\n :behavior=\"item.link_behavior\"\n @click=\"unsetActiveItem()\"\n >\n {{ item.link_text }}\n </PreparedAnchor>\n <button\n v-if=\"item.template === 'search'\"\n id=\"search-menu\"\n aria-controls=\"search-submenu\"\n :aria-expanded=\"activeItem === 'search' ? 'true' : 'false'\"\n :aria-label=\"activeItem != 'search' ? 'Open Search Submenu' : 'Close Search Submenu'\"\n :class=\"$style.search\"\n @click=\"\n unsetActiveItem();\n searchActive = !searchActive;\n sendEvent(`${activeItem != 'search' ? 'Open' : 'Close'} Search`);\n \"\n >\n Search\n <IconMagnify></IconMagnify>\n </button>\n </li>\n </ul>\n </nav>\n <button\n id=\"burger-icon\"\n aria-controls=\"main-menu\"\n :aria-expanded=\"showMenu ? 'true' : 'false'\"\n :aria-label=\"`${showMenu ? 'Close' : 'Open'} Main Menu`\"\n :class=\"$style.burger\"\n @click=\"\n toggleMenu();\n sendEvent(`${showMenu ? 'Open' : 'Close'} Small Menu`);\n \"\n >\n <IconMenu></IconMenu>\n </button>\n <SearchModal\n v-if=\"searchActive\"\n :active=\"searchActive\"\n @search-state=\"updateSearchState\"\n ></SearchModal>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport EventList from '@/components/common/EventList.vue';\nimport ExhibitionsOnView from '@/components/exhibitions/ExhibitionsOnView.vue';\nimport IconClose from '@/assets/svgs/IconClose.svg?component';\nimport IconLogo from '@/assets/svgs/IconLogo.svg?component';\nimport IconMagnify from '@/assets/svgs/IconMagnify.svg?component';\nimport IconMenu from '@/assets/svgs/IconMenu.svg?component';\nimport { inject, onBeforeUnmount, onMounted, ref, useCssModule, watch } from 'vue';\nimport { Item, MainMenu } from '@/types/global.interface';\nimport NavLogo from '@/components/navigation/NavLogo.vue';\nimport PreparedAnchor from '@/components/common/PreparedAnchor.vue';\nimport SearchModal from '@/components/search/SearchModal.vue';\nimport { storeToRefs } from 'pinia';\nimport SubNav from '@/components/navigation/SubNav.vue';\nimport { useAnalytics, useScreenSize } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore';\n\nconst emit = defineEmits(['changeClass']);\n\nconst { ga4Event } = useAnalytics();\nconst { isMobile } = useScreenSize();\nconst store = useMainStore();\nconst style = useCssModule();\n\nconst { overlay, routing, showBanner } = storeToRefs(store);\nconst { setValue } = store;\n\nconst menu = inject<MainMenu>('mainMenu');\n\nconst activeItem = ref(null);\nconst frame = ref();\nconst lastAct = ref();\nconst main = ref();\nconst offset = ref();\nconst searchActive = ref(false);\nconst showMenu = ref(false);\nconst showLogoIconG = ref(false);\n\nonBeforeUnmount(() => {\n window.removeEventListener('resize', resized);\n document.removeEventListener('keydown', escKey);\n});\n\nonMounted(() => {\n const frameClass = frame.value.classList;\n let yPos = window.scrollY;\n\n showLogoIconG.value = window.scrollY > 0;\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setOffset();\n document.addEventListener('keydown', escKey);\n });\n });\n\n window.addEventListener('scroll', () => {\n yPos = window.scrollY;\n showLogoIconG.value = window.scrollY > offset.value;\n\n if (!isMobile() && yPos <= offset.value && lastAct.value !== 'unfixed') {\n lastAct.value = 'unfixed';\n emit('changeClass', 'remove', 'fixed');\n frameClass.remove(`${style.fixed}`);\n }\n\n if (!isMobile() && yPos > offset.value && lastAct.value !== 'fixed') {\n lastAct.value = 'fixed';\n emit('changeClass', 'add', 'fixed');\n frameClass.add(`${style.fixed}`);\n }\n });\n window.addEventListener('resize', resized);\n});\n\nwatch([overlay, routing], ([overlayState, routingState]) => {\n if (!overlayState) {\n activeItem.value = null;\n }\n\n if (routingState) {\n activeItem.value = null;\n showMenu.value = false;\n setValue({ type: 'overlay', value: false });\n }\n});\n\nwatch(searchActive, (val) => {\n setValue({ type: 'overlay', value: val });\n});\n\nwatch(showBanner, () => {\n setOffset();\n});\n\nwatch(showMenu, (val) => {\n setValue({ type: 'overlay', value: val });\n});\n\nfunction changeActiveItem(item: string): void {\n if (activeItem.value && activeItem.value === item) {\n return unsetActiveItem();\n }\n\n if ((activeItem.value && activeItem.value !== item) || !activeItem.value) {\n return setActiveItem(item);\n }\n}\n\nfunction escKey(event): void {\n if (event.key === 'Escape' && activeItem.value !== null) {\n unsetActiveItem();\n }\n}\n\nfunction getLimit(type: string): string | null {\n switch (type) {\n case 'event_list':\n return menu.settings.event_count;\n case 'on_view':\n return menu.settings.exhibition_count;\n default:\n return null;\n }\n}\n\nfunction getSubmenuClass(item: Item): string {\n switch (item.submenus.length) {\n case 1:\n return 'span-twelve';\n case 2:\n return 'span-six';\n case 3:\n return 'span-four';\n case 4:\n return 'span-three';\n case 5:\n return 'span-two';\n default:\n return '';\n }\n}\n\nfunction getSubmenuType(type: string): string {\n switch (type) {\n case 'event_list':\n return EventList;\n case 'link_list':\n return SubNav;\n case 'on_view':\n return ExhibitionsOnView;\n case 'text':\n return SubNav;\n default:\n return '';\n }\n}\n\nfunction handleSamePath(): void {\n if (isMobile()) {\n showMenu.value = !showMenu.value;\n }\n\n unsetActiveItem();\n}\n\nfunction resized(): void {\n const width = window.innerWidth;\n\n if (activeItem.value && width < 960) {\n showMenu.value = true;\n }\n\n if (activeItem.value && width >= 960) {\n showMenu.value = false;\n }\n\n if (!activeItem.value) {\n showMenu.value = false;\n }\n}\n\nfunction sendEvent(str: string, url: string | void): void {\n const event = {\n click_type: 'navigation',\n component: 'MainNav',\n gtm_tag: 'navigation',\n link_text: str,\n };\n\n if (url) {\n event.link_url = url;\n }\n\n ga4Event(event);\n}\n\nfunction setActiveItem(item: string): void {\n const type = menu.main.items[item.split('-')[1]].type;\n\n if (type === 'parent') {\n setValue({ type: 'overlay', value: true });\n }\n\n if (type !== 'parent') {\n setValue({ type: 'overlay', value: false });\n }\n\n activeItem.value = item;\n}\n\nfunction setOffset() {\n const banner = document.getElementById('guggen-banner');\n\n offset.value = banner ? banner.getBoundingClientRect().height : 0;\n}\n\nfunction toggleMenu(): void {\n showMenu.value = !showMenu.value;\n}\n\nfunction unsetActiveItem(): void {\n setValue({ type: 'overlay', value: false });\n activeItem.value = null;\n}\n\nfunction updateSearchState(state: boolean): void {\n setTimeout(() => {\n searchActive.value = state;\n }, 300);\n}\n</script>\n\n<style lang=\"scss\" module>\n@mixin hide-icon {\n height: auto;\n overflow: auto;\n text-indent: 0;\n width: auto;\n\n &:focus,\n &:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n\n svg {\n display: none;\n }\n}\n\n:global(.child) {\n @include subtitle-2;\n @include space-0-above;\n\n & {\n display: inline-block;\n text-decoration: none;\n }\n}\n\n.back,\n.close {\n height: 2.125rem;\n position: absolute;\n top: 1rem;\n z-index: 2;\n\n svg {\n height: 1.5rem;\n width: 1.5rem;\n }\n}\n\n.back {\n @include left-arrow;\n\n & {\n left: 1rem;\n }\n\n &:focus {\n &::before {\n color: $black;\n }\n }\n}\n\n.burger {\n height: 2.125rem;\n position: absolute;\n top: 1rem;\n right: 1rem;\n\n svg {\n height: 1.5rem;\n width: 1.5rem;\n }\n}\n\n.close {\n right: 1rem;\n}\n\n.frame {\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n background: $white;\n border-bottom: 1px solid $black;\n z-index: get-zindex(menu);\n}\n\n.icon-logo-g {\n svg {\n height: 1.5rem;\n max-width: 100%;\n width: auto;\n }\n}\n\n.logo {\n position: relative; /* Add this if not already present */\n}\n\n.logoHidden {\n opacity: 0;\n}\n\n.logoIcon {\n height: 100%;\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.5s ease-in-out; /* Adjust duration as needed */\n transition-delay: 1s;\n}\n\n.logoIconActive {\n height: px-to-rem(40);\n width: px-to-rem(165);\n}\n\n.logoIconG {\n height: 100%;\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.2s ease-in-out; /* Faster transition */\n}\n\n.logoNavActive {\n height: px-to-rem(33);\n width: px-to-rem(33);\n}\n\n.logoWrapper {\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.5s ease-in-out;\n}\n\n.main {\n align-items: center;\n display: flex;\n height: 2.125rem;\n position: relative;\n\n ul {\n height: 100vh;\n left: 100vw;\n padding-left: 0;\n position: fixed;\n top: 0;\n transition: transform 0.3s ease;\n width: 100vw;\n\n &.active {\n background: $white;\n overflow-y: scroll;\n transform: translate(-100vw);\n z-index: 1;\n }\n\n li {\n width: inherit;\n\n &.active {\n background: $white;\n position: absolute;\n text-align: center;\n top: 0;\n }\n }\n\n ul {\n left: 0;\n position: inherit;\n }\n }\n\n .logo {\n display: inline-block;\n height: px-to-rem(40);\n position: relative;\n text-decoration: none;\n vertical-align: middle;\n width: px-to-rem(165);\n z-index: 0;\n\n &:focus {\n @include focus-outline;\n\n & {\n background-color: transparent;\n }\n }\n\n .logoWrapper {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n\n .logoIcon {\n height: 100%;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n transition: opacity 0.4s ease-in-out;\n width: 100%;\n }\n\n .logoIconG {\n height: 100%;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n transition: opacity 0.4s ease-in-out;\n width: 100%;\n }\n\n .logoVisible {\n opacity: 1;\n transition-delay: 0.25s;\n }\n }\n }\n}\n\n.menu {\n @include subtitle-1;\n @include space-0-above;\n\n & {\n border-bottom: 1px solid $light-gray;\n padding: px-to-rem(21.7) 0;\n text-align: center;\n }\n}\n\n.nav {\n padding: 1rem;\n position: relative;\n z-index: get-zindex(menu);\n\n ul {\n margin: 0;\n\n li {\n list-style: none;\n\n &.active {\n margin-left: 0;\n }\n }\n }\n}\n\n.parent {\n @include subtitle-1;\n @include space-0-above;\n\n & {\n display: inline-block;\n padding: 1rem 0 1rem 1rem;\n text-decoration: none;\n white-space: nowrap;\n }\n\n &.active {\n padding: px-to-rem(21.7) 0;\n }\n\n &:hover {\n background: transparent;\n outline: none;\n text-decoration: underline;\n }\n}\n\n.submenu {\n background: $white;\n border-top: 1px solid $light-gray;\n min-height: 100vh;\n padding: 0 1rem 4rem 1rem;\n text-align: initial;\n\n > div {\n @include space-24-32-above;\n }\n\n h2 {\n @include space-0-above;\n }\n\n ul {\n height: auto;\n padding-left: 0;\n width: auto;\n\n li {\n padding: 0;\n }\n }\n\n :global(.mainnav) {\n margin-top: 2rem;\n\n + :global(.mainnav) {\n margin-top: 3rem;\n }\n\n > div {\n p {\n @include body-2;\n @include space-22-27-above;\n }\n }\n\n h2,\n h5 {\n @include space-0-above;\n }\n li {\n a:not(:global(.more-link)) {\n color: $gray-3;\n text-decoration: none;\n\n &:hover {\n color: $gray-3-hover;\n text-decoration: underline;\n }\n &:focus {\n color: $white;\n }\n &:active {\n color: $gray-3-active;\n\n &:focus {\n color: $white;\n }\n }\n }\n }\n }\n}\n\n.util {\n align-items: center;\n display: flex;\n height: 2.125rem;\n position: absolute;\n right: 3.25rem;\n top: 1rem;\n\n a {\n color: $black;\n display: inline-block;\n\n &:focus {\n @include focus-outline;\n\n & {\n background-color: transparent;\n }\n }\n }\n\n button,\n svg {\n height: 1.5rem;\n width: 1.5rem;\n }\n\n ul {\n display: flex;\n gap: 12px;\n line-height: 24px;\n justify-content: flex-end;\n height: 1.5rem;\n }\n\n li {\n a,\n button {\n font-size: 0;\n position: relative;\n text-decoration: none;\n text-transform: none;\n }\n\n &:first-of-type {\n a {\n @include body-2;\n\n & {\n margin-top: 1px;\n vertical-align: text-top;\n }\n\n &:focus {\n color: $black;\n }\n }\n }\n\n &:nth-of-type(2) {\n display: none;\n }\n }\n}\n\n.main {\n .logo {\n svg {\n height: 2.4375rem;\n }\n }\n}\n\n@media (min-width: $break-point) {\n .back,\n .burger {\n display: none;\n }\n\n .icon {\n display: none;\n }\n\n .frame {\n position: relative;\n\n &.fixed {\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n z-index: get-zindex(menu);\n\n .util {\n li {\n a,\n button {\n @include hide-icon;\n }\n }\n }\n }\n\n .util {\n right: 2rem;\n top: 1.5rem;\n transition: top 0.25s ease;\n\n ul {\n gap: 2rem;\n }\n\n li {\n &:nth-of-type(2) {\n display: initial;\n }\n\n a,\n button {\n @include hide-icon;\n @include body-2;\n\n & {\n vertical-align: top;\n }\n\n &:focus,\n &:hover {\n background: transparent;\n color: initial;\n outline: none;\n cursor: pointer;\n text-decoration: underline;\n }\n }\n\n > a,\n button {\n margin-top: 0;\n }\n }\n }\n }\n\n .nav {\n max-width: 80em;\n margin: 0 auto;\n padding: 2rem 2rem px-to-rem(7) 2rem;\n }\n\n .main {\n display: block;\n height: initial;\n\n .logo {\n line-height: 0;\n\n &:focus {\n @include focus-outline;\n\n & {\n background-color: transparent;\n outline-offset: 0.5rem;\n }\n }\n }\n\n ul {\n align-items: baseline;\n display: grid;\n grid-auto-columns: min-content;\n grid-auto-flow: column;\n height: auto;\n left: 0;\n list-style: none;\n padding: 0;\n position: relative;\n top: px-to-rem(7);\n width: auto;\n\n li {\n margin-right: 36px;\n padding: 0;\n text-align: initial;\n width: auto;\n\n &.active {\n background: transparent;\n position: initial;\n top: auto;\n }\n }\n\n ul {\n display: block;\n padding: 0;\n\n li {\n margin-right: 0;\n }\n }\n }\n }\n\n .logoNavActive {\n height: px-to-rem(50);\n width: px-to-rem(50);\n }\n\n .parent {\n cursor: pointer;\n margin: 0;\n padding: px-to-rem(15) 0 px-to-rem(28);\n\n &.active {\n background: transparent;\n border-bottom: 2px solid $black;\n outline: none;\n padding: px-to-rem(15) 0 px-to-rem(28);\n text-decoration: none;\n }\n\n &:focus {\n @include focus;\n }\n }\n\n .submenu {\n border: 1px solid $black;\n display: grid;\n grid-column-gap: 40px;\n grid-template-columns: repeat(12, [col-start] 1fr);\n left: -2rem;\n max-width: $desktop-width;\n min-height: auto;\n padding: 2rem;\n position: absolute;\n top: 100%;\n width: 100%;\n\n :global(.mainnav) {\n @include space-0-above;\n\n + :global(.mainnav) {\n @include space-0-above;\n }\n }\n\n :global(.no-heading) {\n margin-top: 2rem;\n\n :first-child {\n margin-top: 0;\n }\n }\n\n &.wide {\n padding-right: 2rem;\n width: 100%;\n }\n\n > div {\n margin-top: 0;\n\n &.exhibitions:first-of-type {\n margin-top: 0;\n }\n }\n\n h5 {\n margin-top: 0;\n }\n\n ul {\n top: 0;\n\n li {\n padding: 0;\n }\n }\n }\n}\n</style>\n","import { AudioState } from '@/types/audio.store.interface';\nimport { defineStore } from 'pinia';\n\nexport const useAudioStore = defineStore('audioStore', {\n state: (): AudioState => ({\n accessToken: '',\n audioElement: null,\n audioId: 0,\n currentTitle: '',\n currentTrack: 0,\n expires: '',\n isInitial: true,\n isPlaying: false,\n lastFocused: null,\n open: false,\n playlistTitle: '',\n refreshToken: '',\n source: '',\n tracks: [],\n travels: 0,\n }),\n actions: {\n updateAudioState(value: AudioState) {\n Object.keys(value).map((val) => {\n if (val in this) {\n this[val] = value[val];\n }\n });\n },\n },\n});\n","<template>\n <span\n id=\"announcer\"\n ref=\"announcer\"\n aria-live=\"assertive\"\n :class=\"screenreaderOffscreen\"\n role=\"status\"\n tabindex=\"-1\"\n >\n {{ announcement }}\n </span>\n <a\n id=\"skip-link\"\n aria-label=\"Skip to Main Content\"\n :class=\"skip\"\n href=\"#main\"\n @click.prevent=\"skipTo('#main')\"\n @keypress.enter=\"skipTo('#main')\"\n >\n Skip to Main Content\n </a>\n <div :class=\"$style.frame\">\n <Banner></Banner>\n <MainNav @change-class=\"changeClass\"></MainNav>\n <div ref=\"page\" class=\"page\">\n <main id=\"main\" :aria-hidden=\"overlay\" aria-label=\"Main Content\" :inert=\"overlay\" role=\"main\">\n <IconLoading v-if=\"!dataLoaded\" :class=\"spinner\"></IconLoading>\n <router-view v-if=\"!isPreviewLogin\" id=\"content\" :key=\"$route.fullPath\"></router-view>\n </main>\n </div>\n </div>\n <FooterNav :aria-hidden=\"overlay\" :inert=\"overlay\"></FooterNav>\n <div v-if=\"overlay\" :class=\"$style.overlay\" aria-hidden=\"true\" @click=\"closeOverlay\"></div>\n <AudioPlayer v-if=\"tracks.length\"></AudioPlayer>\n</template>\n\n<script setup lang=\"ts\">\nimport '@/styles/_normalize.css';\nimport '@/styles/_typography.scss';\nimport '@/styles/_main.scss';\nimport '@/styles/_grid.scss';\nimport '@/styles/_buttons.scss';\nimport '@/styles/_lightbox.scss';\nimport '@/styles/_stacked.scss';\nimport '@/styles/_popup.scss';\n\nimport { AppConfig } from '@/types/global.interface';\nimport Banner from '@/components/common/Banner.vue';\nimport {\n computed,\n defineAsyncComponent,\n getCurrentInstance,\n inject,\n nextTick,\n onBeforeUnmount,\n onMounted,\n onUpdated,\n ref,\n watch,\n} from 'vue';\nimport FooterNav from '@/components/navigation/FooterNav.vue';\nimport IconLoading from '@/assets/svgs/IconLoading.svg?component';\nimport MainNav from '@/components/navigation/MainNav.vue';\nimport { redirectUnsupportedBrowser } from '@/utils';\nimport { screenreaderOffscreen, skip } from '@/styles/a11y.module.scss';\nimport { spinner } from '@/styles/animations.module.scss';\nimport { storeToRefs } from 'pinia';\nimport { useA11y, useAnalytics, useScrollAnchor } from '@/composables/Common.js';\nimport { useAudioStore } from '@/stores/audioStore';\nimport { useMainStore } from '@/stores/mainStore';\nimport { useRoute, useRouter } from 'vue-router';\n\nconst appConfig = inject<AppConfig>('appConfig');\nconst AudioPlayer = defineAsyncComponent(() => import('@/components/audio/AudioPlayer.vue'));\n\nconst audioStore = useAudioStore();\nconst instance = getCurrentInstance();\nconst route = useRoute();\nconst router = useRouter();\nconst store = useMainStore();\n\nconst { announcement, dataLoaded, isKeyboardUser, overlay, savedPosition } = storeToRefs(store);\nconst { tracks } = storeToRefs(audioStore);\n\nconst { detectKeyboardUser, findFocusable, focusSkip } = useA11y();\nconst { initAnalytics } = useAnalytics();\nconst { scrollToAnchor } = useScrollAnchor();\nconst { setValue } = store;\n\nconst activeLinks = ref(null);\nconst announcer = ref(null);\nconst isPreviewLogin = ref(false);\nconst page = ref();\n\nconst scrollToName = (name) => {\n history.pushState({}, '', `#${name}`);\n\n const selector = `[name=\"_${name}\"]`;\n\n scrollToAnchor(document.querySelector(selector));\n};\n\nconst hasHash = computed(() => {\n if (route.hash) {\n const hash = route.hash;\n\n if (hash.substring(0, 2) === '#_') {\n // footnotes\n return `[name=${hash.substring(1)}]`;\n }\n }\n\n return '';\n});\n\ndefineExpose({ scrollTo, scrollToName });\n\nwatch([dataLoaded, savedPosition], ([loaded, position]) => {\n if (position && loaded) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n window.scroll(savedPosition.value);\n setValue({ type: 'savedPosition', value: false });\n });\n });\n }\n\n if (loaded) {\n // Slight delay needed here to ensure capturing new content.\n nextTick().then(() => {\n initAnalytics();\n watchActiveLinks();\n detectKeyboardUser();\n });\n\n if (isKeyboardUser.value && !hasHash.value) {\n requestAnimationFrame(() => {\n requestAnimationFrame(focusSkip);\n });\n }\n }\n\n if (!loaded) {\n unWatchActiveLinks();\n }\n});\n\nisPreviewLogin.value = Boolean(route.query.preview && !appConfig.loggedIn);\n\nonBeforeUnmount(() => {\n announcer.value.removeEventListener('focusin', preventFocus);\n});\n\nonMounted(() => {\n announcer.value.addEventListener('focusin', preventFocus);\n\n initAnalytics();\n watchActiveLinks();\n detectKeyboardUser();\n\n if (route.fullPath !== '/browser-not-supported') {\n redirectUnsupportedBrowser(router, document.title.split('|')[0].trim());\n }\n\n window.guggApp = instance;\n});\n\nonUpdated(() => {\n if (hasHash.value) {\n nextTick(() => scrollToAnchor(document.querySelector(hasHash.value)));\n }\n});\n\nfunction changeClass(action: string, name: string): void {\n switch (action) {\n case 'add':\n page.value.classList.add(name);\n break;\n case 'remove':\n page.value.classList.remove(name);\n break;\n }\n}\n\nfunction closeOverlay(): void {\n setValue({ type: 'overlay', value: false });\n}\n\nfunction preventFocus(event: Event): void {\n event.relatedTarget ? event.relatedTarget.focus() : event.target.blur();\n}\n\n// TODO: GUGG remove?\nfunction scrollable(val): void {\n if (val) {\n document.body.classList.add('noscroll');\n }\n\n if (!val) {\n document.body.classList.remove('noscroll');\n }\n}\n\nfunction scrollTo(anchor: string): void {\n history.pushState({}, '', anchor);\n scrollToAnchor(document.querySelector(anchor));\n}\n\nfunction skipTo(anchor: string): void {\n anchor = route.hash || anchor;\n history.pushState({}, '', anchor);\n\n const target = document.querySelector(anchor);\n const firstFocusable = findFocusable(target)[0];\n\n firstFocusable.focus();\n window.scrollTo({\n top: firstFocusable.offsetTop - 100,\n behavior: 'smooth',\n });\n}\n\nfunction unfocusLink(event: Event): void {\n if (event.key !== 'Tab' || event.code !== 'Tab') {\n event.target.blur();\n }\n}\n\nfunction unWatchActiveLinks(): void {\n ['click', 'keydown'].map((type) => {\n if (activeLinks.value) {\n Array.from(activeLinks.value).forEach((link) => {\n link.removeEventListener(type, unfocusLink);\n });\n }\n });\n}\n\nfunction watchActiveLinks(): void {\n activeLinks.value = document.getElementsByClassName('router-link-exact-active');\n ['click', 'keydown'].map((type) => {\n if (activeLinks.value) {\n Array.from(activeLinks.value).forEach((link) => {\n link.addEventListener(type, unfocusLink);\n });\n }\n });\n}\n</script>\n\n<style lang=\"scss\" module>\n.frame {\n margin-top: px-to-rem(67);\n}\n\n.mobile {\n padding-bottom: px-to-rem(50);\n padding-top: px-to-rem(57.5);\n}\n\n.overlay {\n background-color: hsla(0, 0%, 97%, 0.9);\n cursor: pointer;\n height: 100vh;\n left: 0;\n position: fixed;\n top: 0;\n width: 100vw;\n z-index: get-zindex(overlay);\n}\n\n@media (min-width: $break-point) {\n .frame {\n margin-top: 0;\n }\n\n :global(.page) {\n &:global(.fixed) {\n margin-top: px-to-rem(150);\n }\n }\n}\n</style>\n","export const artworkSubtypes = [\n 'artist',\n 'artwork_type',\n 'category',\n 'decade',\n 'movement',\n 'special_collection',\n 'site'\n].join('|');\n\nexport const artInvestigationSubtypes = [\n 'look_at_art_grade',\n 'look_at_art_technique',\n 'look_at_art_theme'\n].join('|');\n\nexport const artMakingSubtypes = ['making_art_technique', 'making_art_theme'].join('|');\n\nexport const closingSoonSeconds = 1814000; // 21 days in seconds\n","import { artInvestigationSubtypes, artMakingSubtypes, artworkSubtypes } from '@/config/app';\nimport { createRouter as _createRouter, createWebHistory } from 'vue-router';\nimport { storeToRefs } from 'pinia';\nimport { useAudioStore } from '@/stores/audioStore';\nimport { useMainStore } from '@/stores/mainStore.js';\n\n// lazy loading\nconst ArticlePost = () => import('./components/article/ArticlePost.vue');\nconst ArticleSection = () => import('./components/article/ArticleSection.vue');\nconst ArtworkPost = () => import('./components/artwork/ArtworkPost.vue');\nconst ArtworkTerm = () => import('./components/artwork/ArtworkTerm.vue');\nconst ArtworkTermArtist = () => import('./components/artwork/ArtworkTermArtist.vue');\nconst ArtworkSection = () => import('./components/artwork/ArtworkSection.vue');\nconst AudioSection = () => import('./components/audio/AudioSection.vue');\nconst AudioTracks = () => import('./components/audio/AudioTracks.vue');\nconst AudioPlaylists = () => import('./components/audio/AudioPlaylists.vue');\nconst AudioPlaylist = () => import('./components/audio/AudioPlaylist.vue');\nconst AudioTrack = () => import('./components/audio/AudioTrack.vue');\nconst CalendarEvent = () => import('./components/calendar/CalendarEvent.vue');\nconst CalendarSeries = () => import('./components/calendar/CalendarSeries.vue');\nconst CalendarSection = () => import('./components/calendar/CalendarSection.vue');\nconst CollectionOnline = () => import('./components/CollectionOnline.vue');\nconst ExhibitionsArchive = () => import('./components/exhibitions/ExhibitionsArchive.vue');\nconst ExhibitionsPage = () => import('./components/exhibitions/ExhibitionsPage.vue');\nconst ExhibitionsPost = () => import('./components/exhibitions/ExhibitionsPost.vue');\nconst FindingAidsCollection = () => import('./components/findingAids/FindingAidsCollection.vue');\nconst FindingAidsFile = () => import('./components/findingAids/FindingAidsFile.vue');\nconst FindingAidsRequest = () => import('./components/findingAids/FindingAidsRequest.vue');\nconst FindingAidsSeries = () => import('./components/findingAids/FindingAidsSeries.vue');\nconst Home = () => import('@/components/Home.vue');\nconst LearningThroughArtPostInvestigation = () =>\n import('./components/learningThroughArt/LearningThroughArtPostInvestigation.vue');\nconst LearningThroughArtPostMaking = () =>\n import('./components/learningThroughArt/LearningThroughArtPostMaking.vue');\nconst LearningThroughArtInvestigation = () =>\n import('./components/learningThroughArt/LearningThroughArtInvestigation.vue');\nconst LearningThroughArtCurriculum = () =>\n import('./components/learningThroughArt/LearningThroughArtCurriculum.vue');\nconst LearningThroughArtMaking = () =>\n import('./components/learningThroughArt/LearningThroughArtMaking.vue');\nconst LearningThroughArtTaxonomy = () =>\n import('./components/learningThroughArt/LearningThroughArtTaxonomy.vue');\nconst NewsPost = () => import('./components/news/NewsPost.vue');\nconst NewsSection = () => import('./components/news/NewsSection.vue');\nconst NotFound = () => import('./components/NotFound.vue');\nconst PageController = () => import('./components/page/PageController.vue');\nconst PlanYourVisit = () => import('./components/planYourVisit/PlanYourVisit.vue');\nconst PressReleasePost = () => import('./components/press/PressReleasePost.vue');\nconst PressReleaseSection = () => import('./components/press/PressReleaseSection.vue');\nconst PublicationPost = () => import('./components/publication/PublicationPost.vue');\nconst PublicationSection = () => import('./components/publication/PublicationSection.vue');\nconst Search = () => import('./components/search/Search.vue');\nconst TeachingMaterialsPackage = () =>\n import('./components/teachingMaterials/TeachingMaterialsPackage.vue');\nconst TeachingMaterialsTopic = () =>\n import('./components/teachingMaterials/TeachingMaterialsTopic.vue');\nconst TeachingMaterialsSection = () =>\n import('./components/teachingMaterials/TeachingMaterialsSection.vue');\nconst VideoPost = () => import('./components/video/VideoPost.vue');\nconst VideoSection = () => import('./components/video/VideoSection.vue');\nconst VideoTaxonomy = () => import('./components/video/VideoTaxonomy.vue');\n\nconst routes = [\n {\n path: '/',\n name: 'home',\n component: Home,\n },\n {\n path: '/blogs/:category/:slug',\n redirect: { name: 'ArticlePost' },\n },\n {\n component: ArticlePost,\n name: 'ArticlePost',\n path: '/articles/:category/:slug',\n props: true,\n },\n {\n path: '/blogs',\n redirect: { name: 'ArticleSection' },\n },\n {\n component: ArticleSection,\n name: 'ArticleSection',\n path: '/articles',\n props: true,\n },\n {\n path: '/blogs/page/:page',\n redirect: { name: 'ArticleSectionPaged' },\n },\n {\n component: ArticleSection,\n name: 'ArticleSectionPaged',\n path: '/articles/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n path: '/blogs/:type(author|category|tag)/:slug([^/]+)/:subcategory([^/]+)?',\n redirect: { name: 'ArticleTerm' },\n },\n {\n component: ArticleSection,\n name: 'ArticleTerm',\n path: '/articles/:type(author|category|tag)/:slug([^/]+)/:subcategory([^/]+)?',\n props: true,\n },\n {\n path: '/blogs/:type(author|category|tag)/:slug/:subcategory([^/]+)?/page/:page',\n redirect: { name: 'ArticleTermPaged' },\n },\n {\n component: ArticleSection,\n name: 'ArticleTermPaged',\n path: '/articles/:type(author|category|tag)/:slug/:subcategory([^/]+)?/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: ArtworkTermArtist,\n name: 'ArtworkTermArtist',\n path: '/artwork/artist',\n },\n {\n component: ArtworkTerm,\n name: 'ArtworkTerm',\n path: `/artwork/:subtype(${artworkSubtypes})/:search([^/]+)?`,\n props: true,\n },\n {\n component: ArtworkTerm,\n name: 'ArtworkTermPaged',\n path: `/artwork/:subtype(${artworkSubtypes})/:search([^/]+)?/page/:page`,\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: ArtworkPost,\n name: 'ArtworkPost',\n path: '/artwork/:slugname',\n props: true,\n },\n {\n component: ArtworkSection,\n name: 'ArtworkSection',\n path: '/artwork',\n props: true,\n },\n {\n component: ArtworkSection,\n name: 'ArtworkSectionPaged',\n path: '/artwork/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioPlaylist,\n name: 'AudioPlaylist',\n path: '/audio/playlist/:slug',\n props: true,\n },\n {\n component: AudioTrack,\n name: 'AudioTrack',\n path: '/audio/track/:slug',\n props: true,\n },\n {\n component: AudioTracks,\n name: 'AudioTracks',\n path: '/audio/track',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioTracks,\n name: 'AudioTracksPaged',\n path: '/audio/track/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioPlaylists,\n name: 'AudioPlaylists',\n path: '/audio/playlist',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioPlaylists,\n name: 'AudioPlaylistsPaged',\n path: '/audio/playlist/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioSection,\n name: 'AudioTag',\n path: '/audio/tag/:tag',\n props: true,\n },\n {\n component: AudioSection,\n name: 'AudioTagPaged',\n path: '/audio/tag/:tag/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioSection,\n name: 'AudioSection',\n path: '/audio',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: AudioSection,\n name: 'AudioSectionPaged',\n path: '/audio/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: CalendarSeries,\n name: 'CalendarSeries',\n path: '/event/:type(series|event_series)/:slug',\n props: true,\n },\n {\n component: CalendarEvent,\n name: 'CalendarEvent',\n path: '/event/:slug/:date?',\n props(route) {\n const props = { ...route.params };\n if (!props.date) {\n props.date = '';\n }\n return props;\n },\n },\n {\n component: CalendarSection,\n name: 'CalendarSection',\n path: '/calendar/:view(day|event_date|event_month|month)?/:date?',\n props(route) {\n const props = { ...route.params };\n if (!props.date) {\n props.date = appConfig.today.isoDate;\n }\n if (!props.view) {\n props.view = 'day';\n }\n props.view = props.view === 'event_date' ? 'day' : props.view;\n props.view = props.view === 'event_month' ? 'month' : props.view;\n return props;\n },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsArchive',\n path: '/exhibition',\n props: true,\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsArchivePage',\n path: '/exhibition/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsArchiveTerm',\n path: '/exhibition/:type(site|year)/:term',\n props: true,\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsArchiveTermPage',\n path: '/exhibition/:type(site|year)/:term/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsPast',\n path: '/exhibitions/past',\n props: { past: true },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsPastPage',\n path: '/exhibitions/past/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n props.past = true;\n return props;\n },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsPastTerm',\n path: '/exhibitions/past/:type(site|year)/:term',\n props(route) {\n const props = { ...route.params };\n props.past = true;\n return props;\n },\n },\n {\n component: ExhibitionsArchive,\n name: 'ExhibitionsPastTermPage',\n path: '/exhibitions/past/:type(site|year)/:term/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n props.past = true;\n return props;\n },\n },\n {\n component: ExhibitionsPage,\n name: 'ExhibitionsPage',\n path: '/exhibitions',\n props: true,\n },\n {\n component: ExhibitionsPost,\n name: 'ExhibitionsPost',\n path: '/exhibition/:slug',\n props: true,\n },\n {\n component: FindingAidsCollection,\n name: 'FindingAidsCollection',\n path: '/finding-aids/collection/:slug',\n props: true,\n },\n {\n component: FindingAidsFile,\n name: 'FindingAidsFile',\n path: '/finding-aids/file/:slug',\n props: true,\n },\n {\n component: FindingAidsSeries,\n name: 'FindingAidsSeries',\n path: '/finding-aids/series/:slug',\n props: true,\n },\n {\n component: FindingAidsRequest,\n name: 'FindingAidsRequest',\n path: '/finding-aids/requested-aids',\n props: true,\n },\n {\n component: LearningThroughArtCurriculum,\n name: 'LearningThroughArtCurriculum',\n path: '/learning-through-art/curriculum',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtCurriculum,\n name: 'LearningThroughArtCurriculumPaged',\n path: '/learning-through-art/curriculum/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtInvestigation,\n name: 'LearningThroughArtInvestigation',\n path: '/learning-through-art/art-investigation',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtInvestigation,\n name: 'LearningThroughArtInvestigationPaged',\n path: '/learning-through-art/art-investigation/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtMaking,\n name: 'LearningThroughArtMaking',\n path: '/learning-through-art/art-making',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtMaking,\n name: 'LearningThroughArtMakingPaged',\n path: '/learning-through-art/art-making/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtTaxonomy,\n name: 'LearningThroughArtTaxonomy',\n path: `/learning-through-art/:type(art-investigation|art-making)/:subtype(${artMakingSubtypes}|${artInvestigationSubtypes})/:slug`,\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n\n {\n component: LearningThroughArtTaxonomy,\n name: 'LearningThroughArtTaxonomyPaged',\n path: `/learning-through-art/:type(art-investigation|art-making)/:subtype(${artMakingSubtypes}|${artInvestigationSubtypes})/:slug/page/:page`,\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: LearningThroughArtPostInvestigation,\n name: 'LearningThroughArtPostInvestigation',\n path: '/learning-through-art/art-investigation/:slug',\n props: true,\n },\n {\n component: LearningThroughArtPostMaking,\n name: 'LearningThroughArtPostMaking',\n path: '/learning-through-art/art-making/:slug',\n props: true,\n },\n {\n component: NewsSection,\n name: 'NewsSection',\n path: '/news',\n props: true,\n },\n {\n component: NewsSection,\n name: 'NewsSectionPaged',\n path: '/news/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: NewsPost,\n name: 'NewsPost',\n path: '/news/:slug',\n props: true,\n },\n {\n component: PressReleaseSection,\n name: 'PressReleaseSection',\n path: '/press-release',\n props: true,\n },\n {\n component: PressReleaseSection,\n name: 'PressReleaseSectionPaged',\n path: '/press-release/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: PressReleasePost,\n name: 'PressReleasePost',\n path: '/press-release/:slug',\n props: true,\n },\n {\n component: PublicationSection,\n name: 'PublicationSection',\n path: '/publication',\n props: true,\n },\n {\n component: PublicationSection,\n name: 'PublicationSectionPaged',\n path: '/publication/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: PublicationSection,\n name: 'PublicationTaxSection',\n path: '/publication/:subtype(publication_subject|publication_author)/:slug',\n props: true,\n },\n {\n component: PublicationSection,\n name: 'PublicationTaxSectionPaged',\n path: '/publication/:subtype(publication_subject|publication_author)/:slug/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: PublicationPost,\n name: 'PublicationPost',\n path: '/publication/:slug',\n props: true,\n },\n {\n component: TeachingMaterialsTopic,\n name: 'TeachingMaterialsTopic',\n path: '/teaching-materials/:parent/:slug',\n props: true,\n },\n {\n component: TeachingMaterialsPackage,\n name: 'TeachingMaterialsPackage',\n path: '/teaching-materials/:slug',\n props: true,\n },\n {\n component: TeachingMaterialsSection,\n name: 'TeachingMaterialsSection',\n path: '/teaching-materials',\n props: true,\n },\n {\n path: '/video',\n name: 'Video',\n component: VideoSection,\n props: true,\n },\n {\n path: '/video/page/:page',\n name: 'VideoPage',\n component: VideoSection,\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n name: 'VideoPost',\n path: '/video/:postSlug',\n component: VideoPost,\n props: true,\n },\n {\n component: VideoTaxonomy,\n name: 'VideoTaxonomy',\n path: '/video/:type(category|tag)/:slug',\n props: true,\n },\n {\n component: VideoTaxonomy,\n name: 'VideoTaxonomyPage',\n path: '/video/:type(category|tag)/:slug/page/:page',\n props(route) {\n const props = { ...route.params };\n props.page = props.page ? +props.page : 1;\n return props;\n },\n },\n {\n component: CollectionOnline,\n name: 'CollectionOnline',\n path: '/collection-online',\n props(route) {\n const props = { ...route.params };\n props.uri = 'collection-online';\n return props;\n },\n },\n {\n component: PlanYourVisit,\n name: 'PlanYourVisit',\n path: '/plan-your-visit',\n },\n {\n component: Search,\n name: 'Search',\n path: '/search',\n props: (route) => ({\n page: route.query.page ? +route.query.page : 1,\n type: route.query.post_type,\n query: route.query.s || '',\n }),\n },\n {\n component: NotFound,\n name: 'NotFound',\n path: '/404',\n },\n {\n component: PageController,\n name: 'PagePrimary',\n path: '/:uri',\n props: true,\n },\n {\n component: PageController,\n name: 'PageSecondary',\n path: '/:uri+',\n props: true,\n },\n {\n path: '/[^//]',\n redirect: '/404',\n },\n];\n\nconst router = _createRouter({\n history: createWebHistory(),\n routes,\n scrollBehavior: (to, from, savedPosition) => {\n const store = useMainStore();\n const { setValue } = store;\n\n // Exclude TM footnotes.\n if (to.hash && !to.hash.includes('#_')) {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n resolve({ el: to.hash });\n });\n });\n });\n }\n\n if (savedPosition && savedPosition.top !== 0) {\n setValue({ type: 'savedPosition', value: savedPosition });\n\n return savedPosition;\n }\n\n if (\n (from.query.gallery && !Object.keys(to.query).length) ||\n (to.query.gallery && !Object.keys(from.query).length)\n ) {\n // preserve position for TM gallery links\n return false;\n }\n\n return { left: 0, top: 0 };\n },\n});\n\nrouter.beforeEach((to, from, next) => {\n const store = useMainStore();\n const { setBoolean, setValue } = store;\n\n // Rewrite abnormal URLs if possible.\n const newPath = normalizePath(to.path);\n\n if (newPath !== to.path && !Object.keys(to.query).length) {\n // Account for queries.\n logError(to.path);\n\n // Set normalized path.\n to.path = newPath;\n next(to);\n\n return;\n }\n\n if (to.path.substring(0, 2) === '//') {\n logError(to.path);\n }\n\n setValue({ type: 'announcement', value: 'Page loading.' });\n\n if (from.path !== to.path) {\n setBoolean('routing');\n setValue({ type: 'dataLoaded', value: false });\n }\n\n // Remove focus from focused element when routing\n document.activeElement.blur();\n\n // determine whether to use bootstrap\n if (from.name) {\n setValue({ type: 'useBootstrap', value: false });\n } else {\n setValue({ type: 'useBootstrap', value: true });\n }\n\n // handle TM direct access\n if (to.query.parent && to.query.slug) {\n const navTopic = {\n name: 'TeachingMaterialsTopic',\n params: { parent: to.query.parent, slug: decodeURI(to.query.slug) },\n };\n\n if (to.query.gallery) {\n navTopic.query = { gallery: to.query.gallery };\n }\n\n next(navTopic);\n\n return;\n } else if (to.query.slug) {\n const navPackage = {\n name: 'TeachingMaterialsPackage',\n params: { slug: to.query.slug },\n };\n\n if (to.query.gallery) {\n navPackage.query = { gallery: to.query.gallery };\n }\n\n next(navPackage);\n\n return;\n }\n\n next();\n});\n\nrouter.afterEach((to, from) => {\n const audioStore = useAudioStore();\n const store = useMainStore();\n\n const { open, travels } = storeToRefs(audioStore);\n const { routing } = storeToRefs(store);\n const { setBoolean } = store;\n const { updateAudioState } = audioStore;\n\n if (open.value) {\n travels.value = travels.value + 1;\n\n const params = {\n click_type: 'traveling',\n component: 'audio_player',\n content_group: 'audio',\n gtm_tag: 'interaction',\n link_text: `${travels.value}`,\n };\n\n window.dataLayer.push({\n event: 'ga4-event',\n name: 'click',\n params,\n });\n\n updateAudioState({ travels: travels.value });\n }\n\n if (!open.value && travels.value > 0) {\n updateAudioState({ travels: 0 });\n }\n\n // Gallery related exceptions\n if (!router.currentRoute.value.query.gallery) {\n if (!(Object.keys(from.query).length && from.query.gallery)) {\n if (routing.value) {\n setBoolean('routing');\n }\n }\n }\n});\n\n/**\n * Decodes encoded URI, replaces repeated slashes and performs unicode normalization.\n * Based on https://github.com/pillarjs/path-to-regexp#alternative-using-normalize\n *\n * @param {*} pathname\n */\nfunction normalizePath(pathname) {\n return decodeURI(pathname).replace(/\\/+/g, '/').normalize();\n}\n\nexport function createRouter() {\n return router;\n}\n\nfunction logError(msg) {\n const params = {\n component: 'router.js',\n event_type: 'error',\n event_text: msg,\n };\n\n window.dataLayer.push({\n event: 'ga4-event',\n name: 'error',\n params,\n });\n}\n","export default {\n /* eslint-disable */\n svg: `<svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12.6663 4.27325L11.7263 3.33325L7.99967 7.05992L4.27301 3.33325L3.33301 4.27325L7.05967 7.99992L3.33301 11.7266L4.27301 12.6666L7.99967 8.93992L11.7263 12.6666L12.6663 11.7266L8.93967 7.99992L12.6663 4.27325Z\"/></svg>`,\n};\n","import IconClose from '@/assets/svgs/IconClose.js';\nimport { useA11y, useImageProxy } from '@/composables/Common.js';\nimport { useMainStore } from '@/stores/mainStore';\n\nexport const lightbox = {\n beforeMount(el, binding) {\n const { proxySource } = useImageProxy();\n\n const box = document.createElement('div');\n const close = htmlToElement(IconClose.svg, 'svg');\n const container = document.createElement('div');\n const desc =\n binding.value.description && binding.value.description.includes('<p>')\n ? htmlToElement(binding.value.description, 'p')\n : htmlToElement(`<p>${binding.value.description}</p>`, 'p');\n const image = document.createElement('img');\n const span = document.createElement('span');\n const trigger = document.createElement('button');\n const wrap = document.createElement('picture');\n\n // construct close button\n trigger.innerText = 'Close';\n trigger.appendChild(close);\n trigger.classList.add('button-tertiary', 'close');\n\n span.appendChild(trigger);\n\n if (binding.value.description) {\n // captions\n container.appendChild(desc);\n }\n\n // construct image\n image.alt = binding.value.alt || binding.value.altText;\n image.src = binding.value.sourceUrl\n ? proxySource(binding.value.sourceUrl)\n : proxySource(binding.value.src);\n image.srcset = binding.value.srcset || '';\n image.sizes = '70vw';\n\n wrap.appendChild(image);\n container.prepend(wrap);\n\n // construct lightbox container\n box.classList.add('lightbox-container');\n container.classList.add('lightbox-wrap');\n container.setAttribute('role', 'dialog');\n\n if (\n binding.value.height &&\n binding.value.width &&\n binding.value.height > binding.value.width - 50\n ) {\n box.classList.add('portrait');\n }\n\n el.onkeydown = (evt) => {\n if (evt.code === 'Enter' || evt.code === 'Space') {\n evt.preventDefault();\n activateLightbox(el, box, container, span);\n }\n };\n el.onclick = () => {\n activateLightbox(el, box, container, span);\n };\n },\n};\n\nfunction activateLightbox(\n el: HTMLButtonElement,\n box: HTMLDivElement,\n container: HTMLDivElement,\n span: HTMLSpanElement,\n): void {\n const store = useMainStore();\n const { setValue } = store;\n const { trapFocus } = useA11y();\n\n ['click', 'touch', 'keyup'].map((type) => {\n box.addEventListener(type, (event) => checkCloseEvent(event, box, el, setValue));\n });\n\n el.parentElement.classList.add('active');\n\n container.prepend(span);\n box.appendChild(container);\n\n const app = document.getElementById('app');\n\n // engage overlay and attach lightbox to app\n setValue({ type: 'overlay', value: true });\n app?.appendChild(box);\n\n document.documentElement.classList.add('body-modal');\n box.classList.remove('hidden');\n box.classList.add('lightbox-active');\n\n toggleInert(true);\n trapFocus(box);\n\n // Push to Google Analytics\n if (el.hasAttribute('ga4-event')) {\n const gaEvent = el.getAttribute('ga4-event').replace(/'/g, '\"');\n\n if (gaEvent) {\n let eventData;\n\n try {\n eventData = JSON.parse(gaEvent);\n\n if (eventData.name && eventData.params) {\n window.dataLayer.push({\n event: 'ga4-event',\n name: eventData.name,\n params: eventData.params,\n });\n }\n } catch {\n // eslint-disable-next-line\n console.warn('Cannot parse: ' + gaEvent);\n }\n }\n }\n}\n\nfunction checkCloseEvent(\n event: Event | MouseEvent | KeyboardEvent,\n box: HTMLDivElement,\n el: HTMLButtonElement,\n setValue,\n): void {\n if (\n (event.type !== 'keyup' &&\n event.target &&\n (event.target.attributes === undefined || event.target.tagName !== 'IMG')) ||\n event.code === 'Escape'\n ) {\n ['click', 'touch', 'keyup'].map((type) => {\n box.removeEventListener(type, (event) => checkCloseEvent(event, box, el, setValue));\n });\n\n setValue({ type: 'overlay', value: false });\n toggleInert(false);\n\n document.documentElement.classList.remove('body-modal');\n box.classList.remove('lightbox-active');\n box.classList.add('hidden');\n\n if (box?.parentElement) {\n box.parentElement.classList.remove('active');\n }\n\n el.focus();\n }\n}\n\nfunction htmlToElement(string: string, type: string): Node {\n const element = document.createElement(type);\n\n element.innerHTML = string.trim();\n\n return element.firstChild;\n}\n\nfunction toggleInert(value: boolean): void {\n const skipLink = document.getElementById('skip-link');\n const mainNav = document.getElementById('main-nav');\n\n if (value && skipLink && mainNav) {\n skipLink.setAttribute('aria-hidden', 'true');\n skipLink.setAttribute('inert', '');\n mainNav.setAttribute('aria-hidden', 'true');\n mainNav.setAttribute('inert', '');\n }\n\n if (!value && skipLink && mainNav) {\n skipLink.removeAttribute('aria-hidden');\n skipLink.removeAttribute('inert');\n mainNav.removeAttribute('aria-hidden');\n mainNav.removeAttribute('inert');\n }\n}\n","import { createClient, defaultPlugins } from 'villus';\nimport { batch } from '@villus/batch';\n\nconst passcode = appConfig.graphqlAuth;\n\nfunction authPlugin({ opContext }) {\n opContext.headers.Authorization = passcode ? `Basic ${passcode}` : '';\n}\n\nexport const villusClient = createClient({\n url: '/graphql',\n use: [authPlugin, ...defaultPlugins(), batch({ maxOperationCount: 5 })],\n});\n","// https://vitejs.dev/config/#build-polyfillmodulepreload\nimport 'vite/modulepreload-polyfill';\nimport App from '@/App.vue';\nimport { createApp } from 'vue';\nimport { createPinia } from 'pinia';\nimport { createRouter } from '@/router';\nimport { lightbox } from '@/components/directives/Lightbox.ts';\nimport { villusClient } from '@/vue-villus';\nimport 'wicg-inert';\n\nconst pinia = createPinia();\nconst router = createRouter();\n\nconst app = createApp({\n router,\n ...App,\n});\n\napp.use(villusClient);\napp.use(pinia);\napp.use(router);\n\napp.directive('lightbox', lightbox);\n\n// globals from WP\napp.provide('appConfig', appConfig);\napp.provide('bootstrap', bootstrap);\napp.provide('footerNav', footerNav);\napp.provide('mainMenu', mainMenu);\n\nfunction getMatchedComponents(route) {\n return route.matched.flatMap((record) => Object.values(record.components));\n}\n\n// Register component hook tied into router beforeResolve.\nconst routerReady = router.isReady().then(() => {\n router.beforeResolve((to, from, next) => {\n const components = getMatchedComponents(to);\n const promises = components.map((component) => {\n if (component.beforeRoute && component.setup) {\n return component.beforeRoute(to.params, villusClient);\n }\n\n if (!component.beforeRoute) {\n return Promise.resolve();\n }\n });\n\n Promise.all(promises)\n .then(() => next())\n .catch((err) => {\n // eslint-disable-next-line\n console.log(err);\n next(err);\n });\n });\n});\n\nrouterReady.then(() => app.mount('#app'));\n"],"file":"assets/main-BdF-IjED.js"}