uikit 3.20.9-dev.b50e1953b → 3.20.9-dev.e2e1b058d

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 (76) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/css/uikit-core-rtl.css +1 -1
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +1 -1
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +1 -1
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +1 -1
  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 +2 -4
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +13 -28
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +18 -33
  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 +1 -1
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +4 -10
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +18 -26
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +4 -10
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +17 -25
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +1 -1
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +1 -1
  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 +125 -214
  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 +155 -259
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/api/component.js +1 -1
  44. package/src/js/api/events.js +1 -1
  45. package/src/js/components/filter.js +1 -3
  46. package/src/js/components/internal/slider-transitioner.js +4 -0
  47. package/src/js/components/lightbox-panel.js +1 -3
  48. package/src/js/components/lightbox.js +5 -5
  49. package/src/js/components/slider-parallax.js +3 -9
  50. package/src/js/components/slider.js +1 -1
  51. package/src/js/core/accordion.js +2 -6
  52. package/src/js/core/alert.js +1 -3
  53. package/src/js/core/cover.js +6 -12
  54. package/src/js/core/drop.js +5 -13
  55. package/src/js/core/dropnav.js +14 -42
  56. package/src/js/core/form-custom.js +1 -3
  57. package/src/js/core/grid.js +4 -7
  58. package/src/js/core/height-match.js +1 -3
  59. package/src/js/core/inverse.js +31 -3
  60. package/src/js/core/modal.js +2 -1
  61. package/src/js/core/navbar.js +2 -6
  62. package/src/js/core/offcanvas.js +1 -3
  63. package/src/js/core/scrollspy-nav.js +2 -2
  64. package/src/js/core/scrollspy.js +1 -1
  65. package/src/js/core/sticky.js +18 -28
  66. package/src/js/core/switcher.js +7 -18
  67. package/src/js/core/toggle.js +6 -18
  68. package/src/js/core/video.js +6 -6
  69. package/src/js/mixin/internal/slideshow-transitioner.js +4 -0
  70. package/src/js/mixin/modal.js +1 -3
  71. package/src/js/mixin/slider-autoplay.js +1 -3
  72. package/src/js/mixin/slider-drag.js +2 -6
  73. package/src/js/mixin/slider-nav.js +4 -12
  74. package/src/js/mixin/slider-parallax.js +7 -3
  75. package/src/js/util/fastdom.js +24 -25
  76. package/src/js/util/viewport.js +8 -8
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.20.9-dev.b50e1953b",
5
+ "version": "3.20.9-dev.e2e1b058d",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -78,7 +78,7 @@ export function attachToElement(element, instance) {
78
78
  export function detachFromElement(element, instance) {
79
79
  delete element[DATA]?.[instance.$options.name];
80
80
 
81
- if (!isEmpty(element[DATA])) {
81
+ if (isEmpty(element[DATA])) {
82
82
  delete element[DATA];
83
83
  }
84
84
  }
@@ -24,7 +24,7 @@ export function registerEvent(instance, event, key) {
24
24
  : { name: key, handler: event };
25
25
  el = isFunction(el) ? el.call(instance, instance) : el || instance.$el;
26
26
 
27
- if (!el || (isArray(el) && !el.length) || (filter && !filter.call(instance))) {
27
+ if (!el || (isArray(el) && !el.length) || (filter && !filter.call(instance, instance))) {
28
28
  return;
29
29
  }
30
30
 
@@ -72,9 +72,7 @@ export default {
72
72
  events: {
73
73
  name: 'click keydown',
74
74
 
75
- delegate() {
76
- return `[${this.attrItem}],[data-${this.attrItem}]`;
77
- },
75
+ delegate: ({ attrItem }) => `[${attrItem}],[data-${attrItem}]`,
78
76
 
79
77
  handler(e) {
80
78
  if (e.type === 'keydown' && e.keyCode !== keyMap.SPACE) {
@@ -69,6 +69,10 @@ export default function (prev, next, dir, { center, easing, list }) {
69
69
  },
70
70
 
71
71
  translate(percent) {
72
+ if (percent === this.percent()) {
73
+ return;
74
+ }
75
+
72
76
  const distance = this.getDistance() * dir * (isRtl ? -1 : 1);
73
77
 
74
78
  css(
@@ -85,9 +85,7 @@ export default {
85
85
 
86
86
  self: true,
87
87
 
88
- delegate() {
89
- return `${this.selList} > *`;
90
- },
88
+ delegate: ({ selList }) => `${selList} > *`,
91
89
 
92
90
  handler(e) {
93
91
  if (!e.defaultPrevented) {
@@ -31,13 +31,13 @@ export default {
31
31
  events: {
32
32
  name: 'click',
33
33
 
34
- delegate() {
35
- return `${this.toggle}:not(.uk-disabled)`;
36
- },
34
+ delegate: ({ toggle }) => `${toggle}:not(.uk-disabled)`,
37
35
 
38
36
  handler(e) {
39
- e.preventDefault();
40
- this.show(e.current);
37
+ if (!e.defaultPrevented) {
38
+ e.preventDefault();
39
+ this.show(e.current);
40
+ }
41
41
  },
42
42
  },
43
43
 
@@ -18,9 +18,7 @@ export default {
18
18
 
19
19
  self: true,
20
20
 
21
- el() {
22
- return this.item;
23
- },
21
+ el: ({ item }) => item,
24
22
 
25
23
  handler({ type, detail: { percent, duration, timing, dir } }) {
26
24
  fastdom.read(() => {
@@ -43,9 +41,7 @@ export default {
43
41
 
44
42
  self: true,
45
43
 
46
- el() {
47
- return this.item;
48
- },
44
+ el: ({ item }) => item,
49
45
 
50
46
  handler() {
51
47
  Transition.cancel(this.$el);
@@ -57,9 +53,7 @@ export default {
57
53
 
58
54
  self: true,
59
55
 
60
- el() {
61
- return this.item;
62
- },
56
+ el: ({ item }) => item,
63
57
 
64
58
  handler({ type, detail: { percent, dir } }) {
65
59
  fastdom.read(() => {
@@ -219,7 +219,7 @@ export default {
219
219
  ),
220
220
  );
221
221
 
222
- if (!this.center) {
222
+ if (!this.center || !this.length) {
223
223
  return;
224
224
  }
225
225
 
@@ -101,9 +101,7 @@ export default {
101
101
  {
102
102
  name: 'click keydown',
103
103
 
104
- delegate() {
105
- return `${this.targets} ${this.$props.toggle}`;
106
- },
104
+ delegate: ({ targets, $props }) => `${targets} ${$props.toggle}`,
107
105
 
108
106
  async handler(e) {
109
107
  if (e.type === 'keydown' && e.keyCode !== keyMap.SPACE) {
@@ -123,9 +121,7 @@ export default {
123
121
 
124
122
  self: true,
125
123
 
126
- delegate() {
127
- return this.targets;
128
- },
124
+ delegate: ({ targets }) => targets,
129
125
 
130
126
  handler() {
131
127
  this.$emit();
@@ -21,9 +21,7 @@ export default {
21
21
  events: {
22
22
  name: 'click',
23
23
 
24
- delegate() {
25
- return this.selClose;
26
- },
24
+ delegate: ({ selClose }) => selClose,
27
25
 
28
26
  handler(e) {
29
27
  e.preventDefault();
@@ -14,21 +14,19 @@ export default {
14
14
  automute: true,
15
15
  },
16
16
 
17
- events: {
18
- 'load loadedmetadata'() {
19
- this.$emit('resize');
20
- },
17
+ created() {
18
+ this.useObjectFit = isTag(this.$el, 'img', 'video');
21
19
  },
22
20
 
23
21
  observe: resize({
24
- target: ({ $el }) => [getPositionedParent($el) || parent($el)],
25
- filter: ({ $el }) => !useObjectFit($el),
22
+ target: ({ $el }) => getPositionedParent($el) || parent($el),
23
+ filter: ({ useObjectFit }) => !useObjectFit,
26
24
  }),
27
25
 
28
26
  update: {
29
27
  read() {
30
- if (useObjectFit(this.$el)) {
31
- return;
28
+ if (this.useObjectFit) {
29
+ return false;
32
30
  }
33
31
 
34
32
  const { ratio, cover } = Dimensions;
@@ -80,7 +78,3 @@ function getPositionedParent(el) {
80
78
  }
81
79
  }
82
80
  }
83
-
84
- function useObjectFit(el) {
85
- return isTag(el, 'img', 'video');
86
- }
@@ -106,7 +106,7 @@ export default {
106
106
  },
107
107
 
108
108
  beforeConnect() {
109
- this.clsDrop = this.$props.clsDrop || `uk-${this.$options.name}`;
109
+ this.clsDrop = this.$props.clsDrop || this.$options.id;
110
110
  },
111
111
 
112
112
  connected() {
@@ -131,9 +131,7 @@ export default {
131
131
  {
132
132
  name: 'click',
133
133
 
134
- delegate() {
135
- return '.uk-drop-close';
136
- },
134
+ delegate: () => '.uk-drop-close',
137
135
 
138
136
  handler(e) {
139
137
  e.preventDefault();
@@ -144,9 +142,7 @@ export default {
144
142
  {
145
143
  name: 'click',
146
144
 
147
- delegate() {
148
- return 'a[href*="#"]';
149
- },
145
+ delegate: () => 'a[href*="#"]',
150
146
 
151
147
  handler({ defaultPrevented, current }) {
152
148
  const { hash } = current;
@@ -212,9 +208,7 @@ export default {
212
208
  {
213
209
  name: `${pointerEnter} focusin`,
214
210
 
215
- filter() {
216
- return includes(this.mode, 'hover');
217
- },
211
+ filter: ({ mode }) => includes(mode, 'hover'),
218
212
 
219
213
  handler(e) {
220
214
  if (!isTouch(e)) {
@@ -226,9 +220,7 @@ export default {
226
220
  {
227
221
  name: `${pointerLeave} focusout`,
228
222
 
229
- filter() {
230
- return includes(this.mode, 'hover');
231
- },
223
+ filter: ({ mode }) => includes(mode, 'hover'),
232
224
 
233
225
  handler(e) {
234
226
  if (!isTouch(e) && e.relatedTarget) {
@@ -128,9 +128,7 @@ export default {
128
128
  {
129
129
  name: 'mouseover focusin',
130
130
 
131
- delegate() {
132
- return this.selNavItem;
133
- },
131
+ delegate: ({ selNavItem }) => selNavItem,
134
132
 
135
133
  handler({ current }) {
136
134
  const active = this.getActive();
@@ -151,9 +149,7 @@ export default {
151
149
 
152
150
  self: true,
153
151
 
154
- delegate() {
155
- return this.selNavItem;
156
- },
152
+ delegate: ({ selNavItem }) => selNavItem,
157
153
 
158
154
  handler(e) {
159
155
  const { current, keyCode } = e;
@@ -171,13 +167,9 @@ export default {
171
167
  {
172
168
  name: 'keydown',
173
169
 
174
- el() {
175
- return this.dropContainer;
176
- },
170
+ el: ({ dropContainer }) => dropContainer,
177
171
 
178
- delegate() {
179
- return `.${this.clsDrop}`;
180
- },
172
+ delegate: ({ clsDrop }) => `.${clsDrop}`,
181
173
 
182
174
  handler(e) {
183
175
  const { current, keyCode } = e;
@@ -220,13 +212,9 @@ export default {
220
212
  {
221
213
  name: 'mouseleave',
222
214
 
223
- el() {
224
- return this.dropbar;
225
- },
215
+ el: ({ dropbar }) => dropbar,
226
216
 
227
- filter() {
228
- return this.dropbar;
229
- },
217
+ filter: ({ dropbar }) => dropbar,
230
218
 
231
219
  handler() {
232
220
  const active = this.getActive();
@@ -244,13 +232,9 @@ export default {
244
232
  {
245
233
  name: 'beforeshow',
246
234
 
247
- el() {
248
- return this.dropContainer;
249
- },
235
+ el: ({ dropContainer }) => dropContainer,
250
236
 
251
- filter() {
252
- return this.dropbar;
253
- },
237
+ filter: ({ dropbar }) => dropbar,
254
238
 
255
239
  handler({ target }) {
256
240
  if (!this.isDropbarDrop(target)) {
@@ -268,13 +252,9 @@ export default {
268
252
  {
269
253
  name: 'show',
270
254
 
271
- el() {
272
- return this.dropContainer;
273
- },
255
+ el: ({ dropContainer }) => dropContainer,
274
256
 
275
- filter() {
276
- return this.dropbar;
277
- },
257
+ filter: ({ dropbar }) => dropbar,
278
258
 
279
259
  handler({ target }) {
280
260
  if (!this.isDropbarDrop(target)) {
@@ -306,13 +286,9 @@ export default {
306
286
  {
307
287
  name: 'beforehide',
308
288
 
309
- el() {
310
- return this.dropContainer;
311
- },
289
+ el: ({ dropContainer }) => dropContainer,
312
290
 
313
- filter() {
314
- return this.dropbar;
315
- },
291
+ filter: ({ dropbar }) => dropbar,
316
292
 
317
293
  handler(e) {
318
294
  const active = this.getActive();
@@ -333,13 +309,9 @@ export default {
333
309
  {
334
310
  name: 'hide',
335
311
 
336
- el() {
337
- return this.dropContainer;
338
- },
312
+ el: ({ dropContainer }) => dropContainer,
339
313
 
340
- filter() {
341
- return this.dropbar;
342
- },
314
+ filter: ({ dropbar }) => dropbar,
343
315
 
344
316
  handler({ target }) {
345
317
  if (!this.isDropbarDrop(target)) {
@@ -64,9 +64,7 @@ export default {
64
64
  {
65
65
  name: 'reset',
66
66
 
67
- el() {
68
- return this.$el.closest('form');
69
- },
67
+ el: ({ $el }) => $el.closest('form'),
70
68
 
71
69
  handler() {
72
70
  this.$emit();
@@ -123,14 +123,11 @@ export default {
123
123
 
124
124
  {
125
125
  read({ rows, scrollColumns, parallaxStart, parallaxEnd }) {
126
- if (scrollColumns && positionedAbsolute(rows)) {
127
- return false;
128
- }
129
-
130
126
  return {
131
- scrolled: scrollColumns
132
- ? scrolledOver(this.$el, parallaxStart, parallaxEnd)
133
- : false,
127
+ scrolled:
128
+ scrollColumns && !positionedAbsolute(rows)
129
+ ? scrolledOver(this.$el, parallaxStart, parallaxEnd)
130
+ : false,
134
131
  };
135
132
  },
136
133
 
@@ -28,9 +28,7 @@ export default {
28
28
  // Hidden elements may change height when fonts load
29
29
  name: 'loadingdone',
30
30
 
31
- el() {
32
- return document.fonts;
33
- },
31
+ el: () => document.fonts,
34
32
 
35
33
  handler() {
36
34
  this.$emit('resize');
@@ -1,4 +1,14 @@
1
- import { $$, css, dimensions, matches, observeResize, on, replaceClass, toNodes } from 'uikit-util';
1
+ import {
2
+ $$,
3
+ css,
4
+ dimensions,
5
+ matches,
6
+ observeResize,
7
+ on,
8
+ parent,
9
+ replaceClass,
10
+ toNodes,
11
+ } from 'uikit-util';
2
12
  import { intersection, mutation } from '../api/observables';
3
13
 
4
14
  export default {
@@ -87,17 +97,19 @@ export default {
87
97
 
88
98
  function findTargetColor(target) {
89
99
  const { left, top, height, width } = dimensions(target);
100
+ const viewport = dimensions(window);
90
101
 
91
102
  let last;
92
103
  for (const percent of [0.25, 0.5, 0.75]) {
93
104
  const elements = target.ownerDocument.elementsFromPoint(
94
- Math.max(0, left) + width * percent,
95
- Math.max(0, top) + height / 2,
105
+ Math.max(0, Math.min(left + width * percent, viewport.width - 1)),
106
+ Math.max(0, Math.min(top + height / 2, viewport.height - 1)),
96
107
  );
97
108
 
98
109
  for (const element of elements) {
99
110
  if (
100
111
  target.contains(element) ||
112
+ !checkVisibility(element) ||
101
113
  (element.closest('[class*="-leave"]') &&
102
114
  elements.some((el) => element !== el && matches(el, '[class*="-enter"]')))
103
115
  ) {
@@ -118,3 +130,19 @@ function findTargetColor(target) {
118
130
 
119
131
  return last ? `uk-${last}` : '';
120
132
  }
133
+
134
+ // TODO: once it becomes Baseline `element.checkVisibility({ opacityProperty: true, visibilityProperty: true })`
135
+ function checkVisibility(element) {
136
+ if (css(element, 'visibility') !== 'visible') {
137
+ return false;
138
+ }
139
+
140
+ while (element) {
141
+ if (css(element, 'opacity') === '0') {
142
+ return false;
143
+ }
144
+ element = parent(element);
145
+ }
146
+
147
+ return true;
148
+ }
@@ -126,7 +126,7 @@ function install({ modal }) {
126
126
  ({ i18n }) => `<form class="uk-form-stacked">
127
127
  <div class="uk-modal-body">
128
128
  <label>${isString(message) ? message : html(message)}</label>
129
- <input class="uk-input" value="${value || ''}" autofocus>
129
+ <input class="uk-input" autofocus>
130
130
  </div>
131
131
  <div class="uk-modal-footer uk-text-right">
132
132
  <button class="uk-button uk-button-default uk-modal-close" type="button">${
@@ -142,6 +142,7 @@ function install({ modal }) {
142
142
 
143
143
  const { $el } = promise.dialog;
144
144
  const input = $('input', $el);
145
+ input.value = value || '';
145
146
  on($el, 'show', () => input.select());
146
147
 
147
148
  return promise;
@@ -39,9 +39,7 @@ export default {
39
39
  {
40
40
  name: 'show',
41
41
 
42
- el() {
43
- return this.dropContainer;
44
- },
42
+ el: ({ dropContainer }) => dropContainer,
45
43
 
46
44
  handler({ target }) {
47
45
  if (
@@ -56,9 +54,7 @@ export default {
56
54
  {
57
55
  name: 'hide',
58
56
 
59
- el() {
60
- return this.dropContainer;
61
- },
57
+ el: ({ dropContainer }) => dropContainer,
62
58
 
63
59
  async handler() {
64
60
  await awaitMacroTask();
@@ -81,9 +81,7 @@ export default {
81
81
  self: true,
82
82
  passive: false,
83
83
 
84
- filter() {
85
- return this.overlay;
86
- },
84
+ filter: ({ overlay }) => overlay,
87
85
 
88
86
  handler(e) {
89
87
  e.cancelable && e.preventDefault();
@@ -68,9 +68,9 @@ export default {
68
68
  if (scrollTop === max) {
69
69
  active = length - 1;
70
70
  } else {
71
+ const offsetBy = this.offset + offset(getCoveringElement()).height;
72
+
71
73
  for (let i = 0; i < targets.length; i++) {
72
- const fixedEl = getCoveringElement(targets[i]);
73
- const offsetBy = this.offset + (fixedEl ? offset(fixedEl).height : 0);
74
74
  if (offset(targets[i]).top - viewport.top - offsetBy > 0) {
75
75
  break;
76
76
  }
@@ -108,7 +108,7 @@ export default {
108
108
 
109
109
  methods: {
110
110
  toggle(el, inview) {
111
- const state = this.elementData.get(el);
111
+ const state = this.elementData?.get(el);
112
112
 
113
113
  if (!state) {
114
114
  return;
@@ -16,7 +16,6 @@ import {
16
16
  isVisible,
17
17
  noop,
18
18
  offsetPosition,
19
- once,
20
19
  parent,
21
20
  query,
22
21
  remove,
@@ -97,28 +96,28 @@ export default {
97
96
  },
98
97
 
99
98
  observe: [
100
- viewport({
101
- handler() {
102
- if (toPx('100vh', 'height') !== this._data.viewport) {
103
- this.$emit('resize');
104
- }
99
+ viewport(),
100
+ scroll({ target: () => document.scrollingElement }),
101
+ resize({
102
+ target: ({ $el }) => [$el, parent($el), document.scrollingElement],
103
+ handler(entries) {
104
+ this.$emit(
105
+ this._data.resized && entries.some(({ target }) => target === parent(this.$el))
106
+ ? 'update'
107
+ : 'resize',
108
+ );
109
+ this._data.resized = true;
105
110
  },
106
111
  }),
107
- scroll({ target: () => document.scrollingElement }),
108
- resize({ target: ({ $el }) => [$el, document.scrollingElement] }),
109
112
  ],
110
113
 
111
114
  events: [
112
115
  {
113
116
  name: 'load hashchange popstate',
114
117
 
115
- el() {
116
- return window;
117
- },
118
+ el: () => window,
118
119
 
119
- filter() {
120
- return this.targetOffset !== false;
121
- },
120
+ filter: ({ targetOffset }) => targetOffset !== false,
122
121
 
123
122
  handler() {
124
123
  const { scrollingElement } = document;
@@ -142,29 +141,18 @@ export default {
142
141
  });
143
142
  },
144
143
  },
145
- {
146
- name: 'transitionstart',
147
-
148
- handler() {
149
- this.transitionInProgress = once(
150
- this.$el,
151
- 'transitionend transitioncancel',
152
- () => (this.transitionInProgress = null),
153
- );
154
- },
155
- },
156
144
  ],
157
145
 
158
146
  update: [
159
147
  {
160
- read({ height, width, margin, sticky }) {
148
+ read({ height, width, margin, sticky }, types) {
161
149
  this.inactive = !this.matchMedia || !isVisible(this.$el);
162
150
 
163
151
  if (this.inactive) {
164
152
  return;
165
153
  }
166
154
 
167
- const hide = this.isFixed && !this.transitionInProgress;
155
+ const hide = this.isFixed && types.has('update');
168
156
  if (hide) {
169
157
  preventTransition(this.target);
170
158
  this.hide();
@@ -239,6 +227,7 @@ export default {
239
227
  top: offsetPosition(referenceElement)[0],
240
228
  sticky,
241
229
  viewport,
230
+ maxScrollHeight,
242
231
  };
243
232
  },
244
233
 
@@ -283,8 +272,9 @@ export default {
283
272
  elHeight,
284
273
  height,
285
274
  sticky,
275
+ maxScrollHeight,
286
276
  }) {
287
- const scroll = document.scrollingElement.scrollTop;
277
+ const scroll = Math.min(document.scrollingElement.scrollTop, maxScrollHeight);
288
278
  const dir = prevScroll <= scroll ? 'down' : 'up';
289
279
  const referenceElement = this.isFixed ? this.placeholder : this.$el;
290
280