@@ -22,6 +22,9 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
2222
2323 wrapper.appendChild(resultA)
2424 wrapper.appendChild(location)
25+ wrapper.addEventListener(" mouseover" , {
26+ case e : MouseEvent => handleHover(wrapper)
27+ })
2528 wrapper
2629
2730 def handleNewQuery (query : String ) =
@@ -52,7 +55,10 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
5255 if (document.body.contains(rootDiv)) {
5356 document.body.removeChild(rootDiv)
5457 }
55- else document.body.appendChild(rootDiv)
58+ else {
59+ document.body.appendChild(rootDiv)
60+ input.focus()
61+ }
5662
5763 val element = createNestingDiv(" search-content" )(
5864 createNestingDiv(" search-container" )(
@@ -69,6 +75,7 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
6975 val element = document.createElement(" input" ).asInstanceOf [html.Input ]
7076 element.id = " scaladoc-searchbar-input"
7177 element.addEventListener(" input" , (e) => handleNewQuery(e.target.asInstanceOf [html.Input ].value))
78+ element.autocomplete = " off"
7279 element
7380
7481 private val resultsDiv : html.Div =
@@ -94,9 +101,58 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
94101 document.body.removeChild(element)
95102 }
96103 )
104+ element.addEventListener(" keydown" , {
105+ case e : KeyboardEvent =>
106+ if e.keyCode == 40 then handleArrowDown()
107+ else if e.keyCode == 38 then handleArrowUp()
108+ else if e.keyCode == 13 then handleEnter()
109+ })
97110 element.id = " scaladoc-searchbar"
98111 element.appendChild(input)
99112 element.appendChild(resultsDiv)
100113 element
101114
115+ private def handleArrowUp () = {
116+ val selectedElement = resultsDiv.querySelector(" [selected]" )
117+ if selectedElement != null then {
118+ selectedElement.removeAttribute(" selected" )
119+ val sibling = selectedElement.previousElementSibling
120+ if sibling != null then {
121+ sibling.setAttribute(" selected" , " " )
122+ resultsDiv.scrollTop = sibling.asInstanceOf [html.Element ].offsetTop - (2 * sibling.asInstanceOf [html.Element ].clientHeight)
123+ }
124+ }
125+ }
126+ private def handleArrowDown () = {
127+ val selectedElement = resultsDiv.querySelector(" [selected]" )
128+ if selectedElement != null then {
129+ val sibling = selectedElement.nextElementSibling
130+ if sibling != null then {
131+ selectedElement.removeAttribute(" selected" )
132+ sibling.setAttribute(" selected" , " " )
133+ resultsDiv.scrollTop = sibling.asInstanceOf [html.Element ].offsetTop - (2 * sibling.asInstanceOf [html.Element ].clientHeight)
134+ }
135+ } else {
136+ val firstResult = resultsDiv.firstElementChild
137+ if firstResult != null then {
138+ firstResult.setAttribute(" selected" , " " )
139+ resultsDiv.scrollTop = firstResult.asInstanceOf [html.Element ].offsetTop - (2 * firstResult.asInstanceOf [html.Element ].clientHeight)
140+ }
141+ }
142+ }
143+ private def handleEnter () = {
144+ val selectedElement = resultsDiv.querySelector(" [selected] a" ).asInstanceOf [html.Element ]
145+ if selectedElement != null then {
146+ selectedElement.click()
147+ }
148+ }
149+
150+ private def handleHover (elem : html.Element ) = {
151+ val selectedElement = resultsDiv.querySelector(" [selected]" )
152+ if selectedElement != null then {
153+ selectedElement.removeAttribute(" selected" )
154+ }
155+ elem.setAttribute(" selected" ," " )
156+ }
157+
102158 handleNewQuery(" " )
0 commit comments