@vaadin/vaadin-overlay 23.0.8 → 23.0.11

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/vaadin-overlay",
3
- "version": "23.0.8",
3
+ "version": "23.0.11",
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.8",
39
- "@vaadin/vaadin-lumo-styles": "^23.0.8",
40
- "@vaadin/vaadin-material-styles": "^23.0.8",
41
- "@vaadin/vaadin-themable-mixin": "^23.0.8"
38
+ "@vaadin/component-base": "^23.0.11",
39
+ "@vaadin/vaadin-lumo-styles": "^23.0.11",
40
+ "@vaadin/vaadin-material-styles": "^23.0.11",
41
+ "@vaadin/vaadin-themable-mixin": "^23.0.11"
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.8",
47
- "@vaadin/radio-group": "^23.0.8",
46
+ "@vaadin/button": "^23.0.11",
47
+ "@vaadin/radio-group": "^23.0.11",
48
48
  "@vaadin/testing-helpers": "^0.3.2",
49
- "@vaadin/text-field": "^23.0.8",
49
+ "@vaadin/text-field": "^23.0.11",
50
50
  "lit": "^2.0.0",
51
51
  "sinon": "^9.2.1"
52
52
  },
53
- "gitHead": "43fe9d95c8cd745adc7bef214c0097c47f4f83ed"
53
+ "gitHead": "10838304fe6f5c98b838ec3a90bdcf49cbf4650b"
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(positionTarget, horizontalAlign, verticalAlign, noHorizontalOverlap, noVerticalOverlap)',
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.__boundUpdatePosition = this._updatePosition.bind(this);
91
+ this._updatePosition = this._updatePosition.bind(this);
91
92
  }
92
93
 
93
- __overlayOpenedChanged(opened) {
94
- // Toggle the event listeners that cause the overlay to update its position
95
- ['scroll', 'resize'].forEach((eventName) => {
96
- if (opened) {
97
- window.addEventListener(eventName, this.__boundUpdatePosition);
98
- } else {
99
- window.removeEventListener(eventName, this.__boundUpdatePosition);
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
  };
@@ -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
 
@@ -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.__focusTrapController.releaseFocus();
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