@vaadin/vaadin-overlay 23.3.0-alpha1 → 23.3.0-alpha3

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.3.0-alpha1",
3
+ "version": "23.3.0-alpha3",
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.3.0-alpha1",
39
- "@vaadin/vaadin-lumo-styles": "23.3.0-alpha1",
40
- "@vaadin/vaadin-material-styles": "23.3.0-alpha1",
41
- "@vaadin/vaadin-themable-mixin": "23.3.0-alpha1"
38
+ "@vaadin/component-base": "23.3.0-alpha3",
39
+ "@vaadin/vaadin-lumo-styles": "23.3.0-alpha3",
40
+ "@vaadin/vaadin-material-styles": "23.3.0-alpha3",
41
+ "@vaadin/vaadin-themable-mixin": "23.3.0-alpha3"
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.3.0-alpha1",
47
- "@vaadin/radio-group": "23.3.0-alpha1",
46
+ "@vaadin/button": "23.3.0-alpha3",
47
+ "@vaadin/radio-group": "23.3.0-alpha3",
48
48
  "@vaadin/testing-helpers": "^0.3.2",
49
- "@vaadin/text-field": "23.3.0-alpha1",
49
+ "@vaadin/text-field": "23.3.0-alpha3",
50
50
  "lit": "^2.0.0",
51
51
  "sinon": "^13.0.2"
52
52
  },
53
- "gitHead": "beabc527d4b1274eb798ff701d406fed45cfe638"
53
+ "gitHead": "e86cd2abf3e28bade37711291331415d92c454ec"
54
54
  }
@@ -98,6 +98,7 @@ export const PositionMixin = (superClass) =>
98
98
  constructor() {
99
99
  super();
100
100
 
101
+ this.__onScroll = this.__onScroll.bind(this);
101
102
  this._updatePosition = this._updatePosition.bind(this);
102
103
  }
103
104
 
@@ -122,7 +123,7 @@ export const PositionMixin = (superClass) =>
122
123
 
123
124
  this.__positionTargetAncestorRootNodes = getAncestorRootNodes(this.positionTarget);
124
125
  this.__positionTargetAncestorRootNodes.forEach((node) => {
125
- node.addEventListener('scroll', this._updatePosition, true);
126
+ node.addEventListener('scroll', this.__onScroll, true);
126
127
  });
127
128
  }
128
129
 
@@ -132,7 +133,7 @@ export const PositionMixin = (superClass) =>
132
133
 
133
134
  if (this.__positionTargetAncestorRootNodes) {
134
135
  this.__positionTargetAncestorRootNodes.forEach((node) => {
135
- node.removeEventListener('scroll', this._updatePosition, true);
136
+ node.removeEventListener('scroll', this.__onScroll, true);
136
137
  });
137
138
  this.__positionTargetAncestorRootNodes = null;
138
139
  }
@@ -177,6 +178,14 @@ export const PositionMixin = (superClass) =>
177
178
  this._updatePosition();
178
179
  }
179
180
 
181
+ /** @private */
182
+ __onScroll(e) {
183
+ // If the scroll event occurred inside the overlay, ignore it.
184
+ if (!this.contains(e.target)) {
185
+ this._updatePosition();
186
+ }
187
+ }
188
+
180
189
  _updatePosition() {
181
190
  if (!this.positionTarget || !this.opened) {
182
191
  return;
@@ -281,9 +290,47 @@ export const PositionMixin = (superClass) =>
281
290
  return defaultAlignStart === shouldGoToDefaultSide;
282
291
  }
283
292
 
293
+ /**
294
+ * Returns an adjusted value after resizing the browser window,
295
+ * to avoid wrong calculations when e.g. previously set `bottom`
296
+ * CSS property value is larger than the updated viewport height.
297
+ * See https://github.com/vaadin/web-components/issues/4604
298
+ */
299
+ __adjustBottomProperty(cssPropNameToSet, propNames, currentValue) {
300
+ let adjustedProp;
301
+
302
+ if (cssPropNameToSet === propNames.end) {
303
+ // Adjust horizontally
304
+ if (propNames.end === PROP_NAMES_VERTICAL.end) {
305
+ const viewportHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);
306
+
307
+ if (currentValue > viewportHeight && this.__oldViewportHeight) {
308
+ const heightDiff = this.__oldViewportHeight - viewportHeight;
309
+ adjustedProp = currentValue - heightDiff;
310
+ }
311
+
312
+ this.__oldViewportHeight = viewportHeight;
313
+ }
314
+
315
+ // Adjust vertically
316
+ if (propNames.end === PROP_NAMES_HORIZONTAL.end) {
317
+ const viewportWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);
318
+
319
+ if (currentValue > viewportWidth && this.__oldViewportWidth) {
320
+ const widthDiff = this.__oldViewportWidth - viewportWidth;
321
+ adjustedProp = currentValue - widthDiff;
322
+ }
323
+
324
+ this.__oldViewportWidth = viewportWidth;
325
+ }
326
+ }
327
+
328
+ return adjustedProp;
329
+ }
330
+
284
331
  /**
285
332
  * Returns an object with CSS position properties to set,
286
- * e.g. { top: "100px", bottom: "" }
333
+ * e.g. { top: "100px" }
287
334
  */
288
335
  // eslint-disable-next-line max-params
289
336
  __calculatePositionInOneDimension(targetRect, overlayRect, noOverlap, propNames, overlay, shouldAlignStart) {
@@ -291,13 +338,18 @@ export const PositionMixin = (superClass) =>
291
338
  const cssPropNameToClear = shouldAlignStart ? propNames.end : propNames.start;
292
339
 
293
340
  const currentValue = parseFloat(overlay.style[cssPropNameToSet] || getComputedStyle(overlay)[cssPropNameToSet]);
341
+ const adjustedValue = this.__adjustBottomProperty(cssPropNameToSet, propNames, currentValue);
294
342
 
295
343
  const diff =
296
344
  overlayRect[shouldAlignStart ? propNames.start : propNames.end] -
297
345
  targetRect[noOverlap === shouldAlignStart ? propNames.end : propNames.start];
298
346
 
347
+ const valueToSet = adjustedValue
348
+ ? `${adjustedValue}px`
349
+ : `${currentValue + diff * (shouldAlignStart ? -1 : 1)}px`;
350
+
299
351
  return {
300
- [cssPropNameToSet]: `${currentValue + diff * (shouldAlignStart ? -1 : 1)}px`,
352
+ [cssPropNameToSet]: valueToSet,
301
353
  [cssPropNameToClear]: '',
302
354
  };
303
355
  }