uikit 3.14.4-dev.cd89debeb → 3.14.4-dev.d2929b5b7

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 (134) hide show
  1. package/CHANGELOG.md +41 -12
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +380 -102
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +380 -102
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +397 -107
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +397 -107
  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 +7 -5
  14. package/dist/js/components/filter.min.js +1 -1
  15. package/dist/js/components/lightbox-panel.js +99 -135
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +99 -135
  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 +4 -5
  22. package/dist/js/components/parallax.min.js +1 -1
  23. package/dist/js/components/slider-parallax.js +4 -5
  24. package/dist/js/components/slider-parallax.min.js +1 -1
  25. package/dist/js/components/slider.js +22 -7
  26. package/dist/js/components/slider.min.js +1 -1
  27. package/dist/js/components/slideshow-parallax.js +4 -5
  28. package/dist/js/components/slideshow-parallax.min.js +1 -1
  29. package/dist/js/components/slideshow.js +22 -7
  30. package/dist/js/components/slideshow.min.js +1 -1
  31. package/dist/js/components/sortable.js +3 -3
  32. package/dist/js/components/sortable.min.js +1 -1
  33. package/dist/js/components/tooltip.js +93 -132
  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 +419 -381
  38. package/dist/js/uikit-core.min.js +14 -1
  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 +472 -417
  42. package/dist/js/uikit.min.js +14 -1
  43. package/package.json +1 -1
  44. package/src/images/{backgrounds/nav-parent-open.svg → components/nav-parent-icon-large.svg} +0 -0
  45. package/src/images/components/nav-parent-icon.svg +3 -0
  46. package/src/images/components/navbar-parent-icon.svg +3 -0
  47. package/src/images/components/navbar-toggle-icon.svg +22 -3
  48. package/src/js/api/state.js +1 -1
  49. package/src/js/components/filter.js +5 -3
  50. package/src/js/components/sortable.js +2 -3
  51. package/src/js/core/accordion.js +9 -17
  52. package/src/js/core/alert.js +35 -14
  53. package/src/js/core/drop.js +90 -61
  54. package/src/js/core/height-viewport.js +14 -6
  55. package/src/js/core/icon.js +16 -0
  56. package/src/js/core/index.js +2 -0
  57. package/src/js/core/leader.js +2 -2
  58. package/src/js/core/navbar.js +42 -30
  59. package/src/js/core/scroll.js +37 -10
  60. package/src/js/core/sticky.js +8 -9
  61. package/src/js/mixin/media.js +4 -5
  62. package/src/js/mixin/modal.js +9 -6
  63. package/src/js/mixin/position.js +22 -8
  64. package/src/js/mixin/slider-drag.js +20 -8
  65. package/src/js/mixin/togglable.js +80 -133
  66. package/src/js/util/animation.js +4 -3
  67. package/src/js/util/dimensions.js +6 -6
  68. package/src/js/util/filter.js +3 -7
  69. package/src/js/util/position.js +43 -47
  70. package/src/js/util/style.js +4 -13
  71. package/src/js/util/viewport.js +5 -32
  72. package/src/less/components/_import.less +1 -0
  73. package/src/less/components/drop.less +1 -18
  74. package/src/less/components/dropbar.less +115 -0
  75. package/src/less/components/dropdown.less +16 -16
  76. package/src/less/components/leader.less +1 -1
  77. package/src/less/components/nav.less +240 -63
  78. package/src/less/components/navbar.less +73 -28
  79. package/src/less/components/utility.less +21 -4
  80. package/src/less/theme/_import.less +1 -0
  81. package/src/less/theme/dropbar.less +44 -0
  82. package/src/less/theme/dropdown.less +0 -11
  83. package/src/less/theme/nav.less +43 -9
  84. package/src/less/theme/navbar.less +4 -10
  85. package/src/scss/components/_import.scss +1 -0
  86. package/src/scss/components/drop.scss +1 -18
  87. package/src/scss/components/dropbar.scss +115 -0
  88. package/src/scss/components/dropdown.scss +16 -16
  89. package/src/scss/components/leader.scss +1 -1
  90. package/src/scss/components/nav.scss +189 -51
  91. package/src/scss/components/navbar.scss +61 -28
  92. package/src/scss/components/utility.scss +19 -3
  93. package/src/scss/mixins-theme.scss +93 -25
  94. package/src/scss/mixins.scss +89 -17
  95. package/src/scss/theme/_import.scss +1 -0
  96. package/src/scss/theme/dropbar.scss +44 -0
  97. package/src/scss/theme/dropdown.scss +0 -8
  98. package/src/scss/theme/nav.scss +41 -9
  99. package/src/scss/theme/navbar.scss +4 -7
  100. package/src/scss/variables-theme.scss +69 -17
  101. package/src/scss/variables.scss +58 -13
  102. package/tests/accordion.html +2 -2
  103. package/tests/alert.html +2 -2
  104. package/tests/countdown.html +1 -1
  105. package/tests/drop.html +453 -371
  106. package/tests/dropbar.html +456 -0
  107. package/tests/dropdown.html +26 -401
  108. package/tests/filter.html +9 -12
  109. package/tests/form.html +1 -1
  110. package/tests/index.html +126 -107
  111. package/tests/lightbox.html +5 -5
  112. package/tests/list.html +8 -8
  113. package/tests/modal.html +13 -13
  114. package/tests/nav.html +117 -75
  115. package/tests/navbar.html +1997 -1138
  116. package/tests/offcanvas.html +17 -21
  117. package/tests/parallax.html +1 -1
  118. package/tests/position.html +13 -24
  119. package/tests/progress.html +9 -9
  120. package/tests/scroll.html +7 -10
  121. package/tests/search.html +5 -5
  122. package/tests/slider.html +6 -5
  123. package/tests/slideshow.html +8 -8
  124. package/tests/sortable.html +6 -8
  125. package/tests/sticky-navbar.html +6 -6
  126. package/tests/sticky.html +8 -8
  127. package/tests/switcher.html +1 -1
  128. package/tests/tab.html +1 -1
  129. package/tests/table.html +7 -7
  130. package/tests/toggle.html +2 -2
  131. package/tests/tooltip.html +1 -1
  132. package/tests/upload.html +11 -11
  133. package/tests/utility.html +19 -0
  134. package/src/images/backgrounds/nav-parent-close.svg +0 -3
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.4-dev.cd89debeb",
5
+ "version": "3.14.4-dev.d2929b5b7",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
2
+ <polyline fill="none" stroke="#000" stroke-width="1.1" points="1 3.5 6 8.5 11 3.5"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
2
+ <polyline fill="none" stroke="#000" stroke-width="1.1" points="1 3.5 6 8.5 11 3.5"/>
3
+ </svg>
@@ -1,5 +1,24 @@
1
1
  <svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
