uikit 3.15.3-dev.e9711b588 → 3.15.4-dev.c21737f52

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 (63) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/css/uikit-core-rtl.css +2 -2
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +2 -2
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +2 -2
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +2 -2
  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 +102 -109
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +2 -4
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +2 -4
  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 +2 -2
  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 +2 -2
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +90 -96
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +1 -3
  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 +13 -12
  37. package/dist/js/uikit-core.min.js +2 -2
  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 +117 -123
  41. package/dist/js/uikit.min.js +2 -2
  42. package/package.json +1 -1
  43. package/src/js/api/boot.js +2 -2
  44. package/src/js/api/component.js +2 -2
  45. package/src/js/api/state.js +1 -1
  46. package/src/js/components/filter.js +12 -14
  47. package/src/js/core/accordion.js +1 -2
  48. package/src/js/core/grid.js +7 -2
  49. package/src/js/core/scrollspy.js +0 -2
  50. package/src/js/mixin/internal/animate-fade.js +50 -51
  51. package/src/js/mixin/internal/animate-slide.js +52 -57
  52. package/src/js/mixin/parallax.js +1 -1
  53. package/src/js/mixin/scroll.js +2 -2
  54. package/src/js/mixin/slider.js +1 -2
  55. package/src/js/mixin/togglable.js +0 -2
  56. package/src/js/util/observer.js +1 -2
  57. package/src/less/components/nav.less +1 -1
  58. package/src/less/components/navbar.less +2 -1
  59. package/src/scss/components/nav.scss +1 -1
  60. package/src/scss/components/navbar.scss +2 -1
  61. package/src/scss/variables-theme.scss +1 -0
  62. package/src/scss/variables.scss +1 -0
  63. 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.3-dev.e9711b588",
5
+ "version": "3.15.4-dev.c21737f52",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -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
  }
@@ -1,6 +1,6 @@
1
1
  import Margin from './margin';
2
2
  import Class from '../mixin/class';
3
- import Scroll from '../mixin/scroll';
3
+ import { registerScrollListener, unregisterScrollListener } from '../mixin/scroll';
4
4
  import {
5
5
  addClass,
6
6
  children,
@@ -15,7 +15,7 @@ import {
15
15
  export default {
16
16
  extends: Margin,
17
17
 
18
- mixins: [Class, Scroll],
18
+ mixins: [Class],
19
19
 
20
20
  name: 'grid',
21
21
 
@@ -33,6 +33,11 @@ export default {
33
33
 
34
34
  connected() {
35
35
  this.masonry && addClass(this.$el, 'uk-flex-top uk-flex-wrap-top');
36
+ this.parallax && registerScrollListener(this._uid, () => this.$emit('scroll'));
37
+ },
38
+
39
+ disconnected() {
40
+ unregisterScrollListener(this._uid);
36
41
  },
37
42
 
38
43
  update: [
@@ -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
+ }
@@ -353,7 +353,7 @@ function getValue(stops, percent) {
353
353
  return isNumber(start) ? start + Math.abs(start - end) * p * (start < end ? 1 : -1) : +end;
354
354
  }
355
355
 
356
- const unitRe = /^-?\d+(\S*)/;
356
+ const unitRe = /^-?\d+(\S+)/;
357
357
  function getUnit(stops, defaultUnit) {
358
358
  for (const stop of stops) {
359
359
  const match = stop.match?.(unitRe);
@@ -12,7 +12,7 @@ export default {
12
12
 
13
13
  const scrollListeners = new Map();
14
14
  let unbindScrollListener;
15
- function registerScrollListener(id, listener) {
15
+ export function registerScrollListener(id, listener) {
16
16
  unbindScrollListener =
17
17
  unbindScrollListener ||
18
18
  on(window, 'scroll', () => scrollListeners.forEach((listener) => listener()), {
@@ -23,7 +23,7 @@ function registerScrollListener(id, listener) {
23
23
  scrollListeners.set(id, listener);
24
24
  }
25
25
 
26
- function unregisterScrollListener(id) {
26
+ export function unregisterScrollListener(id) {
27
27
  scrollListeners.delete(id);
28
28
  if (unbindScrollListener && !scrollListeners.size) {
29
29
  unbindScrollListener();
@@ -6,7 +6,6 @@ import {
6
6
  $,
7
7
  $$,
8
8
  clamp,
9
- fastdom,
10
9
  getIndex,
11
10
  hasClass,
12
11
  isNumber,
@@ -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
  }
@@ -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();}
@@ -809,6 +809,7 @@ $navbar-dropdown-grid-gutter-horizontal: $global-gutter !default;
809
809
  $navbar-dropdown-grid-gutter-vertical: $navbar-dropdown-grid-gutter-horizontal !default;
810
810
  $navbar-dropdown-large-shift-margin: 0 !default;
811
811
  $navbar-dropdown-large-padding: 40px !default;
812
+ $navbar-dropdown-dropbar-margin: 0 !default;
812
813
  $navbar-dropdown-dropbar-shift-margin: 0 !default;
813
814
  $navbar-dropdown-dropbar-padding-top: $navbar-dropdown-padding !default;
814
815
  $navbar-dropdown-dropbar-padding-bottom: $navbar-dropdown-dropbar-padding-top !default;
@@ -807,6 +807,7 @@ $navbar-dropdown-grid-gutter-horizontal: $global-gutter !default;
807
807
  $navbar-dropdown-grid-gutter-vertical: $navbar-dropdown-grid-gutter-horizontal !default;
808
808
  $navbar-dropdown-large-shift-margin: 0 !default;
809
809
  $navbar-dropdown-large-padding: 40px !default;
810
+ $navbar-dropdown-dropbar-margin: 0 !default;
810
811
  $navbar-dropdown-dropbar-shift-margin: 0 !default;
811
812
  $navbar-dropdown-dropbar-padding-top: $navbar-dropdown-padding !default;
812
813
  $navbar-dropdown-dropbar-padding-bottom: $navbar-dropdown-dropbar-padding-top !default;
package/tests/js/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* global TESTS */
2
- import { addClass, css, fastdom, on, prepend, removeClass, ucfirst } from 'uikit-util';
2
+ import { addClass, css, on, prepend, removeClass, ucfirst } from 'uikit-util';
3
3
 
4
4
  const tests = TESTS;
5
5
  const storage = window.sessionStorage;
@@ -59,7 +59,7 @@ document.writeln(
59
59
  on(window, 'load', () =>
60
60
  setTimeout(
61
61
  () =>
62
- fastdom.write(() => {
62
+ requestAnimationFrame(() => {
63
63
  const $body = document.body;
64
64
  const $container = prepend(
65
65
  $body,