@@ -22,6 +22,9 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
22
22
23
23
wrapper.appendChild(resultA)
24
24
wrapper.appendChild(location)
25
+ wrapper.addEventListener(" mouseover" , {
26
+ case e : MouseEvent => handleHover(wrapper)
27
+ })
25
28
wrapper
26
29
27
30
def handleNewQuery (query : String ) =
@@ -52,7 +55,10 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
52
55
if (document.body.contains(rootDiv)) {
53
56
document.body.removeChild(rootDiv)
54
57
}
55
- else document.body.appendChild(rootDiv)
58
+ else {
59
+ document.body.appendChild(rootDiv)
60
+ input.focus()
61
+ }
56
62
57
63
val element = createNestingDiv(" search-content" )(
58
64
createNestingDiv(" search-container" )(
@@ -69,6 +75,7 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
69
75
val element = document.createElement(" input" ).asInstanceOf [html.Input ]
70
76
element.id = " scaladoc-searchbar-input"
71
77
element.addEventListener(" input" , (e) => handleNewQuery(e.target.asInstanceOf [html.Input ].value))
78
+ element.autocomplete = " off"
72
79
element
73
80
74
81
private val resultsDiv : html.Div =
@@ -94,9 +101,58 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
94
101
document.body.removeChild(element)
95
102
}
96
103
)
97
- element.id = " scaladoc-searchbar"
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
+ })
110
+ element.id = " scala3doc-searchbar"
98
111
element.appendChild(input)
99
112
element.appendChild(resultsDiv)
100
113
element
101
114
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
+
102
158
handleNewQuery(" " )
0 commit comments