uikit 3.14.4-dev.3a6c538ab → 3.14.4-dev.5e7e87ba7

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 (114) hide show
  1. package/CHANGELOG.md +27 -17
  2. package/build/util.js +1 -0
  3. package/dist/css/uikit-core-rtl.css +271 -61
  4. package/dist/css/uikit-core-rtl.min.css +1 -1
  5. package/dist/css/uikit-core.css +271 -61
  6. package/dist/css/uikit-core.min.css +1 -1
  7. package/dist/css/uikit-rtl.css +291 -65
  8. package/dist/css/uikit-rtl.min.css +1 -1
  9. package/dist/css/uikit.css +291 -65
  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 +1 -1
  14. package/dist/js/components/filter.min.js +1 -1
  15. package/dist/js/components/lightbox-panel.js +69 -114
  16. package/dist/js/components/lightbox-panel.min.js +1 -1
  17. package/dist/js/components/lightbox.js +69 -114
  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 +1 -1
  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 +1 -1
  30. package/dist/js/components/slideshow.min.js +1 -1
  31. package/dist/js/components/sortable.js +1 -1
  32. package/dist/js/components/sortable.min.js +1 -1
  33. package/dist/js/components/tooltip.js +85 -131
  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 +339 -339
  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 +339 -339
  42. package/dist/js/uikit.min.js +14 -1
  43. package/package.json +1 -1
  44. package/src/images/components/navbar-toggle-icon.svg +22 -3
  45. package/src/js/api/state.js +1 -1
  46. package/src/js/core/accordion.js +9 -17
  47. package/src/js/core/alert.js +35 -14
  48. package/src/js/core/drop.js +90 -61
  49. package/src/js/core/height-viewport.js +4 -2
  50. package/src/js/core/navbar.js +28 -45
  51. package/src/js/core/scroll.js +37 -10
  52. package/src/js/mixin/position.js +18 -20
  53. package/src/js/mixin/togglable.js +80 -124
  54. package/src/js/util/animation.js +4 -3
  55. package/src/js/util/filter.js +3 -7
  56. package/src/js/util/position.js +42 -47
  57. package/src/js/util/viewport.js +3 -5
  58. package/src/less/components/_import.less +1 -0
  59. package/src/less/components/drop.less +1 -18
  60. package/src/less/components/dropbar.less +115 -0
  61. package/src/less/components/dropdown.less +6 -20
  62. package/src/less/components/nav.less +211 -22
  63. package/src/less/components/navbar.less +10 -52
  64. package/src/less/theme/_import.less +1 -0
  65. package/src/less/theme/dropbar.less +44 -0
  66. package/src/less/theme/dropdown.less +0 -11
  67. package/src/less/theme/nav.less +46 -0
  68. package/src/less/theme/navbar.less +1 -5
  69. package/src/scss/components/_import.scss +1 -0
  70. package/src/scss/components/drop.scss +1 -18
  71. package/src/scss/components/dropbar.scss +115 -0
  72. package/src/scss/components/dropdown.scss +6 -20
  73. package/src/scss/components/nav.scss +160 -21
  74. package/src/scss/components/navbar.scss +10 -52
  75. package/src/scss/mixins-theme.scss +78 -7
  76. package/src/scss/mixins.scss +75 -3
  77. package/src/scss/theme/_import.scss +1 -0
  78. package/src/scss/theme/dropbar.scss +44 -0
  79. package/src/scss/theme/dropdown.scss +0 -8
  80. package/src/scss/theme/nav.scss +44 -0
  81. package/src/scss/theme/navbar.scss +1 -5
  82. package/src/scss/variables-theme.scss +50 -9
  83. package/src/scss/variables.scss +39 -7
  84. package/tests/accordion.html +2 -2
  85. package/tests/alert.html +2 -2
  86. package/tests/countdown.html +1 -1
  87. package/tests/drop.html +444 -412
  88. package/tests/dropbar.html +456 -0
  89. package/tests/dropdown.html +8 -470
  90. package/tests/filter.html +9 -12
  91. package/tests/form.html +1 -1
  92. package/tests/index.html +124 -105
  93. package/tests/lightbox.html +5 -5
  94. package/tests/list.html +8 -8
  95. package/tests/modal.html +13 -13
  96. package/tests/nav.html +121 -12
  97. package/tests/navbar.html +76 -212
  98. package/tests/offcanvas.html +10 -14
  99. package/tests/parallax.html +1 -1
  100. package/tests/position.html +13 -24
  101. package/tests/progress.html +9 -9
  102. package/tests/scroll.html +7 -10
  103. package/tests/search.html +5 -5
  104. package/tests/slider.html +6 -5
  105. package/tests/slideshow.html +8 -8
  106. package/tests/sortable.html +6 -8
  107. package/tests/sticky-navbar.html +6 -6
  108. package/tests/sticky.html +8 -8
  109. package/tests/switcher.html +1 -1
  110. package/tests/tab.html +1 -1
  111. package/tests/table.html +7 -7
  112. package/tests/toggle.html +2 -2
  113. package/tests/tooltip.html +1 -1
  114. package/tests/upload.html +11 -11
