uikit 3.14.4-dev.871ba3c05 → 3.14.4-dev.a02c81d72
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 +17 -0
- package/dist/css/uikit-core-rtl.css +73 -28
- package/dist/css/uikit-core-rtl.min.css +1 -1
- package/dist/css/uikit-core.css +73 -28
- package/dist/css/uikit-core.min.css +1 -1
- package/dist/css/uikit-rtl.css +70 -29
- package/dist/css/uikit-rtl.min.css +1 -1
- package/dist/css/uikit.css +70 -29
- 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 +110 -11
- package/dist/js/components/lightbox-panel.min.js +1 -1
- package/dist/js/components/lightbox.js +110 -11
- 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 +1 -1
- package/dist/js/components/parallax.min.js +1 -1
- package/dist/js/components/slider-parallax.js +1 -1
- 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 +1 -1
- 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 +18 -3
- 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 +717 -637
- 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 +1511 -1414
- package/dist/js/uikit.min.js +1 -1
- package/package.json +1 -1
- package/src/images/backgrounds/nav-parent-close.svg +1 -1
- package/src/images/backgrounds/nav-parent-open.svg +1 -1
- package/src/images/backgrounds/navbar-parent-close.svg +3 -0
- package/src/images/backgrounds/navbar-parent-open.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 +11 -5
- package/src/js/core/navbar.js +44 -15
- package/src/js/core/offcanvas.js +1 -47
- package/src/js/core/sticky.js +8 -9
- package/src/js/mixin/modal.js +90 -4
- package/src/js/mixin/position.js +24 -7
- package/src/js/mixin/slider-drag.js +20 -8
- package/src/js/util/dimensions.js +6 -6
- package/src/js/util/position.js +1 -0
- package/src/js/util/viewport.js +2 -27
- package/src/less/components/dropdown.less +8 -0
- package/src/less/components/nav.less +22 -4
- package/src/less/components/navbar.less +60 -24
- package/src/less/components/utility.less +12 -3
- package/src/less/theme/nav.less +3 -7
- package/src/less/theme/navbar.less +7 -7
- package/src/scss/components/dropdown.scss +8 -0
- package/src/scss/components/nav.scss +24 -6
- package/src/scss/components/navbar.scss +60 -24
- package/src/scss/components/utility.scss +12 -3
- package/src/scss/mixins-theme.scss +2 -5
- package/src/scss/theme/nav.scss +3 -7
- package/src/scss/theme/navbar.scss +6 -3
- package/src/scss/variables-theme.scss +26 -10
- package/src/scss/variables.scss +26 -8
- package/tests/drop.html +72 -16
- package/tests/dropdown.html +103 -16
- package/tests/navbar.html +2132 -1126
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.
|
|
5
|
+
"version": "3.14.4-dev.a02c81d72",
|
|
6
6
|
"main": "dist/js/uikit.js",
|
|
7
7
|
"style": "dist/css/uikit.css",
|
|
8
8
|
"sideEffects": [
|
|
@@ -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
|
-
)
|
|
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
|
|
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
|
|
336
|
+
scrollEl.scrollTop = scroll;
|
|
338
337
|
return true;
|
|
339
338
|
}
|
|
340
339
|
});
|
package/src/js/core/drop.js
CHANGED
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
toggleClass,
|
|
31
31
|
within,
|
|
32
32
|
} from 'uikit-util';
|
|
33
|
+
import { preventBackgroundScroll, preventOverscroll } from '../mixin/modal';
|
|
33
34
|
|
|
34
35
|
export let active;
|
|
35
36
|
|
|
@@ -48,6 +49,7 @@ export default {
|
|
|
48
49
|
display: String,
|
|
49
50
|
clsDrop: String,
|
|
50
51
|
animateOut: Boolean,
|
|
52
|
+
bgScroll: Boolean,
|
|
51
53
|
},
|
|
52
54
|
|
|
53
55
|
data: {
|
|
@@ -63,6 +65,7 @@ export default {
|
|
|
63
65
|
cls: 'uk-open',
|
|
64
66
|
container: false,
|
|
65
67
|
animateOut: false,
|
|
68
|
+
bgScroll: true,
|
|
66
69
|
},
|
|
67
70
|
|
|
68
71
|
created() {
|
|
@@ -250,6 +253,10 @@ export default {
|
|
|
250
253
|
}
|
|
251
254
|
}),
|
|
252
255
|
|
|
256
|
+
...(this.bgScroll
|
|
257
|
+
? []
|
|
258
|
+
: [preventOverscroll(this.$el), preventBackgroundScroll()]),
|
|
259
|
+
|
|
253
260
|
...(this.display === 'static' && this.align !== 'stretch'
|
|
254
261
|
? []
|
|
255
262
|
: (() => {
|
|
@@ -56,14 +56,20 @@ export default {
|
|
|
56
56
|
0
|
|
57
57
|
);
|
|
58
58
|
} else {
|
|
59
|
+
const { body, scrollingElement } = document;
|
|
60
|
+
const isScrollingElement =
|
|
61
|
+
scrollingElement === scrollElement || body === scrollElement;
|
|
62
|
+
|
|
59
63
|
// on mobile devices (iOS and Android) window.innerHeight !== 100vh
|
|
60
|
-
minHeight = `calc(${
|
|
61
|
-
document.scrollingElement === scrollElement ? '100vh' : `${viewportHeight}px`
|
|
62
|
-
}`;
|
|
64
|
+
minHeight = `calc(${isScrollingElement ? '100vh' : `${viewportHeight}px`}`;
|
|
63
65
|
|
|
64
66
|
if (this.offsetTop) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
if (isScrollingElement) {
|
|
68
|
+
const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];
|
|
69
|
+
minHeight += top > 0 && top < viewportHeight / 2 ? ` - ${top}px` : '';
|
|
70
|
+
} else {
|
|
71
|
+
minHeight += ` - ${css(scrollElement, 'paddingTop')}`;
|
|
72
|
+
}
|
|
67
73
|
}
|
|
68
74
|
|
|
69
75
|
if (this.offsetBottom === true) {
|
package/src/js/core/navbar.js
CHANGED
|
@@ -124,7 +124,6 @@ export default {
|
|
|
124
124
|
...this.$props,
|
|
125
125
|
boundary: this.boundary,
|
|
126
126
|
pos: this.pos,
|
|
127
|
-
offset: this.dropbar || this.offset,
|
|
128
127
|
}
|
|
129
128
|
);
|
|
130
129
|
},
|
|
@@ -285,8 +284,8 @@ export default {
|
|
|
285
284
|
return this.dropbar;
|
|
286
285
|
},
|
|
287
286
|
|
|
288
|
-
handler(
|
|
289
|
-
if (!
|
|
287
|
+
handler({ target }) {
|
|
288
|
+
if (!this.isDropbarDrop(target)) {
|
|
290
289
|
return;
|
|
291
290
|
}
|
|
292
291
|
|
|
@@ -294,7 +293,7 @@ export default {
|
|
|
294
293
|
after(this.dropbarAnchor || this.$el, this.dropbar);
|
|
295
294
|
}
|
|
296
295
|
|
|
297
|
-
addClass(
|
|
296
|
+
addClass(target, `${this.clsDrop}-dropbar`);
|
|
298
297
|
},
|
|
299
298
|
},
|
|
300
299
|
|
|
@@ -309,22 +308,47 @@ export default {
|
|
|
309
308
|
return this.dropbar;
|
|
310
309
|
},
|
|
311
310
|
|
|
312
|
-
handler(
|
|
313
|
-
if (!
|
|
311
|
+
handler({ target }) {
|
|
312
|
+
if (!this.isDropbarDrop(target)) {
|
|
314
313
|
return;
|
|
315
314
|
}
|
|
316
315
|
|
|
317
|
-
this._observer = observeResize(
|
|
316
|
+
this._observer = observeResize(target, () =>
|
|
318
317
|
this.transitionTo(
|
|
319
|
-
offset(
|
|
318
|
+
offset(target).bottom -
|
|
320
319
|
offset(this.dropbar).top +
|
|
321
|
-
toFloat(css(
|
|
322
|
-
|
|
320
|
+
toFloat(css(target, 'marginBottom')),
|
|
321
|
+
target
|
|
323
322
|
)
|
|
324
323
|
);
|
|
325
324
|
},
|
|
326
325
|
},
|
|
327
326
|
|
|
327
|
+
{
|
|
328
|
+
name: 'beforeposition',
|
|
329
|
+
|
|
330
|
+
el() {
|
|
331
|
+
return this.dropContainer;
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
filter() {
|
|
335
|
+
return this.dropbar;
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
handler(e, element, target, options) {
|
|
339
|
+
if (!this.isDropbarDrop(element)) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const dropbarOffset = offset(this.dropbar);
|
|
344
|
+
|
|
345
|
+
css(element, 'maxWidth', dropbarOffset.width - options.viewportOffset * 2);
|
|
346
|
+
|
|
347
|
+
options.offset[1] = dropbarOffset.top - offset(target).bottom;
|
|
348
|
+
options.viewportOffset += dropbarOffset.left;
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
|
|
328
352
|
{
|
|
329
353
|
name: 'beforehide',
|
|
330
354
|
|
|
@@ -336,12 +360,12 @@ export default {
|
|
|
336
360
|
return this.dropbar;
|
|
337
361
|
},
|
|
338
362
|
|
|
339
|
-
handler(e
|
|
363
|
+
handler(e) {
|
|
340
364
|
const active = this.getActive();
|
|
341
365
|
|
|
342
366
|
if (
|
|
343
367
|
matches(this.dropbar, ':hover') &&
|
|
344
|
-
active?.$el ===
|
|
368
|
+
active?.$el === e.target &&
|
|
345
369
|
!this.toggles.some((el) => active.target !== el && matches(el, ':focus'))
|
|
346
370
|
) {
|
|
347
371
|
e.preventDefault();
|
|
@@ -360,8 +384,8 @@ export default {
|
|
|
360
384
|
return this.dropbar;
|
|
361
385
|
},
|
|
362
386
|
|
|
363
|
-
handler(
|
|
364
|
-
if (!
|
|
387
|
+
handler({ target }) {
|
|
388
|
+
if (!this.isDropbarDrop(target)) {
|
|
365
389
|
return;
|
|
366
390
|
}
|
|
367
391
|
|
|
@@ -369,7 +393,7 @@ export default {
|
|
|
369
393
|
|
|
370
394
|
const active = this.getActive();
|
|
371
395
|
|
|
372
|
-
if (!active || active?.$el ===
|
|
396
|
+
if (!active || active?.$el === target) {
|
|
373
397
|
this.transitionTo(0);
|
|
374
398
|
}
|
|
375
399
|
},
|
|
@@ -409,6 +433,11 @@ export default {
|
|
|
409
433
|
getDropdown(el) {
|
|
410
434
|
return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
|
|
411
435
|
},
|
|
436
|
+
|
|
437
|
+
isDropbarDrop(el) {
|
|
438
|
+
const drop = this.getDropdown(el);
|
|
439
|
+
return drop && hasClass(el, this.clsDrop) && drop.align !== 'stretch';
|
|
440
|
+
},
|
|
412
441
|
},
|
|
413
442
|
};
|
|
414
443
|
|
package/src/js/core/offcanvas.js
CHANGED
|
@@ -93,22 +93,6 @@ export default {
|
|
|
93
93
|
},
|
|
94
94
|
},
|
|
95
95
|
|
|
96
|
-
{
|
|
97
|
-
name: 'touchstart',
|
|
98
|
-
|
|
99
|
-
passive: true,
|
|
100
|
-
|
|
101
|
-
el() {
|
|
102
|
-
return this.panel;
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
handler({ targetTouches }) {
|
|
106
|
-
if (targetTouches.length === 1) {
|
|
107
|
-
this.clientY = targetTouches[0].clientY;
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
|
|
112
96
|
{
|
|
113
97
|
name: 'touchmove',
|
|
114
98
|
|
|
@@ -124,33 +108,6 @@ export default {
|
|
|
124
108
|
},
|
|
125
109
|
},
|
|
126
110
|
|
|
127
|
-
{
|
|
128
|
-
name: 'touchmove',
|
|
129
|
-
|
|
130
|
-
passive: false,
|
|
131
|
-
|
|
132
|
-
el() {
|
|
133
|
-
return this.panel;
|
|
134
|
-
},
|
|
135
|
-
|
|
136
|
-
handler(e) {
|
|
137
|
-
if (e.targetTouches.length !== 1) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const clientY = e.targetTouches[0].clientY - this.clientY;
|
|
142
|
-
const { scrollTop, scrollHeight, clientHeight } = this.panel;
|
|
143
|
-
|
|
144
|
-
if (
|
|
145
|
-
clientHeight >= scrollHeight ||
|
|
146
|
-
(scrollTop === 0 && clientY > 0) ||
|
|
147
|
-
(scrollHeight - scrollTop <= clientHeight && clientY < 0)
|
|
148
|
-
) {
|
|
149
|
-
e.cancelable && e.preventDefault();
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
|
|
154
111
|
{
|
|
155
112
|
name: 'show',
|
|
156
113
|
|
|
@@ -162,7 +119,6 @@ export default {
|
|
|
162
119
|
addClass(parent(this.panel), this.clsMode);
|
|
163
120
|
}
|
|
164
121
|
|
|
165
|
-
css(document.documentElement, 'overflowY', this.overlay ? 'hidden' : '');
|
|
166
122
|
addClass(document.body, this.clsContainer, this.clsFlip);
|
|
167
123
|
css(document.body, 'touch-action', 'pan-y pinch-zoom');
|
|
168
124
|
css(this.$el, 'display', 'block');
|
|
@@ -170,7 +126,7 @@ export default {
|
|
|
170
126
|
addClass(
|
|
171
127
|
this.panel,
|
|
172
128
|
this.clsSidebarAnimation,
|
|
173
|
-
this.mode
|
|
129
|
+
this.mode === 'reveal' ? '' : this.clsMode
|
|
174
130
|
);
|
|
175
131
|
|
|
176
132
|
height(document.body); // force reflow
|
|
@@ -207,8 +163,6 @@ export default {
|
|
|
207
163
|
removeClass(this.$el, this.clsOverlay);
|
|
208
164
|
css(this.$el, 'display', '');
|
|
209
165
|
removeClass(document.body, this.clsContainer, this.clsFlip);
|
|
210
|
-
|
|
211
|
-
css(document.documentElement, 'overflowY', '');
|
|
212
166
|
},
|
|
213
167
|
},
|
|
214
168
|
|
package/src/js/core/sticky.js
CHANGED
|
@@ -23,7 +23,6 @@ import {
|
|
|
23
23
|
remove,
|
|
24
24
|
removeClass,
|
|
25
25
|
replaceClass,
|
|
26
|
-
scrollTop,
|
|
27
26
|
toFloat,
|
|
28
27
|
toggleClass,
|
|
29
28
|
toPx,
|
|
@@ -125,7 +124,9 @@ export default {
|
|
|
125
124
|
},
|
|
126
125
|
|
|
127
126
|
handler() {
|
|
128
|
-
|
|
127
|
+
const { scrollingElement } = document;
|
|
128
|
+
|
|
129
|
+
if (!location.hash || scrollingElement.scrollTop === 0) {
|
|
129
130
|
return;
|
|
130
131
|
}
|
|
131
132
|
|
|
@@ -134,13 +135,11 @@ export default {
|
|
|
134
135
|
const elOffset = getOffset(this.$el);
|
|
135
136
|
|
|
136
137
|
if (this.isFixed && intersectRect(targetOffset, elOffset)) {
|
|
137
|
-
scrollTop
|
|
138
|
-
window,
|
|
138
|
+
scrollingElement.scrollTop =
|
|
139
139
|
targetOffset.top -
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
);
|
|
140
|
+
elOffset.height -
|
|
141
|
+
toPx(this.targetOffset, 'height', this.placeholder) -
|
|
142
|
+
toPx(this.offset, 'height', this.placeholder);
|
|
144
143
|
}
|
|
145
144
|
});
|
|
146
145
|
},
|
|
@@ -238,7 +237,7 @@ export default {
|
|
|
238
237
|
start,
|
|
239
238
|
end,
|
|
240
239
|
}) {
|
|
241
|
-
const scroll = scrollTop
|
|
240
|
+
const scroll = document.scrollingElement.scrollTop;
|
|
242
241
|
const dir = prevScroll <= scroll ? 'down' : 'up';
|
|
243
242
|
|
|
244
243
|
return {
|
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
|
@@ -6,7 +6,9 @@ import {
|
|
|
6
6
|
includes,
|
|
7
7
|
isRtl,
|
|
8
8
|
positionAt,
|
|
9
|
+
scrollParents,
|
|
9
10
|
toPx,
|
|
11
|
+
trigger,
|
|
10
12
|
} from 'uikit-util';
|
|
11
13
|
|
|
12
14
|
export default {
|
|
@@ -44,17 +46,32 @@ export default {
|
|
|
44
46
|
offset = offset.reverse();
|
|
45
47
|
}
|
|
46
48
|
|
|
49
|
+
const [scrollElement] = scrollParents(element, /auto|scroll/);
|
|
50
|
+
const { scrollTop, scrollLeft } = scrollElement;
|
|
51
|
+
|
|
47
52
|
// Ensure none positioned element does not generate scrollbars
|
|
48
53
|
const elDim = dimensions(element);
|
|
49
54
|
css(element, { top: -elDim.height, left: -elDim.width });
|
|
50
55
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
const args = [
|
|
57
|
+
element,
|
|
58
|
+
target,
|
|
59
|
+
{
|
|
60
|
+
attach,
|
|
61
|
+
offset,
|
|
62
|
+
boundary,
|
|
63
|
+
flip: this.flip,
|
|
64
|
+
viewportOffset: this.getViewportOffset(element),
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
trigger(element, 'beforeposition', args);
|
|
69
|
+
|
|
70
|
+
positionAt(...args);
|
|
71
|
+
|
|
72
|
+
// Restore scroll position
|
|
73
|
+
scrollElement.scrollTop = scrollTop;
|
|
74
|
+
scrollElement.scrollLeft = scrollLeft;
|
|
58
75
|
},
|
|
59
76
|
|
|
60
77
|
getPositionOffset(element) {
|
|
@@ -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;
|
|
@@ -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
|
}
|