uikit 3.14.4-dev.6a00f7fe6 → 3.14.4-dev.7db3661de
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.
- package/CHANGELOG.md +24 -0
- package/dist/css/uikit-core-rtl.css +146 -77
- package/dist/css/uikit-core-rtl.min.css +1 -1
- package/dist/css/uikit-core.css +146 -77
- package/dist/css/uikit-core.min.css +1 -1
- package/dist/css/uikit-rtl.css +143 -78
- package/dist/css/uikit-rtl.min.css +1 -1
- package/dist/css/uikit.css +143 -78
- package/dist/css/uikit.min.css +1 -1
- package/dist/js/components/countdown.js +1 -1
- package/dist/js/components/countdown.min.js +1 -1
- package/dist/js/components/filter.js +7 -5
- package/dist/js/components/filter.min.js +1 -1
- package/dist/js/components/lightbox-panel.js +115 -24
- package/dist/js/components/lightbox-panel.min.js +1 -1
- package/dist/js/components/lightbox.js +115 -24
- package/dist/js/components/lightbox.min.js +1 -1
- package/dist/js/components/notification.js +1 -1
- package/dist/js/components/notification.min.js +1 -1
- package/dist/js/components/parallax.js +4 -5
- package/dist/js/components/parallax.min.js +1 -1
- package/dist/js/components/slider-parallax.js +4 -5
- package/dist/js/components/slider-parallax.min.js +1 -1
- package/dist/js/components/slider.js +22 -7
- package/dist/js/components/slider.min.js +1 -1
- package/dist/js/components/slideshow-parallax.js +4 -5
- package/dist/js/components/slideshow-parallax.min.js +1 -1
- package/dist/js/components/slideshow.js +22 -7
- package/dist/js/components/slideshow.min.js +1 -1
- package/dist/js/components/sortable.js +3 -3
- package/dist/js/components/sortable.min.js +1 -1
- package/dist/js/components/tooltip.js +26 -19
- package/dist/js/components/tooltip.min.js +1 -1
- package/dist/js/components/upload.js +1 -1
- package/dist/js/components/upload.min.js +1 -1
- package/dist/js/uikit-core.js +765 -647
- package/dist/js/uikit-core.min.js +1 -1
- package/dist/js/uikit-icons.js +1 -1
- package/dist/js/uikit-icons.min.js +1 -1
- package/dist/js/uikit.js +1593 -1458
- package/dist/js/uikit.min.js +1 -1
- package/package.json +1 -1
- package/src/images/{backgrounds/nav-parent-open.svg → components/nav-parent-icon-large.svg} +0 -0
- package/src/images/components/nav-parent-icon.svg +3 -0
- package/src/images/components/navbar-parent-icon.svg +3 -0
- package/src/js/components/filter.js +5 -3
- package/src/js/components/sortable.js +2 -3
- package/src/js/core/drop.js +7 -0
- package/src/js/core/height-viewport.js +14 -6
- package/src/js/core/icon.js +16 -0
- package/src/js/core/index.js +2 -0
- package/src/js/core/leader.js +2 -2
- package/src/js/core/navbar.js +44 -15
- package/src/js/core/offcanvas.js +1 -47
- package/src/js/core/scroll.js +37 -10
- package/src/js/core/sticky.js +8 -9
- package/src/js/mixin/media.js +4 -5
- package/src/js/mixin/modal.js +90 -4
- package/src/js/mixin/position.js +27 -11
- package/src/js/mixin/slider-drag.js +20 -8
- package/src/js/mixin/togglable.js +8 -17
- package/src/js/util/dimensions.js +6 -6
- package/src/js/util/position.js +1 -0
- package/src/js/util/style.js +4 -13
- package/src/js/util/viewport.js +20 -36
- package/src/less/components/dropdown.less +14 -0
- package/src/less/components/leader.less +1 -1
- package/src/less/components/nav.less +37 -44
- package/src/less/components/navbar.less +108 -24
- package/src/less/components/utility.less +21 -4
- package/src/less/theme/nav.less +3 -15
- package/src/less/theme/navbar.less +7 -7
- package/src/scss/components/dropdown.scss +14 -0
- package/src/scss/components/leader.scss +1 -1
- package/src/scss/components/nav.scss +36 -32
- package/src/scss/components/navbar.scss +96 -24
- package/src/scss/components/utility.scss +19 -3
- package/src/scss/mixins-theme.scss +18 -20
- package/src/scss/mixins.scss +16 -15
- package/src/scss/theme/nav.scss +3 -15
- package/src/scss/theme/navbar.scss +6 -3
- package/src/scss/variables-theme.scss +27 -15
- package/src/scss/variables.scss +27 -13
- package/tests/drop.html +72 -16
- package/tests/dropdown.html +103 -16
- package/tests/index.html +3 -3
- package/tests/nav.html +20 -87
- package/tests/navbar.html +2128 -1133
- package/tests/offcanvas.html +8 -8
- package/tests/utility.html +19 -0
- package/src/images/backgrounds/nav-parent-close.svg +0 -3
package/src/js/mixin/modal.js
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
$,
|
|
3
3
|
addClass,
|
|
4
4
|
append,
|
|
5
|
+
apply,
|
|
5
6
|
attr,
|
|
6
7
|
css,
|
|
7
8
|
endsWith,
|
|
@@ -15,6 +16,7 @@ import {
|
|
|
15
16
|
pointerDown,
|
|
16
17
|
pointerUp,
|
|
17
18
|
removeClass,
|
|
19
|
+
scrollParents,
|
|
18
20
|
toFloat,
|
|
19
21
|
width,
|
|
20
22
|
within,
|
|
@@ -121,17 +123,26 @@ export default {
|
|
|
121
123
|
self: true,
|
|
122
124
|
|
|
123
125
|
handler() {
|
|
124
|
-
|
|
126
|
+
once(
|
|
127
|
+
this.$el,
|
|
128
|
+
'hide',
|
|
129
|
+
on(document, 'focusin', (e) => {
|
|
130
|
+
if (last(active) === this && !within(e.target, this.$el)) {
|
|
131
|
+
this.$el.focus();
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
);
|
|
125
135
|
|
|
126
|
-
if (
|
|
127
|
-
|
|
136
|
+
if (this.overlay) {
|
|
137
|
+
once(this.$el, 'hide', preventOverscroll(this.$el));
|
|
138
|
+
once(this.$el, 'hide', preventBackgroundScroll());
|
|
128
139
|
}
|
|
129
140
|
|
|
130
141
|
if (this.stack) {
|
|
131
142
|
css(this.$el, 'zIndex', toFloat(css(this.$el, 'zIndex')) + active.length);
|
|
132
143
|
}
|
|
133
144
|
|
|
134
|
-
addClass(
|
|
145
|
+
addClass(document.documentElement, this.clsPage);
|
|
135
146
|
|
|
136
147
|
if (this.bgClose) {
|
|
137
148
|
once(
|
|
@@ -273,3 +284,78 @@ function animate({ transitionElement, _toggle }) {
|
|
|
273
284
|
function toMs(time) {
|
|
274
285
|
return time ? (endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000) : 0;
|
|
275
286
|
}
|
|
287
|
+
|
|
288
|
+
export function preventOverscroll(el) {
|
|
289
|
+
if (CSS.supports('overscroll-behavior', 'contain')) {
|
|
290
|
+
const elements = filterChildren(el, (child) => /auto|scroll/.test(css(child, 'overflow')));
|
|
291
|
+
css(elements, 'overscrollBehavior', 'contain');
|
|
292
|
+
return () => css(elements, 'overscrollBehavior', '');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
let startClientY;
|
|
296
|
+
|
|
297
|
+
const events = [
|
|
298
|
+
on(
|
|
299
|
+
el,
|
|
300
|
+
'touchstart',
|
|
301
|
+
({ targetTouches }) => {
|
|
302
|
+
if (targetTouches.length === 1) {
|
|
303
|
+
startClientY = targetTouches[0].clientY;
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
{ passive: true }
|
|
307
|
+
),
|
|
308
|
+
|
|
309
|
+
on(
|
|
310
|
+
el,
|
|
311
|
+
'touchmove',
|
|
312
|
+
(e) => {
|
|
313
|
+
if (e.targetTouches.length !== 1) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let [scrollParent] = scrollParents(e.target, /auto|scroll/);
|
|
318
|
+
if (!within(scrollParent, el)) {
|
|
319
|
+
scrollParent = el;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const clientY = e.targetTouches[0].clientY - startClientY;
|
|
323
|
+
const { scrollTop, scrollHeight, clientHeight } = scrollParent;
|
|
324
|
+
|
|
325
|
+
if (
|
|
326
|
+
clientHeight >= scrollHeight ||
|
|
327
|
+
(scrollTop === 0 && clientY > 0) ||
|
|
328
|
+
(scrollHeight - scrollTop <= clientHeight && clientY < 0)
|
|
329
|
+
) {
|
|
330
|
+
e.cancelable && e.preventDefault();
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
{ passive: false }
|
|
334
|
+
),
|
|
335
|
+
];
|
|
336
|
+
|
|
337
|
+
return () => events.forEach((fn) => fn());
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export function preventBackgroundScroll() {
|
|
341
|
+
const { body, documentElement } = document;
|
|
342
|
+
css(body, {
|
|
343
|
+
overflowY: width(window) > documentElement.clientWidth ? 'scroll' : '',
|
|
344
|
+
touchAction: 'none',
|
|
345
|
+
});
|
|
346
|
+
css(documentElement, 'overflowY', 'hidden');
|
|
347
|
+
return () => {
|
|
348
|
+
css(documentElement, 'overflowY', '');
|
|
349
|
+
css(body, { overflowY: '', touchAction: '' });
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function filterChildren(el, fn) {
|
|
354
|
+
const children = [];
|
|
355
|
+
apply(el, (node) => {
|
|
356
|
+
if (fn(node)) {
|
|
357
|
+
children.push(node);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return children;
|
|
361
|
+
}
|
package/src/js/mixin/position.js
CHANGED
|
@@ -2,11 +2,12 @@ import {
|
|
|
2
2
|
css,
|
|
3
3
|
dimensions,
|
|
4
4
|
flipPosition,
|
|
5
|
-
getCssVar,
|
|
6
5
|
includes,
|
|
7
6
|
isRtl,
|
|
8
7
|
positionAt,
|
|
8
|
+
scrollParents,
|
|
9
9
|
toPx,
|
|
10
|
+
trigger,
|
|
10
11
|
} from 'uikit-util';
|
|
11
12
|
|
|
12
13
|
export default {
|
|
@@ -44,23 +45,38 @@ export default {
|
|
|
44
45
|
offset = offset.reverse();
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
const [scrollElement] = scrollParents(element, /auto|scroll/);
|
|
49
|
+
const { scrollTop, scrollLeft } = scrollElement;
|
|
50
|
+
|
|
47
51
|
// Ensure none positioned element does not generate scrollbars
|
|
48
52
|
const elDim = dimensions(element);
|
|
49
53
|
css(element, { top: -elDim.height, left: -elDim.width });
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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);
|
|
70
|
+
|
|
71
|
+
// Restore scroll position
|
|
72
|
+
scrollElement.scrollTop = scrollTop;
|
|
73
|
+
scrollElement.scrollLeft = scrollLeft;
|
|
58
74
|
},
|
|
59
75
|
|
|
60
76
|
getPositionOffset(element) {
|
|
61
77
|
return (
|
|
62
78
|
toPx(
|
|
63
|
-
this.offset === false ?
|
|
79
|
+
this.offset === false ? css(element, '--uk-position-offset') : this.offset,
|
|
64
80
|
this.axis === 'x' ? 'width' : 'height',
|
|
65
81
|
element
|
|
66
82
|
) * (includes(['left', 'top'], this.dir) ? -1 : 1)
|
|
@@ -71,14 +87,14 @@ export default {
|
|
|
71
87
|
return includes(['center', 'justify', 'stretch'], this.align)
|
|
72
88
|
? 0
|
|
73
89
|
: toPx(
|
|
74
|
-
|
|
90
|
+
css(element, '--uk-position-shift-offset'),
|
|
75
91
|
this.axis === 'y' ? 'width' : 'height',
|
|
76
92
|
element
|
|
77
93
|
) * (includes(['left', 'top'], this.align) ? 1 : -1);
|
|
78
94
|
},
|
|
79
95
|
|
|
80
96
|
getViewportOffset(element) {
|
|
81
|
-
return toPx(
|
|
97
|
+
return toPx(css(element, '--uk-position-viewport-offset'));
|
|
82
98
|
},
|
|
83
99
|
},
|
|
84
100
|
};
|
|
@@ -5,16 +5,18 @@ import {
|
|
|
5
5
|
includes,
|
|
6
6
|
isRtl,
|
|
7
7
|
isTouch,
|
|
8
|
+
noop,
|
|
8
9
|
off,
|
|
9
10
|
on,
|
|
10
|
-
pointerCancel,
|
|
11
|
-
pointerDown,
|
|
12
|
-
pointerMove,
|
|
13
|
-
pointerUp,
|
|
14
11
|
selInput,
|
|
15
12
|
trigger,
|
|
16
13
|
} from 'uikit-util';
|
|
17
14
|
|
|
15
|
+
const pointerOptions = { passive: false, capture: true };
|
|
16
|
+
const pointerDown = 'touchstart mousedown';
|
|
17
|
+
const pointerMove = 'touchmove mousemove';
|
|
18
|
+
const pointerUp = 'touchend touchcancel mouseup click input';
|
|
19
|
+
|
|
18
20
|
export default {
|
|
19
21
|
props: {
|
|
20
22
|
draggable: Boolean,
|
|
@@ -69,6 +71,16 @@ export default {
|
|
|
69
71
|
e.preventDefault();
|
|
70
72
|
},
|
|
71
73
|
},
|
|
74
|
+
|
|
75
|
+
{
|
|
76
|
+
// iOS workaround for slider stopping if swiping fast
|
|
77
|
+
name: `${pointerMove} ${pointerUp}`,
|
|
78
|
+
el() {
|
|
79
|
+
return this.list;
|
|
80
|
+
},
|
|
81
|
+
handler: noop,
|
|
82
|
+
...pointerOptions,
|
|
83
|
+
},
|
|
72
84
|
],
|
|
73
85
|
|
|
74
86
|
methods: {
|
|
@@ -89,10 +101,10 @@ export default {
|
|
|
89
101
|
this.prevIndex = this.index;
|
|
90
102
|
}
|
|
91
103
|
|
|
92
|
-
on(document, pointerMove, this.move,
|
|
104
|
+
on(document, pointerMove, this.move, pointerOptions);
|
|
93
105
|
|
|
94
106
|
// 'input' event is triggered by video controls
|
|
95
|
-
on(document,
|
|
107
|
+
on(document, pointerUp, this.end, pointerOptions);
|
|
96
108
|
|
|
97
109
|
css(this.list, 'userSelect', 'none');
|
|
98
110
|
},
|
|
@@ -172,8 +184,8 @@ export default {
|
|
|
172
184
|
},
|
|
173
185
|
|
|
174
186
|
end() {
|
|
175
|
-
off(document, pointerMove, this.move,
|
|
176
|
-
off(document,
|
|
187
|
+
off(document, pointerMove, this.move, pointerOptions);
|
|
188
|
+
off(document, pointerUp, this.end, pointerOptions);
|
|
177
189
|
|
|
178
190
|
if (this.dragging) {
|
|
179
191
|
this.dragging = null;
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
isFunction,
|
|
11
11
|
isVisible,
|
|
12
12
|
noop,
|
|
13
|
-
offset,
|
|
14
13
|
removeClass,
|
|
15
14
|
scrollParents,
|
|
16
15
|
startsWith,
|
|
@@ -232,7 +231,7 @@ function slideHorizontal({ isToggled, duration, velocity, transition, _toggle },
|
|
|
232
231
|
|
|
233
232
|
Transition.cancel(el);
|
|
234
233
|
|
|
235
|
-
const [scrollElement] = scrollParents(el);
|
|
234
|
+
const [scrollElement] = scrollParents(el.offsetParent);
|
|
236
235
|
css(scrollElement, 'overflowX', 'hidden');
|
|
237
236
|
|
|
238
237
|
if (!isToggled(el)) {
|
|
@@ -243,17 +242,11 @@ function slideHorizontal({ isToggled, duration, velocity, transition, _toggle },
|
|
|
243
242
|
duration = velocity * width + duration;
|
|
244
243
|
|
|
245
244
|
const percent = visible ? ((width + marginLeft * (right ? -1 : 1)) / width) * 100 : 0;
|
|
246
|
-
const offsetEl = offset(el);
|
|
247
|
-
const useClipPath = right
|
|
248
|
-
? offsetEl.right < scrollElement.clientWidth
|
|
249
|
-
: Math.round(offsetEl.left) > 0;
|
|
250
245
|
|
|
251
246
|
css(el, {
|
|
252
|
-
clipPath:
|
|
253
|
-
?
|
|
254
|
-
|
|
255
|
-
: `polygon(${100 - percent}% 0,100% 0,100% 100%,${100 - percent}% 100%)`
|
|
256
|
-
: '',
|
|
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%)`,
|
|
257
250
|
marginLeft: (((100 - percent) * (right ? 1 : -1)) / 100) * width,
|
|
258
251
|
});
|
|
259
252
|
|
|
@@ -262,7 +255,7 @@ function slideHorizontal({ isToggled, duration, velocity, transition, _toggle },
|
|
|
262
255
|
? Transition.start(
|
|
263
256
|
el,
|
|
264
257
|
{
|
|
265
|
-
clipPath:
|
|
258
|
+
clipPath: `polygon(0 0,100% 0,100% 100%,0 100%)`,
|
|
266
259
|
marginLeft: 0,
|
|
267
260
|
},
|
|
268
261
|
duration * (1 - percent / 100),
|
|
@@ -271,11 +264,9 @@ function slideHorizontal({ isToggled, duration, velocity, transition, _toggle },
|
|
|
271
264
|
: Transition.start(
|
|
272
265
|
el,
|
|
273
266
|
{
|
|
274
|
-
clipPath:
|
|
275
|
-
?
|
|
276
|
-
|
|
277
|
-
: `polygon(100% 0,100% 0,100% 100%,100% 100%)`
|
|
278
|
-
: '',
|
|
267
|
+
clipPath: right
|
|
268
|
+
? `polygon(0 0,0 0,0 100%,0 100%)`
|
|
269
|
+
: `polygon(100% 0,100% 0,100% 100%,100% 100%)`,
|
|
279
270
|
marginLeft: (right ? 1 : -1) * width,
|
|
280
271
|
},
|
|
281
272
|
duration * (percent / 100),
|
|
@@ -94,13 +94,13 @@ export function position(element) {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
export function offsetPosition(element) {
|
|
97
|
-
const offset = [0, 0];
|
|
98
|
-
|
|
99
97
|
element = toNode(element);
|
|
100
98
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
const offset = [element.offsetTop, element.offsetLeft];
|
|
100
|
+
|
|
101
|
+
while ((element = element.offsetParent)) {
|
|
102
|
+
offset[0] += element.offsetTop + toFloat(css(element, `borderTopWidth`));
|
|
103
|
+
offset[1] += element.offsetLeft + toFloat(css(element, `borderLeftWidth`));
|
|
104
104
|
|
|
105
105
|
if (css(element, 'position') === 'fixed') {
|
|
106
106
|
const win = toWindow(element);
|
|
@@ -108,7 +108,7 @@ export function offsetPosition(element) {
|
|
|
108
108
|
offset[1] += win.scrollX;
|
|
109
109
|
return offset;
|
|
110
110
|
}
|
|
111
|
-
}
|
|
111
|
+
}
|
|
112
112
|
|
|
113
113
|
return offset;
|
|
114
114
|
}
|
package/src/js/util/position.js
CHANGED
package/src/js/util/style.js
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
isString,
|
|
9
9
|
isUndefined,
|
|
10
10
|
memoize,
|
|
11
|
+
startsWith,
|
|
11
12
|
toNodes,
|
|
12
13
|
} from './lang';
|
|
13
14
|
|
|
@@ -62,18 +63,11 @@ export function css(element, property, value, priority = '') {
|
|
|
62
63
|
return elements[0];
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
const propertyRe = /^\s*(["'])?(.*?)\1\s*$/;
|
|
66
|
-
export function getCssVar(name, element = document.documentElement) {
|
|
67
|
-
return css(element, `--uk-${name}`).replace(propertyRe, '$2');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
66
|
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty
|
|
71
67
|
export const propName = memoize((name) => vendorPropName(name));
|
|
72
68
|
|
|
73
|
-
const cssPrefixes = ['webkit', 'moz'];
|
|
74
|
-
|
|
75
69
|
function vendorPropName(name) {
|
|
76
|
-
if (name
|
|
70
|
+
if (startsWith(name, '--')) {
|
|
77
71
|
return name;
|
|
78
72
|
}
|
|
79
73
|
|
|
@@ -85,11 +79,8 @@ function vendorPropName(name) {
|
|
|
85
79
|
return name;
|
|
86
80
|
}
|
|
87
81
|
|
|
88
|
-
|
|
89
|
-
prefixedName
|
|
90
|
-
|
|
91
|
-
while (i--) {
|
|
92
|
-
prefixedName = `-${cssPrefixes[i]}-${name}`;
|
|
82
|
+
for (const prefix of ['webkit', 'moz']) {
|
|
83
|
+
const prefixedName = `-${prefix}-${name}`;
|
|
93
84
|
if (prefixedName in style) {
|
|
94
85
|
return prefixedName;
|
|
95
86
|
}
|
package/src/js/util/viewport.js
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import { css } from './style';
|
|
2
2
|
import { isVisible, parents } from './filter';
|
|
3
3
|
import { offset, offsetPosition } from './dimensions';
|
|
4
|
-
import {
|
|
5
|
-
clamp,
|
|
6
|
-
findIndex,
|
|
7
|
-
intersectRect,
|
|
8
|
-
isDocument,
|
|
9
|
-
isUndefined,
|
|
10
|
-
isWindow,
|
|
11
|
-
toFloat,
|
|
12
|
-
toNode,
|
|
13
|
-
toWindow,
|
|
14
|
-
ucfirst,
|
|
15
|
-
} from './lang';
|
|
4
|
+
import { clamp, findIndex, intersectRect, isWindow, toFloat, toWindow, ucfirst } from './lang';
|
|
16
5
|
|
|
17
6
|
export function isInView(element, offsetTop = 0, offsetLeft = 0) {
|
|
18
7
|
if (!isVisible(element)) {
|
|
@@ -35,20 +24,6 @@ export function isInView(element, offsetTop = 0, offsetLeft = 0) {
|
|
|
35
24
|
);
|
|
36
25
|
}
|
|
37
26
|
|
|
38
|
-
export function scrollTop(element, top) {
|
|
39
|
-
if (isWindow(element) || isDocument(element)) {
|
|
40
|
-
element = scrollingElement(element);
|
|
41
|
-
} else {
|
|
42
|
-
element = toNode(element);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (isUndefined(top)) {
|
|
46
|
-
return element.scrollTop;
|
|
47
|
-
} else {
|
|
48
|
-
element.scrollTop = top;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
27
|
export function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {
|
|
53
28
|
const parents = isVisible(element) ? scrollParents(element) : [];
|
|
54
29
|
return parents.reduce(
|
|
@@ -90,7 +65,7 @@ export function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {
|
|
|
90
65
|
(function step() {
|
|
91
66
|
const percent = ease(clamp((Date.now() - start) / duration));
|
|
92
67
|
|
|
93
|
-
scrollTop
|
|
68
|
+
element.scrollTop = scroll + top * percent;
|
|
94
69
|
|
|
95
70
|
// scroll more if we have not reached our destination
|
|
96
71
|
if (percent === 1) {
|
|
@@ -151,18 +126,31 @@ export function scrollParents(element, overflowRe = /auto|scroll|hidden|clip/, s
|
|
|
151
126
|
}
|
|
152
127
|
|
|
153
128
|
export function offsetViewport(scrollElement) {
|
|
154
|
-
|
|
129
|
+
const window = toWindow(scrollElement);
|
|
130
|
+
const {
|
|
131
|
+
document: { documentElement },
|
|
132
|
+
} = window;
|
|
133
|
+
let viewportElement =
|
|
134
|
+
scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
|
|
135
|
+
|
|
136
|
+
const { visualViewport } = window;
|
|
137
|
+
if (isWindow(viewportElement) && visualViewport) {
|
|
138
|
+
let { height, width, scale, pageTop: top, pageLeft: left } = visualViewport;
|
|
139
|
+
height = Math.round(height * scale);
|
|
140
|
+
width = Math.round(width * scale);
|
|
141
|
+
return { height, width, top, left, bottom: top + height, right: left + width };
|
|
142
|
+
}
|
|
155
143
|
|
|
156
144
|
let rect = offset(viewportElement);
|
|
157
145
|
for (let [prop, dir, start, end] of [
|
|
158
146
|
['width', 'x', 'left', 'right'],
|
|
159
147
|
['height', 'y', 'top', 'bottom'],
|
|
160
148
|
]) {
|
|
161
|
-
if (
|
|
162
|
-
rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
|
|
163
|
-
} else {
|
|
149
|
+
if (isWindow(viewportElement)) {
|
|
164
150
|
// iOS 12 returns <body> as scrollingElement
|
|
165
|
-
viewportElement =
|
|
151
|
+
viewportElement = documentElement;
|
|
152
|
+
} else {
|
|
153
|
+
rect[start] += toFloat(css(viewportElement, `border${ucfirst(start)}Width`));
|
|
166
154
|
}
|
|
167
155
|
rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];
|
|
168
156
|
rect[end] = rect[prop] + rect[start];
|
|
@@ -173,7 +161,3 @@ export function offsetViewport(scrollElement) {
|
|
|
173
161
|
function scrollingElement(element) {
|
|
174
162
|
return toWindow(element).document.scrollingElement;
|
|
175
163
|
}
|
|
176
|
-
|
|
177
|
-
function getViewport(scrollElement) {
|
|
178
|
-
return scrollElement === scrollingElement(scrollElement) ? window : scrollElement;
|
|
179
|
-
}
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
@dropdown-background: @global-muted-background;
|
|
26
26
|
@dropdown-color: @global-color;
|
|
27
27
|
|
|
28
|
+
@dropdown-large-padding: 40px;
|
|
29
|
+
|
|
28
30
|
@dropdown-nav-item-color: @global-muted-color;
|
|
29
31
|
@dropdown-nav-item-hover-color: @global-color;
|
|
30
32
|
@dropdown-nav-subtitle-font-size: @global-small-font-size;
|
|
@@ -68,6 +70,18 @@
|
|
|
68
70
|
/* Show */
|
|
69
71
|
.uk-dropdown.uk-open { display: block; }
|
|
70
72
|
|
|
73
|
+
/*
|
|
74
|
+
* Remove margin from the last-child
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
.uk-dropdown > :last-child { margin-bottom: 0; }
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
/* Size modifier
|
|
81
|
+
========================================================================== */
|
|
82
|
+
|
|
83
|
+
.uk-dropdown-large { padding: @dropdown-large-padding; }
|
|
84
|
+
|
|
71
85
|
|
|
72
86
|
/* Stretch modifier
|
|
73
87
|
========================================================================== */
|