uikit 3.20.8 → 3.20.9-dev.2cb573699

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 (94) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/css/uikit-core-rtl.css +18 -1
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +18 -1
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +18 -1
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +18 -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 +16 -29
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +17 -32
  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 +21 -27
  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 +20 -26
  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 +121 -211
  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 -260
  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 +1 -3
  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/height-placeholder.js +1 -1
  60. package/src/js/core/inverse.js +30 -3
  61. package/src/js/core/modal.js +2 -1
  62. package/src/js/core/navbar.js +2 -6
  63. package/src/js/core/offcanvas.js +1 -3
  64. package/src/js/core/scrollspy-nav.js +2 -2
  65. package/src/js/core/scrollspy.js +1 -1
  66. package/src/js/core/sticky.js +23 -34
  67. package/src/js/core/switcher.js +7 -18
  68. package/src/js/core/toggle.js +6 -18
  69. package/src/js/core/video.js +6 -6
  70. package/src/js/mixin/internal/animate-slide.js +1 -1
  71. package/src/js/mixin/internal/slideshow-transitioner.js +4 -0
  72. package/src/js/mixin/modal.js +1 -3
  73. package/src/js/mixin/slider-autoplay.js +1 -3
  74. package/src/js/mixin/slider-drag.js +2 -6
  75. package/src/js/mixin/slider-nav.js +4 -12
  76. package/src/js/mixin/slider-parallax.js +7 -3
  77. package/src/js/mixin/slider.js +3 -1
  78. package/src/js/util/viewport.js +8 -8
  79. package/src/less/components/card.less +3 -0
  80. package/src/less/components/dropbar.less +1 -0
  81. package/src/less/components/dropdown.less +1 -0
  82. package/src/less/components/navbar.less +1 -0
  83. package/src/less/components/offcanvas.less +1 -0
  84. package/src/less/components/overlay.less +2 -0
  85. package/src/less/components/section.less +5 -0
  86. package/src/less/components/tile.less +4 -0
  87. package/src/scss/components/card.scss +3 -0
  88. package/src/scss/components/dropbar.scss +1 -0
  89. package/src/scss/components/dropdown.scss +1 -0
  90. package/src/scss/components/navbar.scss +1 -0
  91. package/src/scss/components/offcanvas.scss +1 -0
  92. package/src/scss/components/overlay.scss +2 -0
  93. package/src/scss/components/section.scss +5 -0
  94. package/src/scss/components/tile.scss +4 -0
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.8",
5
+ "version": "3.20.9-dev.2cb573699",
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,9 +31,7 @@ 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
37
  e.preventDefault();
@@ -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');
@@ -23,7 +23,7 @@ export default {
23
23
 
24
24
  update: {
25
25
  read() {
26
- return { height: this.target.offsetHeight };
26
+ return this.target ? { height: this.target.offsetHeight } : false;
27
27
  },
28
28
 
29
29
  write({ height }) {
@@ -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 {
@@ -91,13 +101,14 @@ function findTargetColor(target) {
91
101
  let last;
92
102
  for (const percent of [0.25, 0.5, 0.75]) {
93
103
  const elements = target.ownerDocument.elementsFromPoint(
94
- Math.max(0, left) + width * percent,
95
- Math.max(0, top) + height / 2,
104
+ Math.max(0, left + width * percent),
105
+ Math.max(0, top + height / 2),
96
106
  );
97
107
 
98
108
  for (const element of elements) {
99
109
  if (
100
110
  target.contains(element) ||
111
+ !isVisible(element) ||
101
112
  (element.closest('[class*="-leave"]') &&
102
113
  elements.some((el) => element !== el && matches(el, '[class*="-enter"]')))
103
114
  ) {
@@ -118,3 +129,19 @@ function findTargetColor(target) {
118
129
 
119
130
  return last ? `uk-${last}` : '';
120
131
  }
132
+
133
+ // TODO: once it becomes Baseline `element.checkVisibility({ opacityProperty: true, visibilityProperty: true })`
134
+ function isVisible(element) {
135
+ if (css(element, 'visibility') !== 'visible') {
136
+ return false;
137
+ }
138
+
139
+ while (element) {
140
+ if (css(element, 'opacity') === '0') {
141
+ return false;
142
+ }
143
+ element = parent(element);
144
+ }
145
+
146
+ return true;
147
+ }
@@ -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,32 +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
- }
105
- },
106
- }),
99
+ viewport(),
107
100
  scroll({ target: () => document.scrollingElement }),
108
101
  resize({
109
- target: () => document.scrollingElement,
110
- options: { box: 'content-box' },
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;
110
+ },
111
111
  }),
112
- resize(),
113
112
  ],
114
113
 
115
114
  events: [
116
115
  {
117
116
  name: 'load hashchange popstate',
118
117
 
119
- el() {
120
- return window;
121
- },
118
+ el: () => window,
122
119
 
123
- filter() {
124
- return this.targetOffset !== false;
125
- },
120
+ filter: ({ targetOffset }) => targetOffset !== false,
126
121
 
127
122
  handler() {
128
123
  const { scrollingElement } = document;
@@ -146,29 +141,18 @@ export default {
146
141
  });
147
142
  },
148
143
  },
149
- {
150
- name: 'transitionstart',
151
-
152
- handler() {
153
- this.transitionInProgress = once(
154
- this.$el,
155
- 'transitionend transitioncancel',
156
- () => (this.transitionInProgress = null),
157
- );
158
- },
159
- },
160
144
  ],
161
145
 
162
146
  update: [
163
147
  {
164
- read({ height, width, margin, sticky }) {
148
+ read({ height, width, margin, sticky }, types) {
165
149
  this.inactive = !this.matchMedia || !isVisible(this.$el);
166
150
 
167
151
  if (this.inactive) {
168
152
  return;
169
153
  }
170
154
 
171
- const hide = this.isFixed && !this.transitionInProgress;
155
+ const hide = this.isFixed && types.has('update');
172
156
  if (hide) {
173
157
  preventTransition(this.target);
174
158
  this.hide();
@@ -243,6 +227,7 @@ export default {
243
227
  top: offsetPosition(referenceElement)[0],
244
228
  sticky,
245
229
  viewport,
230
+ maxScrollHeight,
246
231
  };
247
232
  },
248
233
 
@@ -287,8 +272,9 @@ export default {
287
272
  elHeight,
288
273
  height,
289
274
  sticky,
275
+ maxScrollHeight,
290
276
  }) {
291
- const scroll = document.scrollingElement.scrollTop;
277
+ const scroll = Math.min(document.scrollingElement.scrollTop, maxScrollHeight);
292
278
  const dir = prevScroll <= scroll ? 'down' : 'up';
293
279
  const referenceElement = this.isFixed ? this.placeholder : this.$el;
294
280
 
@@ -490,7 +476,10 @@ function reset(el) {
490
476
  css(el, { position: '', top: '', marginTop: '', width: '' });
491
477
  }
492
478
 
493
- function preventTransition(el) {
494
- addClass(el, 'uk-transition-disable');
495
- requestAnimationFrame(() => removeClass(el, 'uk-transition-disable'));
479
+ const clsTransitionDisable = 'uk-transition-disable';
480
+ function preventTransition(element) {
481
+ if (!hasClass(element, clsTransitionDisable)) {
482
+ addClass(element, clsTransitionDisable);
483
+ requestAnimationFrame(() => removeClass(element, clsTransitionDisable));
484
+ }
496
485
  }