uikit 3.11.2-dev.c2430c233 → 3.11.2-dev.cfa6c7d5c
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/.eslintrc.json +4 -49
- package/.prettierignore +14 -0
- package/.prettierrc.json +13 -0
- package/.webstorm.js +3 -3
- package/CHANGELOG.md +41 -18
- package/build/.eslintrc.json +1 -3
- package/build/build.js +26 -28
- package/build/icons.js +7 -11
- package/build/less.js +48 -36
- package/build/package.json +2 -2
- package/build/prefix.js +21 -18
- package/build/publishDev.js +6 -8
- package/build/release.js +20 -17
- package/build/scope.js +21 -11
- package/build/scss.js +72 -39
- package/build/util.js +71 -62
- package/build/wrapper/icons.js +0 -2
- package/dist/css/uikit-core-rtl.css +86 -185
- package/dist/css/uikit-core-rtl.min.css +1 -1
- package/dist/css/uikit-core.css +86 -185
- package/dist/css/uikit-core.min.css +1 -1
- package/dist/css/uikit-rtl.css +88 -191
- package/dist/css/uikit-rtl.min.css +1 -1
- package/dist/css/uikit.css +88 -191
- package/dist/css/uikit.min.css +1 -1
- package/dist/js/components/countdown.js +88 -133
- package/dist/js/components/countdown.min.js +1 -1
- package/dist/js/components/filter.js +408 -439
- package/dist/js/components/filter.min.js +1 -1
- package/dist/js/components/lightbox-panel.js +1098 -1316
- package/dist/js/components/lightbox-panel.min.js +1 -1
- package/dist/js/components/lightbox.js +1144 -1393
- package/dist/js/components/lightbox.min.js +1 -1
- package/dist/js/components/notification.js +94 -114
- package/dist/js/components/notification.min.js +1 -1
- package/dist/js/components/parallax.js +344 -359
- package/dist/js/components/parallax.min.js +1 -1
- package/dist/js/components/slider-parallax.js +342 -358
- package/dist/js/components/slider-parallax.min.js +1 -1
- package/dist/js/components/slider.js +768 -843
- package/dist/js/components/slider.min.js +1 -1
- package/dist/js/components/slideshow-parallax.js +342 -358
- package/dist/js/components/slideshow-parallax.min.js +1 -1
- package/dist/js/components/slideshow.js +645 -793
- package/dist/js/components/slideshow.min.js +1 -1
- package/dist/js/components/sortable.js +587 -620
- package/dist/js/components/sortable.min.js +1 -1
- package/dist/js/components/tooltip.js +324 -356
- package/dist/js/components/tooltip.min.js +1 -1
- package/dist/js/components/upload.js +155 -167
- package/dist/js/components/upload.min.js +1 -1
- package/dist/js/uikit-core.js +5273 -6604
- package/dist/js/uikit-core.min.js +1 -1
- package/dist/js/uikit-icons.js +7 -9
- package/dist/js/uikit-icons.min.js +1 -1
- package/dist/js/uikit.js +7995 -9704
- package/dist/js/uikit.min.js +1 -1
- package/jsconfig.json +1 -1
- package/package.json +64 -60
- package/src/js/api/boot.js +25 -32
- package/src/js/api/component.js +15 -28
- package/src/js/api/global.js +6 -12
- package/src/js/api/hooks.js +14 -33
- package/src/js/api/instance.js +7 -15
- package/src/js/api/state.js +65 -82
- package/src/js/components/countdown.js +24 -50
- package/src/js/components/filter.js +70 -66
- package/src/js/components/index.js +13 -13
- package/src/js/components/internal/lightbox-animations.js +14 -25
- package/src/js/components/internal/slider-preload.js +37 -0
- package/src/js/components/internal/slider-transitioner.js +66 -45
- package/src/js/components/internal/slideshow-animations.js +46 -64
- package/src/js/components/lightbox-panel.js +107 -105
- package/src/js/components/lightbox.js +17 -39
- package/src/js/components/notification.js +49 -43
- package/src/js/components/parallax.js +16 -30
- package/src/js/components/slider-parallax.js +13 -23
- package/src/js/components/slider.js +95 -64
- package/src/js/components/slideshow-parallax.js +1 -1
- package/src/js/components/slideshow.js +15 -13
- package/src/js/components/sortable.js +125 -106
- package/src/js/components/tooltip.js +41 -31
- package/src/js/components/upload.js +52 -63
- package/src/js/core/accordion.js +53 -48
- package/src/js/core/alert.js +9 -17
- package/src/js/core/core.js +74 -53
- package/src/js/core/cover.js +11 -15
- package/src/js/core/drop.js +106 -92
- package/src/js/core/form-custom.js +20 -25
- package/src/js/core/gif.js +3 -7
- package/src/js/core/grid.js +57 -58
- package/src/js/core/height-match.js +16 -29
- package/src/js/core/height-viewport.js +30 -34
- package/src/js/core/icon.js +47 -52
- package/src/js/core/img.js +156 -138
- package/src/js/core/index.js +39 -39
- package/src/js/core/leader.js +9 -18
- package/src/js/core/margin.js +21 -37
- package/src/js/core/modal.js +49 -36
- package/src/js/core/nav.js +2 -4
- package/src/js/core/navbar.js +112 -88
- package/src/js/core/offcanvas.js +49 -53
- package/src/js/core/overflow-auto.js +13 -17
- package/src/js/core/responsive.js +14 -12
- package/src/js/core/scroll.js +10 -20
- package/src/js/core/scrollspy-nav.js +34 -31
- package/src/js/core/scrollspy.js +37 -54
- package/src/js/core/sticky.js +161 -128
- package/src/js/core/svg.js +68 -83
- package/src/js/core/switcher.js +47 -46
- package/src/js/core/tab.js +7 -10
- package/src/js/core/toggle.js +66 -67
- package/src/js/core/video.js +11 -22
- package/src/js/mixin/animate.js +19 -20
- package/src/js/mixin/class.js +2 -4
- package/src/js/mixin/container.js +7 -11
- package/src/js/mixin/internal/animate-fade.js +73 -30
- package/src/js/mixin/internal/animate-slide.js +58 -41
- package/src/js/mixin/internal/slideshow-animations.js +7 -14
- package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
- package/src/js/mixin/media.js +5 -10
- package/src/js/mixin/modal.js +89 -66
- package/src/js/mixin/parallax.js +146 -105
- package/src/js/mixin/position.js +26 -20
- package/src/js/mixin/slider-autoplay.js +12 -21
- package/src/js/mixin/slider-drag.js +64 -65
- package/src/js/mixin/slider-nav.js +26 -35
- package/src/js/mixin/slider-reactive.js +2 -8
- package/src/js/mixin/slider.js +48 -55
- package/src/js/mixin/slideshow.js +13 -19
- package/src/js/mixin/togglable.js +89 -63
- package/src/js/uikit-core.js +2 -4
- package/src/js/uikit.js +2 -4
- package/src/js/util/ajax.js +25 -40
- package/src/js/util/animation.js +77 -75
- package/src/js/util/attr.js +17 -21
- package/src/js/util/class.js +14 -52
- package/src/js/util/dimensions.js +58 -45
- package/src/js/util/dom.js +39 -66
- package/src/js/util/env.js +7 -12
- package/src/js/util/event.js +60 -59
- package/src/js/util/fastdom.js +1 -6
- package/src/js/util/filter.js +17 -34
- package/src/js/util/index.js +0 -1
- package/src/js/util/lang.js +82 -121
- package/src/js/util/mouse.js +19 -17
- package/src/js/util/options.js +35 -49
- package/src/js/util/player.js +41 -36
- package/src/js/util/position.js +54 -46
- package/src/js/util/selector.js +43 -58
- package/src/js/util/style.js +39 -49
- package/src/js/util/viewport.js +75 -64
- package/src/less/components/base.less +10 -33
- package/src/less/components/form-range.less +48 -95
- package/src/less/components/form.less +0 -1
- package/src/less/components/height.less +3 -0
- package/src/less/components/leader.less +0 -1
- package/src/less/components/lightbox.less +0 -1
- package/src/less/components/modal.less +3 -7
- package/src/less/components/progress.less +14 -36
- package/src/less/components/slider.less +0 -3
- package/src/less/components/slideshow.less +0 -3
- package/src/less/components/text.less +16 -32
- package/src/scss/components/base.scss +10 -33
- package/src/scss/components/form-range.scss +48 -95
- package/src/scss/components/form.scss +0 -1
- package/src/scss/components/height.scss +3 -0
- package/src/scss/components/leader.scss +0 -1
- package/src/scss/components/lightbox.scss +0 -1
- package/src/scss/components/modal.scss +3 -7
- package/src/scss/components/progress.scss +14 -36
- package/src/scss/components/slider.scss +0 -3
- package/src/scss/components/slideshow.scss +0 -3
- package/src/scss/components/text.scss +16 -32
- package/src/scss/mixins-theme.scss +1 -1
- package/src/scss/mixins.scss +1 -1
- package/src/scss/variables-theme.scss +3 -3
- package/src/scss/variables.scss +3 -3
- package/tests/align.html +10 -10
- package/tests/animation.html +2 -2
- package/tests/article.html +2 -2
- package/tests/base.html +3 -3
- package/tests/card.html +10 -10
- package/tests/column.html +3 -3
- package/tests/comment.html +9 -9
- package/tests/dotnav.html +3 -3
- package/tests/image.html +296 -64
- package/tests/images/image-type.avif +0 -0
- package/tests/images/image-type.jpeg +0 -0
- package/tests/images/image-type.webp +0 -0
- package/tests/index.html +8 -8
- package/tests/js/index.js +114 -85
- package/tests/lightbox.html +10 -10
- package/tests/marker.html +2 -2
- package/tests/modal.html +8 -9
- package/tests/navbar.html +2 -2
- package/tests/overlay.html +7 -7
- package/tests/parallax.html +14 -5
- package/tests/position.html +12 -12
- package/tests/slidenav.html +12 -12
- package/tests/slider.html +20 -20
- package/tests/sortable.html +1 -1
- package/tests/sticky-parallax.html +55 -70
- package/tests/svg.html +6 -6
- package/tests/table.html +11 -11
- package/tests/thumbnav.html +12 -12
- package/tests/transition.html +30 -30
- package/tests/utility.html +33 -33
- package/tests/video.html +1 -1
- package/tests/width.html +1 -1
- package/src/js/mixin/flex-bug.js +0 -56
- package/src/js/util/promise.js +0 -191
- package/tests/images/animated.gif +0 -0
package/src/js/core/scrollspy.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
$$,
|
|
3
|
+
css,
|
|
4
|
+
filter,
|
|
5
|
+
data as getData,
|
|
6
|
+
isInView,
|
|
7
|
+
once,
|
|
8
|
+
removeClass,
|
|
9
|
+
removeClasses,
|
|
10
|
+
toggleClass,
|
|
11
|
+
trigger,
|
|
12
|
+
} from 'uikit-util';
|
|
2
13
|
|
|
3
14
|
const stateKey = '_ukScrollspy';
|
|
4
15
|
export default {
|
|
5
|
-
|
|
6
16
|
args: 'cls',
|
|
7
17
|
|
|
8
18
|
props: {
|
|
@@ -12,7 +22,7 @@ export default {
|
|
|
12
22
|
offsetTop: Number,
|
|
13
23
|
offsetLeft: Number,
|
|
14
24
|
repeat: Boolean,
|
|
15
|
-
delay: Number
|
|
25
|
+
delay: Number,
|
|
16
26
|
},
|
|
17
27
|
|
|
18
28
|
data: () => ({
|
|
@@ -23,14 +33,12 @@ export default {
|
|
|
23
33
|
offsetLeft: 0,
|
|
24
34
|
repeat: false,
|
|
25
35
|
delay: 0,
|
|
26
|
-
inViewClass: 'uk-scrollspy-inview'
|
|
36
|
+
inViewClass: 'uk-scrollspy-inview',
|
|
27
37
|
}),
|
|
28
38
|
|
|
29
39
|
computed: {
|
|
30
|
-
|
|
31
40
|
elements: {
|
|
32
|
-
|
|
33
|
-
get({target}, $el) {
|
|
41
|
+
get({ target }, $el) {
|
|
34
42
|
return target ? $$(target, $el) : [$el];
|
|
35
43
|
},
|
|
36
44
|
|
|
@@ -40,25 +48,20 @@ export default {
|
|
|
40
48
|
}
|
|
41
49
|
},
|
|
42
50
|
|
|
43
|
-
immediate: true
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
51
|
+
immediate: true,
|
|
52
|
+
},
|
|
47
53
|
},
|
|
48
54
|
|
|
49
55
|
disconnected() {
|
|
50
|
-
this.elements
|
|
56
|
+
for (const el of this.elements) {
|
|
51
57
|
removeClass(el, this.inViewClass, el[stateKey] ? el[stateKey].cls : '');
|
|
52
58
|
delete el[stateKey];
|
|
53
|
-
}
|
|
59
|
+
}
|
|
54
60
|
},
|
|
55
61
|
|
|
56
62
|
update: [
|
|
57
|
-
|
|
58
63
|
{
|
|
59
|
-
|
|
60
64
|
read(data) {
|
|
61
|
-
|
|
62
65
|
// Let child components be applied at least once first
|
|
63
66
|
if (!data.update) {
|
|
64
67
|
Promise.resolve().then(() => {
|
|
@@ -68,60 +71,43 @@ export default {
|
|
|
68
71
|
return false;
|
|
69
72
|
}
|
|
70
73
|
|
|
71
|
-
this.elements
|
|
72
|
-
|
|
74
|
+
for (const el of this.elements) {
|
|
73
75
|
if (!el[stateKey]) {
|
|
74
|
-
el[stateKey] = {cls: getData(el, 'uk-scrollspy-class') || this.cls};
|
|
76
|
+
el[stateKey] = { cls: getData(el, 'uk-scrollspy-class') || this.cls };
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
el[stateKey].show = isInView(el, this.offsetTop, this.offsetLeft);
|
|
78
|
-
|
|
79
|
-
});
|
|
80
|
-
|
|
80
|
+
}
|
|
81
81
|
},
|
|
82
82
|
|
|
83
83
|
write(data) {
|
|
84
|
-
|
|
85
|
-
this.elements.forEach(el => {
|
|
86
|
-
|
|
84
|
+
for (const el of this.elements) {
|
|
87
85
|
const state = el[stateKey];
|
|
88
86
|
|
|
89
87
|
if (state.show && !state.inview && !state.queued) {
|
|
90
|
-
|
|
91
88
|
state.queued = true;
|
|
92
89
|
|
|
93
|
-
data.promise = (data.promise || Promise.resolve())
|
|
94
|
-
new Promise(resolve =>
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}, 300);
|
|
103
|
-
});
|
|
104
|
-
|
|
90
|
+
data.promise = (data.promise || Promise.resolve())
|
|
91
|
+
.then(() => new Promise((resolve) => setTimeout(resolve, this.delay)))
|
|
92
|
+
.then(() => {
|
|
93
|
+
this.toggle(el, true);
|
|
94
|
+
setTimeout(() => {
|
|
95
|
+
state.queued = false;
|
|
96
|
+
this.$emit();
|
|
97
|
+
}, 300);
|
|
98
|
+
});
|
|
105
99
|
} else if (!state.show && state.inview && !state.queued && this.repeat) {
|
|
106
|
-
|
|
107
100
|
this.toggle(el, false);
|
|
108
|
-
|
|
109
101
|
}
|
|
110
|
-
|
|
111
|
-
});
|
|
112
|
-
|
|
102
|
+
}
|
|
113
103
|
},
|
|
114
104
|
|
|
115
|
-
events: ['scroll', 'resize']
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
105
|
+
events: ['scroll', 'resize'],
|
|
106
|
+
},
|
|
119
107
|
],
|
|
120
108
|
|
|
121
109
|
methods: {
|
|
122
|
-
|
|
123
110
|
toggle(el, inview) {
|
|
124
|
-
|
|
125
111
|
const state = el[stateKey];
|
|
126
112
|
|
|
127
113
|
state.off && state.off();
|
|
@@ -142,9 +128,6 @@ export default {
|
|
|
142
128
|
state.inview = inview;
|
|
143
129
|
|
|
144
130
|
this.$update(el);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
131
|
+
},
|
|
132
|
+
},
|
|
149
133
|
};
|
|
150
|
-
|
package/src/js/core/sticky.js
CHANGED
|
@@ -1,9 +1,37 @@
|
|
|
1
1
|
import Class from '../mixin/class';
|
|
2
2
|
import Media from '../mixin/media';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
$,
|
|
5
|
+
addClass,
|
|
6
|
+
after,
|
|
7
|
+
Animation,
|
|
8
|
+
clamp,
|
|
9
|
+
css,
|
|
10
|
+
dimensions,
|
|
11
|
+
fastdom,
|
|
12
|
+
height as getHeight,
|
|
13
|
+
offset as getOffset,
|
|
14
|
+
getScrollingElement,
|
|
15
|
+
hasClass,
|
|
16
|
+
isString,
|
|
17
|
+
isVisible,
|
|
18
|
+
noop,
|
|
19
|
+
offsetPosition,
|
|
20
|
+
parent,
|
|
21
|
+
query,
|
|
22
|
+
remove,
|
|
23
|
+
removeClass,
|
|
24
|
+
replaceClass,
|
|
25
|
+
scrollTop,
|
|
26
|
+
toFloat,
|
|
27
|
+
toggleClass,
|
|
28
|
+
toPx,
|
|
29
|
+
trigger,
|
|
30
|
+
within,
|
|
31
|
+
intersectRect,
|
|
32
|
+
} from 'uikit-util';
|
|
4
33
|
|
|
5
34
|
export default {
|
|
6
|
-
|
|
7
35
|
mixins: [Class, Media],
|
|
8
36
|
|
|
9
37
|
props: {
|
|
@@ -19,7 +47,7 @@ export default {
|
|
|
19
47
|
selTarget: String,
|
|
20
48
|
widthElement: Boolean,
|
|
21
49
|
showOnUp: Boolean,
|
|
22
|
-
targetOffset: Number
|
|
50
|
+
targetOffset: Number,
|
|
23
51
|
},
|
|
24
52
|
|
|
25
53
|
data: {
|
|
@@ -35,36 +63,19 @@ export default {
|
|
|
35
63
|
selTarget: '',
|
|
36
64
|
widthElement: false,
|
|
37
65
|
showOnUp: false,
|
|
38
|
-
targetOffset: false
|
|
66
|
+
targetOffset: false,
|
|
39
67
|
},
|
|
40
68
|
|
|
41
69
|
computed: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return position === 'auto'
|
|
45
|
-
? (this.isFixed ? this.placeholder : $el).offsetHeight > getHeight(window)
|
|
46
|
-
? 'bottom'
|
|
47
|
-
: 'top'
|
|
48
|
-
: position;
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
offset({offset}, $el) {
|
|
52
|
-
if (this.position === 'bottom') {
|
|
53
|
-
offset += '+100vh-100%';
|
|
54
|
-
}
|
|
55
|
-
return toPx(offset, 'height', $el);
|
|
70
|
+
selTarget({ selTarget }, $el) {
|
|
71
|
+
return (selTarget && $(selTarget, $el)) || $el;
|
|
56
72
|
},
|
|
57
73
|
|
|
58
|
-
|
|
59
|
-
return selTarget && $(selTarget, $el) || $el;
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
widthElement({widthElement}, $el) {
|
|
74
|
+
widthElement({ widthElement }, $el) {
|
|
63
75
|
return query(widthElement, $el) || this.placeholder;
|
|
64
76
|
},
|
|
65
77
|
|
|
66
78
|
isActive: {
|
|
67
|
-
|
|
68
79
|
get() {
|
|
69
80
|
return hasClass(this.selTarget, this.clsActive);
|
|
70
81
|
},
|
|
@@ -77,20 +88,19 @@ export default {
|
|
|
77
88
|
replaceClass(this.selTarget, this.clsActive, this.clsInactive);
|
|
78
89
|
trigger(this.$el, 'inactive');
|
|
79
90
|
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
91
|
+
},
|
|
92
|
+
},
|
|
84
93
|
},
|
|
85
94
|
|
|
86
95
|
connected() {
|
|
87
|
-
this.placeholder =
|
|
96
|
+
this.placeholder =
|
|
97
|
+
$('+ .uk-sticky-placeholder', this.$el) ||
|
|
98
|
+
$('<div class="uk-sticky-placeholder"></div>');
|
|
88
99
|
this.isFixed = false;
|
|
89
100
|
this.isActive = false;
|
|
90
101
|
},
|
|
91
102
|
|
|
92
103
|
disconnected() {
|
|
93
|
-
|
|
94
104
|
if (this.isFixed) {
|
|
95
105
|
this.hide();
|
|
96
106
|
removeClass(this.selTarget, this.clsInactive);
|
|
@@ -102,49 +112,43 @@ export default {
|
|
|
102
112
|
},
|
|
103
113
|
|
|
104
114
|
events: [
|
|
105
|
-
|
|
106
115
|
{
|
|
107
|
-
|
|
108
116
|
name: 'load hashchange popstate',
|
|
109
117
|
|
|
110
118
|
el() {
|
|
111
119
|
return window;
|
|
112
120
|
},
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
filter() {
|
|
123
|
+
return this.targetOffset !== false;
|
|
124
|
+
},
|
|
115
125
|
|
|
116
|
-
|
|
126
|
+
handler() {
|
|
127
|
+
if (!location.hash || scrollTop(window) === 0) {
|
|
117
128
|
return;
|
|
118
129
|
}
|
|
119
130
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
131
|
+
fastdom.read(() => {
|
|
132
|
+
const targetOffset = getOffset($(location.hash));
|
|
133
|
+
const elOffset = getOffset(this.$el);
|
|
134
|
+
|
|
135
|
+
if (this.isFixed && intersectRect(targetOffset, elOffset)) {
|
|
136
|
+
scrollTop(
|
|
137
|
+
window,
|
|
138
|
+
targetOffset.top -
|
|
139
|
+
elOffset.height -
|
|
140
|
+
toPx(this.targetOffset, 'height') -
|
|
141
|
+
toPx(this.offset, 'height')
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
},
|
|
140
147
|
],
|
|
141
148
|
|
|
142
149
|
update: [
|
|
143
|
-
|
|
144
150
|
{
|
|
145
|
-
|
|
146
|
-
read({height, margin}, types) {
|
|
147
|
-
|
|
151
|
+
read({ height, margin }, types) {
|
|
148
152
|
this.inactive = !this.matchMedia || !isVisible(this.$el);
|
|
149
153
|
|
|
150
154
|
if (this.inactive) {
|
|
@@ -153,50 +157,64 @@ export default {
|
|
|
153
157
|
|
|
154
158
|
const hide = this.isActive && types.has('resize');
|
|
155
159
|
if (hide) {
|
|
160
|
+
css(this.selTarget, 'transition', '0s');
|
|
156
161
|
this.hide();
|
|
157
162
|
}
|
|
158
163
|
|
|
159
164
|
if (!this.isActive) {
|
|
160
|
-
height = this.$el.
|
|
165
|
+
height = getOffset(this.$el).height;
|
|
161
166
|
margin = css(this.$el, 'margin');
|
|
162
167
|
}
|
|
163
168
|
|
|
164
169
|
if (hide) {
|
|
165
170
|
this.show();
|
|
171
|
+
fastdom.write(() => css(this.selTarget, 'transition', ''));
|
|
166
172
|
}
|
|
167
173
|
|
|
168
|
-
const overflow = Math.max(0, height + this.offset - getHeight(window));
|
|
169
|
-
|
|
170
174
|
const referenceElement = this.isFixed ? this.placeholder : this.$el;
|
|
171
|
-
const
|
|
172
|
-
|
|
175
|
+
const windowHeight = getHeight(window);
|
|
176
|
+
|
|
177
|
+
let position = this.position;
|
|
178
|
+
if (position === 'auto' && height > windowHeight) {
|
|
179
|
+
position = 'bottom';
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let offset = toPx(this.offset, 'height', referenceElement);
|
|
183
|
+
if (position === 'bottom') {
|
|
184
|
+
offset += windowHeight - height;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const overflow = Math.max(0, height + offset - windowHeight);
|
|
188
|
+
const topOffset = getOffset(referenceElement).top;
|
|
189
|
+
const offsetParentTop = getOffset(referenceElement.offsetParent).top;
|
|
173
190
|
|
|
174
191
|
const top = parseProp(this.top, this.$el, topOffset);
|
|
175
|
-
const bottom = parseProp(this.bottom, this.$el, topOffset + height);
|
|
192
|
+
const bottom = parseProp(this.bottom, this.$el, topOffset + height, true);
|
|
176
193
|
|
|
177
|
-
const start = Math.max(top, topOffset) -
|
|
194
|
+
const start = Math.max(top, topOffset) - offset;
|
|
178
195
|
const end = bottom
|
|
179
|
-
? bottom - this.$el.
|
|
180
|
-
: getScrollingElement(this.$el).scrollHeight -
|
|
196
|
+
? bottom - getOffset(this.$el).height + overflow - offset
|
|
197
|
+
: getScrollingElement(this.$el).scrollHeight - windowHeight;
|
|
181
198
|
|
|
182
199
|
return {
|
|
183
200
|
start,
|
|
184
201
|
end,
|
|
202
|
+
offset,
|
|
185
203
|
overflow,
|
|
186
204
|
topOffset,
|
|
187
205
|
offsetParentTop,
|
|
188
206
|
height,
|
|
189
207
|
margin,
|
|
190
|
-
width: dimensions(isVisible(this.widthElement) ? this.widthElement : this.$el)
|
|
191
|
-
|
|
208
|
+
width: dimensions(isVisible(this.widthElement) ? this.widthElement : this.$el)
|
|
209
|
+
.width,
|
|
210
|
+
top: offsetPosition(referenceElement)[0],
|
|
192
211
|
};
|
|
193
212
|
},
|
|
194
213
|
|
|
195
|
-
write({height, margin}) {
|
|
196
|
-
|
|
197
|
-
const {placeholder} = this;
|
|
214
|
+
write({ height, margin }) {
|
|
215
|
+
const { placeholder } = this;
|
|
198
216
|
|
|
199
|
-
css(placeholder, {height, margin});
|
|
217
|
+
css(placeholder, { height, margin });
|
|
200
218
|
|
|
201
219
|
if (!within(placeholder, document)) {
|
|
202
220
|
after(this.$el, placeholder);
|
|
@@ -204,17 +222,20 @@ export default {
|
|
|
204
222
|
}
|
|
205
223
|
|
|
206
224
|
this.isActive = !!this.isActive; // force self-assign
|
|
207
|
-
|
|
208
225
|
},
|
|
209
226
|
|
|
210
|
-
events: ['resize']
|
|
211
|
-
|
|
227
|
+
events: ['resize'],
|
|
212
228
|
},
|
|
213
229
|
|
|
214
230
|
{
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
231
|
+
read({
|
|
232
|
+
scroll: prevScroll = 0,
|
|
233
|
+
dir: prevDir = 'down',
|
|
234
|
+
overflow,
|
|
235
|
+
overflowScroll = 0,
|
|
236
|
+
start,
|
|
237
|
+
end,
|
|
238
|
+
}) {
|
|
218
239
|
const scroll = scrollTop(window);
|
|
219
240
|
const dir = prevScroll <= scroll ? 'down' : 'up';
|
|
220
241
|
|
|
@@ -224,21 +245,32 @@ export default {
|
|
|
224
245
|
scroll,
|
|
225
246
|
prevScroll,
|
|
226
247
|
overflowScroll: clamp(
|
|
227
|
-
overflowScroll
|
|
228
|
-
+ clamp(scroll, start, end)
|
|
229
|
-
- clamp(prevScroll, start, end),
|
|
248
|
+
overflowScroll + clamp(scroll, start, end) - clamp(prevScroll, start, end),
|
|
230
249
|
0,
|
|
231
250
|
overflow
|
|
232
|
-
)
|
|
251
|
+
),
|
|
233
252
|
};
|
|
234
253
|
},
|
|
235
254
|
|
|
236
255
|
write(data, types) {
|
|
237
|
-
|
|
238
256
|
const isScrollUpdate = types.has('scroll');
|
|
239
|
-
const {
|
|
257
|
+
const {
|
|
258
|
+
initTimestamp = 0,
|
|
259
|
+
dir,
|
|
260
|
+
prevDir,
|
|
261
|
+
scroll,
|
|
262
|
+
prevScroll = 0,
|
|
263
|
+
top,
|
|
264
|
+
start,
|
|
265
|
+
topOffset,
|
|
266
|
+
height,
|
|
267
|
+
} = data;
|
|
240
268
|
|
|
241
|
-
if (
|
|
269
|
+
if (
|
|
270
|
+
scroll < 0 ||
|
|
271
|
+
(scroll === prevScroll && isScrollUpdate) ||
|
|
272
|
+
(this.showOnUp && !isScrollUpdate && !this.isFixed)
|
|
273
|
+
) {
|
|
242
274
|
return;
|
|
243
275
|
}
|
|
244
276
|
|
|
@@ -248,17 +280,24 @@ export default {
|
|
|
248
280
|
data.initTimestamp = now;
|
|
249
281
|
}
|
|
250
282
|
|
|
251
|
-
if (
|
|
283
|
+
if (
|
|
284
|
+
this.showOnUp &&
|
|
285
|
+
!this.isFixed &&
|
|
286
|
+
Math.abs(data.initScroll - scroll) <= 30 &&
|
|
287
|
+
Math.abs(prevScroll - scroll) <= 10
|
|
288
|
+
) {
|
|
252
289
|
return;
|
|
253
290
|
}
|
|
254
291
|
|
|
255
|
-
if (
|
|
256
|
-
||
|
|
257
|
-
|
|
292
|
+
if (
|
|
293
|
+
this.inactive ||
|
|
294
|
+
scroll < start ||
|
|
295
|
+
(this.showOnUp &&
|
|
296
|
+
(scroll <= start ||
|
|
297
|
+
(dir === 'down' && isScrollUpdate) ||
|
|
298
|
+
(dir === 'up' && !this.isFixed && scroll <= topOffset + height)))
|
|
258
299
|
) {
|
|
259
|
-
|
|
260
300
|
if (!this.isFixed) {
|
|
261
|
-
|
|
262
301
|
if (Animation.inProgress(this.$el) && top > scroll) {
|
|
263
302
|
Animation.cancel(this.$el);
|
|
264
303
|
this.hide();
|
|
@@ -275,93 +314,87 @@ export default {
|
|
|
275
314
|
} else {
|
|
276
315
|
this.hide();
|
|
277
316
|
}
|
|
278
|
-
|
|
279
317
|
} else if (this.isFixed) {
|
|
280
|
-
|
|
281
318
|
this.update();
|
|
282
|
-
|
|
283
|
-
} else if (this.animation) {
|
|
284
|
-
|
|
319
|
+
} else if (this.animation && scroll > topOffset) {
|
|
285
320
|
Animation.cancel(this.$el);
|
|
286
321
|
this.show();
|
|
287
322
|
Animation.in(this.$el, this.animation).catch(noop);
|
|
288
|
-
|
|
289
323
|
} else {
|
|
290
324
|
this.show();
|
|
291
325
|
}
|
|
292
|
-
|
|
293
326
|
},
|
|
294
327
|
|
|
295
|
-
events: ['resize', 'scroll']
|
|
296
|
-
|
|
297
|
-
}
|
|
298
|
-
|
|
328
|
+
events: ['resize', 'scroll'],
|
|
329
|
+
},
|
|
299
330
|
],
|
|
300
331
|
|
|
301
332
|
methods: {
|
|
302
|
-
|
|
303
333
|
show() {
|
|
304
|
-
|
|
305
334
|
this.isFixed = true;
|
|
306
335
|
this.update();
|
|
307
336
|
this.placeholder.hidden = false;
|
|
308
|
-
|
|
309
337
|
},
|
|
310
338
|
|
|
311
339
|
hide() {
|
|
312
|
-
|
|
313
340
|
this.isActive = false;
|
|
314
341
|
removeClass(this.$el, this.clsFixed, this.clsBelow);
|
|
315
|
-
css(this.$el, {position: '', top: '', width: ''});
|
|
342
|
+
css(this.$el, { position: '', top: '', width: '' });
|
|
316
343
|
this.placeholder.hidden = true;
|
|
317
|
-
|
|
318
344
|
},
|
|
319
345
|
|
|
320
346
|
update() {
|
|
321
|
-
|
|
322
|
-
|
|
347
|
+
let {
|
|
348
|
+
width,
|
|
349
|
+
scroll = 0,
|
|
350
|
+
overflow,
|
|
351
|
+
overflowScroll = 0,
|
|
352
|
+
start,
|
|
353
|
+
end,
|
|
354
|
+
offset,
|
|
355
|
+
topOffset,
|
|
356
|
+
height,
|
|
357
|
+
offsetParentTop,
|
|
358
|
+
} = this._data;
|
|
323
359
|
const active = start !== 0 || scroll > start;
|
|
324
|
-
let top = this.offset;
|
|
325
360
|
let position = 'fixed';
|
|
326
361
|
|
|
327
362
|
if (scroll > end) {
|
|
328
|
-
|
|
363
|
+
offset += end - offsetParentTop;
|
|
329
364
|
position = 'absolute';
|
|
330
365
|
}
|
|
331
366
|
|
|
332
367
|
if (overflow) {
|
|
333
|
-
|
|
368
|
+
offset -= overflowScroll;
|
|
334
369
|
}
|
|
335
370
|
|
|
336
371
|
css(this.$el, {
|
|
337
372
|
position,
|
|
338
|
-
top: `${
|
|
339
|
-
width
|
|
373
|
+
top: `${offset}px`,
|
|
374
|
+
width,
|
|
340
375
|
});
|
|
341
376
|
|
|
342
377
|
this.isActive = active;
|
|
343
378
|
toggleClass(this.$el, this.clsBelow, scroll > topOffset + height);
|
|
344
379
|
addClass(this.$el, this.clsFixed);
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
}
|
|
349
|
-
|
|
380
|
+
},
|
|
381
|
+
},
|
|
350
382
|
};
|
|
351
383
|
|
|
352
|
-
function parseProp(value, el, propOffset) {
|
|
353
|
-
|
|
384
|
+
function parseProp(value, el, propOffset, padding) {
|
|
354
385
|
if (!value) {
|
|
355
386
|
return 0;
|
|
356
387
|
}
|
|
357
388
|
|
|
358
389
|
if (isString(value) && value.match(/^-?\d/)) {
|
|
359
|
-
|
|
360
390
|
return propOffset + toPx(value);
|
|
361
|
-
|
|
362
391
|
} else {
|
|
363
|
-
|
|
364
|
-
return
|
|
365
|
-
|
|
392
|
+
const refElement = value === true ? parent(el) : query(value, el);
|
|
393
|
+
return (
|
|
394
|
+
getOffset(refElement).bottom -
|
|
395
|
+
(padding && refElement && within(el, refElement)
|
|
396
|
+
? toFloat(css(refElement, 'paddingBottom'))
|
|
397
|
+
: 0)
|
|
398
|
+
);
|
|
366
399
|
}
|
|
367
400
|
}
|