@@ -7,7 +7,6 @@ import {
7
7
  positionAt,
8
8
  scrollParents,
9
9
  toPx,
10
- trigger,
11
10
  } from 'uikit-util';
12
11
 
13
12
  export default {
@@ -15,12 +14,16 @@ export default {
15
14
  pos: String,
16
15
  offset: null,
17
16
  flip: Boolean,
17
+ shift: Boolean,
18
+ inset: Boolean,
18
19
  },
19
20
 
20
21
  data: {
21
22
  pos: `bottom-${isRtl ? 'right' : 'left'}`,
22
- flip: true,
23
23
  offset: false,
24
+ flip: true,
25
+ shift: true,
26
+ inset: false,
24
27
  },
25
28
 
26
29
  connected() {
@@ -34,7 +37,7 @@ export default {
34
37
  let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];
35
38
 
36
39
  const attach = {
37
- element: [flipPosition(this.dir), this.align],
40
+ element: [this.inset ? this.dir : flipPosition(this.dir), this.align],
38
41
  target: [this.dir, this.align],
39
42
  };
40
43
 
@@ -52,21 +55,14 @@ export default {
52
55
  const elDim = dimensions(element);
53
56
  css(element, { top: -elDim.height, left: -elDim.width });
54
57
 
55
- const args = [
56
- element,
57
- target,
58
- {
59
- attach,
60
- offset,
61
- boundary,
62
- flip: this.flip,
63
- viewportOffset: this.getViewportOffset(element),
64
- },
65
- ];
66
-
67
- trigger(element, 'beforeposition', args);
68
-
69
- positionAt(...args);
58
+ positionAt(element, target, {
59
+ attach,
60
+ offset,
61
+ boundary,
62
+ flip: this.flip,
63
+ shift: this.shift,
64
+ viewportOffset: this.getViewportOffset(element),
65
+ });
70
66
 
71
67
  // Restore scroll position
72
68
  scrollElement.scrollTop = scrollTop;
@@ -79,12 +75,14 @@ export default {
79
75
  this.offset === false ? css(element, '--uk-position-offset') : this.offset,
80
76
  this.axis === 'x' ? 'width' : 'height',
81
77
  element
82
- ) * (includes(['left', 'top'], this.dir) ? -1 : 1)
78
+ ) *
79
+ (includes(['left', 'top'], this.dir) ? -1 : 1) *
80
+ (this.inset ? -1 : 1)
83
81
  );
84
82
  },
85
83
 
