Mercurial > evolve
view docs/tutorial/uikit.js @ 6032:2800aa3c3dbf
topic: drop the old workaround for detecting amends by amend_source
We don't need to have this workaround because amends are handled differently
now. See previous commits, where the old code for handling amends in topic
extension gets removed.
Various commits now preserve amend_source when going through the _changetopics
function (used when changing a topic via the hg topics command).
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Mon, 30 Aug 2021 12:05:14 +0300 |
parents | aad37ffd7d58 |
children |
line wrap: on
line source
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ (function(core) { if (typeof define == "function" && define.amd) { // AMD define("uikit", function(){ var uikit = window.UIkit || core(window, window.jQuery, window.document); uikit.load = function(res, req, onload, config) { var resources = res.split(','), load = [], i, base = (config.config && config.config.uikit && config.config.uikit.base ? config.config.uikit.base : "").replace(/\/+$/g, ""); if (!base) { throw new Error( "Please define base path to UIkit in the requirejs config." ); } for (i = 0; i < resources.length; i += 1) { var resource = resources[i].replace(/\./g, '/'); load.push(base+'/components/'+resource); } req(load, function() { onload(uikit); }); }; return uikit; }); } if (!window.jQuery) { throw new Error( "UIkit requires jQuery" ); } if (window && window.jQuery) { core(window, window.jQuery, window.document); } })(function(global, $, doc) { "use strict"; var UI = {}, _UI = global.UIkit ? Object.create(global.UIkit) : undefined; UI.version = '2.25.0'; UI.noConflict = function() { // restore UIkit version if (_UI) { global.UIkit = _UI; $.UIkit = _UI; $.fn.uk = _UI.fn; } return UI; }; UI.prefix = function(str) { return str; }; // cache jQuery UI.$ = $; UI.$doc = UI.$(document); UI.$win = UI.$(window); UI.$html = UI.$('html'); UI.support = {}; UI.support.transition = (function() { var transitionEnd = (function() { var element = doc.body || doc.documentElement, transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' }, name; for (name in transEndEventNames) { if (element.style[name] !== undefined) return transEndEventNames[name]; } }()); return transitionEnd && { end: transitionEnd }; })(); UI.support.animation = (function() { var animationEnd = (function() { var element = doc.body || doc.documentElement, animEndEventNames = { WebkitAnimation : 'webkitAnimationEnd', MozAnimation : 'animationend', OAnimation : 'oAnimationEnd oanimationend', animation : 'animationend' }, name; for (name in animEndEventNames) { if (element.style[name] !== undefined) return animEndEventNames[name]; } }()); return animationEnd && { end: animationEnd }; })(); // requestAnimationFrame polyfill //https://github.com/darius/requestAnimationFrame (function() { Date.now = Date.now || function() { return new Date().getTime(); }; var vendors = ['webkit', 'moz']; for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { var vp = vendors[i]; window.requestAnimationFrame = window[vp+'RequestAnimationFrame']; window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame'] || window[vp+'CancelRequestAnimationFrame']); } if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy || !window.requestAnimationFrame || !window.cancelAnimationFrame) { var lastTime = 0; window.requestAnimationFrame = function(callback) { var now = Date.now(); var nextTime = Math.max(lastTime + 16, now); return setTimeout(function() { callback(lastTime = nextTime); }, nextTime - now); }; window.cancelAnimationFrame = clearTimeout; } }()); UI.support.touch = ( ('ontouchstart' in document) || (global.DocumentTouch && document instanceof global.DocumentTouch) || (global.navigator.msPointerEnabled && global.navigator.msMaxTouchPoints > 0) || //IE 10 (global.navigator.pointerEnabled && global.navigator.maxTouchPoints > 0) || //IE >=11 false ); UI.support.mutationobserver = (global.MutationObserver || global.WebKitMutationObserver || null); UI.Utils = {}; UI.Utils.isFullscreen = function() { return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.fullscreenElement || false; }; UI.Utils.str2json = function(str, notevil) { try { if (notevil) { return JSON.parse(str // wrap keys without quote with valid double quote .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":';}) // replacing single quote wrapped ones to double quote .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"';}) ); } else { return (new Function("", "var json = " + str + "; return JSON.parse(JSON.stringify(json));"))(); } } catch(e) { return false; } }; UI.Utils.debounce = function(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; UI.Utils.removeCssRules = function(selectorRegEx) { var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref; if(!selectorRegEx) return; setTimeout(function(){ try { _ref = document.styleSheets; for (_i = 0, _len = _ref.length; _i < _len; _i++) { stylesheet = _ref[_i]; idxs = []; stylesheet.cssRules = stylesheet.cssRules; for (idx = _j = 0, _len1 = stylesheet.cssRules.length; _j < _len1; idx = ++_j) { if (stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && selectorRegEx.test(stylesheet.cssRules[idx].selectorText)) { idxs.unshift(idx); } } for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) { stylesheet.deleteRule(idxs[_k]); } } } catch (_error) {} }, 0); }; UI.Utils.isInView = function(element, options) { var $element = $(element); if (!$element.is(':visible')) { return false; } var window_left = UI.$win.scrollLeft(), window_top = UI.$win.scrollTop(), offset = $element.offset(), left = offset.left, top = offset.top; options = $.extend({topoffset:0, leftoffset:0}, options); if (top + $element.height() >= window_top && top - options.topoffset <= window_top + UI.$win.height() && left + $element.width() >= window_left && left - options.leftoffset <= window_left + UI.$win.width()) { return true; } else { return false; } }; UI.Utils.checkDisplay = function(context, initanimation) { var elements = UI.$('[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', context || document), animated; if (context && !elements.length) { elements = $(context); } elements.trigger('display.uk.check'); // fix firefox / IE animations if (initanimation) { if (typeof(initanimation)!='string') { initanimation = '[class*="uk-animation-"]'; } elements.find(initanimation).each(function(){ var ele = UI.$(this), cls = ele.attr('class'), anim = cls.match(/uk\-animation\-(.+)/); ele.removeClass(anim[0]).width(); ele.addClass(anim[0]); }); } return elements; }; UI.Utils.options = function(string) { if ($.type(string)!='string') return string; if (string.indexOf(':') != -1 && string.trim().substr(-1) != '}') { string = '{'+string+'}'; } var start = (string ? string.indexOf("{") : -1), options = {}; if (start != -1) { try { options = UI.Utils.str2json(string.substr(start)); } catch (e) {} } return options; }; UI.Utils.animate = function(element, cls) { var d = $.Deferred(); element = UI.$(element); element.css('display', 'none').addClass(cls).one(UI.support.animation.end, function() { element.removeClass(cls); d.resolve(); }); element.css('display', ''); return d.promise(); }; UI.Utils.uid = function(prefix) { return (prefix || 'id') + (new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000)); }; UI.Utils.template = function(str, data) { var tokens = str.replace(/\n/g, '\\n').replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, "{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g), i=0, toc, cmd, prop, val, fn, output = [], openblocks = 0; while(i < tokens.length) { toc = tokens[i]; if(toc.match(/\{\{\s*(.+?)\s*\}\}/)) { i = i + 1; toc = tokens[i]; cmd = toc[0]; prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1:0); switch(cmd) { case '~': output.push("for(var $i=0;$i<"+prop+".length;$i++) { var $item = "+prop+"[$i];"); openblocks++; break; case ':': output.push("for(var $key in "+prop+") { var $val = "+prop+"[$key];"); openblocks++; break; case '#': output.push("if("+prop+") {"); openblocks++; break; case '^': output.push("if(!"+prop+") {"); openblocks++; break; case '/': output.push("}"); openblocks--; break; case '!': output.push("__ret.push("+prop+");"); break; default: output.push("__ret.push(escape("+prop+"));"); break; } } else { output.push("__ret.push('"+toc.replace(/\'/g, "\\'")+"');"); } i = i + 1; } fn = new Function('$data', [ 'var __ret = [];', 'try {', 'with($data){', (!openblocks ? output.join('') : '__ret = ["Not all blocks are closed correctly."]'), '};', '}catch(e){__ret = [e.message];}', 'return __ret.join("").replace(/\\n\\n/g, "\\n");', "function escape(html) { return String(html).replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');}" ].join("\n")); return data ? fn(data) : fn; }; UI.Utils.events = {}; UI.Utils.events.click = UI.support.touch ? 'tap' : 'click'; global.UIkit = UI; // deprecated UI.fn = function(command, options) { var args = arguments, cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), component = cmd[1], method = cmd[2]; if (!UI[component]) { $.error("UIkit component [" + component + "] does not exist."); return this; } return this.each(function() { var $this = $(this), data = $this.data(component); if (!data) $this.data(component, (data = UI[component](this, method ? undefined : options))); if (method) data[method].apply(data, Array.prototype.slice.call(args, 1)); }); }; $.UIkit = UI; $.fn.uk = UI.fn; UI.langdirection = UI.$html.attr("dir") == "rtl" ? "right" : "left"; UI.components = {}; UI.component = function(name, def) { var fn = function(element, options) { var $this = this; this.UIkit = UI; this.element = element ? UI.$(element) : null; this.options = $.extend(true, {}, this.defaults, options); this.plugins = {}; if (this.element) { this.element.data(name, this); } this.init(); (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function(plugin) { if (fn.plugins[plugin].init) { fn.plugins[plugin].init($this); $this.plugins[plugin] = true; } }); this.trigger('init.uk.component', [name, this]); return this; }; fn.plugins = {}; $.extend(true, fn.prototype, { defaults : {plugins: []}, boot: function(){}, init: function(){}, on: function(a1,a2,a3){ return UI.$(this.element || this).on(a1,a2,a3); }, one: function(a1,a2,a3){ return UI.$(this.element || this).one(a1,a2,a3); }, off: function(evt){ return UI.$(this.element || this).off(evt); }, trigger: function(evt, params) { return UI.$(this.element || this).trigger(evt, params); }, find: function(selector) { return UI.$(this.element ? this.element: []).find(selector); }, proxy: function(obj, methods) { var $this = this; methods.split(' ').forEach(function(method) { if (!$this[method]) $this[method] = function() { return obj[method].apply(obj, arguments); }; }); }, mixin: function(obj, methods) { var $this = this; methods.split(' ').forEach(function(method) { if (!$this[method]) $this[method] = obj[method].bind($this); }); }, option: function() { if (arguments.length == 1) { return this.options[arguments[0]] || undefined; } else if (arguments.length == 2) { this.options[arguments[0]] = arguments[1]; } } }, def); this.components[name] = fn; this[name] = function() { var element, options; if (arguments.length) { switch(arguments.length) { case 1: if (typeof arguments[0] === "string" || arguments[0].nodeType || arguments[0] instanceof jQuery) { element = $(arguments[0]); } else { options = arguments[0]; } break; case 2: element = $(arguments[0]); options = arguments[1]; break; } } if (element && element.data(name)) { return element.data(name); } return (new UI.components[name](element, options)); }; if (UI.domready) { UI.component.boot(name); } return fn; }; UI.plugin = function(component, name, def) { this.components[component].plugins[name] = def; }; UI.component.boot = function(name) { if (UI.components[name].prototype && UI.components[name].prototype.boot && !UI.components[name].booted) { UI.components[name].prototype.boot.apply(UI, []); UI.components[name].booted = true; } }; UI.component.bootComponents = function() { for (var component in UI.components) { UI.component.boot(component); } }; // DOM mutation save ready helper function UI.domObservers = []; UI.domready = false; UI.ready = function(fn) { UI.domObservers.push(fn); if (UI.domready) { fn(document); } }; UI.on = function(a1,a2,a3){ if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) { a2.apply(UI.$doc); } return UI.$doc.on(a1,a2,a3); }; UI.one = function(a1,a2,a3){ if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) { a2.apply(UI.$doc); return UI.$doc; } return UI.$doc.one(a1,a2,a3); }; UI.trigger = function(evt, params) { return UI.$doc.trigger(evt, params); }; UI.domObserve = function(selector, fn) { if(!UI.support.mutationobserver) return; fn = fn || function() {}; UI.$(selector).each(function() { var element = this, $element = UI.$(element); if ($element.data('observer')) { return; } try { var observer = new UI.support.mutationobserver(UI.Utils.debounce(function(mutations) { fn.apply(element, []); $element.trigger('changed.uk.dom'); }, 50)); // pass in the target node, as well as the observer options observer.observe(element, { childList: true, subtree: true }); $element.data('observer', observer); } catch(e) {} }); }; UI.init = function(root) { root = root || document; UI.domObservers.forEach(function(fn){ fn(root); }); }; UI.on('domready.uk.dom', function(){ UI.init(); if (UI.domready) UI.Utils.checkDisplay(); }); document.addEventListener('DOMContentLoaded', function(){ var domReady = function() { UI.$body = UI.$('body'); UI.ready(function(context){ UI.domObserve('[data-uk-observe]'); }); UI.on('changed.uk.dom', function(e) { UI.init(e.target); UI.Utils.checkDisplay(e.target); }); UI.trigger('beforeready.uk.dom'); UI.component.bootComponents(); // custom scroll observer requestAnimationFrame((function(){ var memory = {dir: {x:0, y:0}, x: window.pageXOffset, y:window.pageYOffset}; var fn = function(){ // reading this (window.page[X|Y]Offset) causes a full page recalc of the layout in Chrome, // so we only want to do this once var wpxo = window.pageXOffset; var wpyo = window.pageYOffset; // Did the scroll position change since the last time we were here? if (memory.x != wpxo || memory.y != wpyo) { // Set the direction of the scroll and store the new position if (wpxo != memory.x) {memory.dir.x = wpxo > memory.x ? 1:-1; } else { memory.dir.x = 0; } if (wpyo != memory.y) {memory.dir.y = wpyo > memory.y ? 1:-1; } else { memory.dir.y = 0; } memory.x = wpxo; memory.y = wpyo; // Trigger the scroll event, this could probably be sent using memory.clone() but this is // more explicit and easier to see exactly what is being sent in the event. UI.$doc.trigger('scrolling.uk.document', [{ "dir": {"x": memory.dir.x, "y": memory.dir.y}, "x": wpxo, "y": wpyo }]); } requestAnimationFrame(fn); }; if (UI.support.touch) { UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn); } if (memory.x || memory.y) fn(); return fn; })()); // run component init functions on dom UI.trigger('domready.uk.dom'); if (UI.support.touch) { // remove css hover rules for touch devices // UI.Utils.removeCssRules(/\.uk-(?!navbar).*:hover/); // viewport unit fix for uk-height-viewport - should be fixed in iOS 8 if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) { UI.$win.on('load orientationchange resize', UI.Utils.debounce((function(){ var fn = function() { $('.uk-height-viewport').css('height', window.innerHeight); return fn; }; return fn(); })(), 100)); } } UI.trigger('afterready.uk.dom'); // mark that domready is left behind UI.domready = true; }; if (document.readyState == 'complete' || document.readyState == 'interactive') { setTimeout(domReady); } return domReady; }()); // add touch identifier class UI.$html.addClass(UI.support.touch ? "uk-touch" : "uk-notouch"); // add uk-hover class on tap to support overlays on touch devices if (UI.support.touch) { var hoverset = false, exclude, hovercls = 'uk-hover', selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover'; UI.$html.on('mouseenter touchstart MSPointerDown pointerdown', selector, function() { if (hoverset) $('.'+hovercls).removeClass(hovercls); hoverset = $(this).addClass(hovercls); }).on('mouseleave touchend MSPointerUp pointerup', function(e) { exclude = $(e.target).parents(selector); if (hoverset) { hoverset.not(exclude).removeClass(hovercls); } }); } return UI; }); // Based on Zeptos touch.js // https://raw.github.com/madrobby/zepto/master/src/touch.js // Zepto.js may be freely distributed under the MIT license. ;(function($){ if ($.fn.swipeLeft) { return; } var touch = {}, touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, longTapDelay = 750, gesture; function swipeDirection(x1, x2, y1, y2) { return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down'); } function longTap() { longTapTimeout = null; if (touch.last) { if ( touch.el !== undefined ) touch.el.trigger('longTap'); touch = {}; } } function cancelLongTap() { if (longTapTimeout) clearTimeout(longTapTimeout); longTapTimeout = null; } function cancelAll() { if (touchTimeout) clearTimeout(touchTimeout); if (tapTimeout) clearTimeout(tapTimeout); if (swipeTimeout) clearTimeout(swipeTimeout); if (longTapTimeout) clearTimeout(longTapTimeout); touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null; touch = {}; } function isPrimaryTouch(event){ return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary; } $(function(){ var now, delta, deltaX = 0, deltaY = 0, firstTouch; if ('MSGesture' in window) { gesture = new MSGesture(); gesture.target = document.body; } $(document) .on('MSGestureEnd gestureend', function(e){ var swipeDirectionFromVelocity = e.originalEvent.velocityX > 1 ? 'Right' : e.originalEvent.velocityX < -1 ? 'Left' : e.originalEvent.velocityY > 1 ? 'Down' : e.originalEvent.velocityY < -1 ? 'Up' : null; if (swipeDirectionFromVelocity && touch.el !== undefined) { touch.el.trigger('swipe'); touch.el.trigger('swipe'+ swipeDirectionFromVelocity); } }) // MSPointerDown: for IE10 // pointerdown: for IE11 .on('touchstart MSPointerDown pointerdown', function(e){ if(e.type == 'MSPointerDown' && !isPrimaryTouch(e.originalEvent)) return; firstTouch = (e.type == 'MSPointerDown' || e.type == 'pointerdown') ? e : e.originalEvent.touches[0]; now = Date.now(); delta = now - (touch.last || now); touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode); if(touchTimeout) clearTimeout(touchTimeout); touch.x1 = firstTouch.pageX; touch.y1 = firstTouch.pageY; if (delta > 0 && delta <= 250) touch.isDoubleTap = true; touch.last = now; longTapTimeout = setTimeout(longTap, longTapDelay); // adds the current touch contact for IE gesture recognition if (gesture && ( e.type == 'MSPointerDown' || e.type == 'pointerdown' || e.type == 'touchstart' ) ) { gesture.addPointer(e.originalEvent.pointerId); } }) // MSPointerMove: for IE10 // pointermove: for IE11 .on('touchmove MSPointerMove pointermove', function(e){ if (e.type == 'MSPointerMove' && !isPrimaryTouch(e.originalEvent)) return; firstTouch = (e.type == 'MSPointerMove' || e.type == 'pointermove') ? e : e.originalEvent.touches[0]; cancelLongTap(); touch.x2 = firstTouch.pageX; touch.y2 = firstTouch.pageY; deltaX += Math.abs(touch.x1 - touch.x2); deltaY += Math.abs(touch.y1 - touch.y2); }) // MSPointerUp: for IE10 // pointerup: for IE11 .on('touchend MSPointerUp pointerup', function(e){ if (e.type == 'MSPointerUp' && !isPrimaryTouch(e.originalEvent)) return; cancelLongTap(); // swipe if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){ swipeTimeout = setTimeout(function() { if ( touch.el !== undefined ) { touch.el.trigger('swipe'); touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2))); } touch = {}; }, 0); // normal tap } else if ('last' in touch) { // don't fire tap when delta position changed by more than 30 pixels, // for instance when moving to a point and back to origin if (isNaN(deltaX) || (deltaX < 30 && deltaY < 30)) { // delay by one tick so we can cancel the 'tap' event if 'scroll' fires // ('tap' fires before 'scroll') tapTimeout = setTimeout(function() { // trigger universal 'tap' with the option to cancelTouch() // (cancelTouch cancels processing of single vs double taps for faster 'tap' response) var event = $.Event('tap'); event.cancelTouch = cancelAll; if ( touch.el !== undefined ) touch.el.trigger(event); // trigger double tap immediately if (touch.isDoubleTap) { if ( touch.el !== undefined ) touch.el.trigger('doubleTap'); touch = {}; } // trigger single tap after 250ms of inactivity else { touchTimeout = setTimeout(function(){ touchTimeout = null; if ( touch.el !== undefined ) touch.el.trigger('singleTap'); touch = {}; }, 250); } }, 0); } else { touch = {}; } deltaX = deltaY = 0; } }) // when the browser window loses focus, // for example when a modal dialog is shown, // cancel all ongoing events .on('touchcancel MSPointerCancel', cancelAll); // scrolling the window indicates intention of the user // to scroll, not tap or swipe, so cancel all ongoing events $(window).on('scroll', cancelAll); }); ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){ $.fn[eventName] = function(callback){ return $(this).on(eventName, callback); }; }); })(jQuery); (function(UI) { "use strict"; var stacks = []; UI.component('stackMargin', { defaults: { cls: 'uk-margin-small-top', rowfirst: false }, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-margin]", context).each(function() { var ele = UI.$(this); if (!ele.data("stackMargin")) { UI.stackMargin(ele, UI.Utils.options(ele.attr("data-uk-margin"))); } }); }); }, init: function() { var $this = this; UI.$win.on('resize orientationchange', (function() { var fn = function() { $this.process(); }; UI.$(function() { fn(); UI.$win.on("load", fn); }); return UI.Utils.debounce(fn, 20); })()); UI.$html.on("changed.uk.dom", function(e) { $this.process(); }); this.on("display.uk.check", function(e) { if (this.element.is(":visible")) this.process(); }.bind(this)); stacks.push(this); }, process: function() { var $this = this, columns = this.element.children(); UI.Utils.stackMargin(columns, this.options); if (!this.options.rowfirst) { return this; } // Mark first column elements var pos_cache = columns.removeClass(this.options.rowfirst).filter(':visible').first().position(); if (pos_cache) { columns.each(function() { UI.$(this)[UI.$(this).position().left == pos_cache.left ? 'addClass':'removeClass']($this.options.rowfirst); }); } return this; } }); // responsive element e.g. iframes (function(){ var elements = [], check = function(ele) { if (!ele.is(':visible')) return; var width = ele.parent().width(), iwidth = ele.data('width'), ratio = (width / iwidth), height = Math.floor(ratio * ele.data('height')); ele.css({'height': (width < iwidth) ? height : ele.data('height')}); }; UI.component('responsiveElement', { defaults: {}, boot: function() { // init code UI.ready(function(context) { UI.$("iframe.uk-responsive-width, [data-uk-responsive]", context).each(function() { var ele = UI.$(this), obj; if (!ele.data("responsiveElement")) { obj = UI.responsiveElement(ele, {}); } }); }); }, init: function() { var ele = this.element; if (ele.attr('width') && ele.attr('height')) { ele.data({ 'width' : ele.attr('width'), 'height': ele.attr('height') }).on('display.uk.check', function(){ check(ele); }); check(ele); elements.push(ele); } } }); UI.$win.on('resize load', UI.Utils.debounce(function(){ elements.forEach(function(ele){ check(ele); }); }, 15)); })(); // helper UI.Utils.stackMargin = function(elements, options) { options = UI.$.extend({ 'cls': 'uk-margin-small-top' }, options); options.cls = options.cls; elements = UI.$(elements).removeClass(options.cls); var skip = false, firstvisible = elements.filter(":visible:first"), offset = firstvisible.length ? (firstvisible.position().top + firstvisible.outerHeight()) - 1 : false; // (-1): weird firefox bug when parent container is display:flex if (offset === false || elements.length == 1) return; elements.each(function() { var column = UI.$(this); if (column.is(":visible")) { if (skip) { column.addClass(options.cls); } else { if (column.position().top >= offset) { skip = column.addClass(options.cls); } } } }); }; UI.Utils.matchHeights = function(elements, options) { elements = UI.$(elements).css('min-height', ''); options = UI.$.extend({ row : true }, options); var matchHeights = function(group){ if (group.length < 2) return; var max = 0; group.each(function() { max = Math.max(max, UI.$(this).outerHeight()); }).each(function() { var element = UI.$(this), height = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height())); element.css('min-height', height + 'px'); }); }; if (options.row) { elements.first().width(); // force redraw setTimeout(function(){ var lastoffset = false, group = []; elements.each(function() { var ele = UI.$(this), offset = ele.offset().top; if (offset != lastoffset && group.length) { matchHeights(UI.$(group)); group = []; offset = ele.offset().top; } group.push(ele); lastoffset = offset; }); if (group.length) { matchHeights(UI.$(group)); } }, 0); } else { matchHeights(elements); } }; (function(cacheSvgs){ UI.Utils.inlineSvg = function(selector, root) { var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){ var img = UI.$(this), src = img.attr('src'); if (!cacheSvgs[src]) { var d = UI.$.Deferred(); UI.$.get(src, {nc: Math.random()}, function(data){ d.resolve(UI.$(data).find('svg')); }); cacheSvgs[src] = d.promise(); } cacheSvgs[src].then(function(svg) { var $svg = UI.$(svg).clone(); if (img.attr('id')) $svg.attr('id', img.attr('id')); if (img.attr('class')) $svg.attr('class', img.attr('class')); if (img.attr('style')) $svg.attr('style', img.attr('style')); if (img.attr('width')) { $svg.attr('width', img.attr('width')); if (!img.attr('height')) $svg.removeAttr('height'); } if (img.attr('height')){ $svg.attr('height', img.attr('height')); if (!img.attr('width')) $svg.removeAttr('width'); } img.replaceWith($svg); }); }); }; // init code UI.ready(function(context) { UI.Utils.inlineSvg('[data-uk-svg]', context); }); })({}); })(UIkit); (function(UI) { "use strict"; UI.component('smoothScroll', { boot: function() { // init code UI.$html.on("click.smooth-scroll.uikit", "[data-uk-smooth-scroll]", function(e) { var ele = UI.$(this); if (!ele.data("smoothScroll")) { var obj = UI.smoothScroll(ele, UI.Utils.options(ele.attr("data-uk-smooth-scroll"))); ele.trigger("click"); } return false; }); }, init: function() { var $this = this; this.on("click", function(e) { e.preventDefault(); scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$("body"), $this.options); }); } }); function scrollToElement(ele, options) { options = UI.$.extend({ duration: 1000, transition: 'easeOutExpo', offset: 0, complete: function(){} }, options); // get / set parameters var target = ele.offset().top - options.offset, docheight = UI.$doc.height(), winheight = window.innerHeight; if ((target + winheight) > docheight) { target = docheight - winheight; } // animate to target, fire callback when done UI.$("html,body").stop().animate({scrollTop: target}, options.duration, options.transition).promise().done(options.complete); } UI.Utils.scrollToElement = scrollToElement; if (!UI.$.easing.easeOutExpo) { UI.$.easing.easeOutExpo = function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; }; } })(UIkit); (function(UI) { "use strict"; var $win = UI.$win, $doc = UI.$doc, scrollspies = [], checkScrollSpy = function() { for(var i=0; i < scrollspies.length; i++) { window.requestAnimationFrame.apply(window, [scrollspies[i].check]); } }; UI.component('scrollspy', { defaults: { "target" : false, "cls" : "uk-scrollspy-inview", "initcls" : "uk-scrollspy-init-inview", "topoffset" : 0, "leftoffset" : 0, "repeat" : false, "delay" : 0 }, boot: function() { // listen to scroll and resize $doc.on("scrolling.uk.document", checkScrollSpy); $win.on("load resize orientationchange", UI.Utils.debounce(checkScrollSpy, 50)); // init code UI.ready(function(context) { UI.$("[data-uk-scrollspy]", context).each(function() { var element = UI.$(this); if (!element.data("scrollspy")) { var obj = UI.scrollspy(element, UI.Utils.options(element.attr("data-uk-scrollspy"))); } }); }); }, init: function() { var $this = this, inviewstate, initinview, togglecls = this.options.cls.split(/,/), fn = function(){ var elements = $this.options.target ? $this.element.find($this.options.target) : $this.element, delayIdx = elements.length === 1 ? 1 : 0, toggleclsIdx = 0; elements.each(function(idx){ var element = UI.$(this), inviewstate = element.data('inviewstate'), inview = UI.Utils.isInView(element, $this.options), toggle = element.data('ukScrollspyCls') || togglecls[toggleclsIdx].trim(); if (inview && !inviewstate && !element.data('scrollspy-idle')) { if (!initinview) { element.addClass($this.options.initcls); $this.offset = element.offset(); initinview = true; element.trigger("init.uk.scrollspy"); } element.data('scrollspy-idle', setTimeout(function(){ element.addClass("uk-scrollspy-inview").toggleClass(toggle).width(); element.trigger("inview.uk.scrollspy"); element.data('scrollspy-idle', false); element.data('inviewstate', true); }, $this.options.delay * delayIdx)); delayIdx++; } if (!inview && inviewstate && $this.options.repeat) { if (element.data('scrollspy-idle')) { clearTimeout(element.data('scrollspy-idle')); element.data('scrollspy-idle', false); } element.removeClass("uk-scrollspy-inview").toggleClass(toggle); element.data('inviewstate', false); element.trigger("outview.uk.scrollspy"); } toggleclsIdx = togglecls[toggleclsIdx + 1] ? (toggleclsIdx + 1) : 0; }); }; fn(); this.check = fn; scrollspies.push(this); } }); var scrollspynavs = [], checkScrollSpyNavs = function() { for(var i=0; i < scrollspynavs.length; i++) { window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]); } }; UI.component('scrollspynav', { defaults: { "cls" : 'uk-active', "closest" : false, "topoffset" : 0, "leftoffset" : 0, "smoothscroll" : false }, boot: function() { // listen to scroll and resize $doc.on("scrolling.uk.document", checkScrollSpyNavs); $win.on("resize orientationchange", UI.Utils.debounce(checkScrollSpyNavs, 50)); // init code UI.ready(function(context) { UI.$("[data-uk-scrollspy-nav]", context).each(function() { var element = UI.$(this); if (!element.data("scrollspynav")) { var obj = UI.scrollspynav(element, UI.Utils.options(element.attr("data-uk-scrollspy-nav"))); } }); }); }, init: function() { var ids = [], links = this.find("a[href^='#']").each(function(){ if(this.getAttribute("href").trim()!=='#') ids.push(this.getAttribute("href")); }), targets = UI.$(ids.join(",")), clsActive = this.options.cls, clsClosest = this.options.closest || this.options.closest; var $this = this, inviews, fn = function(){ inviews = []; for (var i=0 ; i < targets.length ; i++) { if (UI.Utils.isInView(targets.eq(i), $this.options)) { inviews.push(targets.eq(i)); } } if (inviews.length) { var navitems, scrollTop = $win.scrollTop(), target = (function(){ for(var i=0; i< inviews.length;i++){ if(inviews[i].offset().top >= scrollTop){ return inviews[i]; } } })(); if (!target) return; if ($this.options.closest) { links.blur().closest(clsClosest).removeClass(clsActive); navitems = links.filter("a[href='#"+target.attr("id")+"']").closest(clsClosest).addClass(clsActive); } else { navitems = links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive); } $this.element.trigger("inview.uk.scrollspynav", [target, navitems]); } }; if (this.options.smoothscroll && UI.smoothScroll) { links.each(function(){ UI.smoothScroll(this, $this.options.smoothscroll); }); } fn(); this.element.data("scrollspynav", this); this.check = fn; scrollspynavs.push(this); } }); })(UIkit); (function(UI){ "use strict"; var toggles = []; UI.component('toggle', { defaults: { target : false, cls : 'uk-hidden', animation : false, duration : 200 }, boot: function(){ // init code UI.ready(function(context) { UI.$("[data-uk-toggle]", context).each(function() { var ele = UI.$(this); if (!ele.data("toggle")) { var obj = UI.toggle(ele, UI.Utils.options(ele.attr("data-uk-toggle"))); } }); setTimeout(function(){ toggles.forEach(function(toggle){ toggle.getToggles(); }); }, 0); }); }, init: function() { var $this = this; this.aria = (this.options.cls.indexOf('uk-hidden') !== -1); this.getToggles(); this.on("click", function(e) { if ($this.element.is('a[href="#"]')) e.preventDefault(); $this.toggle(); }); toggles.push(this); }, toggle: function() { if(!this.totoggle.length) return; if (this.options.animation && UI.support.animation) { var $this = this, animations = this.options.animation.split(','); if (animations.length == 1) { animations[1] = animations[0]; } animations[0] = animations[0].trim(); animations[1] = animations[1].trim(); this.totoggle.css('animation-duration', this.options.duration+'ms'); this.totoggle.each(function(){ var ele = UI.$(this); if (ele.hasClass($this.options.cls)) { ele.toggleClass($this.options.cls); UI.Utils.animate(ele, animations[0]).then(function(){ ele.css('animation-duration', ''); UI.Utils.checkDisplay(ele); }); } else { UI.Utils.animate(this, animations[1]+' uk-animation-reverse').then(function(){ ele.toggleClass($this.options.cls).css('animation-duration', ''); UI.Utils.checkDisplay(ele); }); } }); } else { this.totoggle.toggleClass(this.options.cls); UI.Utils.checkDisplay(this.totoggle); } this.updateAria(); }, getToggles: function() { this.totoggle = this.options.target ? UI.$(this.options.target):[]; this.updateAria(); }, updateAria: function() { if (this.aria && this.totoggle.length) { this.totoggle.each(function(){ UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden')); }); } } }); })(UIkit); (function(UI) { "use strict"; UI.component('alert', { defaults: { "fade": true, "duration": 200, "trigger": ".uk-alert-close" }, boot: function() { // init code UI.$html.on("click.alert.uikit", "[data-uk-alert]", function(e) { var ele = UI.$(this); if (!ele.data("alert")) { var alert = UI.alert(ele, UI.Utils.options(ele.attr("data-uk-alert"))); if (UI.$(e.target).is(alert.options.trigger)) { e.preventDefault(); alert.close(); } } }); }, init: function() { var $this = this; this.on("click", this.options.trigger, function(e) { e.preventDefault(); $this.close(); }); }, close: function() { var element = this.trigger("close.uk.alert"), removeElement = function () { this.trigger("closed.uk.alert").remove(); }.bind(this); if (this.options.fade) { element.css("overflow", "hidden").css("max-height", element.height()).animate({ "height" : 0, "opacity" : 0, "padding-top" : 0, "padding-bottom" : 0, "margin-top" : 0, "margin-bottom" : 0 }, this.options.duration, removeElement); } else { removeElement(); } } }); })(UIkit); (function(UI) { "use strict"; UI.component('buttonRadio', { defaults: { "activeClass": 'uk-active', "target": ".uk-button" }, boot: function() { // init code UI.$html.on("click.buttonradio.uikit", "[data-uk-button-radio]", function(e) { var ele = UI.$(this); if (!ele.data("buttonRadio")) { var obj = UI.buttonRadio(ele, UI.Utils.options(ele.attr("data-uk-button-radio"))), target = UI.$(e.target); if (target.is(obj.options.target)) { target.trigger("click"); } } }); }, init: function() { var $this = this; // Init ARIA this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true'); this.on("click", this.options.target, function(e) { var ele = UI.$(this); if (ele.is('a[href="#"]')) e.preventDefault(); $this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur(); ele.addClass($this.options.activeClass); // Update ARIA $this.find($this.options.target).not(ele).attr('aria-checked', 'false'); ele.attr('aria-checked', 'true'); $this.trigger("change.uk.button", [ele]); }); }, getSelected: function() { return this.find('.' + this.options.activeClass); } }); UI.component('buttonCheckbox', { defaults: { "activeClass": 'uk-active', "target": ".uk-button" }, boot: function() { UI.$html.on("click.buttoncheckbox.uikit", "[data-uk-button-checkbox]", function(e) { var ele = UI.$(this); if (!ele.data("buttonCheckbox")) { var obj = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr("data-uk-button-checkbox"))), target = UI.$(e.target); if (target.is(obj.options.target)) { target.trigger("click"); } } }); }, init: function() { var $this = this; // Init ARIA this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true'); this.on("click", this.options.target, function(e) { var ele = UI.$(this); if (ele.is('a[href="#"]')) e.preventDefault(); ele.toggleClass($this.options.activeClass).blur(); // Update ARIA ele.attr('aria-checked', ele.hasClass($this.options.activeClass)); $this.trigger("change.uk.button", [ele]); }); }, getSelected: function() { return this.find('.' + this.options.activeClass); } }); UI.component('button', { defaults: {}, boot: function() { UI.$html.on("click.button.uikit", "[data-uk-button]", function(e) { var ele = UI.$(this); if (!ele.data("button")) { var obj = UI.button(ele, UI.Utils.options(ele.attr("data-uk-button"))); ele.trigger("click"); } }); }, init: function() { var $this = this; // Init ARIA this.element.attr('aria-pressed', this.element.hasClass("uk-active")); this.on("click", function(e) { if ($this.element.is('a[href="#"]')) e.preventDefault(); $this.toggle(); $this.trigger("change.uk.button", [$this.element.blur().hasClass("uk-active")]); }); }, toggle: function() { this.element.toggleClass("uk-active"); // Update ARIA this.element.attr('aria-pressed', this.element.hasClass("uk-active")); } }); })(UIkit); (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.$('<div class="uk-dropdown-overlay"></div>').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); (function(UI) { "use strict"; var grids = []; UI.component('gridMatchHeight', { defaults: { "target" : false, "row" : true, "ignorestacked" : false }, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-grid-match]", context).each(function() { var grid = UI.$(this), obj; if (!grid.data("gridMatchHeight")) { obj = UI.gridMatchHeight(grid, UI.Utils.options(grid.attr("data-uk-grid-match"))); } }); }); }, init: function() { var $this = this; this.columns = this.element.children(); this.elements = this.options.target ? this.find(this.options.target) : this.columns; if (!this.columns.length) return; UI.$win.on('load resize orientationchange', (function() { var fn = function() { $this.match(); }; UI.$(function() { fn(); }); return UI.Utils.debounce(fn, 50); })()); UI.$html.on("changed.uk.dom", function(e) { $this.columns = $this.element.children(); $this.elements = $this.options.target ? $this.find($this.options.target) : $this.columns; $this.match(); }); this.on("display.uk.check", function(e) { if(this.element.is(":visible")) this.match(); }.bind(this)); grids.push(this); }, match: function() { var firstvisible = this.columns.filter(":visible:first"); if (!firstvisible.length) return; var stacked = Math.ceil(100 * parseFloat(firstvisible.css('width')) / parseFloat(firstvisible.parent().css('width'))) >= 100; if (stacked && !this.options.ignorestacked) { this.revert(); } else { UI.Utils.matchHeights(this.elements, this.options); } return this; }, revert: function() { this.elements.css('min-height', ''); return this; } }); UI.component('gridMargin', { defaults: { cls : 'uk-grid-margin', rowfirst : 'uk-row-first' }, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-grid-margin]", context).each(function() { var grid = UI.$(this), obj; if (!grid.data("gridMargin")) { obj = UI.gridMargin(grid, UI.Utils.options(grid.attr("data-uk-grid-margin"))); } }); }); }, init: function() { var stackMargin = UI.stackMargin(this.element, this.options); } }); })(UIkit); (function(UI) { "use strict"; var active = false, activeCount = 0, $html = UI.$html, body; UI.component('modal', { defaults: { keyboard: true, bgclose: true, minScrollHeight: 150, center: false, modal: true }, scrollable: false, transition: false, hasTransitioned: true, init: function() { if (!body) body = UI.$('body'); if (!this.element.length) return; var $this = this; this.paddingdir = "padding-" + (UI.langdirection == 'left' ? "right":"left"); this.dialog = this.find(".uk-modal-dialog"); this.active = false; // Update ARIA this.element.attr('aria-hidden', this.element.hasClass("uk-open")); this.on("click", ".uk-modal-close", function(e) { e.preventDefault(); $this.hide(); }).on("click", function(e) { var target = UI.$(e.target); if (target[0] == $this.element[0] && $this.options.bgclose) { $this.hide(); } }); }, toggle: function() { return this[this.isActive() ? "hide" : "show"](); }, show: function() { if (!this.element.length) return; var $this = this; if (this.isActive()) return; if (this.options.modal && active) { active.hide(true); } this.element.removeClass("uk-open").show(); this.resize(); if (this.options.modal) { active = this; } this.active = true; activeCount++; if (UI.support.transition) { this.hasTransitioned = false; this.element.one(UI.support.transition.end, function(){ $this.hasTransitioned = true; }).addClass("uk-open"); } else { this.element.addClass("uk-open"); } $html.addClass("uk-modal-page").height(); // force browser engine redraw // Update ARIA this.element.attr('aria-hidden', 'false'); this.element.trigger("show.uk.modal"); UI.Utils.checkDisplay(this.dialog, true); return this; }, hide: function(force) { if (!force && UI.support.transition && this.hasTransitioned) { var $this = this; this.one(UI.support.transition.end, function() { $this._hide(); }).removeClass("uk-open"); } else { this._hide(); } return this; }, resize: function() { var bodywidth = body.width(); this.scrollbarwidth = window.innerWidth - bodywidth; body.css(this.paddingdir, this.scrollbarwidth); this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto'); if (!this.updateScrollable() && this.options.center) { var dh = this.dialog.outerHeight(), pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10); if ((dh + pad) < window.innerHeight) { this.dialog.css({'top': (window.innerHeight/2 - dh/2) - pad }); } else { this.dialog.css({'top': ''}); } } }, updateScrollable: function() { // has scrollable? var scrollable = this.dialog.find('.uk-overflow-container:visible:first'); if (scrollable.length) { scrollable.css('height', 0); var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)), dh = this.dialog.outerHeight(), wh = window.innerHeight, h = wh - 2*(offset < 20 ? 20:offset) - dh; scrollable.css({ 'max-height': (h < this.options.minScrollHeight ? '':h), 'height':'' }); return true; } return false; }, _hide: function() { this.active = false; if (activeCount > 0) activeCount--; else activeCount = 0; this.element.hide().removeClass('uk-open'); // Update ARIA this.element.attr('aria-hidden', 'true'); if (!activeCount) { $html.removeClass('uk-modal-page'); body.css(this.paddingdir, ""); } if(active===this) active = false; this.trigger('hide.uk.modal'); }, isActive: function() { return this.active; } }); UI.component('modalTrigger', { boot: function() { // init code UI.$html.on("click.modal.uikit", "[data-uk-modal]", function(e) { var ele = UI.$(this); if (ele.is("a")) { e.preventDefault(); } if (!ele.data("modalTrigger")) { var modal = UI.modalTrigger(ele, UI.Utils.options(ele.attr("data-uk-modal"))); modal.show(); } }); // close modal on esc button UI.$html.on('keydown.modal.uikit', function (e) { if (active && e.keyCode === 27 && active.options.keyboard) { // ESC e.preventDefault(); active.hide(); } }); UI.$win.on("resize orientationchange", UI.Utils.debounce(function(){ if (active) active.resize(); }, 150)); }, init: function() { var $this = this; this.options = UI.$.extend({ "target": $this.element.is("a") ? $this.element.attr("href") : false }, this.options); this.modal = UI.modal(this.options.target, this.options); this.on("click", function(e) { e.preventDefault(); $this.show(); }); //methods this.proxy(this.modal, "show hide isActive"); } }); UI.modal.dialog = function(content, options) { var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo("body"), options); modal.on("hide.uk.modal", function(){ if (modal.persist) { modal.persist.appendTo(modal.persist.data("modalPersistParent")); modal.persist = false; } modal.element.remove(); }); setContent(content, modal); return modal; }; UI.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>'; UI.modal.alert = function(content, options) { options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options); var modal = UI.modal.dialog(([ '<div class="uk-margin uk-modal-content">'+String(content)+'</div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">'+options.labels.Ok+'</button></div>' ]).join(""), options); modal.on('show.uk.modal', function(){ setTimeout(function(){ modal.element.find('button:first').focus(); }, 50); }); return modal.show(); }; UI.modal.confirm = function(content, onconfirm, oncancel) { var options = arguments.length > 1 && arguments[arguments.length-1] ? arguments[arguments.length-1] : {}; onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function(){}; oncancel = UI.$.isFunction(oncancel) ? oncancel : function(){}; options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, UI.$.isFunction(options) ? {}:options); var modal = UI.modal.dialog(([ '<div class="uk-margin uk-modal-content">'+String(content)+'</div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-confirm">'+options.labels.Ok+'</button></div>' ]).join(""), options); modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function(){ UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel(); modal.hide(); }); modal.on('show.uk.modal', function(){ setTimeout(function(){ modal.element.find('.js-modal-confirm').focus(); }, 50); }); return modal.show(); }; UI.modal.prompt = function(text, value, onsubmit, options) { onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function(value){}; options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options); var modal = UI.modal.dialog(([ text ? '<div class="uk-modal-content uk-form">'+String(text)+'</div>':'', '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-ok">'+options.labels.Ok+'</button></div>' ]).join(""), options), input = modal.element.find("input[type='text']").val(value || '').on('keyup', function(e){ if (e.keyCode == 13) { modal.element.find(".js-modal-ok").trigger('click'); } }); modal.element.find(".js-modal-ok").on("click", function(){ if (onsubmit(input.val())!==false){ modal.hide(); } }); modal.on('show.uk.modal', function(){ setTimeout(function(){ input.focus(); }, 50); }); return modal.show(); }; UI.modal.blockUI = function(content, options) { var modal = UI.modal.dialog(([ '<div class="uk-margin uk-modal-content">'+String(content || '<div class="uk-text-center">...</div>')+'</div>' ]).join(""), UI.$.extend({bgclose:false, keyboard:false, modal:false}, options)); modal.content = modal.element.find('.uk-modal-content:first'); return modal.show(); }; UI.modal.labels = { 'Ok': 'Ok', 'Cancel': 'Cancel' }; // helper functions function setContent(content, modal){ if(!modal) return; if (typeof content === 'object') { // convert DOM object to a jQuery object content = content instanceof jQuery ? content : UI.$(content); if(content.parent().length) { modal.persist = content; modal.persist.data("modalPersistParent", content.parent()); } }else if (typeof content === 'string' || typeof content === 'number') { // just insert the data as innerHTML content = UI.$('<div></div>').html(content); }else { // unsupported data type! content = UI.$('<div></div>').html('UIkit.modal Error: Unsupported data type: ' + typeof content); } content.appendTo(modal.element.find('.uk-modal-dialog')); return modal; } })(UIkit); (function(UI) { "use strict"; // navigation UI.component('nav', { defaults: { "toggle": ">li.uk-parent > a[href*='#']", "lists": ">li.uk-parent > ul", "multiple": true }, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-nav]", context).each(function() { var nav = UI.$(this); if (!nav.data("nav")) { var obj = UI.nav(nav, UI.Utils.options(nav.attr("data-uk-nav"))); } }); }); }, init: function() { var $this = this; this.on("click.uk.nav", this.options.toggle, function(e) { // e.preventDefault(); var ele = UI.$(this); $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li")); }); this.find(this.options.lists).each(function() { var $ele = UI.$(this), parent = $ele.parent(), active = parent.hasClass("uk-active"); $ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>'); parent.data("list-container", $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden')); // Init ARIA parent.attr('aria-expanded', parent.hasClass("uk-open")); if (active) $this.open(parent, true); }); }, open: function(li, noanimation) { noanimation = true; var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container'); if (!this.options.multiple) { element.children('.uk-open').not(li).each(function() { var ele = UI.$(this); if (ele.data('list-container')) { ele.data('list-container').stop().animate({height: 0}, function() { UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden'); }); } }); } $li.toggleClass('uk-open'); // Update ARIA $li.attr('aria-expanded', $li.hasClass('uk-open')); if ($container) { if ($li.hasClass('uk-open')) { $container.removeClass('uk-hidden'); } if (noanimation) { $container.stop().height($li.hasClass('uk-open') ? 'auto' : 0); if (!$li.hasClass('uk-open')) { $container.addClass('uk-hidden'); } this.trigger('display.uk.check'); } else { $container.stop().animate({ height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0) }, function() { if (!$li.hasClass('uk-open')) { $container.addClass('uk-hidden'); } else { $container.css('height', ''); } $this.trigger('display.uk.check'); }); } } } }); // helper function getHeight(ele) { var $ele = UI.$(ele), height = "auto"; if ($ele.is(":visible")) { height = $ele.outerHeight(); } else { var tmp = { position: $ele.css("position"), visibility: $ele.css("visibility"), display: $ele.css("display") }; height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight(); $ele.css(tmp); // reset element } return height; } })(UIkit); (function(UI) { "use strict"; var scrollpos = {x: window.scrollX, y: window.scrollY}, $win = UI.$win, $doc = UI.$doc, $html = UI.$html, Offcanvas = { show: function(element) { element = UI.$(element); if (!element.length) return; var $body = UI.$('body'), bar = element.find(".uk-offcanvas-bar:first"), rtl = (UI.langdirection == "right"), flip = bar.hasClass("uk-offcanvas-bar-flip") ? -1:1, dir = flip * (rtl ? -1 : 1), scrollbarwidth = window.innerWidth - $body.width(); scrollpos = {x: window.pageXOffset, y: window.pageYOffset}; element.addClass("uk-active"); $body.css({"width": window.innerWidth - scrollbarwidth, "height": window.innerHeight}).addClass("uk-offcanvas-page"); $body.css((rtl ? "margin-right" : "margin-left"), (rtl ? -1 : 1) * (bar.outerWidth() * dir)).width(); // .width() - force redraw $html.css('margin-top', scrollpos.y * -1); bar.addClass("uk-offcanvas-bar-show"); this._initElement(element); bar.trigger('show.uk.offcanvas', [element, bar]); // Update ARIA element.attr('aria-hidden', 'false'); }, hide: function(force) { var $body = UI.$('body'), panel = UI.$(".uk-offcanvas.uk-active"), rtl = (UI.langdirection == "right"), bar = panel.find(".uk-offcanvas-bar:first"), finalize = function() { $body.removeClass("uk-offcanvas-page").css({"width": "", "height": "", "margin-left": "", "margin-right": ""}); panel.removeClass("uk-active"); bar.removeClass("uk-offcanvas-bar-show"); $html.css('margin-top', ''); window.scrollTo(scrollpos.x, scrollpos.y); bar.trigger('hide.uk.offcanvas', [panel, bar]); // Update ARIA panel.attr('aria-hidden', 'true'); }; if (!panel.length) return; if (UI.support.transition && !force) { $body.one(UI.support.transition.end, function() { finalize(); }).css((rtl ? "margin-right" : "margin-left"), ""); setTimeout(function(){ bar.removeClass("uk-offcanvas-bar-show"); }, 0); } else { finalize(); } }, _initElement: function(element) { if (element.data("OffcanvasInit")) return; element.on("click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas", function(e) { var target = UI.$(e.target); if (!e.type.match(/swipe/)) { if (!target.hasClass("uk-offcanvas-close")) { if (target.hasClass("uk-offcanvas-bar")) return; if (target.parents(".uk-offcanvas-bar:first").length) return; } } e.stopImmediatePropagation(); Offcanvas.hide(); }); element.on("click", "a[href*='#']", function(e){ var link = UI.$(this), href = link.attr("href"); if (href == "#") { return; } UI.$doc.one('hide.uk.offcanvas', function() { var target; try { target = UI.$(link[0].hash); } catch (e){ target = ''; } if (!target.length) { target = UI.$('[name="'+link[0].hash.replace('#','')+'"]'); } if (target.length && UI.Utils.scrollToElement) { UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}')); } else { window.location.href = href; } }); Offcanvas.hide(); }); element.data("OffcanvasInit", true); } }; UI.component('offcanvasTrigger', { boot: function() { // init code $html.on("click.offcanvas.uikit", "[data-uk-offcanvas]", function(e) { e.preventDefault(); var ele = UI.$(this); if (!ele.data("offcanvasTrigger")) { var obj = UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr("data-uk-offcanvas"))); ele.trigger("click"); } }); $html.on('keydown.uk.offcanvas', function(e) { if (e.keyCode === 27) { // ESC Offcanvas.hide(); } }); }, init: function() { var $this = this; this.options = UI.$.extend({ "target": $this.element.is("a") ? $this.element.attr("href") : false }, this.options); this.on("click", function(e) { e.preventDefault(); Offcanvas.show($this.options.target); }); } }); UI.offcanvas = Offcanvas; })(UIkit); (function(UI) { "use strict"; var Animations; UI.component('switcher', { defaults: { connect : false, toggle : ">*", active : 0, animation : false, duration : 200, swiping : true }, animating: false, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-switcher]", context).each(function() { var switcher = UI.$(this); if (!switcher.data("switcher")) { var obj = UI.switcher(switcher, UI.Utils.options(switcher.attr("data-uk-switcher"))); } }); }); }, init: function() { var $this = this; this.on("click.uk.switcher", this.options.toggle, function(e) { e.preventDefault(); $this.show(this); }); if (this.options.connect) { this.connect = UI.$(this.options.connect); this.connect.find(".uk-active").removeClass(".uk-active"); // delegate switch commands within container content if (this.connect.length) { // Init ARIA for connect this.connect.children().attr('aria-hidden', 'true'); this.connect.on("click", '[data-uk-switcher-item]', function(e) { e.preventDefault(); var item = UI.$(this).attr('data-uk-switcher-item'); if ($this.index == item) return; switch(item) { case 'next': case 'previous': $this.show($this.index + (item=='next' ? 1:-1)); break; default: $this.show(parseInt(item, 10)); } }); if (this.options.swiping) { this.connect.on('swipeRight swipeLeft', function(e) { e.preventDefault(); if(!window.getSelection().toString()) { $this.show($this.index + (e.type == 'swipeLeft' ? 1 : -1)); } }); } } var toggles = this.find(this.options.toggle), active = toggles.filter(".uk-active"); if (active.length) { this.show(active, false); } else { if (this.options.active===false) return; active = toggles.eq(this.options.active); this.show(active.length ? active : toggles.eq(0), false); } // Init ARIA for toggles toggles.not(active).attr('aria-expanded', 'false'); active.attr('aria-expanded', 'true'); this.on('changed.uk.dom', function() { $this.connect = UI.$($this.options.connect); }); } }, show: function(tab, animate) { if (this.animating) { return; } if (isNaN(tab)) { tab = UI.$(tab); } else { var toggles = this.find(this.options.toggle); tab = tab < 0 ? toggles.length-1 : tab; tab = toggles.eq(toggles[tab] ? tab : 0); } var $this = this, toggles = this.find(this.options.toggle), active = UI.$(tab), animation = Animations[this.options.animation] || function(current, next) { if (!$this.options.animation) { return Animations.none.apply($this); } var anim = $this.options.animation.split(','); if (anim.length == 1) { anim[1] = anim[0]; } anim[0] = anim[0].trim(); anim[1] = anim[1].trim(); return coreAnimation.apply($this, [anim, current, next]); }; if (animate===false || !UI.support.animation) { animation = Animations.none; } if (active.hasClass("uk-disabled")) return; // Update ARIA for Toggles toggles.attr('aria-expanded', 'false'); active.attr('aria-expanded', 'true'); toggles.filter(".uk-active").removeClass("uk-active"); active.addClass("uk-active"); if (this.options.connect && this.connect.length) { this.index = this.find(this.options.toggle).index(active); if (this.index == -1 ) { this.index = 0; } this.connect.each(function() { var container = UI.$(this), children = UI.$(container.children()), current = UI.$(children.filter('.uk-active')), next = UI.$(children.eq($this.index)); $this.animating = true; animation.apply($this, [current, next]).then(function(){ current.removeClass("uk-active"); next.addClass("uk-active"); // Update ARIA for connect current.attr('aria-hidden', 'true'); next.attr('aria-hidden', 'false'); UI.Utils.checkDisplay(next, true); $this.animating = false; }); }); } this.trigger("show.uk.switcher", [active]); } }); 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 (current && current.index() > next.index()) { anim.reverse(); } return coreAnimation.apply(this, [anim, current, next]); }, 'slide-left': function(current, next) { return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]); }, 'slide-right': function(current, next) { return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]); }, 'slide-horizontal': function(current, next, dir) { var anim = ['uk-animation-slide-right', 'uk-animation-slide-left']; if (current && current.index() > next.index()) { anim.reverse(); } return coreAnimation.apply(this, [anim, current, next]); }, 'scale': function(current, next) { return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]); } }; UI.switcher.animations = Animations; // helpers function coreAnimation(cls, current, next) { var d = UI.$.Deferred(), clsIn = cls, clsOut = cls, release; if (next[0]===current[0]) { d.resolve(); return d.promise(); } if (typeof(cls) == 'object') { clsIn = cls[0]; clsOut = cls[1] || cls[0]; } UI.$body.css('overflow-x', 'hidden'); // fix scroll jumping in iOS release = function() { if (current) current.hide().removeClass('uk-active '+clsOut+' uk-animation-reverse'); next.addClass(clsIn).one(UI.support.animation.end, function() { next.removeClass(''+clsIn+'').css({opacity:'', display:''}); d.resolve(); UI.$body.css('overflow-x', ''); if (current) current.css({opacity:'', display:''}); }.bind(this)).show(); }; next.css('animation-duration', this.options.duration+'ms'); if (current && current.length) { current.css('animation-duration', this.options.duration+'ms'); current.css('display', 'none').addClass(clsOut+' uk-animation-reverse').one(UI.support.animation.end, function() { release(); }.bind(this)).css('display', ''); } else { next.addClass('uk-active'); release(); } return d.promise(); } })(UIkit); (function(UI) { "use strict"; UI.component('tab', { defaults: { 'target' : '>li:not(.uk-tab-responsive, .uk-disabled)', 'connect' : false, 'active' : 0, 'animation' : false, 'duration' : 200, 'swiping' : true }, boot: function() { // init code UI.ready(function(context) { UI.$("[data-uk-tab]", context).each(function() { var tab = UI.$(this); if (!tab.data("tab")) { var obj = UI.tab(tab, UI.Utils.options(tab.attr("data-uk-tab"))); } }); }); }, init: function() { var $this = this; this.current = false; this.on("click.uk.tab", this.options.target, function(e) { e.preventDefault(); if ($this.switcher && $this.switcher.animating) { return; } var current = $this.find($this.options.target).not(this); current.removeClass("uk-active").blur(); $this.trigger("change.uk.tab", [UI.$(this).addClass("uk-active"), $this.current]); $this.current = UI.$(this); // Update ARIA if (!$this.options.connect) { current.attr('aria-expanded', 'false'); UI.$(this).attr('aria-expanded', 'true'); } }); if (this.options.connect) { this.connect = UI.$(this.options.connect); } // init responsive tab this.responsivetab = UI.$('<li class="uk-tab-responsive uk-active"><a></a></li>').append('<div class="uk-dropdown uk-dropdown-small"><ul class="uk-nav uk-nav-dropdown"></ul><div>'); this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown'); this.responsivetab.lst = this.responsivetab.dropdown.find('ul'); this.responsivetab.caption = this.responsivetab.find('a:first'); if (this.element.hasClass("uk-tab-bottom")) this.responsivetab.dropdown.addClass("uk-dropdown-up"); // handle click this.responsivetab.lst.on('click.uk.tab', 'a', function(e) { e.preventDefault(); e.stopPropagation(); var link = UI.$(this); $this.element.children('li:not(.uk-tab-responsive)').eq(link.data('index')).trigger('click'); }); this.on('show.uk.switcher change.uk.tab', function(e, tab) { $this.responsivetab.caption.html(tab.text()); }); this.element.append(this.responsivetab); // init UIkit components if (this.options.connect) { this.switcher = UI.switcher(this.element, { 'toggle' : '>li:not(.uk-tab-responsive)', 'connect' : this.options.connect, 'active' : this.options.active, 'animation' : this.options.animation, 'duration' : this.options.duration, 'swiping' : this.options.swiping }); } UI.dropdown(this.responsivetab, {"mode": "click", "preventflip": "y"}); // init $this.trigger("change.uk.tab", [this.element.find(this.options.target).not('.uk-tab-responsive').filter('.uk-active')]); this.check(); UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){ if ($this.element.is(":visible")) $this.check(); }, 100)); this.on('display.uk.check', function(){ if ($this.element.is(":visible")) $this.check(); }); }, check: function() { var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden'); if (!children.length) { this.responsivetab.addClass('uk-hidden'); return; } var top = (children.eq(0).offset().top + Math.ceil(children.eq(0).height()/2)), doresponsive = false, item, link, clone; this.responsivetab.lst.empty(); children.each(function(){ if (UI.$(this).offset().top > top) { doresponsive = true; } }); if (doresponsive) { for (var i = 0; i < children.length; i++) { item = UI.$(children.eq(i)); link = item.find('a'); if (item.css('float') != 'none' && !item.attr('uk-dropdown')) { if (!item.hasClass('uk-disabled')) { clone = item[0].outerHTML.replace('<a ', '<a data-index="'+i+'" '); this.responsivetab.lst.append(clone); } item.addClass('uk-hidden'); } } } this.responsivetab[this.responsivetab.lst.children('li').length ? 'removeClass':'addClass']('uk-hidden'); } }); })(UIkit); (function(UI){ "use strict"; UI.component('cover', { defaults: { automute : true }, boot: function() { // auto init UI.ready(function(context) { UI.$("[data-uk-cover]", context).each(function(){ var ele = UI.$(this); if(!ele.data("cover")) { var plugin = UI.cover(ele, UI.Utils.options(ele.attr("data-uk-cover"))); } }); }); }, init: function() { this.parent = this.element.parent(); UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(){ this.check(); }.bind(this), 100)); this.on("display.uk.check", function(e) { if(this.element.is(":visible")) this.check(); }.bind(this)); this.check(); if (this.element.is('iframe') && this.options.automute) { var src = this.element.attr('src'); this.element.attr('src', '').on('load', function(){ this.contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', '*'); }).attr('src', [src, (src.indexOf('?') > -1 ? '&':'?'), 'enablejsapi=1&api=1'].join('')); } }, check: function() { this.element.css({ 'width' : '', 'height' : '' }); this.dimension = {w: this.element.width(), h: this.element.height()}; if (this.element.attr('width') && !isNaN(this.element.attr('width'))) { this.dimension.w = this.element.attr('width'); } if (this.element.attr('height') && !isNaN(this.element.attr('height'))) { this.dimension.h = this.element.attr('height'); } this.ratio = this.dimension.w / this.dimension.h; var w = this.parent.width(), h = this.parent.height(), width, height; // if element height < parent height (gap underneath) if ((w / this.ratio) < h) { width = Math.ceil(h * this.ratio); height = h; // element width < parent width (gap to right) } else { width = w; height = Math.ceil(w / this.ratio); } this.element.css({ 'width' : width, 'height' : height }); } }); })(UIkit);