diff options
Diffstat (limited to 'uikit/static/js/components/slideset.js')
-rw-r--r-- | uikit/static/js/components/slideset.js | 503 |
1 files changed, 503 insertions, 0 deletions
diff --git a/uikit/static/js/components/slideset.js b/uikit/static/js/components/slideset.js new file mode 100644 index 0000000..b6693d7 --- /dev/null +++ b/uikit/static/js/components/slideset.js @@ -0,0 +1,503 @@ +/*! UIkit 2.21.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ +(function(addon) { + + var component; + + if (window.UIkit) { + component = addon(UIkit); + } + + if (typeof define == "function" && define.amd) { + define("uikit-slideset", ["uikit"], function(){ + return component || addon(UIkit); + }); + } + +})(function(UI){ + + "use strict"; + + var Animations; + + UI.component('slideset', { + + defaults: { + default : 1, + animation : 'fade', + duration : 200, + filter : '', + delay : false, + controls : false, + autoplay : false, + autoplayInterval : 7000, + pauseOnHover : true + }, + + sets: [], + + boot: function() { + + // auto init + UI.ready(function(context) { + + UI.$("[data-uk-slideset]", context).each(function(){ + + var ele = UI.$(this); + + if(!ele.data("slideset")) { + var plugin = UI.slideset(ele, UI.Utils.options(ele.attr("data-uk-slideset"))); + } + }); + }); + }, + + init: function() { + + var $this = this; + + this.activeSet = false; + this.list = this.element.find('.uk-slideset'); + this.nav = this.element.find('.uk-slideset-nav'); + this.controls = this.options.controls ? UI.$(this.options.controls) : this.element; + + UI.$win.on("resize load", UI.Utils.debounce(function() { + $this.updateSets(); + }, 100)); + + $this.list.addClass('uk-grid-width-1-'+$this.options.default); + + ['xlarge', 'large', 'medium', 'small'].forEach(function(bp) { + + if (!$this.options[bp]) { + return; + } + + $this.list.addClass('uk-grid-width-'+bp+'-1-'+$this.options[bp]); + }); + + this.on("click.uikit.slideset", '[data-uk-slideset-item]', function(e) { + + e.preventDefault(); + + if ($this.animating) { + return; + } + + var set = UI.$(this).attr('data-uk-slideset-item'); + + if ($this.activeSet === set) return; + + switch(set) { + case 'next': + case 'previous': + $this[set=='next' ? 'next':'previous'](); + break; + default: + $this.show(parseInt(set, 10)); + } + + }); + + this.controls.on('click.uikit.slideset', '[data-uk-filter]', function(e) { + + var ele = UI.$(this); + + if (ele.parent().hasClass('uk-slideset')) { + return; + } + + e.preventDefault(); + + if ($this.animating || $this.currentFilter == ele.attr('data-uk-filter')) { + return; + } + + $this.updateFilter(ele.attr('data-uk-filter')); + + $this._hide().then(function(){ + + $this.updateSets(true, true); + }); + }); + + this.on('swipeRight swipeLeft', function(e) { + $this[e.type=='swipeLeft' ? 'next' : 'previous'](); + }); + + this.updateFilter(this.options.filter); + this.updateSets(); + + this.element.on({ + mouseenter: function() { if ($this.options.pauseOnHover) $this.hovering = true; }, + mouseleave: function() { $this.hovering = false; } + }); + + // Set autoplay + if (this.options.autoplay) { + this.start(); + } + }, + + updateSets: function(animate, force) { + + var $this = this, visible = this.visible, i; + + this.visible = this.getVisibleOnCurrenBreakpoint(); + + if (visible == this.visible && !force) { + return; + } + + this.children = this.list.children().hide(); + this.items = this.getItems(); + this.sets = array_chunk(this.items, this.visible); + + for (i=0;i<this.sets.length;i++) { + this.sets[i].css({'display': 'none'}); + } + + // update nav + if (this.nav.length && this.nav.empty()) { + + for (i=0;i<this.sets.length;i++) { + this.nav.append('<li data-uk-slideset-item="'+i+'"><a></a></li>'); + } + + this.nav[this.nav.children().length==1 ? 'addClass':'removeClass']('uk-invisible'); + } + + this.activeSet = false; + this.show(0, !animate); + }, + + updateFilter: function(currentfilter) { + + var $this = this, filter; + + this.currentFilter = currentfilter; + + this.controls.find('[data-uk-filter]').each(function(){ + + filter = UI.$(this); + + if (!filter.parent().hasClass('uk-slideset')) { + + if (filter.attr('data-uk-filter') == $this.currentFilter) { + filter.addClass('uk-active'); + } else { + filter.removeClass('uk-active'); + } + } + }); + }, + + getVisibleOnCurrenBreakpoint: function() { + + var breakpoint = null, + tmp = UI.$('<div style="position:absolute;height:1px;top:-1000px;width:100px"><div></div></div>').appendTo('body'), + testdiv = tmp.children().eq(0), + breakpoints = this.options; + + ['xlarge', 'large', 'medium', 'small'].forEach(function(bp) { + + if (!breakpoints[bp] || breakpoint) { + return; + } + + tmp.attr('class', 'uk-grid-width-'+bp+'-1-2').width(); + + if (testdiv.width() == 50) { + breakpoint = bp; + } + }); + + tmp.remove(); + + return this.options[breakpoint] || this.options['default']; + }, + + getItems: function() { + + var items = [], filter; + + if (this.currentFilter) { + + filter = this.currentFilter || []; + + if (typeof(filter) === 'string') { + filter = filter.split(/,/).map(function(item){ return item.trim(); }); + } + + this.children.each(function(index){ + + var ele = UI.$(this), f = ele.attr('data-uk-filter'), infilter = filter.length ? false : true; + + if (f) { + + f = f.split(/,/).map(function(item){ return item.trim(); }); + + filter.forEach(function(item){ + if (f.indexOf(item) > -1) infilter = true; + }); + } + + if(infilter) items.push(ele[0]); + }); + + items = UI.$(items); + + } else { + items = this.list.children(); + } + + return items; + }, + + show: function(setIndex, noanimate, dir) { + + var $this = this; + + if (this.activeSet === setIndex || this.animating) { + return; + } + + dir = dir || (setIndex < this.activeSet ? -1:1); + + var current = this.sets[this.activeSet] || [], + next = this.sets[setIndex], + animation = this._getAnimation(); + + if (noanimate || !UI.support.animation) { + animation = Animations.none; + } + + this.animating = true; + + if (this.nav.length) { + this.nav.children().removeClass('uk-active').eq(setIndex).addClass('uk-active'); + } + + animation.apply($this, [current, next, dir]).then(function(){ + + UI.Utils.checkDisplay(next, true); + + $this.children.hide().removeClass('uk-active'); + next.addClass('uk-active').css({'display': '', 'opacity':''}); + + $this.animating = false; + $this.activeSet = setIndex; + + UI.Utils.checkDisplay(next, true); + + $this.trigger('show.uk.slideset', [next]); + }); + + }, + + _getAnimation: function() { + + var $this = this, + animation = Animations[this.options.animation] || Animations.none; + + if (!UI.support.animation) { + animation = Animations.none; + } + + return animation; + }, + + _hide: function() { + + var $this = this, + current = this.sets[this.activeSet] || [], + animation = this._getAnimation(); + + this.animating = true; + + return animation.apply($this, [current, [], 1]).then(function(){ + $this.animating = false; + }); + }, + + next: function() { + this.show(this.sets[this.activeSet + 1] ? (this.activeSet + 1) : 0, false, 1); + }, + + previous: function() { + this.show(this.sets[this.activeSet - 1] ? (this.activeSet - 1) : (this.sets.length - 1), false, -1); + }, + + start: function() { + + this.stop(); + + var $this = this; + + this.interval = setInterval(function() { + if (!$this.hovering && !$this.animating) $this.next(); + }, this.options.autoplayInterval); + + }, + + stop: function() { + if (this.interval) clearInterval(this.interval); + } + }); + + Animations = { + + 'none': function() { + var d = UI.$.Deferred(); + d.resolve(); + return d.promise(); + }, + + 'fade': function(current, next) { + return coreAnimation.apply(this, ['uk-animation-fade', current, next]); + }, + + 'slide-bottom': function(current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]); + }, + + 'slide-top': function(current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]); + }, + + 'slide-vertical': function(current, next, dir) { + + var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom']; + + if (dir == -1) { + anim.reverse(); + } + + return coreAnimation.apply(this, [anim, current, next]); + }, + + 'slide-horizontal': function(current, next, dir) { + + var anim = ['uk-animation-slide-right', 'uk-animation-slide-left']; + + if (dir == -1) { + anim.reverse(); + } + + return coreAnimation.apply(this, [anim, current, next, dir]); + }, + + 'scale': function(current, next) { + return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]); + } + }; + + UI.slideset.animations = Animations; + + // helpers + + function coreAnimation(cls, current, next, dir) { + + var d = UI.$.Deferred(), + delay = (this.options.delay === false) ? Math.floor(this.options.duration/2) : this.options.delay, + $this = this, clsIn, clsOut, release, i; + + dir = dir || 1; + + this.element.css('min-height', this.element.height()); + + if (next[0]===current[0]) { + d.resolve(); + return d.promise(); + } + + if (typeof(cls) == 'object') { + clsIn = cls[0]; + clsOut = cls[1] || cls[0]; + } else { + clsIn = cls; + clsOut = clsIn; + } + + release = function() { + + if (current && current.length) { + current.hide().removeClass(clsOut+' uk-animation-reverse').css({'opacity':'', 'animation-delay': '', 'animation':''}); + } + + if (!next.length) { + d.resolve(); + return; + } + + for (i=0;i<next.length;i++) { + next.eq(dir == 1 ? i:(next.length - i)-1).css('animation-delay', (i*delay)+'ms'); + } + + next.addClass(clsIn)[dir==1 ? 'last':'first']().one(UI.support.animation.end, function() { + + next.removeClass(''+clsIn+'').css({opacity:'', display:'', 'animation-delay':'', 'animation':''}); + d.resolve(); + $this.element.css('min-height', ''); + + }).end().css('display', ''); + }; + + if (next.length) { + next.css('animation-duration', this.options.duration+'ms'); + } + + if (current && current.length) { + + current.css('animation-duration', this.options.duration+'ms')[dir==1 ? 'last':'first']().one(UI.support.animation.end, function() { + release(); + }); + + for (i=0;i<current.length;i++) { + + (function (index, ele){ + + setTimeout(function(){ + ele.css('display', 'none').css('display', '').css('opacity', 0).addClass(clsOut+' uk-animation-reverse'); + }.bind(this), i * delay); + + })(i, current.eq(dir == 1 ? i:(current.length - i)-1)); + } + + } else { + release(); + } + + return d.promise(); + } + + function array_chunk(input, size) { + + var x, i = 0, c = -1, l = input.length || 0, n = []; + + if (size < 1) return null; + + while (i < l) { + + x = i % size; + + if(x) { + n[c][x] = input[i]; + } else { + n[++c] = [input[i]]; + } + + i++; + } + + i = 0; + l = n.length; + + while (i < l) { + n[i] = jQuery(n[i]); + i++; + } + + return n; + } + +}); |