var fuse; var showButtons = document.querySelectorAll("[id^='search-button']"); var hideButton = document.getElementById("close-search-button"); var wrapper = document.getElementById("search-wrapper"); var modal = document.getElementById("search-modal"); var input = document.getElementById("search-query"); var output = document.getElementById("search-results"); var first = output.firstChild; var last = output.lastChild; var searchVisible = false; var indexed = false; var hasResults = false; // Listen for events showButtons.forEach((button) => { button.addEventListener("click", displaySearch); }); hideButton.addEventListener("click", hideSearch); wrapper.addEventListener("click", hideSearch); modal.addEventListener("click", function (event) { event.stopPropagation(); event.stopImmediatePropagation(); return false; }); document.addEventListener("keydown", function (event) { // Forward slash to open search wrapper if (event.key == "/") { if (!searchVisible) { event.preventDefault(); displaySearch(); } } // Esc to close search wrapper if (event.key == "Escape") { hideSearch(); } // Down arrow to move down results list if (event.key == "ArrowDown") { if (searchVisible && hasResults) { event.preventDefault(); if (document.activeElement == input) { first.focus(); } else if (document.activeElement == last) { last.focus(); } else { document.activeElement.parentElement.nextSibling.firstElementChild.focus(); } } } // Up arrow to move up results list if (event.key == "ArrowUp") { if (searchVisible && hasResults) { event.preventDefault(); if (document.activeElement == input) { input.focus(); } else if (document.activeElement == first) { input.focus(); } else { document.activeElement.parentElement.previousSibling.firstElementChild.focus(); } } } }); input.onkeyup = function (event) { // queue an update after each keypress. the last one after some idle time wins let isFirstRun = throttle(() => executeQuery(this.value)); // on first run, show a spinner if (isFirstRun) { output.innerHTML = `