2
- <rect y="9" width="20" height="2" />
3
- <rect y="3" width="20" height="2" />
4
- <rect y="15" width="20" height="2" />
2
+ <style>
3
+
4
+ .uk-navbar-toggle svg > [class*='line-'] {
5
+ transition: 0.2s ease-in-out;
6
+ transition-property: transform, opacity,;
7
+ transform-origin: center;
8
+ opacity: 1;
9
+ }
10
+
11
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-2 { transform: rotate(45deg); }
12
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-3 { transform: rotate(-45deg); }
13
+
14
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-1,
15
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-4 { opacity: 0; }
16
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-1 { transform: translateY(6px) scaleX(0); }
17
+ .uk-navbar-toggle[aria-expanded="true"] svg > .line-4 { transform: translateY(-6px) scaleX(0); }
18
+
19
+ </style>
20
+ <rect class="line-1" y="3" width="20" height="2" />
21
+ <rect class="line-2" y="9" width="20" height="2" />
22
+ <rect class="line-3" y="9" width="20" height="2" />
23
+ <rect class="line-4" y="15" width="20" height="2" />
5
24
  </svg>
@@ -142,7 +142,7 @@ function getProps(opts, name) {
142
142
 
143
143
  value = props[key] === Boolean && value === '' ? true : coerce(props[key], value);
144
144
 
145
- if (prop === 'target' && (!value || startsWith(value, '_'))) {
145
+ if (prop === 'target' && startsWith(value, '_')) {
146
146
  continue;
147
147
  }
148
148
 
@@ -103,7 +103,7 @@ export default {
103
103
  });
104
104
  },
