{"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}&ndash;${end.day}, ${end.year}`;\n      }\n\n      return `${begin.month} ${begin.day}&ndash;${end.month} ${end.day}, ${end.year}`;\n    }\n\n    return `${begin.month} ${begin.day}, ${begin.year}&ndash;${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)}&ndash;${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            &copy; {{ 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"}