@vaadin/vaadin-overlay 23.0.9 → 23.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -9
- package/src/vaadin-overlay-position-mixin.js +60 -24
- package/src/vaadin-overlay.d.ts +2 -2
- package/src/vaadin-overlay.js +30 -21
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/vaadin-overlay",
|
|
3
|
-
"version": "23.0.
|
|
3
|
+
"version": "23.0.12",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -35,20 +35,20 @@
|
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@polymer/polymer": "^3.0.0",
|
|
38
|
-
"@vaadin/component-base": "^23.0.
|
|
39
|
-
"@vaadin/vaadin-lumo-styles": "^23.0.
|
|
40
|
-
"@vaadin/vaadin-material-styles": "^23.0.
|
|
41
|
-
"@vaadin/vaadin-themable-mixin": "^23.0.
|
|
38
|
+
"@vaadin/component-base": "^23.0.12",
|
|
39
|
+
"@vaadin/vaadin-lumo-styles": "^23.0.12",
|
|
40
|
+
"@vaadin/vaadin-material-styles": "^23.0.12",
|
|
41
|
+
"@vaadin/vaadin-themable-mixin": "^23.0.12"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@esm-bundle/chai": "^4.3.4",
|
|
45
45
|
"@polymer/iron-overlay-behavior": "^3.0.0",
|
|
46
|
-
"@vaadin/button": "^23.0.
|
|
47
|
-
"@vaadin/radio-group": "^23.0.
|
|
46
|
+
"@vaadin/button": "^23.0.12",
|
|
47
|
+
"@vaadin/radio-group": "^23.0.12",
|
|
48
48
|
"@vaadin/testing-helpers": "^0.3.2",
|
|
49
|
-
"@vaadin/text-field": "^23.0.
|
|
49
|
+
"@vaadin/text-field": "^23.0.12",
|
|
50
50
|
"lit": "^2.0.0",
|
|
51
51
|
"sinon": "^9.2.1"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "717908c222c1e241259e30b4144cd5ba32734819"
|
|
54
54
|
}
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
* Copyright (c) 2017 - 2022 Vaadin Ltd.
|
|
4
4
|
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
5
|
*/
|
|
6
|
+
import { getAncestorRootNodes } from '@vaadin/component-base/src/dom-utils.js';
|
|
6
7
|
|
|
7
8
|
const PROP_NAMES_VERTICAL = {
|
|
8
9
|
start: 'top',
|
|
9
|
-
end: 'bottom'
|
|
10
|
+
end: 'bottom',
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
const PROP_NAMES_HORIZONTAL = {
|
|
13
14
|
start: 'left',
|
|
14
|
-
end: 'right'
|
|
15
|
+
end: 'right',
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
/**
|
|
@@ -29,7 +30,7 @@ export const PositionMixin = (superClass) =>
|
|
|
29
30
|
*/
|
|
30
31
|
positionTarget: {
|
|
31
32
|
type: Object,
|
|
32
|
-
value: null
|
|
33
|
+
value: null,
|
|
33
34
|
},
|
|
34
35
|
|
|
35
36
|
/**
|
|
@@ -42,7 +43,7 @@ export const PositionMixin = (superClass) =>
|
|
|
42
43
|
*/
|
|
43
44
|
horizontalAlign: {
|
|
44
45
|
type: String,
|
|
45
|
-
value: 'start'
|
|
46
|
+
value: 'start',
|
|
46
47
|
},
|
|
47
48
|
|
|
48
49
|
/**
|
|
@@ -54,7 +55,7 @@ export const PositionMixin = (superClass) =>
|
|
|
54
55
|
*/
|
|
55
56
|
verticalAlign: {
|
|
56
57
|
type: String,
|
|
57
|
-
value: 'top'
|
|
58
|
+
value: 'top',
|
|
58
59
|
},
|
|
59
60
|
|
|
60
61
|
/**
|
|
@@ -63,7 +64,7 @@ export const PositionMixin = (superClass) =>
|
|
|
63
64
|
*/
|
|
64
65
|
noHorizontalOverlap: {
|
|
65
66
|
type: Boolean,
|
|
66
|
-
value: false
|
|
67
|
+
value: false,
|
|
67
68
|
},
|
|
68
69
|
|
|
69
70
|
/**
|
|
@@ -72,33 +73,68 @@ export const PositionMixin = (superClass) =>
|
|
|
72
73
|
*/
|
|
73
74
|
noVerticalOverlap: {
|
|
74
75
|
type: Boolean,
|
|
75
|
-
value: false
|
|
76
|
-
}
|
|
76
|
+
value: false,
|
|
77
|
+
},
|
|
77
78
|
};
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
static get observers() {
|
|
81
82
|
return [
|
|
82
|
-
'__positionSettingsChanged(
|
|
83
|
-
'__overlayOpenedChanged(opened)'
|
|
83
|
+
'__positionSettingsChanged(horizontalAlign, verticalAlign, noHorizontalOverlap, noVerticalOverlap)',
|
|
84
|
+
'__overlayOpenedChanged(opened, positionTarget)',
|
|
84
85
|
];
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
constructor() {
|
|
88
89
|
super();
|
|
89
90
|
|
|
90
|
-
this.
|
|
91
|
+
this._updatePosition = this._updatePosition.bind(this);
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
94
|
+
/** @protected */
|
|
95
|
+
connectedCallback() {
|
|
96
|
+
super.connectedCallback();
|
|
97
|
+
|
|
98
|
+
if (this.opened) {
|
|
99
|
+
this.__addUpdatePositionEventListeners();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** @protected */
|
|
104
|
+
disconnectedCallback() {
|
|
105
|
+
super.disconnectedCallback();
|
|
106
|
+
this.__removeUpdatePositionEventListeners();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** @private */
|
|
110
|
+
__addUpdatePositionEventListeners() {
|
|
111
|
+
window.addEventListener('resize', this._updatePosition);
|
|
112
|
+
|
|
113
|
+
this.__positionTargetAncestorRootNodes = getAncestorRootNodes(this.positionTarget);
|
|
114
|
+
this.__positionTargetAncestorRootNodes.forEach((node) => {
|
|
115
|
+
node.addEventListener('scroll', this._updatePosition, true);
|
|
101
116
|
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** @private */
|
|
120
|
+
__removeUpdatePositionEventListeners() {
|
|
121
|
+
window.removeEventListener('resize', this._updatePosition);
|
|
122
|
+
|
|
123
|
+
if (this.__positionTargetAncestorRootNodes) {
|
|
124
|
+
this.__positionTargetAncestorRootNodes.forEach((node) => {
|
|
125
|
+
node.removeEventListener('scroll', this._updatePosition, true);
|
|
126
|
+
});
|
|
127
|
+
this.__positionTargetAncestorRootNodes = null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @private */
|
|
132
|
+
__overlayOpenedChanged(opened, positionTarget) {
|
|
133
|
+
this.__removeUpdatePositionEventListeners();
|
|
134
|
+
|
|
135
|
+
if (opened && positionTarget) {
|
|
136
|
+
this.__addUpdatePositionEventListeners();
|
|
137
|
+
}
|
|
102
138
|
|
|
103
139
|
if (opened) {
|
|
104
140
|
const computedStyle = getComputedStyle(this);
|
|
@@ -150,7 +186,7 @@ export const PositionMixin = (superClass) =>
|
|
|
150
186
|
this.noVerticalOverlap,
|
|
151
187
|
PROP_NAMES_VERTICAL,
|
|
152
188
|
this,
|
|
153
|
-
shouldAlignStartVertically
|
|
189
|
+
shouldAlignStartVertically,
|
|
154
190
|
);
|
|
155
191
|
|
|
156
192
|
// Obtain horizontal positioning properties
|
|
@@ -160,7 +196,7 @@ export const PositionMixin = (superClass) =>
|
|
|
160
196
|
this.noHorizontalOverlap,
|
|
161
197
|
PROP_NAMES_HORIZONTAL,
|
|
162
198
|
this,
|
|
163
|
-
shouldAlignStartHorizontally
|
|
199
|
+
shouldAlignStartHorizontally,
|
|
164
200
|
);
|
|
165
201
|
|
|
166
202
|
// Apply the positioning properties to the overlay
|
|
@@ -189,7 +225,7 @@ export const PositionMixin = (superClass) =>
|
|
|
189
225
|
this.__margins,
|
|
190
226
|
defaultAlignLeft,
|
|
191
227
|
this.noHorizontalOverlap,
|
|
192
|
-
PROP_NAMES_HORIZONTAL
|
|
228
|
+
PROP_NAMES_HORIZONTAL,
|
|
193
229
|
);
|
|
194
230
|
}
|
|
195
231
|
|
|
@@ -209,7 +245,7 @@ export const PositionMixin = (superClass) =>
|
|
|
209
245
|
this.__margins,
|
|
210
246
|
defaultAlignTop,
|
|
211
247
|
this.noVerticalOverlap,
|
|
212
|
-
PROP_NAMES_VERTICAL
|
|
248
|
+
PROP_NAMES_VERTICAL,
|
|
213
249
|
);
|
|
214
250
|
}
|
|
215
251
|
|
|
@@ -245,7 +281,7 @@ export const PositionMixin = (superClass) =>
|
|
|
245
281
|
|
|
246
282
|
return {
|
|
247
283
|
[cssPropNameToSet]: currentValue + diff * (shouldAlignStart ? -1 : 1) + 'px',
|
|
248
|
-
[cssPropNameToClear]: ''
|
|
284
|
+
[cssPropNameToClear]: '',
|
|
249
285
|
};
|
|
250
286
|
}
|
|
251
287
|
};
|
package/src/vaadin-overlay.d.ts
CHANGED
|
@@ -232,13 +232,13 @@ declare class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(HTML
|
|
|
232
232
|
addEventListener<K extends keyof OverlayEventMap>(
|
|
233
233
|
type: K,
|
|
234
234
|
listener: (this: OverlayElement, ev: OverlayEventMap[K]) => void,
|
|
235
|
-
options?: boolean | AddEventListenerOptions
|
|
235
|
+
options?: boolean | AddEventListenerOptions,
|
|
236
236
|
): void;
|
|
237
237
|
|
|
238
238
|
removeEventListener<K extends keyof OverlayEventMap>(
|
|
239
239
|
type: K,
|
|
240
240
|
listener: (this: OverlayElement, ev: OverlayEventMap[K]) => void,
|
|
241
|
-
options?: boolean | EventListenerOptions
|
|
241
|
+
options?: boolean | EventListenerOptions,
|
|
242
242
|
): void;
|
|
243
243
|
}
|
|
244
244
|
|
package/src/vaadin-overlay.js
CHANGED
|
@@ -194,7 +194,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
194
194
|
type: Boolean,
|
|
195
195
|
notify: true,
|
|
196
196
|
observer: '_openedChanged',
|
|
197
|
-
reflectToAttribute: true
|
|
197
|
+
reflectToAttribute: true,
|
|
198
198
|
},
|
|
199
199
|
|
|
200
200
|
/**
|
|
@@ -220,7 +220,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
220
220
|
*/
|
|
221
221
|
template: {
|
|
222
222
|
type: Object,
|
|
223
|
-
notify: true
|
|
223
|
+
notify: true,
|
|
224
224
|
},
|
|
225
225
|
|
|
226
226
|
/**
|
|
@@ -229,7 +229,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
229
229
|
*/
|
|
230
230
|
content: {
|
|
231
231
|
type: Object,
|
|
232
|
-
notify: true
|
|
232
|
+
notify: true,
|
|
233
233
|
},
|
|
234
234
|
|
|
235
235
|
/**
|
|
@@ -239,7 +239,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
239
239
|
withBackdrop: {
|
|
240
240
|
type: Boolean,
|
|
241
241
|
value: false,
|
|
242
|
-
reflectToAttribute: true
|
|
242
|
+
reflectToAttribute: true,
|
|
243
243
|
},
|
|
244
244
|
|
|
245
245
|
/**
|
|
@@ -256,7 +256,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
256
256
|
type: Boolean,
|
|
257
257
|
value: false,
|
|
258
258
|
reflectToAttribute: true,
|
|
259
|
-
observer: '_modelessChanged'
|
|
259
|
+
observer: '_modelessChanged',
|
|
260
260
|
},
|
|
261
261
|
|
|
262
262
|
/**
|
|
@@ -267,7 +267,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
267
267
|
hidden: {
|
|
268
268
|
type: Boolean,
|
|
269
269
|
reflectToAttribute: true,
|
|
270
|
-
observer: '_hiddenChanged'
|
|
270
|
+
observer: '_hiddenChanged',
|
|
271
271
|
},
|
|
272
272
|
|
|
273
273
|
/**
|
|
@@ -277,7 +277,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
277
277
|
*/
|
|
278
278
|
focusTrap: {
|
|
279
279
|
type: Boolean,
|
|
280
|
-
value: false
|
|
280
|
+
value: false,
|
|
281
281
|
},
|
|
282
282
|
|
|
283
283
|
/**
|
|
@@ -286,7 +286,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
286
286
|
*/
|
|
287
287
|
restoreFocusOnClose: {
|
|
288
288
|
type: Boolean,
|
|
289
|
-
value: false
|
|
289
|
+
value: false,
|
|
290
290
|
},
|
|
291
291
|
|
|
292
292
|
/**
|
|
@@ -295,22 +295,22 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
295
295
|
* @type {HTMLElement}
|
|
296
296
|
*/
|
|
297
297
|
restoreFocusNode: {
|
|
298
|
-
type: HTMLElement
|
|
298
|
+
type: HTMLElement,
|
|
299
299
|
},
|
|
300
300
|
|
|
301
301
|
/** @private */
|
|
302
302
|
_mouseDownInside: {
|
|
303
|
-
type: Boolean
|
|
303
|
+
type: Boolean,
|
|
304
304
|
},
|
|
305
305
|
|
|
306
306
|
/** @private */
|
|
307
307
|
_mouseUpInside: {
|
|
308
|
-
type: Boolean
|
|
308
|
+
type: Boolean,
|
|
309
309
|
},
|
|
310
310
|
|
|
311
311
|
/** @private */
|
|
312
312
|
_instance: {
|
|
313
|
-
type: Object
|
|
313
|
+
type: Object,
|
|
314
314
|
},
|
|
315
315
|
|
|
316
316
|
/** @private */
|
|
@@ -332,7 +332,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
332
332
|
_oldRenderer: Object,
|
|
333
333
|
|
|
334
334
|
/** @private */
|
|
335
|
-
_oldOpened: Boolean
|
|
335
|
+
_oldOpened: Boolean,
|
|
336
336
|
};
|
|
337
337
|
}
|
|
338
338
|
|
|
@@ -416,7 +416,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
416
416
|
var evt = new CustomEvent('vaadin-overlay-close', {
|
|
417
417
|
bubbles: true,
|
|
418
418
|
cancelable: true,
|
|
419
|
-
detail: { sourceEvent: sourceEvent }
|
|
419
|
+
detail: { sourceEvent: sourceEvent },
|
|
420
420
|
});
|
|
421
421
|
this.dispatchEvent(evt);
|
|
422
422
|
if (!evt.defaultPrevented) {
|
|
@@ -495,7 +495,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
495
495
|
const evt = new CustomEvent('vaadin-overlay-outside-click', {
|
|
496
496
|
bubbles: true,
|
|
497
497
|
cancelable: true,
|
|
498
|
-
detail: { sourceEvent: event }
|
|
498
|
+
detail: { sourceEvent: event },
|
|
499
499
|
});
|
|
500
500
|
this.dispatchEvent(evt);
|
|
501
501
|
|
|
@@ -515,11 +515,16 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
515
515
|
return;
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
+
// Only close modeless overlay on Esc press when it contains focus
|
|
519
|
+
if (this.modeless && !event.composedPath().includes(this.$.overlay)) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
|
|
518
523
|
if (event.key === 'Escape') {
|
|
519
524
|
const evt = new CustomEvent('vaadin-overlay-escape-press', {
|
|
520
525
|
bubbles: true,
|
|
521
526
|
cancelable: true,
|
|
522
|
-
detail: { sourceEvent: event }
|
|
527
|
+
detail: { sourceEvent: event },
|
|
523
528
|
});
|
|
524
529
|
this.dispatchEvent(evt);
|
|
525
530
|
|
|
@@ -559,14 +564,20 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
559
564
|
this.dispatchEvent(evt);
|
|
560
565
|
});
|
|
561
566
|
|
|
567
|
+
document.addEventListener('keydown', this._boundKeydownListener);
|
|
568
|
+
|
|
562
569
|
if (!this.modeless) {
|
|
563
570
|
this._addGlobalListeners();
|
|
564
571
|
}
|
|
565
572
|
} else if (wasOpened) {
|
|
566
|
-
this.
|
|
573
|
+
if (this.focusTrap) {
|
|
574
|
+
this.__focusTrapController.releaseFocus();
|
|
575
|
+
}
|
|
567
576
|
|
|
568
577
|
this._animatedClosing();
|
|
569
578
|
|
|
579
|
+
document.removeEventListener('keydown', this._boundKeydownListener);
|
|
580
|
+
|
|
570
581
|
if (!this.modeless) {
|
|
571
582
|
this._removeGlobalListeners();
|
|
572
583
|
}
|
|
@@ -753,7 +764,6 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
753
764
|
// Firefox leaks click to document on contextmenu even if prevented
|
|
754
765
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=990614
|
|
755
766
|
document.documentElement.addEventListener('click', this._boundOutsideClickListener, true);
|
|
756
|
-
document.addEventListener('keydown', this._boundKeydownListener);
|
|
757
767
|
}
|
|
758
768
|
|
|
759
769
|
/** @protected */
|
|
@@ -778,7 +788,6 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
778
788
|
document.removeEventListener('mousedown', this._boundMouseDownListener);
|
|
779
789
|
document.removeEventListener('mouseup', this._boundMouseUpListener);
|
|
780
790
|
document.documentElement.removeEventListener('click', this._boundOutsideClickListener, true);
|
|
781
|
-
document.removeEventListener('keydown', this._boundKeydownListener);
|
|
782
791
|
}
|
|
783
792
|
|
|
784
793
|
/** @protected */
|
|
@@ -846,7 +855,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
846
855
|
if (this._instance) {
|
|
847
856
|
this._instance.forwardHostProp(prop, value);
|
|
848
857
|
}
|
|
849
|
-
}
|
|
858
|
+
},
|
|
850
859
|
});
|
|
851
860
|
}
|
|
852
861
|
|
|
@@ -862,7 +871,7 @@ class OverlayElement extends ThemableMixin(DirMixin(ControllerMixin(PolymerEleme
|
|
|
862
871
|
|
|
863
872
|
let scopeCssText = Array.from(templateRoot.querySelectorAll('style')).reduce(
|
|
864
873
|
(result, style) => result + style.textContent,
|
|
865
|
-
''
|
|
874
|
+
'',
|
|
866
875
|
);
|
|
867
876
|
|
|
868
877
|
// The overlay root’s :host styles should not apply inside the overlay
|