uikit 3.14.3-dev.5325d42a0 → 3.14.4-dev.008162cc3

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/css/uikit-core-rtl.css +33 -17
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +33 -17
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +30 -17
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +30 -17
  9. package/dist/css/uikit.min.css +1 -1
  10. package/dist/js/components/countdown.js +1 -1
  11. package/dist/js/components/countdown.min.js +1 -1
  12. package/dist/js/components/filter.js +1 -1
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +110 -16
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +110 -16
  17. package/dist/js/components/lightbox.min.js +1 -1
  18. package/dist/js/components/notification.js +1 -1
  19. package/dist/js/components/notification.min.js +1 -1
  20. package/dist/js/components/parallax.js +2 -2
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +2 -2
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +22 -7
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +2 -2
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +22 -7
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +3 -3
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +8 -6
  33. package/dist/js/components/tooltip.min.js +1 -1
  34. package/dist/js/components/upload.js +1 -1
  35. package/dist/js/components/upload.min.js +1 -1
  36. package/dist/js/uikit-core.js +666 -618
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +1 -1
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +1472 -1409
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/components/sortable.js +2 -3
  44. package/src/js/core/drop.js +7 -0
  45. package/src/js/core/height-viewport.js +9 -5
  46. package/src/js/core/offcanvas.js +1 -47
  47. package/src/js/core/sticky.js +8 -9
  48. package/src/js/core/switcher.js +1 -1
  49. package/src/js/mixin/modal.js +90 -4
  50. package/src/js/mixin/parallax.js +1 -1
  51. package/src/js/mixin/position.js +8 -0
  52. package/src/js/mixin/slider-drag.js +20 -8
  53. package/src/js/mixin/togglable.js +0 -5
  54. package/src/js/util/dimensions.js +6 -6
  55. package/src/js/util/position.js +2 -0
  56. package/src/js/util/viewport.js +22 -36
  57. package/src/less/components/nav.less +22 -4
  58. package/src/less/components/navbar.less +8 -17
  59. package/src/less/components/utility.less +12 -3
  60. package/src/less/theme/nav.less +3 -7
  61. package/src/less/theme/navbar.less +3 -1
  62. package/src/scss/components/nav.scss +22 -4
  63. package/src/scss/components/navbar.scss +8 -17
  64. package/src/scss/components/utility.scss +12 -3
  65. package/src/scss/mixins-theme.scss +1 -1
  66. package/src/scss/theme/nav.scss +3 -7
  67. package/src/scss/theme/navbar.scss +3 -1
  68. package/src/scss/variables-theme.scss +10 -4
  69. package/src/scss/variables.scss +10 -3
  70. package/tests/drop.html +6 -0
  71. package/tests/navbar.html +2041 -1267
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "uikit",
3
3
  "title": "UIkit",
4
4
  "description": "UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.",