105
105
 
106
- setState(state, animate = true) {
106
+ async setState(state, animate = true) {
107
107
  state = { filter: { '': '' }, sort: [], ...state };
108
108
 
109
109
  trigger(this.$el, 'beforeFilter', [this, state]);
@@ -112,7 +112,7 @@ export default {
112
112
  toggleClass(el, this.cls, !!matchFilter(el, this.attrItem, state))
113
113
  );
114
114
 
115
- Promise.all(
115
+ await Promise.all(
116
116
  $$(this.target, this.$el).map((target) => {
117
117
  const filterFn = () => {
118
118
  applyState(state, target, getChildren(target));
@@ -120,7 +120,9 @@ export default {
120
120
  };
121
121
  return animate ? this.animate(filterFn, target) : filterFn();
122
122
  })
123
- ).then(() => trigger(this.$el, 'afterFilter', [this]));
123
+ );
124
+
125
+ trigger(this.$el, 'afterFilter', [this]);
124
126
  },
125
127
 
126
128
  updateState() {
@@ -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
  });
@@ -1,6 +1,6 @@
1
1
  import Class from '../mixin/class';
2
2
  import Lazyload from '../mixin/lazyload';
3
- import { slide, default as Togglable } from '../mixin/togglable';
3
+ import { default as Togglable, toggleTransition } from '../mixin/togglable';
4
4
  import {
5
5
  $,
6
6
  $$,
@@ -14,14 +14,14 @@ import {
14
14
  isInView,
15
15
  scrollIntoView,
16
16
  toggleClass,
17
- unwrap,
18
- wrapAll,
17
+ within,
19
18
  } from 'uikit-util';
20
19
 
21
20
  export default {
22
21
  mixins: [Class, Lazyload, Togglable],
23
22
 
24
23
  props: {
24
+ animation: Boolean,
25
25
  targets: String,
26
26
  active: null,
27
27
  collapsible: Boolean,
@@ -34,7 +34,7 @@ export default {
34
34
  data: {
35
35
  targets: '> *',
36
36
  active: false,
37
- animation: ['slide'],
37
+ animation: true,
38
38
  collapsible: true,
39
39
  multiple: false,
40
40
  clsOpen: 'uk-open',
@@ -80,7 +80,7 @@ export default {
80
80
  hide(
81
81
  el,
82
82
  !hasClass(
83
- this.items.find((item) => item.contains(el)),
83
+ this.items.find((item) => within(el, item)),
84
84
  this.clsOpen
85
85
  )
86
86
  );
@@ -132,23 +132,15 @@ export default {
132
132
  toggleClass(el, this.clsOpen, show);
133
133
  attr($(this.$props.toggle, el), 'aria-expanded', show);
134
134
 
135
- const content = $(`${el._wrapper ? '> * ' : ''}${this.content}`, el);
135
+ const content = $(this.content, el);
136
136
 
137
- if (animate === false || !this.hasTransition) {
137
+ if (animate === false || !this.animation) {
138
+ content.hidden = !show;
138
139
  hide(content, !show);
139
140
  return;
140
141
  }
141
142
 
142
- if (!el._wrapper) {
143
- el._wrapper = wrapAll(content, `<div${show ? ' hidden' : ''}>`);
144
- }
145
-
146
- hide(content, false);
147
- await slide(this)(el._wrapper, show);
148
- hide(content, !show);
149
-
150
- delete el._wrapper;
151
- unwrap(content);
143
+ await toggleTransition(this)(content, show);
152
144
 
153
145
  if (show) {
154
146
  const toggle = $(this.$props.toggle, el);
@@ -1,5 +1,6 @@
1
1
  import Class from '../mixin/class';
2
2
  import Togglable from '../mixin/togglable';
3
+ import { css, toFloat, Transition } from 'uikit-util';
3
4
 
4
5
  export default {
5
6
  mixins: [Class, Togglable],
@@ -7,35 +8,55 @@ export default {
7
8
  args: 'animation',
8
9
 
9
10
  props: {
11
+ animation: Boolean,
10
12
  close: String,
11
13
  },
12
14
 
13
15
  data: {
14
- animation: ['slide'],
16
+ animation: true,
15
17
  selClose: '.uk-alert-close',
16
18
  duration: 150,
17
- hideProps: { opacity: 0, ...Togglable.data.hideProps },
18
19
  },
19
20
 
20
- events: [
21
- {
22
- name: 'click',
21
+ events: {
22
+ name: 'click',
23
23
 
24
- delegate() {
25
- return this.selClose;
26
- },
24
+ delegate() {
25
+ return this.selClose;
26
+ },
27
27
 
28
- handler(e) {
29
- e.preventDefault();
30
- this.close();
31
- },
28
+ handler(e) {
29
+ e.preventDefault();
30
+ this.close();
32
31
  },
33
- ],
32
+ },
34
33
 
35
34
  methods: {
36
35
  async close() {
37
- await this.toggleElement(this.$el);
36
+ await this.toggleElement(this.$el, false, animate(this));
38
37
  this.$destroy(true);
39
38
  },
40
39
  },
41
40
  };
41
+
42
+ function animate({ duration, transition, velocity }) {
43
+ return (el) => {
44
+ const height = toFloat(css(el, 'height'));
45
+ css(el, 'height', height);
46
+ return Transition.start(
47
+ el,
48
+ {
49
+ height: 0,
50
+ marginTop: 0,
51
+ marginBottom: 0,
52
+ paddingTop: 0,
53
+ paddingBottom: 0,
54
+ borderTop: 0,
55
+ borderBottom: 0,
56
+ opacity: 0,
57
+ },
58
+ velocity * height + duration,
59
+ transition
60
+ );
61
+ };
62
+ }
@@ -27,7 +27,6 @@ import {
27
27
  query,
28
28
  removeClass,
29
29
  scrollParents,
30
- toggleClass,
31
30
  within,
32
31
  } from 'uikit-util';
33
32
  import { preventBackgroundScroll, preventOverscroll } from '../mixin/modal';
@@ -43,7 +42,10 @@ export default {
43
42
  mode: 'list',
44
43
  toggle: Boolean,
45
44
  boundary: Boolean,
46
- boundaryAlign: Boolean,
45
+ target: Boolean,
46
+ targetX: Boolean,
47
+ targetY: Boolean,
48
+ stretch: Boolean,
47
49
  delayShow: Number,
48
50
  delayHide: Number,
49
51
  display: String,
@@ -55,17 +57,32 @@ export default {
55
57
  data: {
56
58
  mode: ['click', 'hover'],
57
59
  toggle: '- *',
58
- boundary: true,
59
- boundaryAlign: false,
60
+ boundary: false,
61
+ target: false,
62
+ targetX: false,
63
+ targetY: false,
64
+ stretch: false,
60
65
  delayShow: 0,
61
66
  delayHide: 800,
62
67
  display: null,
63
68
  clsDrop: false,
69
+ animateOut: false,
70
+ bgScroll: true,
64
71
  animation: ['uk-animation-fade'],
65
72
  cls: 'uk-open',
66
73
  container: false,
67
- animateOut: false,
68
- bgScroll: true,
74
+ },
75
+
76
+ computed: {
77
+ target({ target, targetX, targetY }, $el) {
78
+ targetX = targetX || target || this.targetEl;
79
+ targetY = targetY || target || this.targetEl;
80
+
81
+ return [
82
+ targetX === true ? window : query(targetX, $el),
83
+ targetY === true ? window : query(targetY, $el),
84
+ ];
85
+ },
69
86
  },
70
87
 
71
88
  created() {
@@ -79,13 +96,13 @@ export default {
79
96
  connected() {
80
97
  addClass(this.$el, this.clsDrop);
81
98
 
82
- if (this.toggle && !this.target) {
83
- this.target = this.$create('toggle', query(this.toggle, this.$el), {
99
+ if (this.toggle && !this.targetEl) {
100
+ this.targetEl = this.$create('toggle', query(this.toggle, this.$el), {
84
101
  target: this.$el,
85
102
  mode: this.mode,
86
103
  }).$el;
87
- attr(this.target, 'aria-haspopup', true);
88
- this.lazyload(this.target);
104
+ attr(this.targetEl, 'aria-haspopup', true);
105
+ this.lazyload(this.targetEl);
89
106
  }
90
107
  },
91
108
 
@@ -238,7 +255,7 @@ export default {
238
255
  !defaultPrevented &&
239
256
  type === pointerUp &&
240
257
  target === newTarget &&
241
- !(this.target && within(target, this.target))
258
+ !(this.targetEl && within(target, this.targetEl))
242
259
  ) {
243
260
  this.hide(false);
244
261
  }
@@ -257,13 +274,13 @@ export default {
257
274
  ? []
258
275
  : [preventOverscroll(this.$el), preventBackgroundScroll()]),
259
276
 
260
- ...(this.display === 'static' && this.align !== 'stretch'
277
+ ...(this.display === 'static'
261
278
  ? []
262
279
  : (() => {
263
280
  const handler = () => this.$emit();
264
281
  return [
265
282
  on(window, 'resize', handler),
266
- on(document, 'scroll', handler, true),
283
+ on([document, scrollParents(this.$el)], 'scroll', handler),
267
284
  (() => {
268
285
  const observer = observeResize(
269
286
  scrollParents(this.$el),
@@ -316,12 +333,12 @@ export default {
316
333
  },
317
334
 
318
335
  methods: {
319
- show(target = this.target, delay = true) {
320
- if (this.isToggled() && target && this.target && target !== this.target) {
336
+ show(target = this.targetEl, delay = true) {
337
+ if (this.isToggled() && target && this.targetEl && target !== this.targetEl) {
321
338
  this.hide(false, false);
322
339
  }
323
340
 
324
- this.target = target;
341
+ this.targetEl = target;
325
342
 
326
343
  this.clearTimers();
327
344
 
@@ -384,60 +401,72 @@ export default {
384
401
 
385
402
  position() {
386
403
  removeClass(this.$el, `${this.clsDrop}-stack`);
387
- toggleClass(this.$el, `${this.clsDrop}-boundary`, this.boundaryAlign);
388
- toggleClass(this.$el, `${this.clsDrop}-stretch`, this.align === 'stretch');
404
+ css(this.$el, { maxWidth: '', top: '', left: '' });
405
+
406
+ // Ensure none positioned element does not generate scrollbars
407
+ this.$el.hidden = true;
389
408
 
390
409
  const boundary = query(this.boundary, this.$el);
391
- const target = boundary && this.boundaryAlign ? boundary : this.target;
392
- const [scrollParent] = scrollParents(
393
- boundary && this.boundaryAlign ? boundary : this.$el
394
- );
395
- const scrollParentOffset = offset(scrollParent);
396
- const boundaryOffset = boundary ? offset(boundary) : scrollParentOffset;
410
+ const boundaryOffset = offsetViewport(boundary || window);
411
+ const viewports = this.target.map((target) => offsetViewport(scrollParents(target)[0]));
397
412
  const viewportOffset = this.getViewportOffset(this.$el);
398
413
 
399
- css(this.$el, 'maxWidth', '');
400
- const maxWidth = scrollParentOffset.width - 2 * viewportOffset;
401
-
402
- if (this.align === 'justify') {
403
- const prop = this.axis === 'y' ? 'width' : 'height';
404
- css(
405
- this.$el,
406
- prop,
407
- Math.min(
408
- (boundary ? boundaryOffset : offset(this.target))[prop],
409
- scrollParentOffset[prop] - 2 * viewportOffset
410
- )
411
- );
412
- } else if (this.align === 'stretch') {
413
- this.flip = this.axis === 'y' ? 'x' : 'y';
414
- this.display = 'static';
415
-
416
- const viewport = offsetViewport(scrollParent);
417
- const targetDim = offset(target);
418
- const elOffset = Math.abs(this.getPositionOffset(this.$el)) + viewportOffset;
419
-
420
- css(this.$el, {
421
- width:
422
- this.axis === 'y'
423
- ? viewport.width
424
- : (this.dir === 'left'
425
- ? targetDim.left - viewport.left
426
- : viewport.right - targetDim.right) - elOffset,
427
- height:
428
- this.axis === 'x'
429
- ? viewport.height
430
- : (this.dir === 'top'
431
- ? targetDim.top - viewport.top
432
- : viewport.bottom - targetDim.bottom) - elOffset,
433
- });
434
- } else if (this.$el.offsetWidth > maxWidth) {
414
+ const dirs = [
415
+ [0, ['x', 'width', 'left', 'right']],
416
+ [1, ['y', 'height', 'top', 'bottom']],
417
+ ];
418
+
419
+ for (const [i, [axis, prop]] of dirs) {
420
+ if (includes([axis, true], this.stretch)) {
421
+ css(this.$el, {
422
+ [prop]:
423
+ this.axis === axis
424
+ ? '' // Reset prop in main axis before positioning to not cause the drop to flip prematurely
425
+ : Math.min(
426
+ boundaryOffset[prop],
427
+ viewports[i][prop] - 2 * viewportOffset
428
+ ),
429
+ [`overflow-${axis}`]: 'auto',
430
+ });
431
+ }
432
+ }
433
+
434
+ const maxWidth = viewports[0].width - 2 * viewportOffset;
435
+
436
+ if (this.$el.offsetWidth > maxWidth) {
435
437
  addClass(this.$el, `${this.clsDrop}-stack`);
436
438
  }
437
439
 
438
440
  css(this.$el, 'maxWidth', maxWidth);
439
441
 
440
- this.positionAt(this.$el, target, boundary);
442
+ this.$el.hidden = false;
443
+
444
+ this.positionAt(this.$el, this.target, boundary);
445
+
446
+ for (const [i, [axis, prop, start, end]] of dirs) {
447
+ if (this.axis === axis && includes([axis, true], this.stretch)) {
448
+ const positionOffset = Math.abs(this.getPositionOffset(this.$el));
449
+ const targetOffset = offset(this.target[i]);
450
+ const elOffset = offset(this.$el);
451
+
452
+ css(this.$el, {
453
+ [prop]:
454
+ (targetOffset[start] > elOffset[start]
455
+ ? targetOffset[start] -
456
+ Math.max(
457
+ boundaryOffset[start],
458
+ viewports[i][start] + viewportOffset
459
+ )
460
+ : Math.min(
461
+ boundaryOffset[end],
462
+ viewports[i][end] - viewportOffset
463
+ ) - targetOffset[end]) - positionOffset,
464
+ [`overflow-${axis}`]: 'auto',
465
+ });
466
+
467
+ this.positionAt(this.$el, this.target, boundary);
468
+ }
469
+ }
441
470
  },
442
471
  },
443
472
  };
@@ -45,8 +45,11 @@ export default {
45
45
  let minHeight = '';
46
46
  const box = boxModelAdjust(this.$el, 'height', 'content-box');
47
47
 
48
+ const { body, scrollingElement } = document;
48
49
  const [scrollElement] = scrollParents(this.$el, /auto|scroll/);
49
- const { height: viewportHeight } = offsetViewport(scrollElement);
50
+ const { height: viewportHeight } = offsetViewport(
51
+ scrollElement === body ? scrollingElement : scrollElement
52
+ );
50
53
 
51
54
  if (this.expand) {
52
55
  minHeight = Math.max(
@@ -56,14 +59,19 @@ export default {
56
59
  0
57
60
  );
58
61
  } else {
62
+ const isScrollingElement =
63
+ scrollingElement === scrollElement || body === scrollElement;
64
+
59
65
  // on mobile devices (iOS and Android) window.innerHeight !== 100vh
60
- minHeight = `calc(${
61
- document.scrollingElement === scrollElement ? '100vh' : `${viewportHeight}px`
62
- }`;
66
+ minHeight = `calc(${isScrollingElement ? '100vh' : `${viewportHeight}px`}`;
63
67
 
64
68
  if (this.offsetTop) {
65
- const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
66
- minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
69
+ if (isScrollingElement) {
70
+ const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
71
+ minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
72
+ } else {
73
+ minHeight += ` - ${css(scrollElement, 'paddingTop')}`;
74
+ }
67
75
  }
68
76
 
69
77
  if (this.offsetBottom === true) {
@@ -2,6 +2,9 @@ import SVG from './svg';
2
2
  import closeIcon from '../../images/components/close-icon.svg';
3
3
  import closeLarge from '../../images/components/close-large.svg';
4
4
  import marker from '../../images/components/marker.svg';
5
+ import navParentIcon from '../../images/components/nav-parent-icon.svg';
6
+ import navParentIconLarge from '../../images/components/nav-parent-icon-large.svg';
7
+ import navbarParentIcon from '../../images/components/navbar-parent-icon.svg';
5
8
  import navbarToggleIcon from '../../images/components/navbar-toggle-icon.svg';
6
9
  import overlayIcon from '../../images/components/overlay-icon.svg';
7
10
  import paginationNext from '../../images/components/pagination-next.svg';
@@ -19,6 +22,7 @@ import {
19
22
  $,
20
23
  addClass,
21
24
  apply,
25
+ closest,
22
26
  css,
23
27
  each,
24
28
  hasClass,
@@ -35,6 +39,9 @@ const icons = {
35
39
  marker,
36
40
  'close-icon': closeIcon,
37
41
  'close-large': closeLarge,
42
+ 'nav-parent-icon': navParentIcon,
43
+ 'nav-parent-icon-large': navParentIconLarge,
44
+ 'navbar-parent-icon': navbarParentIcon,
38
45
  'navbar-toggle-icon': navbarToggleIcon,
39
46
  'overlay-icon': overlayIcon,
40
47
  'pagination-next': paginationNext,
@@ -96,6 +103,15 @@ export const IconComponent = {
96
103
  },
97
104
  };
98
105
 
106
+ export const NavParentIcon = {
107
+ extends: IconComponent,
108
+
109
+ beforeConnect() {
110
+ const icon = this.$props.icon;
111
+ this.icon = closest(this.$el, '.uk-nav-primary') ? `${icon}-large` : icon;
112
+ },
113
+ };
114
+
99
115
  export const Slidenav = {
100
116
  extends: IconComponent,
101
117
 
@@ -29,10 +29,12 @@ export { default as Video } from './video';
29
29
  // Icon components
30
30
  export { Close } from './icon';
31
31
  export { Spinner } from './icon';
32
+ export { NavParentIcon } from './icon';
32
33
  export { Slidenav as SlidenavNext } from './icon';
33
34
  export { Slidenav as SlidenavPrevious } from './icon';
34
35
  export { Search as SearchIcon } from './icon';
35
36
  export { IconComponent as Marker } from './icon';
37
+ export { IconComponent as NavbarParentIcon } from './icon';
36
38
  export { IconComponent as NavbarToggleIcon } from './icon';
37
39
  export { IconComponent as OverlayIcon } from './icon';
38
40
  export { IconComponent as PaginationNext } from './icon';
@@ -1,6 +1,6 @@
1
1
  import Class from '../mixin/class';
2
2
  import Media from '../mixin/media';
3
- import { attr, getCssVar, toggleClass, unwrap, wrapInner } from 'uikit-util';
3
+ import { attr, css, toggleClass, unwrap, wrapInner } from 'uikit-util';
4
4
  import Resize from '../mixin/resize';
5
5
 
6
6
  export default {
@@ -19,7 +19,7 @@ export default {
19
19
 
20
20
  computed: {
21
21
  fill({ fill }) {
22
- return fill || getCssVar('leader-fill-content');
22
+ return fill || css(this.$el, '--uk-leader-fill-content');
23
23
  },
24
24
  },
25
25