uikit 3.10.2-dev.c8aa7eda2 → 3.11.1

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 (61) hide show
  1. package/CHANGELOG.md +35 -14
  2. package/build/icons.js +4 -4
  3. package/build/scope.js +4 -6
  4. package/dist/css/uikit-core-rtl.css +10 -1
  5. package/dist/css/uikit-core-rtl.min.css +1 -1
  6. package/dist/css/uikit-core.css +10 -1
  7. package/dist/css/uikit-core.min.css +1 -1
  8. package/dist/css/uikit-rtl.css +10 -1
  9. package/dist/css/uikit-rtl.min.css +1 -1
  10. package/dist/css/uikit.css +10 -1
  11. package/dist/css/uikit.min.css +1 -1
  12. package/dist/js/components/countdown.js +1 -1
  13. package/dist/js/components/countdown.min.js +1 -1
  14. package/dist/js/components/filter.js +1 -1
  15. package/dist/js/components/filter.min.js +1 -1
  16. package/dist/js/components/lightbox-panel.js +1 -1
  17. package/dist/js/components/lightbox-panel.min.js +1 -1
  18. package/dist/js/components/lightbox.js +1 -1
  19. package/dist/js/components/lightbox.min.js +1 -1
  20. package/dist/js/components/notification.js +1 -1
  21. package/dist/js/components/notification.min.js +1 -1
  22. package/dist/js/components/parallax.js +257 -264
  23. package/dist/js/components/parallax.min.js +1 -1
  24. package/dist/js/components/slider-parallax.js +215 -257
  25. package/dist/js/components/slider-parallax.min.js +1 -1
  26. package/dist/js/components/slider.js +1 -1
  27. package/dist/js/components/slider.min.js +1 -1
  28. package/dist/js/components/slideshow-parallax.js +215 -257
  29. package/dist/js/components/slideshow-parallax.min.js +1 -1
  30. package/dist/js/components/slideshow.js +1 -1
  31. package/dist/js/components/slideshow.min.js +1 -1
  32. package/dist/js/components/sortable.js +1 -1
  33. package/dist/js/components/sortable.min.js +1 -1
  34. package/dist/js/components/tooltip.js +1 -1
  35. package/dist/js/components/tooltip.min.js +1 -1
  36. package/dist/js/components/upload.js +1 -1
  37. package/dist/js/components/upload.min.js +1 -1
  38. package/dist/js/uikit-core.js +28 -26
  39. package/dist/js/uikit-core.min.js +1 -1
  40. package/dist/js/uikit-icons.js +1 -1
  41. package/dist/js/uikit-icons.min.js +1 -1
  42. package/dist/js/uikit.js +284 -289
  43. package/dist/js/uikit.min.js +1 -1
  44. package/package.json +5 -5
  45. package/src/js/components/parallax.js +38 -8
  46. package/src/js/core/grid.js +2 -2
  47. package/src/js/core/svg.js +9 -7
  48. package/src/js/mixin/parallax.js +209 -242
  49. package/src/js/util/dimensions.js +4 -2
  50. package/src/js/util/viewport.js +9 -13
  51. package/src/less/components/position.less +2 -0
  52. package/src/less/components/sticky.less +6 -0
  53. package/src/scss/components/position.scss +2 -0
  54. package/src/scss/components/sticky.scss +6 -0
  55. package/tests/index.html +1 -1
  56. package/tests/js/index.js +1 -1
  57. package/tests/notification.html +5 -5
  58. package/tests/parallax.html +66 -50
  59. package/tests/sticky-parallax.html +274 -0
  60. package/tests/sticky.html +2 -2
  61. package/tests/tab.html +1 -1
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.10.2-dev.c8aa7eda2 | https://www.getuikit.com | (c) 2014 - 2022 YOOtheme | MIT License */
1
+ /*! UIkit 3.11.1 | https://www.getuikit.com | (c) 2014 - 2022 YOOtheme | MIT License */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('uikit-util')) :
@@ -71,357 +71,315 @@
71
71
  }) )));
72
72
  }
73
73
 
