uikit 3.15.2-dev.c376993b7 → 3.15.3-dev.8c13c92d9

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 (66) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/README.md +1 -1
  3. package/dist/css/uikit-core-rtl.css +2 -2
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +2 -2
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +2 -2
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +2 -2
  10. package/dist/css/uikit.min.css +1 -1
  11. package/dist/js/components/countdown.js +1 -1
  12. package/dist/js/components/countdown.min.js +1 -1
  13. package/dist/js/components/filter.js +102 -109
  14. package/dist/js/components/filter.min.js +1 -1
  15. package/dist/js/components/lightbox-panel.js +3 -5
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +3 -5
  18. package/dist/js/components/lightbox.min.js +1 -1
  19. package/dist/js/components/notification.js +1 -1
  20. package/dist/js/components/notification.min.js +1 -1
  21. package/dist/js/components/parallax.js +1 -1
  22. package/dist/js/components/parallax.min.js +1 -1
  23. package/dist/js/components/slider-parallax.js +1 -1
  24. package/dist/js/components/slider-parallax.min.js +1 -1
  25. package/dist/js/components/slider.js +5 -3
  26. package/dist/js/components/slider.min.js +1 -1
  27. package/dist/js/components/slideshow-parallax.js +1 -1
  28. package/dist/js/components/slideshow-parallax.min.js +1 -1
  29. package/dist/js/components/slideshow.js +5 -3
  30. package/dist/js/components/slideshow.min.js +1 -1
  31. package/dist/js/components/sortable.js +90 -96
  32. package/dist/js/components/sortable.min.js +1 -1
  33. package/dist/js/components/tooltip.js +1 -3
  34. package/dist/js/components/tooltip.min.js +1 -1
  35. package/dist/js/components/upload.js +1 -1
  36. package/dist/js/components/upload.min.js +1 -1
  37. package/dist/js/uikit-core.js +33 -25
  38. package/dist/js/uikit-core.min.js +2 -2
  39. package/dist/js/uikit-icons.js +1 -1
  40. package/dist/js/uikit-icons.min.js +1 -1
  41. package/dist/js/uikit.js +139 -136
  42. package/dist/js/uikit.min.js +2 -2
  43. package/package.json +7 -7
  44. package/src/js/api/boot.js +2 -2
  45. package/src/js/api/component.js +2 -2
  46. package/src/js/api/state.js +1 -1
  47. package/src/js/components/filter.js +12 -14
  48. package/src/js/core/accordion.js +1 -2
  49. package/src/js/core/cover.js +1 -1
  50. package/src/js/core/drop.js +16 -7
  51. package/src/js/core/scrollspy.js +0 -2
  52. package/src/js/mixin/internal/animate-fade.js +50 -51
  53. package/src/js/mixin/internal/animate-slide.js +52 -57
  54. package/src/js/mixin/slider-reactive.js +2 -0
  55. package/src/js/mixin/slider.js +2 -3
  56. package/src/js/mixin/togglable.js +0 -2
  57. package/src/js/util/observer.js +1 -2
  58. package/src/js/util/position.js +4 -1
  59. package/src/less/components/nav.less +1 -1
  60. package/src/less/components/navbar.less +2 -1
  61. package/src/scss/components/nav.scss +1 -1
  62. package/src/scss/components/navbar.scss +2 -1
  63. package/src/scss/variables-theme.scss +1 -0
  64. package/src/scss/variables.scss +1 -0
  65. package/tests/drop.html +36 -3
  66. package/tests/js/index.js +2 -2
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.15.2-dev.c376993b7",
5
+ "version": "3.15.3-dev.8c13c92d9",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "homepage": "https://getuikit.com",
36
36
  "devDependencies": {
37
- "@babel/core": "^7.18.6",
38
- "@babel/preset-env": "^7.18.6",
37
+ "@babel/core": "^7.18.10",
38
+ "@babel/preset-env": "^7.18.10",
39
39
  "@rollup/plugin-alias": "^3.1.9",
40
40
  "@rollup/plugin-babel": "^5.3.1",
41
41
  "@rollup/plugin-replace": "^4.0.0",
@@ -43,18 +43,18 @@
43
43
  "camelcase": "^7.0.0",
44
44
  "clean-css": "^5.3.1",
45
45
  "dateformat": "^5.0.3",
46
- "esbuild": "^0.14.49",
47
- "eslint": "^8.19.0",
46
+ "esbuild": "^0.14.53",
47
+ "eslint": "^8.21.0",
48
48
  "eslint-config-prettier": "^8.5.0",
49
49
  "fs-extra": "^10.1.0",
50
50
  "glob": "^8.0.3",
51
- "inquirer": "^9.0.0",
51
+ "inquirer": "^9.1.0",
52
52
  "less": "^4.1.3",
53
53
  "minimist": "^1.2.6",
54
54
  "number-precision": "^1.5.2",
55
55
  "p-limit": "^4.0.0",
56
56
  "prettier": "^2.7.1",
57
- "rollup": "^2.77.0",
57
+ "rollup": "^2.77.2",
58
58
  "rollup-plugin-esbuild": "^4.9.1",
59
59
  "rollup-plugin-html": "^0.2.1",
60
60
  "rollup-plugin-modify": "^3.0.0",
@@ -1,5 +1,5 @@
1
1
  import { getComponentName } from './component';
2
- import { apply, fastdom, hasAttr, inBrowser } from 'uikit-util';
2
+ import { apply, hasAttr, inBrowser } from 'uikit-util';
3
3
 
4
4
  export default function (UIkit) {
5
5
  const { connect, disconnect } = UIkit;
@@ -8,7 +8,7 @@ export default function (UIkit) {
8
8
  return;
9
9
  }
10
10
 
11
- fastdom.read(function () {
11
+ requestAnimationFrame(function () {
12
12
  if (document.body) {
13
13
  apply(document.body, connect);
14
14
  }
@@ -1,4 +1,4 @@
1
- import { $$, camelize, fastdom, hyphenate, isPlainObject, memoize, startsWith } from 'uikit-util';
1
+ import { $$, camelize, hyphenate, isPlainObject, memoize, startsWith } from 'uikit-util';
2
2
 
3
3
  export default function (UIkit) {
4
4
  const DATA = UIkit.data;
@@ -49,7 +49,7 @@ export default function (UIkit) {
49
49
  opt.install?.(UIkit, opt, name);
50
50
 
51
51
  if (UIkit._initialized && !opt.functional) {
52
- fastdom.read(() => UIkit[name](`[uk-${id}],[data-uk-${id}]`));
52
+ requestAnimationFrame(() => UIkit[name](`[uk-${id}],[data-uk-${id}]`));
53
53
  }
54
54
 
55
55
  return (components[name] = isPlainObject(options) ? opt : options);
@@ -267,7 +267,7 @@ function normalizeData({ data = {} }, { args = [], props = {} }) {
267
267
  function initChildListObserver(component) {
268
268
  const { el } = component.$options;
269
269
 
270
- const observer = new MutationObserver(() => component.$emit());
270
+ const observer = new MutationObserver(() => component._callWatches());
271
271
  observer.observe(el, {
272
272
  childList: true,
273
273
  subtree: true,
@@ -5,7 +5,6 @@ import {
5
5
  css,
6
6
  data,
7
7
  each,
8
- fastdom,
9
8
  children as getChildren,
10
9
  hasClass,
11
10
  includes,
@@ -43,7 +42,7 @@ export default {
43
42
  },
44
43
 
45
44
  watch() {
46
- this.updateState();
45
+ this.$emit();
47
46
 
48
47
  if (this.selActive !== false) {
49
48
  const actives = $$(this.selActive, this.$el);
@@ -61,7 +60,7 @@ export default {
61
60
 
62
61
  watch(list, old) {
63
62
  if (old && !isEqualList(list, old)) {
64
- this.updateState();
63
+ this.$emit();
65
64
  }
66
65
  },
67
66
 
@@ -69,6 +68,12 @@ export default {
69
68
  },
70
69
  },
71
70
 
71
+ update: {
72
+ write() {
73
+ this.setState(this.getState(), false);
74
+ },
75
+ },
76
+
72
77
  events: [
73
78
  {
74
79
  name: 'click',
@@ -108,26 +113,19 @@ export default {
108
113
 
109
114
  trigger(this.$el, 'beforeFilter', [this, state]);
110
115
 
111
- this.toggles.forEach((el) =>
112
- toggleClass(el, this.cls, !!matchFilter(el, this.attrItem, state))
113
- );
116
+ for (const el of this.toggles) {
117
+ toggleClass(el, this.cls, !!matchFilter(el, this.attrItem, state));
118
+ }
114
119
 
115
120
  await Promise.all(
116
121
  $$(this.target, this.$el).map((target) => {
117
- const filterFn = () => {
118
- applyState(state, target, getChildren(target));
119
- this.$update(this.$el);
120
- };
122
+ const filterFn = () => applyState(state, target, getChildren(target));
121
123
  return animate ? this.animate(filterFn, target) : filterFn();
122
124
  })
123
125
  );
124
126
 
125
127
  trigger(this.$el, 'afterFilter', [this]);
126
128
  },
127
-
128
- updateState() {
129
- fastdom.write(() => this.setState(this.getState(), false));
130
- },
131
129
  },
132
130
  };
133
131
 
@@ -5,7 +5,6 @@ import {
5
5
  $,
6
6
  $$,
7
7
  attr,
8
- fastdom,
9
8
  filter,
10
9
  getIndex,
11
10
  hasClass,
@@ -144,7 +143,7 @@ export default {
144
143
 
145
144
  if (show) {
146
145
  const toggle = $(this.$props.toggle, el);
147
- fastdom.read(() => {
146
+ requestAnimationFrame(() => {
148
147
  if (!isInView(toggle)) {
149
148
  scrollIntoView(toggle, { offset: this.offset });
150
149
  }
@@ -21,7 +21,7 @@ export default {
21
21
  },
22
22
 
23
23
  resizeTargets() {
24
- return [this.$el, parent(this.$el)];
24
+ return [this.$el, getPositionedParent(this.$el) || parent(this.$el)];
25
25
  },
26
26
 
27
27
  update: {
@@ -43,6 +43,8 @@ export default {
43
43
  mode: 'list',
44
44
  toggle: Boolean,
45
45
  boundary: Boolean,
46
+ boundaryX: Boolean,
47
+ boundaryY: Boolean,
46
48
  target: Boolean,
47
49
  targetX: Boolean,
48
50
  targetY: Boolean,
@@ -59,6 +61,8 @@ export default {
59
61
  mode: ['click', 'hover'],
60
62
  toggle: '- *',
61
63
  boundary: false,
64
+ boundaryX: false,
65
+ boundaryY: false,
62
66
  target: false,
63
67
  targetX: false,
64
68
  targetY: false,
@@ -75,6 +79,13 @@ export default {
75
79
  },
76
80
 
77
81
  computed: {
82
+ boundary({ boundary, boundaryX, boundaryY }, $el) {
83
+ return [
84
+ query(boundaryX || boundary, $el) || window,
85
+ query(boundaryY || boundary, $el) || window,
86
+ ];
87
+ },
88
+
78
89
  target({ target, targetX, targetY }, $el) {
79
90
  targetX = targetX || target || this.targetEl;
80
91
  targetY = targetY || target || this.targetEl;
@@ -412,8 +423,6 @@ export default {
412
423
  // Ensure none positioned element does not generate scrollbars
413
424
  this.$el.hidden = true;
414
425
 
415
- const boundary = query(this.boundary, this.$el);
416
- const boundaryOffset = offset(boundary || window);
417
426
  const viewports = this.target.map((target) => offsetViewport(scrollParents(target)[0]));
418
427
  const viewportOffset = this.getViewportOffset(this.$el);
419
428
 
@@ -426,7 +435,7 @@ export default {
426
435
  if (this.axis !== axis && includes([axis, true], this.stretch)) {
427
436
  css(this.$el, {
428
437
  [prop]: Math.min(
429
- boundaryOffset[prop],
438
+ offset(this.boundary[i])[prop],
430
439
  viewports[i][prop] - 2 * viewportOffset
431
440
  ),
432
441
  [`overflow-${axis}`]: 'auto',
@@ -444,7 +453,7 @@ export default {
444
453
 
445
454
  this.$el.hidden = false;
446
455
 
447
- this.positionAt(this.$el, this.target, boundary);
456
+ this.positionAt(this.$el, this.target, this.boundary);
448
457
 
449
458
  for (const [i, [axis, prop, start, end]] of dirs) {
450
459
  if (this.axis === axis && includes([axis, true], this.stretch)) {
@@ -457,17 +466,17 @@ export default {
457
466
  (targetOffset[start] > elOffset[start]
458
467
  ? targetOffset[start] -
459
468
  Math.max(
460
- boundaryOffset[start],
469
+ offset(this.boundary[i])[start],
461
470
  viewports[i][start] + viewportOffset
462
471
  )
463
472
  : Math.min(
464
- boundaryOffset[end],
473
+ offset(this.boundary[i])[end],
465
474
  viewports[i][end] - viewportOffset
466
475
  ) - targetOffset[end]) - positionOffset,
467
476
  [`overflow-${axis}`]: 'auto',
468
477
  });
469
478
 
470
- this.positionAt(this.$el, this.target, boundary);
479
+ this.positionAt(this.$el, this.target, this.boundary);
471
480
  }
472
481
  }
473
482
  },
@@ -151,8 +151,6 @@ export default {
151
151
  trigger(el, inview ? 'inview' : 'outview');
152
152
 
153
153
  state.inview = inview;
154
-
155
- this.$update(el);
156
154
  },
157
155
  },
158
156
  };
@@ -23,10 +23,10 @@ export default function fade(action, target, duration, stagger = 0) {
23
23
 
24
24
  const wrapIndexFn = (fn) => () => index === transitionIndex(target) ? fn() : Promise.reject();
25
25
 
26
- const leaveFn = wrapIndexFn(() => {
26
+ const leaveFn = wrapIndexFn(async () => {
27
27
  addClass(target, clsLeave);
28
28
 
29
- return Promise.all(
29
+ await Promise.all(
30
30
  getTransitionNodes(target).map(
31
31
  (child, i) =>
32
32
  new Promise((resolve) =>
@@ -39,10 +39,12 @@ export default function fade(action, target, duration, stagger = 0) {
39
39
  )
40
40
  )
41
41
  )
42
- ).then(() => removeClass(target, clsLeave));
42
+ );
43
+
44
+ removeClass(target, clsLeave);
43
45
  });
44
46
 
45
- const enterFn = wrapIndexFn(() => {
47
+ const enterFn = wrapIndexFn(async () => {
46
48
  const oldHeight = height(target);
47
49
 
48
50
  addClass(target, clsEnter);
@@ -51,53 +53,42 @@ export default function fade(action, target, duration, stagger = 0) {
51
53
  css(children(target), { opacity: 0 });
52
54
 
53
55
  // Ensure UIkit updates have propagated
54
- return new Promise((resolve) =>
55
- requestAnimationFrame(() => {
56
- const nodes = children(target);
57
- const newHeight = height(target);
58
-
59
- // Ensure Grid cells do not stretch when height is applied
60
- css(target, 'alignContent', 'flex-start');
61
- height(target, oldHeight);
62
-
63
- const transitionNodes = getTransitionNodes(target);
64
- css(nodes, propsOut);
65
-
66
- const transitions = transitionNodes.map(
67
- (child, i) =>
68
- new Promise((resolve) =>
69
- setTimeout(
70
- () =>
71
- Transition.start(child, propsIn, duration / 2, 'ease').then(
72
- resolve
73
- ),
74
- i * stagger
75
- )
76
- )
77
- );
78
-
79
- if (oldHeight !== newHeight) {
80
- transitions.push(
81
- Transition.start(
82
- target,
83
- { height: newHeight },
84
- duration / 2 + transitionNodes.length * stagger,
85
- 'ease'
86
- )
87
- );
88
- }
89
-
90
- Promise.all(transitions).then(() => {
91
- removeClass(target, clsEnter);
92
- if (index === transitionIndex(target)) {
93
- css(target, { height: '', alignContent: '' });
94
- css(nodes, { opacity: '' });
95
- delete target.dataset.transition;
96
- }
97
- resolve();
98
- });
99
- })
100
- );
56
+ await awaitFrame();
57
+
58
+ const nodes = children(target);
59
+ const newHeight = height(target);
60
+
61
+ // Ensure Grid cells do not stretch when height is applied
62
+ css(target, 'alignContent', 'flex-start');
63
+ height(target, oldHeight);
64
+
65
+ const transitionNodes = getTransitionNodes(target);
66
+ css(nodes, propsOut);
67
+
68
+ const transitions = transitionNodes.map(async (child, i) => {
69
+ await awaitTimeout(i * stagger);
70
+ await Transition.start(child, propsIn, duration / 2, 'ease');
71
+ });
72
+
73
+ if (oldHeight !== newHeight) {
74
+ transitions.push(
75
+ Transition.start(
76
+ target,
77
+ { height: newHeight },
78
+ duration / 2 + transitionNodes.length * stagger,
79
+ 'ease'
80
+ )
81
+ );
82
+ }
83
+
84
+ await Promise.all(transitions).then(() => {
85
+ removeClass(target, clsEnter);
86
+ if (index === transitionIndex(target)) {
87
+ css(target, { height: '', alignContent: '' });
88
+ css(nodes, { opacity: '' });
89
+ delete target.dataset.transition;
90
+ }
91
+ });
101
92
  });
102
93
 
103
94
  return hasClass(target, clsLeave)
@@ -138,3 +129,11 @@ function getTransitionNodes(target) {
138
129
  []
139
130
  );
140
131
  }
132
+
133
+ function awaitFrame() {
134
+ return new Promise((resolve) => requestAnimationFrame(resolve));
135
+ }
136
+
137
+ function awaitTimeout(timeout) {
138
+ return new Promise((resolve) => setTimeout(resolve, timeout));
139
+ }
@@ -12,63 +12,54 @@ import {
12
12
  Transition,
13
13
  } from 'uikit-util';
14
14
 
15
- export default function (action, target, duration) {
16
- return new Promise((resolve) =>
17
- requestAnimationFrame(() => {
18
- let nodes = children(target);
19
-
20
- // Get current state
21
- const currentProps = nodes.map((el) => getProps(el, true));
22
- const targetProps = css(target, ['height', 'padding']);
23
-
24
- // Cancel previous animations
25
- Transition.cancel(target);
26
- nodes.forEach(Transition.cancel);
27
- reset(target);
28
-
29
- // Adding, sorting, removing nodes
30
- action();
31
-
32
- // Find new nodes
33
- nodes = nodes.concat(children(target).filter((el) => !includes(nodes, el)));
34
-
35
- // Wait for update to propagate
36
- Promise.resolve().then(() => {
37
- // Force update
38
- fastdom.flush();
39
-
40
- // Get new state
41
- const targetPropsTo = css(target, ['height', 'padding']);
42
- const [propsTo, propsFrom] = getTransitionProps(target, nodes, currentProps);
43
-
44
- // Reset to previous state
45
- nodes.forEach((el, i) => propsFrom[i] && css(el, propsFrom[i]));
46
- css(target, { display: 'block', ...targetProps });
47
-
48
- // Start transitions on next frame
49
- requestAnimationFrame(() => {
50
- const transitions = nodes
51
- .map(
52
- (el, i) =>
53
- parent(el) === target &&
54
- Transition.start(el, propsTo[i], duration, 'ease')
55
- )
56
- .concat(Transition.start(target, targetPropsTo, duration, 'ease'));
57
-
58
- Promise.all(transitions)
59
- .then(() => {
60
- nodes.forEach(
61
- (el, i) =>
62
- parent(el) === target &&
63
- css(el, 'display', propsTo[i].opacity === 0 ? 'none' : '')
64
- );
65
- reset(target);
66
- }, noop)
67
- .then(resolve);
68
- });
69
- });
70
- })
71
- );
15
+ export default async function (action, target, duration) {
16
+ await awaitFrame();
17
+
18
+ let nodes = children(target);
19
+
20
+ // Get current state
21
+ const currentProps = nodes.map((el) => getProps(el, true));
22
+ const targetProps = css(target, ['height', 'padding']);
23
+
24
+ // Cancel previous animations
25
+ Transition.cancel(target);
26
+ nodes.forEach(Transition.cancel);
27
+ reset(target);
28
+
29
+ // Adding, sorting, removing nodes
30
+ action();
31
+
32
+ // Find new nodes
33
+ nodes = nodes.concat(children(target).filter((el) => !includes(nodes, el)));
34
+
35
+ // Wait for update to propagate
36
+ await Promise.resolve();
37
+
38
+ // Force update
39
+ fastdom.flush();
40
+
41
+ // Get new state
42
+ const targetPropsTo = css(target, ['height', 'padding']);
43
+ const [propsTo, propsFrom] = getTransitionProps(target, nodes, currentProps);
44
+
45
+ // Reset to previous state
46
+ nodes.forEach((el, i) => propsFrom[i] && css(el, propsFrom[i]));
47
+ css(target, { display: 'block', ...targetProps });
48
+
49
+ // Start transitions on next frame
50
+ await awaitFrame();
51
+
52
+ const transitions = nodes
53
+ .map((el, i) => parent(el) === target && Transition.start(el, propsTo[i], duration, 'ease'))
54
+ .concat(Transition.start(target, targetPropsTo, duration, 'ease'));
55
+
56
+ await Promise.all(transitions).then(() => {
57
+ nodes.forEach(
58
+ (el, i) =>
59
+ parent(el) === target && css(el, 'display', propsTo[i].opacity === 0 ? 'none' : '')
60
+ );
61
+ reset(target);
62
+ }, noop);
72
63
  }
73
64
 
74
65
  function getProps(el, opacity) {
@@ -146,3 +137,7 @@ function getPositionWithMargin(el) {
146
137
 
147
138
  return { top, left, height, width, marginLeft, marginTop, transform: '' };
148
139
  }
140
+
141
+ function awaitFrame() {
142
+ return new Promise((resolve) => requestAnimationFrame(resolve));
143
+ }
@@ -9,6 +9,8 @@ export default {
9
9
 
10
10
  if (!~this.prevIndex || this.index !== index) {
11
11
  this.show(index);
12
+ } else {
13
+ this._translate(1, this.prevIndex, this.index);
12
14
  }
13
15
  },
14
16
 
@@ -6,7 +6,6 @@ import {
6
6
  $,
7
7
  $$,
8
8
  clamp,
9
- fastdom,
10
9
  getIndex,
11
10
  hasClass,
12
11
  isNumber,
@@ -74,7 +73,7 @@ export default {
74
73
  },
75
74
 
76
75
  watch() {
77
- this.$reset();
76
+ this.$emit('resize');
78
77
  },
79
78
  },
80
79
 
@@ -137,7 +136,7 @@ export default {
137
136
  trigger(next, 'itemshown', [this]);
138
137
 
139
138
  return new Promise((resolve) => {
140
- fastdom.write(() => {
139
+ requestAnimationFrame(() => {
141
140
  stack.shift();
142
141
  if (stack.length) {
143
142
  this.show(stack.shift(), true);
@@ -82,7 +82,6 @@ export default {
82
82
  const done = () => {
83
83
  removeClass(el, cls);
84
84
  trigger(el, show ? 'shown' : 'hidden', [this]);
85
- this.$update(el);
86
85
  };
87
86
 
88
87
  return promise
@@ -127,7 +126,6 @@ export default {
127
126
 
128
127
  if (changed) {
129
128
  trigger(el, 'toggled', [toggled, this]);
130
- this.$update(el);
131
129
  }
132
130
  },
133
131
  },
@@ -1,6 +1,5 @@
1
1
  import { on } from './event';
2
2
  import { toNodes } from './lang';
3
- import { fastdom } from './fastdom';
4
3
  import { inBrowser } from './env';
5
4
 
6
5
  export function observeIntersection(targets, cb, options, intersecting = true) {
@@ -53,7 +52,7 @@ function initResizeListener() {
53
52
  return;
54
53
  }
55
54
  pendingResize = true;
56
- fastdom.read(() => (pendingResize = false));
55
+ requestAnimationFrame(() => (pendingResize = false));
57
56
  for (const listener of listeners) {
58
57
  listener();
59
58
  }
@@ -141,7 +141,10 @@ function getViewport(element, viewportOffset, boundary, i) {
141
141
  }
142
142
 
143
143
  if (boundary) {
144
- viewport = getIntersectionArea(viewport, offset(boundary));
144
+ viewport = getIntersectionArea(
145
+ viewport,
146
+ offset(isArray(boundary) ? boundary[i] : boundary)
147
+ );
145
148
  }
146
149
 
147
150
  return viewport;
@@ -454,7 +454,7 @@ ul.uk-nav-sub {
454
454
  * Naming is in plural to prevent conflicts with divider sub object.
455
455
  */
456
456
 
457
- .uk-nav.uk-nav-divider > :not(.uk-nav-divider) + :not(.uk-nav-header, .uk-nav-divider) {
457
+ .uk-nav.uk-nav-divider > :not(.uk-nav-header, .uk-nav-divider) + :not(.uk-nav-header, .uk-nav-divider) {
458
458
  margin-top: @nav-dividers-margin-top;
459
459
  padding-top: @nav-dividers-margin-top;
460
460
  border-top: @nav-dividers-border-width solid @nav-dividers-border;
@@ -77,6 +77,7 @@
77
77
  @navbar-dropdown-large-shift-margin: 0;
78
78
  @navbar-dropdown-large-padding: 40px;
79
79
 
80
+ @navbar-dropdown-dropbar-margin: 0;
80
81
  @navbar-dropdown-dropbar-shift-margin: 0;
81
82
  @navbar-dropdown-dropbar-padding-top: @navbar-dropdown-padding;
82
83
  @navbar-dropdown-dropbar-padding-bottom: @navbar-dropdown-dropbar-padding-top;
@@ -462,7 +463,7 @@
462
463
  background: transparent;
463
464
  /* 3 */
464
465
  padding: @navbar-dropdown-dropbar-padding-top 0 @navbar-dropdown-dropbar-padding-bottom 0;
465
- --uk-position-offset: 0;
466
+ --uk-position-offset: @navbar-dropdown-dropbar-margin;
466
467
  --uk-position-shift-offset: @navbar-dropdown-dropbar-shift-margin;
467
468
  --uk-position-viewport-offset: @navbar-dropdown-dropbar-viewport-margin;
468
469
  .hook-navbar-dropdown-dropbar();
@@ -454,7 +454,7 @@ ul.uk-nav-sub {
454
454
  * Naming is in plural to prevent conflicts with divider sub object.
455
455
  */
456
456
 
457
- .uk-nav.uk-nav-divider > :not(.uk-nav-divider) + :not(.uk-nav-header, .uk-nav-divider) {
457
+ .uk-nav.uk-nav-divider > :not(.uk-nav-header, .uk-nav-divider) + :not(.uk-nav-header, .uk-nav-divider) {
458
458
  margin-top: $nav-dividers-margin-top;
459
459
  padding-top: $nav-dividers-margin-top;
460
460
  border-top: $nav-dividers-border-width solid $nav-dividers-border;
@@ -77,6 +77,7 @@ $navbar-dropdown-grid-gutter-vertical: $navbar-dropdown-grid-gutter-ho
77
77
  $navbar-dropdown-large-shift-margin: 0 !default;
78
78
  $navbar-dropdown-large-padding: 40px !default;
79
79
 
80
+ $navbar-dropdown-dropbar-margin: 0 !default;
80
81
  $navbar-dropdown-dropbar-shift-margin: 0 !default;
81
82
  $navbar-dropdown-dropbar-padding-top: $navbar-dropdown-padding !default;
82
83
  $navbar-dropdown-dropbar-padding-bottom: $navbar-dropdown-dropbar-padding-top !default;
@@ -462,7 +463,7 @@ $navbar-dropbar-z-index: $global-z-index - 20 !default;
462
463
  background: transparent;
463
464
  /* 3 */
464
465
  padding: $navbar-dropdown-dropbar-padding-top 0 $navbar-dropdown-dropbar-padding-bottom 0;
465
- --uk-position-offset: 0;
466
+ --uk-position-offset: #{$navbar-dropdown-dropbar-margin};
466
467
  --uk-position-shift-offset: #{$navbar-dropdown-dropbar-shift-margin};
467
468
  --uk-position-viewport-offset: #{$navbar-dropdown-dropbar-viewport-margin};
468
469
  @if(mixin-exists(hook-navbar-dropdown-dropbar)) {@include hook-navbar-dropdown-dropbar();}