uikit 3.11.2-dev.4c11be04b → 3.11.2-dev.72dbb9a19

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