@@ -49,6 +49,7 @@ export class FilterableTreeViewElement extends HTMLElement {
4949 this . addEventListener ( 'treeViewNodeChecked' , this , { signal} )
5050 this . addEventListener ( 'itemActivated' , this , { signal} )
5151 this . addEventListener ( 'input' , this , { signal} )
52+ this . addEventListener ( 'keydown' , this , { signal} )
5253
5354 if ( this . #isAsyncMode) {
5455 void this . #fetchAndReplaceTree( )
@@ -77,11 +78,17 @@ export class FilterableTreeViewElement extends HTMLElement {
7778 if ( event . target === this . filterModeControl ) {
7879 this . #handleFilterModeEvent( event )
7980 } else if ( event . target === this . filterInput ) {
80- this . #handleFilterInputEvent( event )
81+ if ( event . type === 'keydown' ) {
82+ this . #handleFilterInputKeyDown( event as KeyboardEvent )
83+ } else {
84+ this . #handleFilterInputEvent( event )
85+ }
8186 } else if ( event . target === this . includeSubItemsCheckBox ) {
8287 this . #handleIncludeSubItemsCheckBoxEvent( event )
8388 } else if ( event . target instanceof TreeViewElement || event . target instanceof TreeViewSubTreeNodeElement ) {
8489 this . #handleTreeViewEvent( event )
90+ } else if ( event . type === 'keydown' && this . treeViewList ?. contains ( event . target as Node ) ) {
91+ this . #handleTreeKeyDown( event as KeyboardEvent )
8592 }
8693 }
8794
@@ -231,6 +238,27 @@ export class FilterableTreeViewElement extends HTMLElement {
231238 }
232239 }
233240
241+ #handleFilterInputKeyDown( event : KeyboardEvent ) {
242+ if ( event . key !== 'ArrowDown' && event . key !== 'ArrowUp' ) return
243+
244+ const treeitems = [ ...( this . treeViewList ?. querySelectorAll < HTMLElement > ( '[role=treeitem]' ) ?? [ ] ) ]
245+ const visibleItems = treeitems . filter (
246+ item => ! item . closest ( 'li[hidden]' ) && ! item . closest ( 'tree-view-sub-tree-node[hidden]' ) ,
247+ )
248+
249+ if ( visibleItems . length === 0 ) return
250+
251+ event . preventDefault ( )
252+ const focusTarget = event . key === 'ArrowDown' ? visibleItems [ 0 ] : visibleItems [ visibleItems . length - 1 ]
253+ focusTarget . focus ( )
254+ }
255+
256+ #handleTreeKeyDown( event : KeyboardEvent ) {
257+ if ( event . key !== 'Escape' ) return
258+ event . preventDefault ( )
259+ this . filterInput . focus ( )
260+ }
261+
234262 #handleIncludeSubItemsCheckBoxEvent( event : Event ) {
235263 if ( ! this . treeView ) return
236264 if ( event . type !== 'input' ) return
0 commit comments