74
- var props = ['x', 'y', 'bgx', 'bgy', 'rotate', 'scale', 'color', 'backgroundColor', 'borderColor', 'opacity', 'blur', 'hue', 'grayscale', 'invert', 'saturate', 'sepia', 'fopacity', 'stroke'];
74
+ var props = {
75
+ x: transformFn,
76
+ y: transformFn,
77
+ rotate: transformFn,
78
+ scale: transformFn,
79
+ color: colorFn,
80
+ backgroundColor: colorFn,
81
+ borderColor: colorFn,
82
+ blur: filterFn,
83
+ hue: filterFn,
84
+ fopacity: filterFn,
85
+ grayscale: filterFn,
86
+ invert: filterFn,
87
+ saturate: filterFn,
88
+ sepia: filterFn,
89
+ opacity: cssPropFn,
90
+ stroke: strokeFn,
91
+ bgx: backgroundFn,
92
+ bgy: backgroundFn
93
+ };
94
+
95
+ var keys = Object.keys;
75
96
 
76
97
  var Parallax = {
77
98
 
78
99
  mixins: [Media],
79
100
 
80
- props: props.reduce(function (props, prop) {
81
- props[prop] = 'list';
82
- return props;
83
- }, {}),
101
+ props: fillObject(keys(props), 'list'),
84
102
 
85
- data: props.reduce(function (data, prop) {
86
- data[prop] = undefined;
87
- return data;
88
- }, {}),
103
+ data: fillObject(keys(props), undefined),
89
104
 
90
105
  computed: {
91
106
 
92
107
  props: function(properties, $el) {
93
108
  var this$1$1 = this;
94
109
 
95
-
96
- return props.reduce(function (props, prop) {
97
-
98
- if (uikitUtil.isUndefined(properties[prop])) {
99
- return props;
110
+ return keys(props).reduce(function (result, prop) {
111
+ if (!uikitUtil.isUndefined(properties[prop])) {
112
+ result[prop] = props[prop].call(this$1$1, prop, $el, properties[prop].slice());
100
113
  }
114
+ return result;
115
+ }, {});
116
+ }
101
117
 
102
- var isColor = prop.match(/color/i);
103
- var isCssProp = isColor || prop === 'opacity';
104
-
105
- var pos, bgPos, diff;
106
- var steps = properties[prop].slice();
107
-
108
- if (isCssProp) {
109
- uikitUtil.css($el, prop, '');
110
- }
111
-
112
- if (steps.length < 2) {
113
- steps.unshift((prop === 'scale'
114
- ? 1
115
- : isCssProp
116
- ? uikitUtil.css($el, prop)
117
- : 0) || 0);
118
- }
119
-
120
- var unit = getUnit(steps);
121
-
122
- if (isColor) {
123
-
124
- var ref = $el.style;
125
- var color = ref.color;
126
- steps = steps.map(function (step) { return parseColor($el, step); });
127
- $el.style.color = color;
128
-
129
- } else if (uikitUtil.startsWith(prop, 'bg')) {
118
+ },
130
119
 
131
- var attr = prop === 'bgy' ? 'height' : 'width';
132
- steps = steps.map(function (step) { return uikitUtil.toPx(step, attr, $el); });
120
+ methods: {
133
121
 
134
- uikitUtil.css($el, ("background-position-" + (prop[2])), '');
135
- bgPos = uikitUtil.css($el, 'backgroundPosition').split(' ')[prop[2] === 'x' ? 0 : 1]; // IE 11 can't read background-position-[x|y]
122
+ reset: function() {
123
+ var this$1$1 = this;
136
124
 
137
- if (this$1$1.covers) {
125
+ uikitUtil.each(this.getCss(0), function (_, prop) { return uikitUtil.css(this$1$1.$el, prop, ''); });
126
+ },
138
127
 
139
- var min = Math.min.apply(Math, steps);
140
- var max = Math.max.apply(Math, steps);
141
- var down = steps.indexOf(min) < steps.indexOf(max);
128
+ getCss: function(percent) {
129
+ var this$1$1 = this;
142
130
 
143
- diff = max - min;
131
+ return keys(this.props).reduce(function (css, prop) {
132
+ this$1$1.props[prop](css, percent);
133
+ return css;
134
+ }, {transform: '', filter: ''});
135
+ }
144
136
 
145
- steps = steps.map(function (step) { return step - (down ? min : max); });
146
- pos = (down ? -diff : 0) + "px";
137
+ }
147
138
 
148
- } else {
139
+ };
149
140
 
150
- pos = bgPos;
141
+ function transformFn(prop, el, steps) {
151
142
 
152
- }
143
+ var unit = getUnit(steps) || {x: 'px', y: 'px', rotate: 'deg'}[prop] || '';
153
144
 
154
- } else {
145
+ if (prop === 'x' || prop === 'y') {
146
+ prop = "translate" + (uikitUtil.ucfirst(prop));
147
+ }
155
148
 
156
- steps = steps.map(uikitUtil.toFloat);
149
+ steps = steps.map(uikitUtil.toFloat);
157
150
 
158
- }
151
+ if (steps.length === 1) {
152
+ steps.unshift(prop === 'scale' ? 1 : 0);
153
+ }
159
154
 
160
- if (prop === 'stroke') {
155
+ return function (css, percent) {
156
+ var value = getValue(steps, percent);
161
157
 
162
- if (!steps.some(function (step) { return step; })) {
163
- return props;
164
- }
158
+ if (uikitUtil.startsWith(prop, 'translate')) {
159
+ value = uikitUtil.toFloat(value).toFixed(unit === 'px' ? 0 : 6);
160
+ }
165
161
 
166
- var length = getMaxPathLength($el);
167
- uikitUtil.css($el, 'strokeDasharray', length);
162
+ css.transform += " " + prop + "(" + value + unit + ")";
163
+ };
164
+ }
168
165
 
169
- if (unit === '%') {
170
- steps = steps.map(function (step) { return step * length / 100; });
171
- }
166
+ function colorFn(prop, el, steps) {
172
167
 
173
- steps = steps.reverse();
168
+ if (steps.length === 1) {
169
+ steps.unshift(getCssValue(el, prop, ''));
170
+ }
174
171
 
175
- prop = 'strokeDashoffset';
176
- }
172
+ steps = steps.map(function (step) { return parseColor(el, step); });
177
173
 
178
- props[prop] = {steps: steps, unit: unit, pos: pos, bgPos: bgPos, diff: diff};
174
+ return function (css, percent) {
179
175
 
180
- return props;
176
+ var ref = getStep(steps, percent);
177
+ var start = ref[0];
178
+ var end = ref[1];
179
+ var p = ref[2];
180
+ var value = start.map(function (value, i) {
181
+ value += p * (end[i] - value);
182
+ return i === 3 ? uikitUtil.toFloat(value) : parseInt(value, 10);
183
+ }).join(',');
184
+ css[prop] = "rgba(" + value + ")";
185
+ };
186
+ }
181
187
 
182
- }, {});
188
+ function parseColor(el, color) {
189
+ return getCssValue(el, 'color', color)
190
+ .split(/[(),]/g)
191
+ .slice(1, -1)
192
+ .concat(1)
193
+ .slice(0, 4)
194
+ .map(uikitUtil.toFloat);
195
+ }
183
196
 
184
- },
197
+ function filterFn(prop, el, steps) {
185
198
 
186
- bgProps: function() {
187
- var this$1$1 = this;
199
+ if (steps.length === 1) {
200
+ steps.unshift(0);
201
+ }
188
202
 
189
- return ['bgx', 'bgy'].filter(function (bg) { return bg in this$1$1.props; });
190
- },
203
+ var unit = getUnit(steps) || {blur: 'px', hue: 'deg'}[prop] || '%';
204
+ prop = {fopacity: 'opacity', hue: 'hue-rotate'}[prop] || prop;
205
+ steps = steps.map(uikitUtil.toFloat);
191
206
 
192
- covers: function(_, $el) {
193
- return covers($el);
194
- }
207
+ return function (css, percent) {
208
+ var value = getValue(steps, percent);
209
+ css.filter += " " + prop + "(" + (value + unit) + ")";
210
+ };
211
+ }
195
212
 
