@@ -4,14 +4,22 @@ import {isDocumentFragmentOrElementNode} from '../utils/dom.ts';
4
4
import octiconKebabHorizontal from '../../../public/assets/img/svg/octicon-kebab-horizontal.svg' ;
5
5
6
6
window . customElements . define ( 'overflow-menu' , class extends HTMLElement {
7
+ tippyContent : HTMLDivElement ;
8
+ tippyItems : Array < HTMLElement > ;
9
+ button : HTMLButtonElement ;
10
+ menuItemsEl : HTMLElement ;
11
+ resizeObserver : ResizeObserver ;
12
+ mutationObserver : MutationObserver ;
13
+ lastWidth : number ;
14
+
7
15
updateItems = throttle ( 100 , ( ) => { // eslint-disable-line unicorn/consistent-function-scoping -- https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2088
8
16
if ( ! this . tippyContent ) {
9
17
const div = document . createElement ( 'div' ) ;
10
18
div . classList . add ( 'tippy-target' ) ;
11
19
div . tabIndex = - 1 ; // for initial focus, programmatic focus only
12
20
div . addEventListener ( 'keydown' , ( e ) => {
13
21
if ( e . key === 'Tab' ) {
14
- const items = this . tippyContent . querySelectorAll ( '[role="menuitem"]' ) ;
22
+ const items = this . tippyContent . querySelectorAll < HTMLElement > ( '[role="menuitem"]' ) ;
15
23
if ( e . shiftKey ) {
16
24
if ( document . activeElement === items [ 0 ] ) {
17
25
e . preventDefault ( ) ;
@@ -32,36 +40,36 @@ window.customElements.define('overflow-menu', class extends HTMLElement {
32
40
if ( document . activeElement ?. matches ( '[role="menuitem"]' ) ) {
33
41
e . preventDefault ( ) ;
34
42
e . stopPropagation ( ) ;
35
- document . activeElement . click ( ) ;
43
+ ( document . activeElement as HTMLElement ) . click ( ) ;
36
44
}
37
45
} else if ( e . key === 'ArrowDown' ) {
38
46
if ( document . activeElement ?. matches ( '.tippy-target' ) ) {
39
47
e . preventDefault ( ) ;
40
48
e . stopPropagation ( ) ;
41
- document . activeElement . querySelector ( '[role="menuitem"]:first-of-type' ) . focus ( ) ;
49
+ document . activeElement . querySelector < HTMLElement > ( '[role="menuitem"]:first-of-type' ) . focus ( ) ;
42
50
} else if ( document . activeElement ?. matches ( '[role="menuitem"]' ) ) {
43
51
e . preventDefault ( ) ;
44
52
e . stopPropagation ( ) ;
45
- document . activeElement . nextElementSibling ?. focus ( ) ;
53
+ ( document . activeElement . nextElementSibling as HTMLElement ) ?. focus ( ) ;
46
54
}
47
55
} else if ( e . key === 'ArrowUp' ) {
48
56
if ( document . activeElement ?. matches ( '.tippy-target' ) ) {
49
57
e . preventDefault ( ) ;
50
58
e . stopPropagation ( ) ;
51
- document . activeElement . querySelector ( '[role="menuitem"]:last-of-type' ) . focus ( ) ;
59
+ document . activeElement . querySelector < HTMLElement > ( '[role="menuitem"]:last-of-type' ) . focus ( ) ;
52
60
} else if ( document . activeElement ?. matches ( '[role="menuitem"]' ) ) {
53
61
e . preventDefault ( ) ;
54
62
e . stopPropagation ( ) ;
55
- document . activeElement . previousElementSibling ?. focus ( ) ;
63
+ ( document . activeElement . previousElementSibling as HTMLElement ) ?. focus ( ) ;
56
64
}
57
65
}
58
66
} ) ;
59
67
this . append ( div ) ;
60
68
this . tippyContent = div ;
61
69
}
62
70
63
- const itemFlexSpace = this . menuItemsEl . querySelector ( '.item-flex-space' ) ;
64
- const itemOverFlowMenuButton = this . querySelector ( '.overflow-menu-button' ) ;
71
+ const itemFlexSpace = this . menuItemsEl . querySelector < HTMLSpanElement > ( '.item-flex-space' ) ;
72
+ const itemOverFlowMenuButton = this . querySelector < HTMLButtonElement > ( '.overflow-menu-button' ) ;
65
73
66
74
// move items in tippy back into the menu items for subsequent measurement
67
75
for ( const item of this . tippyItems || [ ] ) {
@@ -78,7 +86,7 @@ window.customElements.define('overflow-menu', class extends HTMLElement {
78
86
itemOverFlowMenuButton ?. style . setProperty ( 'display' , 'none' , 'important' ) ;
79
87
this . tippyItems = [ ] ;
80
88
const menuRight = this . offsetLeft + this . offsetWidth ;
81
- const menuItems = this . menuItemsEl . querySelectorAll ( '.item, .item-flex-space' ) ;
89
+ const menuItems = this . menuItemsEl . querySelectorAll < HTMLElement > ( '.item, .item-flex-space' ) ;
82
90
let afterFlexSpace = false ;
83
91
for ( const item of menuItems ) {
84
92
if ( item . classList . contains ( 'item-flex-space' ) ) {
@@ -189,14 +197,14 @@ window.customElements.define('overflow-menu', class extends HTMLElement {
189
197
// template rendering, wait for its addition.
190
198
// The eslint rule is not sophisticated enough or aware of this problem, see
191
199
// https://github.com/43081j/eslint-plugin-wc/pull/130
192
- const menuItemsEl = this . querySelector ( '.overflow-menu-items' ) ; // eslint-disable-line wc/no-child-traversal-in-connectedcallback
200
+ const menuItemsEl = this . querySelector < HTMLElement > ( '.overflow-menu-items' ) ; // eslint-disable-line wc/no-child-traversal-in-connectedcallback
193
201
if ( menuItemsEl ) {
194
202
this . menuItemsEl = menuItemsEl ;
195
203
this . init ( ) ;
196
204
} else {
197
205
this . mutationObserver = new MutationObserver ( ( mutations ) => {
198
206
for ( const mutation of mutations ) {
199
- for ( const node of mutation . addedNodes ) {
207
+ for ( const node of mutation . addedNodes as NodeListOf < HTMLElement > ) {
200
208
if ( ! isDocumentFragmentOrElementNode ( node ) ) continue ;
201
209
if ( node . classList . contains ( 'overflow-menu-items' ) ) {
202
210
this . menuItemsEl = node ;
0 commit comments