feat(search): add arrow key navigation (#442)
* feat(search): add arrow navigation * chore: format * refactor: simplify arrow navigation * chore: remove comment * feat: rework arrow navigation to work without state * feat: make pressing enter work with arrow navigation * fix: remove unused css class * chore: correct comment * refactor(search): use optional chaining
This commit is contained in:
		
							parent
							
								
									8c354f6261
								
							
						
					
					
						commit
						7e42be8e46
					
				
					 1 changed files with 26 additions and 3 deletions
				
			
		| 
						 | 
					@ -82,6 +82,7 @@ document.addEventListener("nav", async (e: unknown) => {
 | 
				
			||||||
  const searchIcon = document.getElementById("search-icon")
 | 
					  const searchIcon = document.getElementById("search-icon")
 | 
				
			||||||
  const searchBar = document.getElementById("search-bar") as HTMLInputElement | null
 | 
					  const searchBar = document.getElementById("search-bar") as HTMLInputElement | null
 | 
				
			||||||
  const results = document.getElementById("results-container")
 | 
					  const results = document.getElementById("results-container")
 | 
				
			||||||
 | 
					  const resultCards = document.getElementsByClassName("result-card")
 | 
				
			||||||
  const idDataMap = Object.keys(data) as FullSlug[]
 | 
					  const idDataMap = Object.keys(data) as FullSlug[]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function hideSearch() {
 | 
					  function hideSearch() {
 | 
				
			||||||
| 
						 | 
					@ -122,9 +123,31 @@ document.addEventListener("nav", async (e: unknown) => {
 | 
				
			||||||
      // add "#" prefix for tag search
 | 
					      // add "#" prefix for tag search
 | 
				
			||||||
      if (searchBar) searchBar.value = "#"
 | 
					      if (searchBar) searchBar.value = "#"
 | 
				
			||||||
    } else if (e.key === "Enter") {
 | 
					    } else if (e.key === "Enter") {
 | 
				
			||||||
      const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null
 | 
					      // If result has focus, navigate to that one, otherwise pick first result
 | 
				
			||||||
      if (anchor) {
 | 
					      if (results?.contains(document.activeElement)) {
 | 
				
			||||||
        anchor.click()
 | 
					        const active = document.activeElement as HTMLInputElement
 | 
				
			||||||
 | 
					        active.click()
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null
 | 
				
			||||||
 | 
					        anchor?.click()
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else if (e.key === "ArrowDown") {
 | 
				
			||||||
 | 
					      e.preventDefault()
 | 
				
			||||||
 | 
					      // When first pressing ArrowDown, results wont contain the active element, so focus first element
 | 
				
			||||||
 | 
					      if (!results?.contains(document.activeElement)) {
 | 
				
			||||||
 | 
					        const firstResult = resultCards[0] as HTMLInputElement | null
 | 
				
			||||||
 | 
					        firstResult?.focus()
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        // If an element in results-container already has focus, focus next one
 | 
				
			||||||
 | 
					        const nextResult = document.activeElement?.nextElementSibling as HTMLInputElement | null
 | 
				
			||||||
 | 
					        nextResult?.focus()
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else if (e.key === "ArrowUp") {
 | 
				
			||||||
 | 
					      e.preventDefault()
 | 
				
			||||||
 | 
					      if (results?.contains(document.activeElement)) {
 | 
				
			||||||
 | 
					        // If an element in results-container already has focus, focus previous one
 | 
				
			||||||
 | 
					        const prevResult = document.activeElement?.previousElementSibling as HTMLInputElement | null
 | 
				
			||||||
 | 
					        prevResult?.focus()
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue