{"version":3,"file":"dropdown_nav-DAoNYfVB.js","sources":["../../../app/frontend/entrypoints/javascript/home_page/dropdown_nav.js"],"sourcesContent":["import $ from 'jquery'\nimport gsap from 'gsap'\n\nconst navWrapper = $('[data-id=\"nav-wrapper\"]')\nconst dropdownWrapper = $('[data-id=\"dropdown-wrapper\"]')\nconst contentWrapper = $('[data-id=\"content-wrapper\"]')\nconst navItem = $('[data-id=\"nav-item\"]')\nconst arrow = $('[data-id=\"dropdown-arrow\"]')\nconst background = $('[data-id=\"dropdown-bg\"]')\nconst content = $('[data-id=\"content-group\"]')\nconst contentItem = $('[data-id=\"content-item\"]')\n\nconst ANIMATION_DURATION = 0.2\nconst EVENTS = {\n MOUSE_ENTER: 'mouseenter',\n MOUSE_LEAVE: 'mouseleave',\n MOUSE_MOVE: 'mousemove',\n FOCUS: 'focus',\n BLUR: 'blur',\n KEYDOWN: 'keydown',\n}\nconst KEYS = {\n ARROW_LEFT: 'ArrowLeft',\n ARROW_UP: 'ArrowUp',\n ARROW_RIGHT: 'ArrowRight',\n ARROW_DOWN: 'ArrowDown',\n ESCAPE: 'Escape',\n ENTER: 'Enter',\n TAB: 'Tab',\n}\n\nconst showDropdown = createShowDropdownTimeline()\n\nfunction createShowDropdownTimeline() {\n return gsap\n .timeline({\n onReverseComplete: () => {\n navItem.removeClass('active')\n navItem.attr('aria-expanded', false)\n dropdownWrapper.css('display', 'none')\n },\n })\n .from(dropdownWrapper, { opacity: 0, rotateX: -15, duration: ANIMATION_DURATION })\n .to(arrow, { opacity: 1, duration: ANIMATION_DURATION }, '<')\n}\n\nfunction getNavItemCenter(navItem) {\n return navItem.position().left + navItem.width() / 2\n}\n\nfunction getCurrentContent(currentNavItem) {\n return content.eq(currentNavItem.index())\n}\n\nfunction switchDropdown(currentNavItem, previousContent, currentContent) {\n let moveDistance = 10\n\n previousContent.css('display', 'none')\n currentContent.css('display', 'flex')\n\n if (currentContent.index() < previousContent.index()) {\n moveDistance *= -1\n }\n\n gsap.to(arrow, {\n x: getNavItemCenter(currentNavItem),\n duration: ANIMATION_DURATION,\n })\n\n gsap.to([background, contentWrapper], {\n width: currentContent.outerWidth(),\n height: currentContent.outerHeight(),\n duration: ANIMATION_DURATION,\n })\n\n gsap.fromTo(\n previousContent,\n { opacity: 1, x: '0em' },\n {\n opacity: 0,\n x: -1 * (moveDistance + 'em'),\n duration: ANIMATION_DURATION,\n }\n )\n\n gsap.fromTo(\n currentContent,\n { opacity: 0, x: moveDistance + 'em' },\n {\n opacity: 1,\n x: '0em',\n duration: ANIMATION_DURATION,\n }\n )\n}\n\nfunction revealDropdown(currentNavItem, currentContent) {\n content.css('display', 'none') // Reset all displays to none to guarantee menus do not overlap\n currentContent.css('display', 'flex')\n dropdownWrapper.css('display', 'flex')\n\n showDropdown.restart()\n\n gsap.set(arrow, {\n x: getNavItemCenter(currentNavItem),\n })\n\n gsap.from(arrow, {\n y: 20,\n duration: ANIMATION_DURATION,\n })\n\n gsap.set(background, {\n width: currentContent.outerWidth(),\n height: currentContent.outerHeight(),\n })\n\n gsap.set(contentWrapper, {\n width: currentContent.outerWidth(),\n height: currentContent.outerHeight(),\n })\n\n gsap.set(content, {\n opacity: 0,\n })\n\n gsap.set(currentContent, {\n opacity: 1,\n x: '0em',\n })\n}\n\nfunction handleNavItemActivity() {\n if ($(this).hasClass('active')) return\n\n const previousNavItem = navItem.filter('.active')\n const previousContent = content.filter('.active')\n\n previousNavItem.attr('aria-expanded', false)\n navItem.removeClass('active')\n content.removeClass('active')\n\n const currentNavItem = $(this).addClass('active').attr('aria-expanded', true)\n const currentContent = getCurrentContent($(this)).addClass('active')\n\n if (previousNavItem.length > 0) {\n switchDropdown(currentNavItem, previousContent, currentContent)\n } else {\n revealDropdown(currentNavItem, currentContent)\n }\n}\n\nfunction handleBlur(e) {\n const nextElementDataId = e.relatedTarget?.getAttribute('data-id')\n\n if (contentItem.is(e.relatedTarget)) return\n\n navItem.removeClass('active')\n showDropdown.reverse()\n}\n\nfunction handleNavItemKeydown({ key }) {\n switch (key) {\n case KEYS.ENTER:\n handleNavItemActivity.apply(this)\n const currentContentItems = getCurrentContent($(this)).find(contentItem)\n currentContentItems.first().focus()\n break\n\n case KEYS.ARROW_DOWN:\n case KEYS.ARROW_RIGHT:\n handleNavItemActivity.apply(this)\n break\n }\n}\n\nfunction handleNavWrapperKeydown(e) {\n const activeNavItem = navItem.filter('.active')\n const currentContentItems = getCurrentContent(activeNavItem).find(contentItem)\n const focusedElement = currentContentItems.filter(':focus')\n const focusIndex = currentContentItems.index(focusedElement)\n const noContentItemsFocused = focusIndex === -1\n\n switch (e.key) {\n case KEYS.TAB:\n if (noContentItemsFocused) return\n activeNavItem.focus()\n break\n\n case KEYS.ARROW_LEFT:\n case KEYS.ARROW_RIGHT:\n case KEYS.ARROW_DOWN:\n case KEYS.ARROW_UP:\n e.preventDefault()\n\n const direction = [KEYS.ARROW_DOWN, KEYS.ARROW_RIGHT].includes(e.key) ? 1 : -1\n const nextIndex = wrapInteger(focusIndex + direction, 0, currentContentItems.length)\n currentContentItems[nextIndex].focus()\n break\n\n case KEYS.ESCAPE:\n activeNavItem.first().focus()\n activeNavItem.trigger('blur')\n break\n }\n}\n\nfunction wrapInteger(value, min, max) {\n const range = max - min\n return ((((value - min) % range) + range) % range) + min\n}\n\n// Listeners\nlet mouseLeaveTimeout\n\nnavWrapper.on(EVENTS.MOUSE_ENTER, () => {\n clearTimeout(mouseLeaveTimeout)\n})\n\nnavWrapper.on(EVENTS.MOUSE_LEAVE, () => {\n mouseLeaveTimeout = setTimeout(() => {\n showDropdown.reverse()\n }, 200)\n})\n\nnavWrapper.on(EVENTS.KEYDOWN, handleNavWrapperKeydown)\n\nnavItem.on(EVENTS.MOUSE_MOVE, handleNavItemActivity)\n\nnavItem.on(EVENTS.FOCUS, function () {\n clearTimeout(mouseLeaveTimeout)\n})\n\nnavItem.on(EVENTS.KEYDOWN, handleNavItemKeydown)\n\nnavItem.on(EVENTS.BLUR, handleBlur)\n\ncontentItem.on(EVENTS.BLUR, handleBlur)\n"],"names":["navWrapper","$","dropdownWrapper","contentWrapper","navItem","arrow","background","content","contentItem","ANIMATION_DURATION","EVENTS","KEYS","showDropdown","createShowDropdownTimeline","gsap","getNavItemCenter","getCurrentContent","currentNavItem","switchDropdown","previousContent","currentContent","moveDistance","revealDropdown","handleNavItemActivity","previousNavItem","handleBlur","e","_a","handleNavItemKeydown","key","handleNavWrapperKeydown","activeNavItem","currentContentItems","focusedElement","focusIndex","noContentItemsFocused","direction","nextIndex","wrapInteger","value","min","max","range","mouseLeaveTimeout"],"mappings":"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"}