196
- },
213
+ function cssPropFn(prop, el, steps) {
197
214
 
198
- disconnected: function() {
199
- delete this._image;
200
- },
215
+ if (steps.length === 1) {
216
+ steps.unshift(getCssValue(el, prop, ''));
217
+ }
201
218
 
202
- update: {
219
+ steps = steps.map(uikitUtil.toFloat);
203
220
 
204
- read: function(data) {
205
- var this$1$1 = this;
221
+ return function (css, percent) {
222
+ css[prop] = getValue(steps, percent);
223
+ };
224
+ }
206
225
 
226
+ function strokeFn(prop, el, steps) {
207
227
 
208
- if (!this.matchMedia) {
209
- return;
210
- }
228
+ if (steps.length === 1) {
229
+ steps.unshift(0);
230
+ }
211
231
 
212
- if (!data.image && this.covers && this.bgProps.length) {
213
- var src = uikitUtil.css(this.$el, 'backgroundImage').replace(/^none|url\(["']?(.+?)["']?\)$/, '$1');
232
+ var unit = getUnit(steps);
233
+ steps = steps.map(uikitUtil.toFloat);
214
234
 
215
- if (src) {
216
- var img = new Image();
217
- img.src = src;
218
- data.image = img;
235
+ if (!steps.some(function (step) { return step; })) {
236
+ return uikitUtil.noop;
237
+ }
219
238
 
220
- if (!img.naturalWidth) {
221
- img.onload = function () { return this$1$1.$update(); };
222
- }
223
- }
239
+ var length = getMaxPathLength(el);
240
+ uikitUtil.css(el, 'strokeDasharray', length);
224
241
 
225
- }
242
+ if (unit === '%') {
243
+ steps = steps.map(function (step) { return step * length / 100; });
244
+ }
226
245
 
227
- var image = data.image;
246
+ steps = steps.reverse();
228
247
 
229
- if (!image || !image.naturalWidth) {
230
- return;
231
- }
248
+ return function (css, percent) {
249
+ css.strokeDashoffset = getValue(steps, percent);
250
+ };
251
+ }
232
252
 
233
- var dimEl = {
234
- width: this.$el.offsetWidth,
235
- height: this.$el.offsetHeight
236
- };
237
- var dimImage = {
238
- width: image.naturalWidth,
239
- height: image.naturalHeight
240
- };
253
+ function backgroundFn(prop, el, steps) {
241
254
 
242
- var dim = uikitUtil.Dimensions.cover(dimImage, dimEl);
255
+ if (steps.length === 1) {
256
+ steps.unshift(0);
257
+ }
243
258
 
244
- this.bgProps.forEach(function (prop) {
259
+ prop = prop.substr(-1);
260
+ var attr = prop === 'y' ? 'height' : 'width';
261
+ steps = steps.map(function (step) { return uikitUtil.toPx(step, attr, el); });
245
262
 
246
- var ref = this$1$1.props[prop];
247
- var diff = ref.diff;
248
- var bgPos = ref.bgPos;
249
- var steps = ref.steps;
250
- var attr = prop === 'bgy' ? 'height' : 'width';
251
- var span = dim[attr] - dimEl[attr];
263
+ uikitUtil.css(el, ("background-position-" + prop), '');
264
+ var bgPos = uikitUtil.css(el, 'backgroundPosition').split(' ')[prop === 'x' ? 0 : 1]; // IE 11 can't read background-position-[x|y]
252
265
 
253
- if (span < diff) {
254
- dimEl[attr] = dim[attr] + diff - span;
255
- } else if (span > diff) {
266
+ return getCssValue(el, 'backgroundSize', '') === 'cover'
267
+ ? backgroundCoverFn.call(this, prop, el, steps, bgPos, attr)
268
+ : setBackgroundPosFn(prop, steps, bgPos);
269
+ }
256
270
 
257
- var posPercentage = dimEl[attr] / uikitUtil.toPx(bgPos, attr, this$1$1.$el);
271
+ function backgroundCoverFn(prop, el, steps, bgPos, attr) {
258
272
 
259
- if (posPercentage) {
260
- this$1$1.props[prop].steps = steps.map(function (step) { return step - (span - diff) / posPercentage; });
261
- }
262
- }
273
+ var image = getBackgroundImage.call(this, el);
263
274
 
264
- dim = uikitUtil.Dimensions.cover(dimImage, dimEl);
265
- });
275
+ if (!image.naturalWidth) {
276
+ return uikitUtil.noop;
277
+ }
266
278
 
267
- data.dim = dim;
268
- },
279
+ var min = Math.min.apply(Math, steps);
280
+ var max = Math.max.apply(Math, steps);
281
+ var down = steps.indexOf(min) < steps.indexOf(max);
269
282
 
270
- write: function(ref) {
271
- var dim = ref.dim;
283
+ var diff = max - min;
284
+ var pos = (down ? -diff : 0) - (down ? min : max);
272
285
 
286
+ var dimEl = {
287
+ width: el.offsetWidth,
288
+ height: el.offsetHeight
289
+ };
273
290
 
274
- if (!this.matchMedia) {
275
- uikitUtil.css(this.$el, {backgroundSize: '', backgroundRepeat: ''});
276
- return;
277
- }
291
+ var dimImage = {
292
+ width: image.naturalWidth,
293
+ height: image.naturalHeight
294
+ };
278
295
 
279
- dim && uikitUtil.css(this.$el, {
280
- backgroundSize: ((dim.width) + "px " + (dim.height) + "px"),
281
- backgroundRepeat: 'no-repeat'
282
- });
296
+ var baseDim = uikitUtil.Dimensions.cover(dimImage, dimEl);
297
+ var span = baseDim[attr] - dimEl[attr];
283
298
 
284
- },
299
+ if (span < diff) {
300
+ dimEl[attr] = baseDim[attr] + diff - span;
301
+ } else if (span > diff) {
285
302
 
286
- events: ['resize']
303
+ var posPercentage = dimEl[attr] / uikitUtil.toPx(bgPos, attr, el, true);
287
304
 
288
- },
305
+ if (posPercentage) {
306
+ pos -= (span - diff) / posPercentage;
307
+ }
308
+ }
289
309
 
290
- methods: {
310
+ var dim = uikitUtil.Dimensions.cover(dimImage, dimEl);
291
311
 
292
- reset: function() {
293
- var this$1$1 = this;
312
+ var fn = setBackgroundPosFn(prop, steps, (pos + "px"));
313
+ return function (css, percent) {
314
+ fn(css, percent);
315
+ css.backgroundSize = (dim.width) + "px " + (dim.height) + "px";
316
+ css.backgroundRepeat = 'no-repeat';
317
+ };
318
+ }
294
319
 
295
- uikitUtil.each(this.getCss(0), function (_, prop) { return uikitUtil.css(this$1$1.$el, prop, ''); });
296
- },
320
+ function setBackgroundPosFn(prop, steps, pos) {
321
+ return function (css, percent) {
322
+ css[("background-position-" + prop)] = "calc(" + pos + " + " + (getValue(steps, percent)) + "px)";
323
+ };
324
+ }
297
325
 
298
- getCss: function(percent) {
326
+ function getBackgroundImage(el) {
327
+ var this$1$1 = this;
299
328
 
300
- var ref = this;
301
- var props = ref.props;
302
- return Object.keys(props).reduce(function (css, prop) {
303
-
304
- var ref = props[prop];
305
- var steps = ref.steps;
306
- var unit = ref.unit;
307
- var pos = ref.pos;
308
- var value = getValue(steps, percent);
309
-
310
- switch (prop) {
311
-
312
- // transforms
313
- case 'x':
314
- case 'y': {
315
- unit = unit || 'px';
316
- css.transform += " translate" + (uikitUtil.ucfirst(prop)) + "(" + (uikitUtil.toFloat(value).toFixed(unit === 'px' ? 0 : 2)) + unit + ")";
317
- break;
318
- }
319
- case 'rotate':
320
- unit = unit || 'deg';
321
- css.transform += " rotate(" + (value + unit) + ")";
322
- break;
323
- case 'scale':
324
- css.transform += " scale(" + value + ")";
325
- break;
326
-
327
- // bg image
328
- case 'bgy':
329
- case 'bgx':
330
- css[("background-position-" + (prop[2]))] = "calc(" + pos + " + " + value + "px)";
331
- break;
332
-
333
- // color
334
- case 'color':
335
- case 'backgroundColor':
336
- case 'borderColor': {
337
-
338
- var ref$1 = getStep(steps, percent);
339
- var start = ref$1[0];
340
- var end = ref$1[1];
341
- var p = ref$1[2];
342
-
343
- css[prop] = "rgba(" + (start.map(function (value, i) {
344
- value += p * (end[i] - value);
345
- return i === 3 ? uikitUtil.toFloat(value) : parseInt(value, 10);
346
- }).join(',')) + ")";
347
- break;
348
- }
349
- // CSS Filter
350
- case 'blur':
351
- unit = unit || 'px';
352
- css.filter += " blur(" + (value + unit) + ")";
353
- break;
354
- case 'hue':
355
- unit = unit || 'deg';
356
- css.filter += " hue-rotate(" + (value + unit) + ")";
357
- break;
358
- case 'fopacity':
359
- unit = unit || '%';
360
- css.filter += " opacity(" + (value + unit) + ")";
361
- break;
362
- case 'grayscale':
363
- case 'invert':
364
- case 'saturate':
365
- case 'sepia':
366
- unit = unit || '%';
367
- css.filter += " " + prop + "(" + (value + unit) + ")";
368
- break;
369
- default:
370
- css[prop] = value;
371
- }
329
+ var src = uikitUtil.css(el, 'backgroundImage').replace(/^none|url\(["']?(.+?)["']?\)$/, '$1');
372
330
 
373
- return css;
331
+ var data = this._data;
374
332
 
375
- }, {transform: '', filter: ''});
333
+ if (data[src]) {
334
+ return data[src];
335
+ }
376
336
 
337
+ if (src) {
338
+ var img = new Image();
339
+ img.src = src;
340
+ if (!img.naturalWidth) {
341
+ img.onload = function () { return this$1$1.$update(); };
377
342
  }
378
343
 
344
+ return data[src] = img;
379
345
  }
380
-
381
- };
382
-
383
- function parseColor(el, color) {
384
- return uikitUtil.css(uikitUtil.css(el, 'color', color), 'color')
385
- .split(/[(),]/g)
386
- .slice(1, -1)
387
- .concat(1)
388
- .slice(0, 4)
389
- .map(uikitUtil.toFloat);
390
346
  }
391
347
 
392
348
  function getStep(steps, percent) {
393
349
  var count = steps.length - 1;
394
350
  var index = Math.min(Math.floor(count * percent), count - 1);
395
- var step = steps.slice(index, index + 2);
396
-
397
- step.push(percent === 1 ? 1 : percent % (1 / count) * count);
398
351
 
399
- return step;
352
+ return steps
353
+ .slice(index, index + 2)
354
+ .concat(percent === 1 ? 1 : percent % (1 / count) * count);
400
355
  }
401
356
 
402
- function getValue(steps, percent, digits) {
403
- if ( digits === void 0 ) digits = 2;
404
-
357
+ function getValue(steps, percent) {
405
358
  var ref = getStep(steps, percent);
406
359
  var start = ref[0];
407
360
  var end = ref[1];
408
361
  var p = ref[2];
409
- return (uikitUtil.isNumber(start)
362
+ return uikitUtil.isNumber(start)
410
363
  ? start + Math.abs(start - end) * p * (start < end ? 1 : -1)
411
- : +end
412
- ).toFixed(digits);
364
+ : +end;
365
+ }
366
+
367
+ function getUnit(steps, defaultUnit) {
368
+ return steps.reduce(function (unit, step) { return unit || uikitUtil.isString(step) && step.replace(/[\d-]/g, '').trim(); }, '') || defaultUnit;
413
369
  }
414
370
 
415
- function getUnit(steps) {
416
- return steps.reduce(function (unit, step) { return uikitUtil.isString(step) && step.replace(/-|\d/g, '').trim() || unit; }, '');
371
+ function getCssValue(el, prop, value) {
372
+ var prev = el.style[prop];
373
+ var val = uikitUtil.css(uikitUtil.css(el, prop, value), prop);
374
+ el.style[prop] = prev;
375
+ return val;
417
376
  }
418
377
 
419
- function covers(el) {
420
- var ref = el.style;
421
- var backgroundSize = ref.backgroundSize;
422
- var covers = uikitUtil.css(uikitUtil.css(el, 'backgroundSize', ''), 'backgroundSize') === 'cover';
423
- el.style.backgroundSize = backgroundSize;
424
- return covers;
378
+ function fillObject(keys, value) {
379
+ return keys.reduce(function (data, prop) {
380
+ data[prop] = value;
381
+ return data;
382
+ }, {});
425
383
  }
426
384
 
427
385
  var Component = {
@@ -430,14 +388,18 @@
430
388
 
431
389
  props: {
432
390
  target: String,
433
- viewport: Number,
434
- easing: Number
391
+ viewport: Number, // Deprecated
392
+ easing: Number,
393
+ start: String,
394
+ end: String
435
395
  },
436
396
 
437
397
  data: {
438
398
  target: false,
439
399
  viewport: 1,
440
- easing: 1
400
+ easing: 1,
401
+ start: 0,
402
+ end: 0
441
403
  },
442
404
 
443
405
  computed: {
@@ -446,6 +408,22 @@
446
408
  var target = ref.target;
447
409
 
448
410
  return getOffsetElement(target && uikitUtil.query(target, $el) || $el);
411
+ },
412
+
413
+ start: function(ref) {
414
+ var start = ref.start;
415
+
416
+ return parseCalc(start, this.target);
417
+ },
418
+
419
+ end: function(ref) {
420
+ var end = ref.end;
421
+ var viewport = ref.viewport;
422
+
423
+ return parseCalc(
424
+ end || (viewport = (1 - viewport) * 100) && (viewport + "vh+" + viewport + "%"),
425
+ this.target
426
+ );
449
427
  }
450
428
 
451
429
  },
@@ -465,11 +443,11 @@
465
443
  }
466
444
 
467
445
  var prev = percent;
468
- percent = ease(uikitUtil.scrolledOver(this.target) / (this.viewport || 1), this.easing);
446
+ percent = ease(uikitUtil.scrolledOver(this.target, this.start, this.end), this.easing);
469
447
 
470
448
  return {
471
449
  percent: percent,
472
- style: prev !== percent ? this.getCss(percent) : false
450
+ style: prev === percent ? false : this.getCss(percent)
473
451
  };
474
452
  },
475
453
 
@@ -491,8 +469,23 @@
491
469
 
492
470
  };
493
471
 
472
+ var calcRe = /-?\d+(?:\.\d+)?(?:v[wh]|%|px)?/g;
473
+ function parseCalc(calc, el) {
474
+ var match;
475
+ var result = 0;
476
+ calc = calc.toString().replace(/\s/g, '');
477
+ calcRe.lastIndex = 0;
478
+ while ((match = calcRe.exec(calc)) !== null) {
479
+ result += uikitUtil.toPx(match[0], 'height', el, true);
480
+ }
481
+
482
+ return result;
483
+ }
484
+
494
485
  function ease(percent, easing) {
495
- return uikitUtil.clamp(percent * (1 - (easing - easing * percent)));
486
+ return easing >= 0
487
+ ? Math.pow(percent, easing + 1)
488
+ : 1 - Math.pow(1 - percent, -easing + 1);
496
489
  }
497
490
 
498
491
  // SVG elements do not inherit from HTMLElement
@@ -501,7 +494,7 @@
501
494
  ? 'offsetTop' in el
502
495
  ? el
503
496
  : getOffsetElement(uikitUtil.parent(el))
504
- : document.body;
497
+ : document.documentElement;
505
498
  }
506
499
 
507
500
  if (typeof window !== 'undefined' && window.UIkit) {