86
84
  getShiftOffset(element) {
87
- return includes(['center', 'justify', 'stretch'], this.align)
85
+ return this.align === 'center'
88
86
  ? 0
89
87
  : toPx(
90
88
  css(element, '--uk-position-shift-offset'),
@@ -3,7 +3,7 @@ import {
3
3
  addClass,
4
4
  Animation,
5
5
  css,
6
- fastdom,
6
+ dimensions,
7
7
  hasClass,
8
8
  includes,
9
9
  isBoolean,
@@ -11,13 +11,14 @@ import {
11
11
  isVisible,
12
12
  noop,
13
13
  removeClass,
14
- scrollParents,
15
14
  startsWith,
16
15
  toFloat,
17
16
  toggleClass,
18
17
  toNodes,
19
18
  Transition,
20
19
  trigger,
20
+ unwrap,
21
+ wrapInner,
21
22
  } from 'uikit-util';
22
23
 
23
24
  export default {
@@ -39,26 +40,6 @@ export default {
39
40
  transition: 'ease',
40
41
  clsEnter: 'uk-togglabe-enter',
41
42
  clsLeave: 'uk-togglabe-leave',
42
-
43
- initProps: {
44
- overflow: '',
45
- maxHeight: '',
46
- paddingTop: '',
47
- paddingBottom: '',
48
- marginTop: '',
49
- marginBottom: '',
50
- boxShadow: '',
51
- },
52
-
53
- hideProps: {
54
- overflow: 'hidden',
55
- maxHeight: 0,
56
- paddingTop: 0,
57
- paddingBottom: 0,
58
- marginTop: 0,
59
- marginBottom: 0,
60
- boxShadow: 'none',
61
- },
62
43
  },
63
44
 
64
45
  computed: {
@@ -67,7 +48,7 @@ export default {
67
48
  },
68
49
 
69
50
  hasTransition({ animation }) {
70
- return startsWith(animation[0], 'slide');
51
+ return ['slide', 'reveal'].some((transition) => startsWith(animation[0], transition));
71
52
  },
72
53
  },
73
54
 
@@ -160,122 +141,97 @@ function toggleInstant({ _toggle }) {
160
141
  };
161
142
  }
162
143
 
163
- function toggleTransition(cmp) {
164
- switch (cmp.animation[0]) {
165
- case 'slide-left':
166
- return slideHorizontal(cmp);
167
- case 'slide-right':
168
- return slideHorizontal(cmp, true);
169
- }
170
- return slide(cmp);
171
- }
144
+ export function toggleTransition(cmp) {
145
+ const [mode = 'reveal', startProp = 'top'] = cmp.animation[0]?.split('-') || [];
172
146
 
173
- export function slide({
174
- isToggled,
175
- duration,
176
- velocity,
177
- initProps,
178
- hideProps,
179
- transition,
180
- _toggle,
181
- }) {
182
- return (el, show) => {
183
- const inProgress = Transition.inProgress(el);
184
- const inner =
185
- !inProgress && el.hasChildNodes()
186
- ? toFloat(css(el.firstElementChild, 'marginTop')) +
187
- toFloat(css(el.lastElementChild, 'marginBottom'))
188
- : 0;
189
- const currentHeight = isVisible(el) ? toFloat(css(el, 'height')) + inner : 0;
147
+ const dirs = [
148
+ ['left', 'right'],
149
+ ['top', 'bottom'],
150
+ ];
151
+ const dir = dirs[includes(dirs[0], startProp) ? 0 : 1];
152
+ const end = dir[1] === startProp;
153
+ const props = ['width', 'height'];
154
+ const dimProp = props[dirs.indexOf(dir)];
155
+ const marginProp = `margin-${dir[0]}`;
156
+ const marginStartProp = `margin-${startProp}`;
190
157
 
191
- const props = inProgress ? css(el, Object.keys(initProps)) : show ? hideProps : initProps;
158
+ return async (el, show) => {
159
+ let { duration, velocity, transition, _toggle } = cmp;
192
160
 
193
- Transition.cancel(el);
161
+ let currentDim = dimensions(el)[dimProp];
162
+
163
+ const inProgress = Transition.inProgress(el);
164
+ await Transition.cancel(el);
194
165
 
195
- if (!isToggled(el)) {
166
+ if (show) {
196
167
  _toggle(el, true);
197
168
  }
198
169
 
199
- css(el, 'maxHeight', '');
200
-
201
- // Update child components first
202
- fastdom.flush();
203
-
204
- const endHeight = toFloat(css(el, 'height')) + inner;
205
- duration = velocity * endHeight + duration;
206
-
207
- css(el, { ...props, maxHeight: currentHeight });
208
-
209
- return (
210
- show
211
- ? Transition.start(
212
- el,
213
- { ...initProps, overflow: 'hidden', maxHeight: endHeight },
214
- duration * (1 - currentHeight / endHeight),
215
- transition
216
- )
217
- : Transition.start(
218
- el,
219
- hideProps,
220
- duration * (currentHeight / endHeight),
221
- transition
222
- ).then(() => _toggle(el, false))
223
- ).then(() => css(el, initProps));
224
- };
225
- }
226
-
227
- function slideHorizontal({ isToggled, duration, velocity, transition, _toggle }, right) {
228
- return (el, show) => {
229
- const visible = isVisible(el);
230
- const marginLeft = toFloat(css(el, 'marginLeft'));
231
-
232
- Transition.cancel(el);
170
+ const prevProps = Object.fromEntries(
171
+ ['padding', 'border', 'width', 'height', 'overflow', marginProp, marginStartProp].map(
172
+ (key) => [key, el.style[key]]
173
+ )
174
+ );
233
175
 
234
- const [scrollElement] = scrollParents(el.offsetParent);
235
- css(scrollElement, 'overflowX', 'hidden');
176
+ const dim = dimensions(el);
177
+ const currentMargin = toFloat(css(el, marginProp));
178
+ const marginStart = toFloat(css(el, marginStartProp));
179
+ const endDim = dim[dimProp] + marginStart;
236
180
 
237
- if (!isToggled(el)) {
238
- _toggle(el, true);
181
+ if (!inProgress && !show) {
182
+ currentDim += marginStart;
239
183
  }
240
184
 
241
- const width = toFloat(css(el, 'width'));
242
- duration = velocity * width + duration;
243
-
244
- const percent = visible ? ((width + marginLeft * (right ? -1 : 1)) / width) * 100 : 0;
185
+ const [wrapper] = wrapInner(el, '<div>');
186
+ css(wrapper, {
187
+ boxSizing: 'border-box',
188
+ height: dim.height,
189
+ width: dim.width,
190
+ ...css(el, [
191
+ 'padding',
192
+ 'borderTop',
193
+ 'borderRight',
194
+ 'borderBottom',
195
+ 'borderLeft',
196
+ 'borderImage',
197
+ marginStartProp,
198
+ ]),
199
+ });
245
200
 
246
201
  css(el, {
247
- clipPath: right
248
- ? `polygon(0 0,${percent}% 0,${percent}% 100%,0 100%)`
249
- : `polygon(${100 - percent}% 0,100% 0,100% 100%,${100 - percent}% 100%)`,
250
- marginLeft: (((100 - percent) * (right ? 1 : -1)) / 100) * width,
202
+ padding: 0,
203
+ border: 0,
204
+ [marginStartProp]: 0,
205
+ width: dim.width,
206
+ height: dim.height,
207
+ overflow: 'hidden',
208
+ [dimProp]: currentDim,
251
209
  });
252
210
 
253
- return (
254
- show
255
- ? Transition.start(
256
- el,
257
- {
258
- clipPath: `polygon(0 0,100% 0,100% 100%,0 100%)`,
259
- marginLeft: 0,
260
- },
261
- duration * (1 - percent / 100),
262
- transition
263
- )
264
- : Transition.start(
265
- el,
266
- {
267
- clipPath: right
268
- ? `polygon(0 0,0 0,0 100%,0 100%)`
269
- : `polygon(100% 0,100% 0,100% 100%,100% 100%)`,
270
- marginLeft: (right ? 1 : -1) * width,
271
- },
272
- duration * (percent / 100),
273
- transition
274
- ).then(() => _toggle(el, false))
275
- ).then(() => {
276
- css(scrollElement, 'overflowX', '');
277
- css(el, { clipPath: '', marginLeft: '' });
278
- });
211
+ const percent = currentDim / endDim;
212
+ duration = (velocity * endDim + duration) * (show ? 1 - percent : percent);
213
+ const endProps = { [dimProp]: show ? endDim : 0 };
214
+
215
+ if (end) {
216
+ css(el, marginProp, endDim - currentDim + currentMargin);
217
+ endProps[marginProp] = show ? currentMargin : endDim + currentMargin;
218
+ }
219
+
220
+ if (!end ^ (mode === 'reveal')) {
221
+ css(wrapper, marginProp, -endDim + currentDim);
222
+ Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition);
223
+ }
224
+
225
+ try {
226
+ await Transition.start(el, endProps, duration, transition);
227
+ } finally {
228
+ css(el, prevProps);
229
+ unwrap(wrapper.firstChild);
230
+
231
+ if (!show) {
232
+ _toggle(el, false);
233
+ }
234
+ }
279
235
  };
280
236
  }
281
237
 
@@ -50,13 +50,14 @@ export function transition(element, props, duration = 400, timing = 'linear') {
50
50
  export const Transition = {
51
51
  start: transition,
52
52
 
53
- stop(element) {
53
+ async stop(element) {
54
54
  trigger(element, 'transitionend');
55
- return Promise.resolve();
55
+ await Promise.resolve();
56
56
  },
57
57
 
58
- cancel(element) {
58
+ async cancel(element) {
59
59
  trigger(element, 'transitioncanceled');
60
+ await Promise.resolve();
60
61
  },
61
62
 
62
63
  inProgress(element) {
@@ -51,12 +51,8 @@ export function matches(element, selector) {
51
51
  }
52
52
 
53
53
  export function closest(element, selector) {
54
- if (startsWith(selector, '>')) {
55
- selector = selector.slice(1);
56
- }
57
-
58
54
  return isElement(element)
59
- ? element.closest(selector)
55
+ ? element.closest(startsWith(selector, '>') ? selector.slice(1) : selector)
60
56
  : toNodes(element)
61
57
  .map((element) => closest(element, selector))
62
58
  .filter(Boolean);
@@ -64,8 +60,8 @@ export function closest(element, selector) {
64
60
 
65
61
  export function within(element, selector) {
66
62
  return isString(selector)
67
- ? matches(element, selector) || !!closest(element, selector)
68
- : element === selector || toNode(selector).contains(toNode(element));
63
+ ? !!closest(element, selector)
64
+ : toNode(selector).contains(toNode(element));
69
65
  }
70
66
 
71
67
  export function parents(element, selector) {
@@ -1,5 +1,5 @@
1
1
  import { offset } from './dimensions';
2
- import { clamp, includes, ucfirst } from './lang';
2
+ import { clamp, isArray, ucfirst } from './lang';
3
3
  import { offsetViewport, scrollParents } from './viewport';
4
4
 
5
5
  const dirs = [
@@ -18,11 +18,11 @@ export function positionAt(element, target, options) {
18
18
  ...options,
19
19
  };
20
20
 
21
- const dim = options.flip
22
- ? attachToWithFlip(element, target, options)
23
- : attachTo(element, target, options);
21
+ if (!isArray(target)) {
22
+ target = [target, target];
23
+ }
24
24
 
25
- offset(element, dim);
25
+ offset(element, getPosition(element, target, options));
26
26
  }
27
27
 
28
28
  function attachTo(element, target, options) {
@@ -37,8 +37,11 @@ function attachTo(element, target, options) {
37
37
  };
38
38
 
39
39
  const position = offset(element);
40
- const targetOffset = offset(target);
40
+
41
41
  for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
42
+ const targetOffset =
43
+ attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]);
44
+
42
45
  position[start] = position[dir] =
43
46
  targetOffset[start] +
44
47
  moveBy(attach.target[i], end, targetOffset[prop]) -
@@ -53,60 +56,54 @@ function moveBy(start, end, dim) {
53
56
  return start === 'center' ? dim / 2 : start === end ? dim : 0;
54
57
  }
55
58
 
56
- function attachToWithFlip(element, target, options) {
59
+ function getPosition(element, target, options) {
57
60
  const position = attachTo(element, target, options);
58
- const targetDim = offset(target);
59
61
 
60
62
  let {
61
63
  flip,
64
+ shift,
62
65
  attach: { element: elAttach, target: targetAttach },
63
66
  offset: elOffset,
64
67
  boundary,
65
- viewport,
66
68
  viewportOffset,
67
69
  } = options;
68
70
 
69
- let viewports = scrollParents(element);
70
- if (boundary === target) {
71
- viewports = viewports.filter((viewport) => viewport !== boundary);
71
+ if (!flip && !shift) {
72
+ return position;
72
73
  }
73
- const [scrollElement] = viewports;
74
- viewports.push(viewport);
75
74
 
76
75
  const offsetPosition = { ...position };
77
76
  for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
78
- if (flip !== true && !includes(flip, dir)) {
79
- continue;
80
- }
77
+ let viewports = scrollParents(target[i]);
78
+ const [scrollElement] = viewports;
81
79
 
82
- const willFlip =
83
- !intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i);
84
-
85
- viewport = getIntersectionArea(...viewports.filter(Boolean).map(offsetViewport));
80
+ let viewport = getIntersectionArea(...viewports.map(offsetViewport));
86
81
 
87
82
  if (viewportOffset) {
88
83
  viewport[start] += viewportOffset;
89
84
  viewport[end] -= viewportOffset;
90
85
  }
91
86
 
92
- if (boundary && !willFlip && position[prop] <= offset(boundary)[prop]) {
93
- viewport = getIntersectionArea(viewport, offset(boundary));
87
+ if (boundary) {
88
+ viewport = getIntersectionArea(viewport, offsetViewport(boundary));
94
89
  }
95
90
 
96
- const isInStartBoundary = position[start] >= viewport[start];
97
- const isInEndBoundary = position[end] <= viewport[end];
91
+ const isInStartViewport = position[start] >= viewport[start];
92
+ const isInEndViewport = position[end] <= viewport[end];
98
93
 
99
- if (isInStartBoundary && isInEndBoundary) {
94
+ if (isInStartViewport && isInEndViewport) {
100
95
  continue;
101
96
  }
102
97
 
103
- let offsetBy;
98
+ let offsetBy = 0;
99
+ const targetDim = offset(target[i]);
104
100
 
105
101
  // Flip
106
- if (willFlip) {
102
+ if (!intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i)) {
107
103
  if (
108
- (elAttach[i] === end && isInStartBoundary) ||
109
- (elAttach[i] === start && isInEndBoundary)
104
+ !flip ||
105
+ (elAttach[i] === end && isInStartViewport) ||
106
+ (elAttach[i] === start && isInEndViewport)
110
107
  ) {
111
108
  continue;
112
109
  }
@@ -143,27 +140,25 @@ function attachToWithFlip(element, target, options) {
143
140
  return false;
144
141
  }
145
142
 
146
- if (flip === true || includes(flip, dirs[1 - i][1])) {
147
- const newPos = attachToWithFlip(element, target, {
148
- ...options,
149
- attach: {
150
- element: elAttach.map(flipDir).reverse(),
151
- target: targetAttach.map(flipDir).reverse(),
152
- },
153
- offset: elOffset.reverse(),
154
- flip: flip === true ? flip : [...flip, dirs[1 - i][1]],
155
- recursion: true,
156
- });
157
-
158
- if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
159
- return newPos;
160
- }
143
+ const newPos = getPosition(element, target, {
144
+ ...options,
145
+ attach: {
146
+ element: elAttach.map(flipDir).reverse(),
147
+ target: targetAttach.map(flipDir).reverse(),
148
+ },
149
+ offset: elOffset.reverse(),
150
+ recursion: true,
151
+ });
152
+
153
+ if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
154
+ return newPos;
161
155
  }
156
+
162
157
  continue;
163
158
  }
164
159
 
165
- // Move
166
- } else {
160
+ // Shift
161
+ } else if (shift) {
167
162
  offsetBy =
168
163
  clamp(
169
164
  clamp(position[start], viewport[start], viewport[end] - position[prop]),
@@ -128,12 +128,10 @@ export function scrollParents(element, overflowRe = /auto|scroll|hidden|clip/, s
128
128
  export function offsetViewport(scrollElement) {
129
129
  const window = toWindow(scrollElement);
130
130
  const {
131
- document: { body, documentElement },
131
+ document: { documentElement },
132
132
  } = window;
133
133
  let viewportElement =
134
- scrollElement === scrollingElement(scrollElement) || scrollElement === body
135
- ? window
136
- : scrollElement;
134
+ scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
137
135
 
138
136
  const { visualViewport } = window;
139
137
  if (isWindow(viewportElement) && visualViewport) {
@@ -152,7 +150,7 @@ export function offsetViewport(scrollElement) {
152
150
  // iOS 12 returns <body> as scrollingElement
153
151
  viewportElement = documentElement;
154
152
  } else {
155
- rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
153
+ rect[start] += toFloat(css(viewportElement, `border-${start}-width`));
156
154
  }
157
155
  rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];
158
156
  rect[end] = rect[prop] + rect[start];
@@ -40,6 +40,7 @@
40
40
  @import "accordion.less";
41
41
  @import "drop.less"; // After: Card
42
42
  @import "dropdown.less"; // After: Card
43
+ @import "dropbar.less";
43
44
  @import "modal.less"; // After: Close
44
45
  @import "slideshow.less";
45
46
  @import "slider.less";
@@ -3,8 +3,7 @@
3
3
  //
4
4
  // Component: `uk-drop`
5
5
  //
6
- // Modifiers: `uk-drop-stretch`
7
- // `uk-drop-stack`
6
+ // Modifiers: `uk-drop-stack`
8
7
  // `uk-drop-grid`
9
8
  //
10
9
  // States: `uk-open`
@@ -50,22 +49,6 @@
50
49
  .uk-drop.uk-open { display: block; }
51
50
 
52
51
 
53
- /* Stretch modifier
54
- ========================================================================== */
55
-
56
- /*
57
- * 1. Allow scrolling
58
- */
59
-
60
- .uk-drop-stretch {
61
- --uk-position-offset: 0;
62
- --uk-position-viewport-offset: 0;
63
- /* 1 */
64
- overflow-y: auto;
65
- -webkit-overflow-scrolling: touch;
66
- }
67
-
68
-
69
52
  /* Grid modifiers
70
53
  ========================================================================== */
71
54