5
- "version": "3.14.3-dev.5325d42a0",
5
+ "version": "3.14.4-dev.008162cc3",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -26,7 +26,6 @@ import {
26
26
  remove,
27
27
  removeClass,
28
28
  scrollParents,
29
- scrollTop,
30
29
  toggleClass,
31
30
  Transition,
32
31
  trigger,
@@ -313,7 +312,7 @@ function trackScroll(pos) {
313
312
  let last = Date.now();
314
313
  trackTimer = setInterval(() => {
315
314
  let { x, y } = pos;
316
- y += scrollTop(window);
315
+ y += document.scrollingElement.scrollTop;
317
316
 
318
317
  const dist = (Date.now() - last) * 0.3;
319
318
  last = Date.now();
@@ -334,7 +333,7 @@ function trackScroll(pos) {
334
333
  }
335
334
 
336
335
  if (scroll > 0 && scroll < scrollHeight - height) {
337
- scrollTop(scrollEl, scroll);
336
+ scrollEl.scrollTop = scroll;
338
337
  return true;
339
338
  }
340
339
  });
@@ -30,6 +30,7 @@ import {
30
30
  toggleClass,
31
31
  within,
32
32
  } from 'uikit-util';
33
+ import { preventBackgroundScroll, preventOverscroll } from '../mixin/modal';
33
34
 
34
35
  export let active;
35
36
 
@@ -48,6 +49,7 @@ export default {
48
49
  display: String,
49
50
  clsDrop: String,
50
51
  animateOut: Boolean,
52
+ bgScroll: Boolean,
51
53
  },
52
54
 
53
55
  data: {
@@ -63,6 +65,7 @@ export default {
63
65
  cls: 'uk-open',
64
66
  container: false,
65
67
  animateOut: false,
68
+ bgScroll: true,
66
69
  },
67
70
 
68
71
  created() {
@@ -250,6 +253,10 @@ export default {
250
253
  }
251
254
  }),
252
255
 
256
+ ...(this.bgScroll
257
+ ? []
258
+ : [preventOverscroll(this.$el), preventBackgroundScroll()]),
259
+
253
260
  ...(this.display === 'static' && this.align !== 'stretch'
254
261
  ? []
255
262
  : (() => {
@@ -56,14 +56,18 @@ export default {
56
56
  0
57
57
  );
58
58
  } else {
59
+ const isScrollingElement = document.scrollingElement === scrollElement;
60
+
59
61
  // on mobile devices (iOS and Android) window.innerHeight !== 100vh
60
- minHeight = `calc(${
61
- document.scrollingElement === scrollElement ? '100vh' : `${viewportHeight}px`
62
- }`;
62
+ minHeight = `calc(${isScrollingElement ? '100vh' : `${viewportHeight}px`}`;
63
63
 
64
64
  if (this.offsetTop) {
65
- const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
66
- minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
65
+ if (isScrollingElement) {
66
+ const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
67
+ minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
68
+ } else {
69
+ minHeight += ` - ${css(scrollElement, 'paddingTop')}`;
70
+ }
67
71
  }
68
72
 
69
73
  if (this.offsetBottom === true) {
@@ -93,22 +93,6 @@ export default {
93
93
  },
94
94
  },
95
95
 
96
- {
97
- name: 'touchstart',
98
-
99
- passive: true,
100
-
101
- el() {
102
- return this.panel;
103
- },
104
-
105
- handler({ targetTouches }) {
106
- if (targetTouches.length === 1) {
107
- this.clientY = targetTouches[0].clientY;
108
- }
109
- },
110
- },
111
-
112
96
  {
113
97
  name: 'touchmove',
114
98
 
@@ -124,33 +108,6 @@ export default {
124
108
  },
125
109
  },
126
110
 
127
- {
128
- name: 'touchmove',
129
-
130
- passive: false,
131
-
132
- el() {
133
- return this.panel;
134
- },
135
-
136
- handler(e) {
137
- if (e.targetTouches.length !== 1) {
138
- return;
139
- }
140
-
141
- const clientY = e.targetTouches[0].clientY - this.clientY;
142
- const { scrollTop, scrollHeight, clientHeight } = this.panel;
143
-
144
- if (
145
- clientHeight >= scrollHeight ||
146
- (scrollTop === 0 && clientY > 0) ||
147
- (scrollHeight - scrollTop <= clientHeight && clientY < 0)
148
- ) {
149
- e.cancelable && e.preventDefault();
150
- }
151
- },
152
- },
153
-
154
111
  {
155
112
  name: 'show',
156
113
 
@@ -162,7 +119,6 @@ export default {
162
119
  addClass(parent(this.panel), this.clsMode);
163
120
  }
164
121
 
165
- css(document.documentElement, 'overflowY', this.overlay ? 'hidden' : '');
166
122
  addClass(document.body, this.clsContainer, this.clsFlip);
167
123
  css(document.body, 'touch-action', 'pan-y pinch-zoom');
168
124
  css(this.$el, 'display', 'block');
@@ -170,7 +126,7 @@ export default {
170
126
  addClass(
171
127
  this.panel,
172
128
  this.clsSidebarAnimation,
173
- this.mode !== 'reveal' ? this.clsMode : ''
129
+ this.mode === 'reveal' ? '' : this.clsMode
174
130
  );
175
131
 
176
132
  height(document.body); // force reflow
@@ -207,8 +163,6 @@ export default {
207
163
  removeClass(this.$el, this.clsOverlay);
208
164
  css(this.$el, 'display', '');
209
165
  removeClass(document.body, this.clsContainer, this.clsFlip);
210
-
211
- css(document.documentElement, 'overflowY', '');
212
166
  },
213
167
  },
214
168
 
@@ -23,7 +23,6 @@ import {
23
23
  remove,
24
24
  removeClass,
25
25
  replaceClass,
26
- scrollTop,
27
26
  toFloat,
28
27
  toggleClass,
29
28
  toPx,
@@ -125,7 +124,9 @@ export default {
125
124
  },
126
125
 
127
126
  handler() {
128
- if (!location.hash || scrollTop(window) === 0) {
127
+ const { scrollingElement } = document;
128
+
129
+ if (!location.hash || scrollingElement.scrollTop === 0) {
129
130
  return;
130
131
  }
131
132
 
@@ -134,13 +135,11 @@ export default {
134
135
  const elOffset = getOffset(this.$el);
135
136
 
136
137
  if (this.isFixed && intersectRect(targetOffset, elOffset)) {
137
- scrollTop(
138
- window,
138
+ scrollingElement.scrollTop =
139
139
  targetOffset.top -
140
- elOffset.height -
141
- toPx(this.targetOffset, 'height', this.placeholder) -
142
- toPx(this.offset, 'height', this.placeholder)
143
- );
140
+ elOffset.height -
141
+ toPx(this.targetOffset, 'height', this.placeholder) -
142
+ toPx(this.offset, 'height', this.placeholder);
144
143
  }
145
144
  });
146
145
  },
@@ -238,7 +237,7 @@ export default {
238
237
  start,
239
238
  end,
240
239
  }) {
241
- const scroll = scrollTop(window);
240
+ const scroll = document.scrollingElement.scrollTop;
242
241
  const dir = prevScroll <= scroll ? 'down' : 'up';
243
242
 
244
243
  return {
@@ -48,7 +48,7 @@ export default {
48
48
 
49
49
  watch(connects) {
50
50
  if (this.swiping) {
51
- css(connects, 'touch-action', 'pan-y pinch-zoom');
51
+ css(connects, 'touchAction', 'pan-y pinch-zoom');
52
52
  }
53
53
 
54
54
  const index = this.index();
@@ -2,6 +2,7 @@ import {
2
2
  $,
3
3
  addClass,
4
4
  append,
5
+ apply,
5
6
  attr,
6
7
  css,
7
8
  endsWith,
@@ -15,6 +16,7 @@ import {
15
16
  pointerDown,
16
17
  pointerUp,
17
18
  removeClass,
19
+ scrollParents,
18
20
  toFloat,
19
21
  width,
20
22
  within,
@@ -121,17 +123,26 @@ export default {
121
123
  self: true,
122
124
 
123
125
  handler() {
124
- const docEl = document.documentElement;
126
+ once(
127
+ this.$el,
128
+ 'hide',
129
+ on(document, 'focusin', (e) => {
130
+ if (last(active) === this && !within(e.target, this.$el)) {
131
+ this.$el.focus();
132
+ }
133
+ })
134
+ );
125
135
 
126
- if (width(window) > docEl.clientWidth && this.overlay) {
127
- css(document.body, 'overflowY', 'scroll');
136
+ if (this.overlay) {
137
+ once(this.$el, 'hide', preventOverscroll(this.$el));
138
+ once(this.$el, 'hide', preventBackgroundScroll());
128
139
  }
129
140
 
130
141
  if (this.stack) {
131
142
  css(this.$el, 'zIndex', toFloat(css(this.$el, 'zIndex')) + active.length);
132
143
  }
133
144
 
134
- addClass(docEl, this.clsPage);
145
+ addClass(document.documentElement, this.clsPage);
135
146
 
136
147
  if (this.bgClose) {
137
148
  once(
@@ -273,3 +284,78 @@ function animate({ transitionElement, _toggle }) {
273
284
  function toMs(time) {
274
285
  return time ? (endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000) : 0;
275
286
  }
287
+
288
+ export function preventOverscroll(el) {
289
+ if (CSS.supports('overscroll-behavior', 'contain')) {
290
+ const elements = filterChildren(el, (child) => /auto|scroll/.test(css(child, 'overflow')));
291
+ css(elements, 'overscrollBehavior', 'contain');
292
+ return () => css(elements, 'overscrollBehavior', '');
293
+ }
294
+
295
+ let startClientY;
296
+
297
+ const events = [
298
+ on(
299
+ el,
300
+ 'touchstart',
301
+ ({ targetTouches }) => {
302
+ if (targetTouches.length === 1) {
303
+ startClientY = targetTouches[0].clientY;
304
+ }
305
+ },
306
+ { passive: true }
307
+ ),
308
+
309
+ on(
310
+ el,
311
+ 'touchmove',
312
+ (e) => {
313
+ if (e.targetTouches.length !== 1) {
314
+ return;
315
+ }
316
+
317
+ let [scrollParent] = scrollParents(e.target, /auto|scroll/);
318
+ if (!within(scrollParent, el)) {
319
+ scrollParent = el;
320
+ }
321
+
322
+ const clientY = e.targetTouches[0].clientY - startClientY;
323
+ const { scrollTop, scrollHeight, clientHeight } = scrollParent;
324
+
325
+ if (
326
+ clientHeight >= scrollHeight ||
327
+ (scrollTop === 0 && clientY > 0) ||
328
+ (scrollHeight - scrollTop <= clientHeight && clientY < 0)
329
+ ) {
330
+ e.cancelable && e.preventDefault();
331
+ }
332
+ },
333
+ { passive: false }
334
+ ),
335
+ ];
336
+
337
+ return () => events.forEach((fn) => fn());
338
+ }
339
+
340
+ export function preventBackgroundScroll() {
341
+ const { body, documentElement } = document;
342
+ css(body, {
343
+ overflowY: width(window) > documentElement.clientWidth ? 'scroll' : '',
344
+ touchAction: 'none',
345
+ });
346
+ css(documentElement, 'overflowY', 'hidden');
347
+ return () => {
348
+ css(documentElement, 'overflowY', '');
349
+ css(body, { overflowY: '', touchAction: '' });
350
+ };
351
+ }
352
+
353
+ function filterChildren(el, fn) {
354
+ const children = [];
355
+ apply(el, (node) => {
356
+ if (fn(node)) {
357
+ children.push(node);
358
+ }
359
+ });
360
+ return children;
361
+ }
@@ -208,7 +208,7 @@ function backgroundFn(prop, el, stops, props) {
208
208
  positions[prop] = getBackgroundPos(el, prop);
209
209
  }
210
210
 
211
- return setBackgroundPosFn(bgProps, props, positions);
211
+ return setBackgroundPosFn(bgProps, positions, props);
212
212
  }
213
213
 
214
214
  function backgroundCoverFn(prop, el, stops, props) {
@@ -6,6 +6,7 @@ import {
6
6
  includes,
7
7
  isRtl,
8
8
  positionAt,
9
+ scrollParents,
9
10
  toPx,
10
11
  } from 'uikit-util';
11
12
 
@@ -44,6 +45,9 @@ export default {
44
45
  offset = offset.reverse();
45
46
  }
46
47
 
48
+ const [scrollElement] = scrollParents(element, /auto|scroll/);
49
+ const { scrollTop, scrollLeft } = scrollElement;
50
+
47
51
  // Ensure none positioned element does not generate scrollbars
48
52
  const elDim = dimensions(element);
49
53
  css(element, { top: -elDim.height, left: -elDim.width });
@@ -55,6 +59,10 @@ export default {
55
59
  flip: this.flip,
56
60
  viewportOffset: this.getViewportOffset(element),
57
61
  });
62
+
63
+ // Restore scroll position
64
+ scrollElement.scrollTop = scrollTop;
65
+ scrollElement.scrollLeft = scrollLeft;
58
66
  },
59
67
 
60
68
  getPositionOffset(element) {
@@ -5,16 +5,18 @@ import {
5
5
  includes,
6
6
  isRtl,
7
7
  isTouch,
8
+ noop,
8
9
  off,
9
10
  on,
10
- pointerCancel,
11
- pointerDown,
12
- pointerMove,
13
- pointerUp,
14
11
  selInput,
15
12
  trigger,
16
13
  } from 'uikit-util';
17
14
 
15
+ const pointerOptions = { passive: false, capture: true };
16
+ const pointerDown = 'touchstart mousedown';
17
+ const pointerMove = 'touchmove mousemove';
18
+ const pointerUp = 'touchend touchcancel mouseup click input';
19
+
18
20
  export default {
19
21
  props: {
20
22
  draggable: Boolean,
@@ -69,6 +71,16 @@ export default {
69
71
  e.preventDefault();
70
72
  },
71
73
  },
74
+
75
+ {
76
+ // iOS workaround for slider stopping if swiping fast
77
+ name: `${pointerMove} ${pointerUp}`,
78
+ el() {
79
+ return this.list;
80
+ },
81
+ handler: noop,
82
+ ...pointerOptions,
83
+ },
72
84
  ],
73
85
 
74
86
  methods: {
@@ -89,10 +101,10 @@ export default {
89
101
  this.prevIndex = this.index;
90
102
  }
91
103
 
92
- on(document, pointerMove, this.move, { passive: false });
104
+ on(document, pointerMove, this.move, pointerOptions);
93
105
 
94
106
  // 'input' event is triggered by video controls
95
- on(document, `${pointerUp} ${pointerCancel} input`, this.end, true);
107
+ on(document, pointerUp, this.end, pointerOptions);
96
108
 
97
109
  css(this.list, 'userSelect', 'none');
98
110
  },
@@ -172,8 +184,8 @@ export default {
172
184
  },
173
185
 
174
186
  end() {
175
- off(document, pointerMove, this.move, { passive: false });
176
- off(document, `${pointerUp} ${pointerCancel} input`, this.end, true);
187
+ off(document, pointerMove, this.move, pointerOptions);
188
+ off(document, pointerUp, this.end, pointerOptions);
177
189
 
178
190
  if (this.dragging) {
179
191
  this.dragging = null;
@@ -83,11 +83,6 @@ export default {
83
83
  return Promise.reject();
84
84
  }
85
85
 
86
- if (!animate) {
87
- Animation.cancel(el);
88
- Transition.cancel(el);
89
- }
90
-
91
86
  const promise = (
92
87
  isFunction(animate)
93
88
  ? animate
@@ -94,13 +94,13 @@ export function position(element) {
94
94
  }
95
95
 
96
96
  export function offsetPosition(element) {
97
- const offset = [0, 0];
98
-
99
97
  element = toNode(element);
100
98
 
101
- do {
102
- offset[0] += element.offsetTop;
103
- offset[1] += element.offsetLeft;
99
+ const offset = [element.offsetTop, element.offsetLeft];
100
+
101
+ while ((element = element.offsetParent)) {
102
+ offset[0] += element.offsetTop + toFloat(css(element, `borderTopWidth`));
103
+ offset[1] += element.offsetLeft + toFloat(css(element, `borderLeftWidth`));
104
104
 
105
105
  if (css(element, 'position') === 'fixed') {
106
106
  const win = toWindow(element);
@@ -108,7 +108,7 @@ export function offsetPosition(element) {
108
108
  offset[1] += win.scrollX;
109
109
  return offset;
110
110
  }
111
- } while ((element = element.offsetParent));
111
+ }
112
112
 
113
113
  return offset;
114
114
  }
@@ -158,6 +158,8 @@ function attachToWithFlip(element, target, options) {
158
158
  if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
159
159
  return newPos;
160
160
  }
161
+
162
+ continue;
161
163
  }
162
164
  }
163
165
 
@@ -1,18 +1,7 @@
1
1
  import { css } from './style';
2
2
  import { isVisible, parents } from './filter';
3
3
  import { offset, offsetPosition } from './dimensions';
4
- import {
5
- clamp,
6
- findIndex,
7
- intersectRect,
8
- isDocument,
9
- isUndefined,
10
- isWindow,
11
- toFloat,
12
- toNode,
13
- toWindow,
14
- ucfirst,
15
- } from './lang';
4
+ import { clamp, findIndex, intersectRect, isWindow, toFloat, toWindow, ucfirst } from './lang';
16
5
 
17
6
  export function isInView(element, offsetTop = 0, offsetLeft = 0) {
18
7
  if (!isVisible(element)) {
@@ -35,20 +24,6 @@ export function isInView(element, offsetTop = 0, offsetLeft = 0) {
35
24
  );
36
25
  }
37
26
 
38
- export function scrollTop(element, top) {
39
- if (isWindow(element) || isDocument(element)) {
40
- element = scrollingElement(element);
41
- } else {
42
- element = toNode(element);
43
- }
44
-
45
- if (isUndefined(top)) {
46
- return element.scrollTop;
47
- } else {
48
- element.scrollTop = top;
49
- }
50
- }
51
-
52
27
  export function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {
53
28
  const parents = isVisible(element) ? scrollParents(element) : [];
54
29
  return parents.reduce(
@@ -90,7 +65,7 @@ export function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {
90
65
  (function step() {
91
66
  const percent = ease(clamp((Date.now() - start) / duration));
92
67
 
93
- scrollTop(element, scroll + top * percent);
68
+ element.scrollTop = scroll + top * percent;
94
69
 
95
70
  // scroll more if we have not reached our destination
96
71
  if (percent === 1) {
@@ -151,18 +126,33 @@ export function scrollParents(element, overflowRe = /auto|scroll|hidden|clip/, s
151
126
  }
152
127
 
153
128
  export function offsetViewport(scrollElement) {
154
- let viewportElement = getViewport(scrollElement);
129
+ const window = toWindow(scrollElement);
130
+ const {
131
+ document: { body, documentElement },
132
+ } = window;
133
+ let viewportElement =
134
+ scrollElement === scrollingElement(scrollElement) || scrollElement === body
135
+ ? window
136
+ : scrollElement;
137
+
138
+ const { visualViewport } = window;
139
+ if (isWindow(viewportElement) && visualViewport) {
140
+ let { height, width, scale, pageTop: top, pageLeft: left } = visualViewport;
141
+ height = Math.round(height * scale);
142
+ width = Math.round(width * scale);
143
+ return { height, width, top, left, bottom: top + height, right: left + width };
144
+ }
155
145
 
156
146
  let rect = offset(viewportElement);
157
147
  for (let [prop, dir, start, end] of [
158
148
  ['width', 'x', 'left', 'right'],
159
149
  ['height', 'y', 'top', 'bottom'],
160
150
  ]) {
161
- if (!isWindow(viewportElement)) {
162
- rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
163
- } else {
151
+ if (isWindow(viewportElement)) {
164
152
  // iOS 12 returns <body> as scrollingElement
165
- viewportElement = viewportElement.document.documentElement;
153
+ viewportElement = documentElement;
154
+ } else {
155
+ rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
166
156
  }
167
157
  rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];
168
158
  rect[end] = rect[prop] + rect[start];
@@ -173,7 +163,3 @@ export function offsetViewport(scrollElement) {
173
163
  function scrollingElement(element) {
174
164
  return toWindow(element).document.scrollingElement;
175
165
  }
176
-
177
- function getViewport(scrollElement) {
178
- return scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
179
- }