@@ -25,8 +25,9 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
25
25
*/
26
26
isOpen : boolean ;
27
27
28
+ static _taptargets : TapTarget [ ] ;
28
29
private wrapper : HTMLElement ;
29
- private _origin : HTMLElement ;
30
+ // private _origin: HTMLElement;
30
31
private originEl : HTMLElement ;
31
32
private waveEl : HTMLElement & Element & Node ;
32
33
private contentEl : HTMLElement ;
@@ -42,10 +43,14 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
42
43
43
44
this . isOpen = false ;
44
45
// setup
45
- this . _origin = document . querySelector ( `#${ el . dataset . target } ` ) ;
46
+ this . originEl = document . querySelector ( `#${ el . dataset . target } ` ) ;
47
+ this . originEl . tabIndex = 0 ;
48
+
46
49
this . _setup ( ) ;
47
50
this . _calculatePositioning ( ) ;
48
51
this . _setupEventHandlers ( ) ;
52
+
53
+ TapTarget . _taptargets . push ( this ) ;
49
54
}
50
55
51
56
static get defaults ( ) : TapTargetOptions {
@@ -80,48 +85,65 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
80
85
destroy ( ) {
81
86
this . _removeEventHandlers ( ) ;
82
87
( this . el as any ) . TapTarget = undefined ;
88
+ const index = TapTarget . _taptargets . indexOf ( this ) ;
89
+ if ( index >= 0 ) {
90
+ TapTarget . _taptargets . splice ( index , 1 ) ;
91
+ }
83
92
}
84
93
85
94
_setupEventHandlers ( ) {
86
- this . el . addEventListener ( 'click' , this . _handleTargetClick ) ;
87
- this . originEl . addEventListener ( 'click' , this . _handleOriginClick ) ;
95
+ this . originEl . addEventListener ( 'click' , this . _handleTargetToggle ) ;
96
+ this . originEl . addEventListener ( 'keypress' , this . _handleKeyboardInteraction , true ) ;
97
+ // this.originEl.addEventListener('click', this._handleOriginClick);
88
98
// Resize
89
99
window . addEventListener ( 'resize' , this . _handleThrottledResize ) ;
90
100
}
91
101
92
102
_removeEventHandlers ( ) {
93
- this . el . removeEventListener ( 'click' , this . _handleTargetClick ) ;
94
- this . originEl . removeEventListener ( 'click' , this . _handleOriginClick ) ;
103
+ this . originEl . removeEventListener ( 'click' , this . _handleTargetToggle ) ;
104
+ this . originEl . removeEventListener ( 'keypress' , this . _handleKeyboardInteraction , true ) ;
105
+ // this.originEl.removeEventListener('click', this._handleOriginClick);
95
106
window . removeEventListener ( 'resize' , this . _handleThrottledResize ) ;
96
107
}
97
108
98
109
_handleThrottledResize : ( ) => void = Utils . throttle ( function ( ) { this . _handleResize ( ) ; } , 200 ) . bind ( this ) ;
99
110
100
- _handleTargetClick = ( ) => {
101
- this . open ( ) ;
111
+ _handleKeyboardInteraction = ( e : KeyboardEvent ) => {
112
+ if ( Utils . keys . ENTER . includes ( e . key ) ) {
113
+ this . _handleTargetToggle ( ) ;
114
+ }
102
115
}
103
116
104
- _handleOriginClick = ( ) => {
105
- this . close ( ) ;
117
+ _handleTargetToggle = ( ) => {
118
+ ! this . isOpen ? this . open ( ) : this . close ( ) ;
106
119
}
107
120
121
+ /*_handleOriginClick = () => {
122
+ this.close();
123
+ }*/
124
+
108
125
_handleResize = ( ) => {
109
126
this . _calculatePositioning ( ) ;
110
127
}
111
128
112
- _handleDocumentClick = ( e : MouseEvent | TouchEvent ) => {
113
- if ( ! ( e . target as HTMLElement ) . closest ( '.tap-target-wrapper' ) ) {
129
+ _handleDocumentClick = ( e : MouseEvent | TouchEvent | KeyboardEvent ) => {
130
+ if (
131
+ ( e . target as HTMLElement ) . closest ( `#${ this . el . dataset . target } ` ) !== this . originEl &&
132
+ ! ( e . target as HTMLElement ) . closest ( '.tap-target-wrapper' )
133
+ ) {
114
134
this . close ( ) ;
115
- e . preventDefault ( ) ;
116
- e . stopPropagation ( ) ;
135
+ // e.preventDefault();
136
+ // e.stopPropagation();
117
137
}
118
138
}
119
139
120
140
_setup ( ) {
121
141
// Creating tap target
122
142
this . wrapper = this . el . parentElement ;
123
143
this . waveEl = this . wrapper . querySelector ( '.tap-target-wave' ) ;
124
- this . originEl = this . wrapper . querySelector ( '.tap-target-origin' ) ;
144
+ this . el . parentElement . ariaExpanded = 'false' ;
145
+ this . originEl . style . zIndex = '1002' ;
146
+ // this.originEl = this.wrapper.querySelector('.tap-target-origin');
125
147
this . contentEl = this . el . querySelector ( '.tap-target-content' ) ;
126
148
// Creating wrapper
127
149
if ( ! this . wrapper . classList . contains ( '.tap-target-wrapper' ) ) {
@@ -141,13 +163,13 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
141
163
this . waveEl = document . createElement ( 'div' ) ;
142
164
this . waveEl . classList . add ( 'tap-target-wave' ) ;
143
165
// Creating origin
144
- if ( ! this . originEl ) {
166
+ /* if (!this.originEl) {
145
167
this.originEl = <HTMLElement>this._origin.cloneNode(true); // .clone(true, true);
146
168
this.originEl.classList.add('tap-target-origin');
147
169
this.originEl.removeAttribute('id');
148
170
this.originEl.removeAttribute('style');
149
171
this.waveEl.append(this.originEl);
150
- }
172
+ }*/
151
173
this . wrapper . append ( this . waveEl ) ;
152
174
}
153
175
}
@@ -163,10 +185,10 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
163
185
164
186
_calculatePositioning ( ) {
165
187
// Element or parent is fixed position?
166
- let isFixed = getComputedStyle ( this . _origin ) . position === 'fixed' ;
188
+ let isFixed = getComputedStyle ( this . originEl ) . position === 'fixed' ;
167
189
if ( ! isFixed ) {
168
190
169
- let currentElem : any = this . _origin ;
191
+ let currentElem : any = this . originEl ;
170
192
const parents = [ ] ;
171
193
while ( ( currentElem = currentElem . parentNode ) && currentElem !== document )
172
194
parents . push ( currentElem ) ;
@@ -177,10 +199,10 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
177
199
}
178
200
}
179
201
// Calculating origin
180
- const originWidth = this . _origin . offsetWidth ;
181
- const originHeight = this . _origin . offsetHeight ;
182
- const originTop = isFixed ? this . _offset ( this . _origin ) . top - Utils . getDocumentScrollTop ( ) : this . _offset ( this . _origin ) . top ;
183
- const originLeft = isFixed ? this . _offset ( this . _origin ) . left - Utils . getDocumentScrollLeft ( ) : this . _offset ( this . _origin ) . left ;
202
+ const originWidth = this . originEl . offsetWidth ;
203
+ const originHeight = this . originEl . offsetHeight ;
204
+ const originTop = isFixed ? this . _offset ( this . originEl ) . top - Utils . getDocumentScrollTop ( ) : this . _offset ( this . originEl ) . top ;
205
+ const originLeft = isFixed ? this . _offset ( this . originEl ) . left - Utils . getDocumentScrollLeft ( ) : this . _offset ( this . originEl ) . left ;
184
206
185
207
// Calculating screen
186
208
const windowWidth = window . innerWidth ;
@@ -248,11 +270,13 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
248
270
if ( this . isOpen ) return ;
249
271
// onOpen callback
250
272
if ( typeof this . options . onOpen === 'function' ) {
251
- this . options . onOpen . call ( this , this . _origin ) ;
273
+ this . options . onOpen . call ( this , this . originEl ) ;
252
274
}
253
275
this . isOpen = true ;
254
276
this . wrapper . classList . add ( 'open' ) ;
277
+ this . wrapper . ariaExpanded = 'true'
255
278
document . body . addEventListener ( 'click' , this . _handleDocumentClick , true ) ;
279
+ document . body . addEventListener ( 'keypress' , this . _handleDocumentClick , true ) ;
256
280
document . body . addEventListener ( 'touchend' , this . _handleDocumentClick ) ;
257
281
} ;
258
282
@@ -263,11 +287,17 @@ export class TapTarget extends Component<TapTargetOptions> implements Openable {
263
287
if ( ! this . isOpen ) return ;
264
288
// onClose callback
265
289
if ( typeof this . options . onClose === 'function' ) {
266
- this . options . onClose . call ( this , this . _origin ) ;
290
+ this . options . onClose . call ( this , this . originEl ) ;
267
291
}
268
292
this . isOpen = false ;
269
293
this . wrapper . classList . remove ( 'open' ) ;
294
+ this . wrapper . ariaExpanded = 'false'
270
295
document . body . removeEventListener ( 'click' , this . _handleDocumentClick , true ) ;
296
+ document . body . removeEventListener ( 'keypress' , this . _handleDocumentClick , true ) ;
271
297
document . body . removeEventListener ( 'touchend' , this . _handleDocumentClick ) ;
272
298
} ;
299
+
300
+ static {
301
+ TapTarget . _taptargets = [ ] ;
302
+ }
273
303
}
0 commit comments