From c94fb32c7a3c28b18a27460aa2447eeec1fac1de Mon Sep 17 00:00:00 2001 From: Pascal Szewczyk Date: Mon, 18 Jul 2016 23:23:54 +0200 Subject: uikit added --- js/core/dropdown.js | 525 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 525 insertions(+) create mode 100755 js/core/dropdown.js (limited to 'js/core/dropdown.js') diff --git a/js/core/dropdown.js b/js/core/dropdown.js new file mode 100755 index 0000000..1fa7035 --- /dev/null +++ b/js/core/dropdown.js @@ -0,0 +1,525 @@ +/*! UIkit 2.26.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ +(function(UI) { + + "use strict"; + + var active = false, hoverIdle, flips = { + 'x': { + "bottom-left" : 'bottom-right', + "bottom-right" : 'bottom-left', + "bottom-center" : 'bottom-center', + "top-left" : 'top-right', + "top-right" : 'top-left', + "top-center" : 'top-center', + "left-top" : 'right-top', + "left-bottom" : 'right-bottom', + "left-center" : 'right-center', + "right-top" : 'left-top', + "right-bottom" : 'left-bottom', + "right-center" : 'left-center' + }, + 'y': { + "bottom-left" : 'top-left', + "bottom-right" : 'top-right', + "bottom-center" : 'top-center', + "top-left" : 'bottom-left', + "top-right" : 'bottom-right', + "top-center" : 'bottom-center', + "left-top" : 'left-bottom', + "left-bottom" : 'left-top', + "left-center" : 'left-center', + "right-top" : 'right-bottom', + "right-bottom" : 'right-top', + "right-center" : 'right-center' + }, + 'xy': { + "bottom-left" : 'top-right', + "bottom-right" : 'top-left', + "bottom-center" : 'top-center', + "top-left" : 'bottom-right', + "top-right" : 'bottom-left', + "top-center" : 'bottom-center', + "left-top" : 'right-bottom', + "left-bottom" : 'right-top', + "left-center" : 'right-center', + "right-top" : 'left-bottom', + "right-bottom" : 'left-top', + "right-center" : 'left-center' + } + }; + + UI.component('dropdown', { + + defaults: { + 'mode' : 'hover', + 'pos' : 'bottom-left', + 'offset' : 0, + 'remaintime' : 800, + 'justify' : false, + 'boundary' : UI.$win, + 'delay' : 0, + 'dropdownSelector': '.uk-dropdown,.uk-dropdown-blank', + 'hoverDelayIdle' : 250, + 'preventflip' : false + }, + + remainIdle: false, + + boot: function() { + + var triggerevent = UI.support.touch ? "click" : "mouseenter"; + + // init code + UI.$html.on(triggerevent+".dropdown.uikit", "[data-uk-dropdown]", function(e) { + + var ele = UI.$(this); + + if (!ele.data("dropdown")) { + + var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr("data-uk-dropdown"))); + + if (triggerevent=="click" || (triggerevent=="mouseenter" && dropdown.options.mode=="hover")) { + dropdown.element.trigger(triggerevent); + } + + if (dropdown.element.find(dropdown.options.dropdownSelector).length) { + e.preventDefault(); + } + } + }); + }, + + init: function() { + + var $this = this; + + this.dropdown = this.find(this.options.dropdownSelector); + this.offsetParent = this.dropdown.parents().filter(function() { + return UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) !== -1; + }).slice(0,1); + + this.centered = this.dropdown.hasClass('uk-dropdown-center'); + this.justified = this.options.justify ? UI.$(this.options.justify) : false; + + this.boundary = UI.$(this.options.boundary); + + if (!this.boundary.length) { + this.boundary = UI.$win; + } + + // legacy DEPRECATED! + if (this.dropdown.hasClass('uk-dropdown-up')) { + this.options.pos = 'top-left'; + } + if (this.dropdown.hasClass('uk-dropdown-flip')) { + this.options.pos = this.options.pos.replace('left','right'); + } + if (this.dropdown.hasClass('uk-dropdown-center')) { + this.options.pos = this.options.pos.replace(/(left|right)/,'center'); + } + //-- end legacy + + // Init ARIA + this.element.attr('aria-haspopup', 'true'); + this.element.attr('aria-expanded', this.element.hasClass("uk-open")); + + if (this.options.mode == "click" || UI.support.touch) { + + this.on("click.uk.dropdown", function(e) { + + var $target = UI.$(e.target); + + if (!$target.parents($this.options.dropdownSelector).length) { + + if ($target.is("a[href='#']") || $target.parent().is("a[href='#']") || ($this.dropdown.length && !$this.dropdown.is(":visible")) ){ + e.preventDefault(); + } + + $target.blur(); + } + + if (!$this.element.hasClass('uk-open')) { + + $this.show(); + + } else { + + if (!$this.dropdown.find(e.target).length || $target.is(".uk-dropdown-close") || $target.parents(".uk-dropdown-close").length) { + $this.hide(); + } + } + }); + + } else { + + this.on("mouseenter", function(e) { + + $this.trigger('pointerenter.uk.dropdown', [$this]); + + if ($this.remainIdle) { + clearTimeout($this.remainIdle); + } + + if (hoverIdle) { + clearTimeout(hoverIdle); + } + + if (active && active == $this) { + return; + } + + // pseudo manuAim + if (active && active != $this) { + + hoverIdle = setTimeout(function() { + hoverIdle = setTimeout($this.show.bind($this), $this.options.delay); + }, $this.options.hoverDelayIdle); + + } else { + + hoverIdle = setTimeout($this.show.bind($this), $this.options.delay); + } + + }).on("mouseleave", function() { + + if (hoverIdle) { + clearTimeout(hoverIdle); + } + + $this.remainIdle = setTimeout(function() { + if (active && active == $this) $this.hide(); + }, $this.options.remaintime); + + $this.trigger('pointerleave.uk.dropdown', [$this]); + + }).on("click", function(e){ + + var $target = UI.$(e.target); + + if ($this.remainIdle) { + clearTimeout($this.remainIdle); + } + + if (active && active == $this) { + if (!$this.dropdown.find(e.target).length || $target.is(".uk-dropdown-close") || $target.parents(".uk-dropdown-close").length) { + $this.hide(); + } + return; + } + + if ($target.is("a[href='#']") || $target.parent().is("a[href='#']")){ + e.preventDefault(); + } + + $this.show(); + }); + } + }, + + show: function(){ + + UI.$html.off("click.outer.dropdown"); + + if (active && active != this) { + active.hide(true); + } + + if (hoverIdle) { + clearTimeout(hoverIdle); + } + + this.trigger('beforeshow.uk.dropdown', [this]); + + this.checkDimensions(); + this.element.addClass('uk-open'); + + // Update ARIA + this.element.attr('aria-expanded', 'true'); + + this.trigger('show.uk.dropdown', [this]); + + UI.Utils.checkDisplay(this.dropdown, true); + active = this; + + this.registerOuterClick(); + }, + + hide: function(force) { + + this.trigger('beforehide.uk.dropdown', [this, force]); + + this.element.removeClass('uk-open'); + + if (this.remainIdle) { + clearTimeout(this.remainIdle); + } + + this.remainIdle = false; + + // Update ARIA + this.element.attr('aria-expanded', 'false'); + + this.trigger('hide.uk.dropdown', [this, force]); + + if (active == this) active = false; + }, + + registerOuterClick: function(){ + + var $this = this; + + UI.$html.off("click.outer.dropdown"); + + setTimeout(function() { + + UI.$html.on("click.outer.dropdown", function(e) { + + if (hoverIdle) { + clearTimeout(hoverIdle); + } + + var $target = UI.$(e.target); + + if (active == $this && !$this.element.find(e.target).length) { + $this.hide(true); + UI.$html.off("click.outer.dropdown"); + } + }); + }, 10); + }, + + checkDimensions: function() { + + if (!this.dropdown.length) return; + + // reset + this.dropdown.removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack').css({ + 'top-left':'', + 'left':'', + 'margin-left' :'', + 'margin-right':'' + }); + + if (this.justified && this.justified.length) { + this.dropdown.css("min-width", ""); + } + + var $this = this, + pos = UI.$.extend({}, this.offsetParent.offset(), {width: this.offsetParent[0].offsetWidth, height: this.offsetParent[0].offsetHeight}), + posoffset = this.options.offset, + dropdown = this.dropdown, + offset = dropdown.show().offset() || {left: 0, top: 0}, + width = dropdown.outerWidth(), + height = dropdown.outerHeight(), + boundarywidth = this.boundary.width(), + boundaryoffset = this.boundary[0] !== window && this.boundary.offset() ? this.boundary.offset(): {top:0, left:0}, + dpos = this.options.pos; + + var variants = { + "bottom-left" : {top: 0 + pos.height + posoffset, left: 0}, + "bottom-right" : {top: 0 + pos.height + posoffset, left: 0 + pos.width - width}, + "bottom-center" : {top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2}, + "top-left" : {top: 0 - height - posoffset, left: 0}, + "top-right" : {top: 0 - height - posoffset, left: 0 + pos.width - width}, + "top-center" : {top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2}, + "left-top" : {top: 0, left: 0 - width - posoffset}, + "left-bottom" : {top: 0 + pos.height - height, left: 0 - width - posoffset}, + "left-center" : {top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset}, + "right-top" : {top: 0, left: 0 + pos.width + posoffset}, + "right-bottom" : {top: 0 + pos.height - height, left: 0 + pos.width + posoffset}, + "right-center" : {top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset} + }, + css = {}, + pp; + + pp = dpos.split('-'); + css = variants[dpos] ? variants[dpos] : variants['bottom-left']; + + // justify dropdown + if (this.justified && this.justified.length) { + justify(dropdown.css({left:0}), this.justified, boundarywidth); + } else { + + if (this.options.preventflip !== true) { + + var fdpos; + + switch(this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) { + case "x": + if(this.options.preventflip !=='x') fdpos = flips['x'][dpos] || 'right-top'; + break; + case "y": + if(this.options.preventflip !=='y') fdpos = flips['y'][dpos] || 'top-left'; + break; + case "xy": + if(!this.options.preventflip) fdpos = flips['xy'][dpos] || 'right-bottom'; + break; + } + + if (fdpos) { + + pp = fdpos.split('-'); + css = variants[fdpos] ? variants[fdpos] : variants['bottom-left']; + + // check flipped + if (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) { + pp = dpos.split('-'); + css = variants[dpos] ? variants[dpos] : variants['bottom-left']; + } + } + } + } + + if (width > boundarywidth) { + dropdown.addClass("uk-dropdown-stack"); + this.trigger('stack.uk.dropdown', [this]); + } + + dropdown.css(css).css("display", "").addClass('uk-dropdown-'+pp[0]); + }, + + checkBoundary: function(left, top, width, height, boundarywidth) { + + var axis = ""; + + if (left < 0 || ((left - UI.$win.scrollLeft())+width) > boundarywidth) { + axis += "x"; + } + + if ((top - UI.$win.scrollTop()) < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) { + axis += "y"; + } + + return axis; + } + }); + + + UI.component('dropdownOverlay', { + + defaults: { + 'justify' : false, + 'cls' : '', + 'duration': 200 + }, + + boot: function() { + + // init code + UI.ready(function(context) { + + UI.$("[data-uk-dropdown-overlay]", context).each(function() { + var ele = UI.$(this); + + if (!ele.data("dropdownOverlay")) { + UI.dropdownOverlay(ele, UI.Utils.options(ele.attr("data-uk-dropdown-overlay"))); + } + }); + }); + }, + + init: function() { + + var $this = this; + + this.justified = this.options.justify ? UI.$(this.options.justify) : false; + this.overlay = this.element.find('uk-dropdown-overlay'); + + if (!this.overlay.length) { + this.overlay = UI.$('
').appendTo(this.element); + } + + this.overlay.addClass(this.options.cls); + + this.on({ + + 'beforeshow.uk.dropdown': function(e, dropdown) { + $this.dropdown = dropdown; + + if ($this.justified && $this.justified.length) { + justify($this.overlay.css({'display':'block', 'margin-left':'','margin-right':''}), $this.justified, $this.justified.outerWidth()); + } + }, + + 'show.uk.dropdown': function(e, dropdown) { + + var h = $this.dropdown.dropdown.outerHeight(true); + + $this.dropdown.element.removeClass('uk-open'); + + $this.overlay.stop().css('display', 'block').animate({height: h}, $this.options.duration, function() { + + $this.dropdown.dropdown.css('visibility', ''); + $this.dropdown.element.addClass('uk-open'); + + UI.Utils.checkDisplay($this.dropdown.dropdown, true); + }); + + $this.pointerleave = false; + }, + + 'hide.uk.dropdown': function() { + $this.overlay.stop().animate({height: 0}, $this.options.duration); + }, + + 'pointerenter.uk.dropdown': function(e, dropdown) { + clearTimeout($this.remainIdle); + }, + + 'pointerleave.uk.dropdown': function(e, dropdown) { + $this.pointerleave = true; + } + }); + + + this.overlay.on({ + + 'mouseenter': function() { + if ($this.remainIdle) { + clearTimeout($this.dropdown.remainIdle); + clearTimeout($this.remainIdle); + } + }, + + 'mouseleave': function(){ + + if ($this.pointerleave && active) { + + $this.remainIdle = setTimeout(function() { + if(active) active.hide(); + }, active.options.remaintime); + } + } + }) + } + + }); + + + function justify(ele, justifyTo, boundarywidth, offset) { + + ele = UI.$(ele); + justifyTo = UI.$(justifyTo); + boundarywidth = boundarywidth || window.innerWidth; + offset = offset || ele.offset(); + + if (justifyTo.length) { + + var jwidth = justifyTo.outerWidth(); + + ele.css("min-width", jwidth); + + if (UI.langdirection == 'right') { + + var right1 = boundarywidth - (justifyTo.offset().left + jwidth), + right2 = boundarywidth - (ele.offset().left + ele.outerWidth()); + + ele.css("margin-right", right1 - right2); + + } else { + ele.css("margin-left", justifyTo.offset().left - offset.left); + } + } + } + +})(UIkit); -- cgit v1.2.3