blob: 9acdffd4767ceaa8b569d90d571321c80f2f5574 [file] [log] [blame]
(() => {
'use strict';
const BREAKPOINT = 512;
const logo = document.querySelector('.js-headerLogo');
const form = document.querySelector('.js-searchForm');
if (!form) return;
const button = document.querySelector('.js-searchFormSubmit');
const input = form.querySelector('input');
renderForm();
window.addEventListener('resize', renderForm);
function renderForm() {
if (window.innerWidth > BREAKPOINT) {
logo.classList.remove('Header-logo--hidden');
form.classList.remove('SearchForm--open');
input.removeEventListener('focus', showSearchBox);
input.removeEventListener('keypress', handleKeypress);
input.removeEventListener('focusout', hideSearchBox);
} else {
button.addEventListener('click', handleSearchClick);
input.addEventListener('focus', showSearchBox);
input.addEventListener('keypress', handleKeypress);
input.addEventListener('focusout', hideSearchBox);
}
}
/**
* Submits form if Enter key is pressed
* @param {KeyboardEvent} e
*/
function handleKeypress(e) {
if (e.key === 'Enter') form.submit();
}
/**
* Shows the search box when it receives focus (expands it from
* just the spyglass if we're on mobile).
*/
function showSearchBox() {
logo.classList.add('Header-logo--hidden');
form.classList.add('SearchForm--open');
}
/**
* Hides the search box (shrinks to just the spyglass icon).
*/
function hideSearchBox() {
logo.classList.remove('Header-logo--hidden');
form.classList.remove('SearchForm--open');
}
/**
* Expands the searchbox so input is visible and gives
* the input focus.
* @param {MouseEvent} e
*/
function handleSearchClick(e) {
e.preventDefault();
showSearchBox();
input.focus();
}
/**
* Focus search input if '/' key is pressed.
*/
document.addEventListener('keypress', e => {
const t = e.target
if (
!handler.target &&
(t?.tagName === 'INPUT' || t?.tagName === 'SELECT' || t?.tagName === 'TEXTAREA')
) {
return;
}
if (t?.isContentEditable) {
return;
}
if (
(handler.withMeta && !(e.ctrlKey || e.metaKey)) ||
(!handler.withMeta && (e.ctrlKey || e.metaKey))
) {
return;
}
if (e.key === '/') {
const searchInput = Array.from(
document.querySelectorAll('.js-searchForm input')
).pop();
// Favoring the Firefox quick find feature over search input
// focus. See: https://github.com/golang/go/issues/41093.
if (searchInput && !window.navigator.userAgent.includes('Firefox')) {
e.preventDefault();
searchInput.focus();
}
}
})
})();