From 010a769b1973a0695e1eb373878b56cb4e73144c Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Thu, 26 May 2016 05:20:26 +1000 Subject: [PATCH] Create centered loader with text Continuity styling updates --- .../assets/css/dashboard/dashboard.css | 57 - modules/backend/assets/css/october.css | 2 +- .../images/dashboard-loading-indicator.svg | 13 - .../assets/less/dashboard/dashboard.less | 53 - .../backend/assets/less/layout/layout.less | 5 +- modules/backend/controllers/index/index.htm | 3 +- .../assets/js/reportcontainer.js | 20 +- .../assets/vendor/isotope/jquery.isotope.js | 1408 +++++++++++++++++ .../vendor/isotope/jquery.isotope.min.js | 6 +- modules/system/assets/ui/docs/loader.md | 13 +- modules/system/assets/ui/less/checkbox.less | 2 +- modules/system/assets/ui/less/loader.less | 2 +- modules/system/assets/ui/storm.css | 4 +- 13 files changed, 1442 insertions(+), 146 deletions(-) delete mode 100644 modules/backend/assets/images/dashboard-loading-indicator.svg create mode 100644 modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js diff --git a/modules/backend/assets/css/dashboard/dashboard.css b/modules/backend/assets/css/dashboard/dashboard.css index c09524d57..2fb878cea 100644 --- a/modules/backend/assets/css/dashboard/dashboard.css +++ b/modules/backend/assets/css/dashboard/dashboard.css @@ -1,13 +1,7 @@ -.dashboard-container > .report-container { - -webkit-transition: background 1s ease; - transition: background 1s ease; - border-radius: 5px; -} .dashboard-container > .report-container.loading { position: absolute; width: 100%; height: 100%; - background: #fff; } .dashboard-container > .report-container.loading .loading-indicator-container { position: absolute; @@ -16,54 +10,3 @@ width: 100%; height: 100%; } -.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator { - background: transparent; - padding: 0; - height: 150px; - top: 50%; - margin-top: -90px; -} -.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator:after { - content: ''; - background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat; - background-size: 100px 100px; - width: 100px; - height: 100px; - left: 50%; - top: 50%; - margin-top: -50px; - margin-left: -50px; - position: absolute; - -webkit-animation: spin 1s linear infinite; - animation: spin 1s linear infinite; -} -.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator:before { - content: ''; - background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat; - background-size: 150px 150px; - width: 150px; - height: 150px; - left: 50%; - top: 50%; - margin-top: -75px; - margin-left: -75px; - position: absolute; - /*.animation(rspin 1.5s linear infinite);*/ - -webkit-animation: spin 1.5s linear infinite; - animation: spin 1.5s linear infinite; - opacity: 0.9; - filter: alpha(opacity=90); -} -.dashboard-container > .report-container.loading .loading-indicator-container .loading-indicator > span { - left: 50%; - width: 200px; - height: 200px; - margin-left: -100px; - margin-top: -100px; - background-size: 200px 200px; - background-image: url('../../images/dashboard-loading-indicator.svg'); - -webkit-animation: spin 2s linear infinite; - animation: spin 2s linear infinite; - opacity: 0.8; - filter: alpha(opacity=80); -} diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css index 5cddda36c..478fc8fb2 100644 --- a/modules/backend/assets/css/october.css +++ b/modules/backend/assets/css/october.css @@ -585,7 +585,7 @@ body.dragging,body.dragging *{cursor:move !important} body.loading,body.loading *{cursor:wait !important} body.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default !important} html,body{height:100%; } -body{webkit-font-smoothing:antialiased;font-family:sans-serif;background:#f9f9f9} +body{font-family:sans-serif;background:#f9f9f9;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} #layout-canvas{min-height:100%;height:100%} .control-tabs.primary-tabs > ul.nav-tabs,.control-tabs.primary-tabs > div > ul.nav-tabs,.control-tabs.primary-tabs > div > div > ul.nav-tabs{margin-left:-20px;margin-right:-20px} .control-tabs.primary-tabs.tabs-no-inset > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > ul.nav-tabs,.control-tabs.primary-tabs.tabs-no-inset > div > div > ul.nav-tabs{margin-left:0;margin-right:0} diff --git a/modules/backend/assets/images/dashboard-loading-indicator.svg b/modules/backend/assets/images/dashboard-loading-indicator.svg deleted file mode 100644 index 0a1715647..000000000 --- a/modules/backend/assets/images/dashboard-loading-indicator.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - dashboard-loading-indicator - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/modules/backend/assets/less/dashboard/dashboard.less b/modules/backend/assets/less/dashboard/dashboard.less index 4df8dd1c5..8b3088596 100644 --- a/modules/backend/assets/less/dashboard/dashboard.less +++ b/modules/backend/assets/less/dashboard/dashboard.less @@ -1,14 +1,10 @@ @import "../../../../backend/assets/less/core/boot.less"; .dashboard-container > .report-container { - .transition(background 1s ease); - .border-radius(5px); - &.loading { position: absolute; width: 100%; height: 100%; - background: #fff; .loading-indicator-container { position: absolute; @@ -16,55 +12,6 @@ top: 0; width: 100%; height: 100%; - - .loading-indicator { - background: transparent; - padding: 0; - height: 150px; - top: 50%; - margin-top: -90px; - - &:after { - content: ''; - background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat; - background-size: 100px 100px; - width: 100px; - height: 100px; - left: 50%; - top: 50%; - margin-top: -50px; - margin-left: -50px; - position: absolute; - .animation(spin 1s linear infinite); - } - - &:before { - content: ''; - background: transparent url('../../images/dashboard-loading-indicator.svg') no-repeat; - background-size: 150px 150px; - width: 150px; - height: 150px; - left: 50%; - top: 50%; - margin-top: -75px; - margin-left: -75px; - position: absolute; - .animation(spin 1.5s linear infinite); - .opacity(.9); - } - - > span { - left: 50%; - width: 200px; - height: 200px; - margin-left: -100px; - margin-top: -100px; - background-size: 200px 200px; - background-image: url('../../images/dashboard-loading-indicator.svg'); - .animation(spin 2s linear infinite); - .opacity(.8); - } - } } } } diff --git a/modules/backend/assets/less/layout/layout.less b/modules/backend/assets/less/layout/layout.less index b35a3aba1..a386db67e 100644 --- a/modules/backend/assets/less/layout/layout.less +++ b/modules/backend/assets/less/layout/layout.less @@ -33,9 +33,10 @@ body { } body { - webkit-font-smoothing: antialiased; font-family: @font-family-base; background: @body-bg; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } #layout-canvas { @@ -53,8 +54,6 @@ body { // // body { // font-family: 'Noto Sans', sans-serif; -// -webkit-font-smoothing: antialiased; -// -moz-osx-font-smoothing: grayscale; // } // diff --git a/modules/backend/controllers/index/index.htm b/modules/backend/controllers/index/index.htm index 41d1b0433..68c213b47 100644 --- a/modules/backend/controllers/index/index.htm +++ b/modules/backend/controllers/index/index.htm @@ -5,8 +5,9 @@
-
+
+
Loading...
diff --git a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js index 63f144ec5..9f32e7616 100644 --- a/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js +++ b/modules/backend/widgets/reportcontainer/assets/js/reportcontainer.js @@ -78,16 +78,18 @@ }) this.$el.on('click', '.content > button.close', function() { - if (!confirm('Remove the widget?')) - return false + var $btn = $(this) + $.oc.confirm('Remove this widget?', function() { + self.$form.request(self.alias + '::onRemoveWidget', { + data: { + 'alias': $('[data-widget-alias]', $btn.closest('div.content')).val() + } + }) - self.$form.request(self.alias + '::onRemoveWidget', {data: { - 'alias': $('[data-widget-alias]', $(this).closest('div.content')).val() - }}) - - $(this).closest('li').remove() - self.redraw() - self.setSortOrders() + $btn.closest('li').remove() + self.redraw() + self.setSortOrders() + }) }) $(window).on('oc.report-widget-added', function(){ diff --git a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js new file mode 100644 index 000000000..902973b5a --- /dev/null +++ b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.js @@ -0,0 +1,1408 @@ +/** + * Isotope v1.5.26 + * An exquisite jQuery plugin for magical layouts + * http://isotope.metafizzy.co + * + * Commercial use requires one-time purchase of a commercial license + * http://isotope.metafizzy.co/docs/license.html + * + * Non-commercial use is licensed under the MIT License + * + * Copyright 2014 Metafizzy + */ + +/*jshint asi: true, browser: true, curly: true, eqeqeq: true, forin: false, immed: false, newcap: true, noempty: true, strict: true, undef: true */ +/*global jQuery: false */ + +(function( window, $, undefined ){ + + 'use strict'; + + // get global vars + var document = window.document; + var docElem = document.documentElement; + var Modernizr = window.Modernizr; + + // helper function + var capitalize = function( str ) { + return str.charAt(0).toUpperCase() + str.slice(1); + }; + + // ========================= getStyleProperty by kangax =============================== + // http://perfectionkills.com/feature-testing-css-properties/ + + var prefixes = 'Moz Webkit O Ms'.split(' '); + + var getStyleProperty = function( propName ) { + var style = docElem.style, + prefixed; + + // test standard property first + if ( typeof style[propName] === 'string' ) { + return propName; + } + + // capitalize + propName = capitalize( propName ); + + // test vendor specific properties + for ( var i=0, len = prefixes.length; i < len; i++ ) { + prefixed = prefixes[i] + propName; + if ( typeof style[ prefixed ] === 'string' ) { + return prefixed; + } + } + }; + + var transformProp = getStyleProperty('transform'), + transitionProp = getStyleProperty('transitionProperty'); + + + // ========================= miniModernizr =============================== + // <3<3<3 and thanks to Faruk and Paul for doing the heavy lifting + + /*! + * Modernizr v1.6ish: miniModernizr for Isotope + * http://www.modernizr.com + * + * Developed by: + * - Faruk Ates http://farukat.es/ + * - Paul Irish http://paulirish.com/ + * + * Copyright (c) 2009-2010 + * Dual-licensed under the BSD or MIT licenses. + * http://www.modernizr.com/license/ + */ + + /* + * This version whittles down the script just to check support for + * CSS transitions, transforms, and 3D transforms. + */ + + var tests = { + csstransforms: function() { + return !!transformProp; + }, + + csstransforms3d: function() { + var test = !!getStyleProperty('perspective'); + // double check for Chrome's false positive + if ( test && 'webkitPerspective' in docElem.style ) { + var $style = $('').appendTo('head'), + $div = $('
').appendTo('html'); + + test = $div.height() === 3; + + $div.remove(); + $style.remove(); + } + return test; + }, + + csstransitions: function() { + return !!transitionProp; + } + }; + + var testName; + + if ( Modernizr ) { + // if there's a previous Modernzir, check if there are necessary tests + for ( testName in tests) { + if ( !Modernizr.hasOwnProperty( testName ) ) { + // if test hasn't been run, use addTest to run it + Modernizr.addTest( testName, tests[ testName ] ); + } + } + } else { + // or create new mini Modernizr that just has the 3 tests + Modernizr = window.Modernizr = { + _version : '1.6ish: miniModernizr for Isotope' + }; + + var classes = ' '; + var result; + + // Run through tests + for ( testName in tests) { + result = tests[ testName ](); + Modernizr[ testName ] = result; + classes += ' ' + ( result ? '' : 'no-' ) + testName; + } + + // Add the new classes to the element. + $('html').addClass( classes ); + } + + + // ========================= isoTransform =============================== + + /** + * provides hooks for .css({ scale: value, translate: [x, y] }) + * Progressively enhanced CSS transforms + * Uses hardware accelerated 3D transforms for Safari + * or falls back to 2D transforms. + */ + + if ( Modernizr.csstransforms ) { + + // i.e. transformFnNotations.scale(0.5) >> 'scale3d( 0.5, 0.5, 1)' + var transformFnNotations = Modernizr.csstransforms3d ? + { // 3D transform functions + translate : function ( position ) { + return 'translate3d(' + position[0] + 'px, ' + position[1] + 'px, 0) '; + }, + scale : function ( scale ) { + return 'scale3d(' + scale + ', ' + scale + ', 1) '; + } + } : + { // 2D transform functions + translate : function ( position ) { + return 'translate(' + position[0] + 'px, ' + position[1] + 'px) '; + }, + scale : function ( scale ) { + return 'scale(' + scale + ') '; + } + } + ; + + var setIsoTransform = function ( elem, name, value ) { + // unpack current transform data + var data = $.data( elem, 'isoTransform' ) || {}, + newData = {}, + fnName, + transformObj = {}, + transformValue; + + // i.e. newData.scale = 0.5 + newData[ name ] = value; + // extend new value over current data + $.extend( data, newData ); + + for ( fnName in data ) { + transformValue = data[ fnName ]; + transformObj[ fnName ] = transformFnNotations[ fnName ]( transformValue ); + } + + // get proper order + // ideally, we could loop through this give an array, but since we only have + // a couple transforms we're keeping track of, we'll do it like so + var translateFn = transformObj.translate || '', + scaleFn = transformObj.scale || '', + // sorting so translate always comes first + valueFns = translateFn + scaleFn; + + // set data back in elem + $.data( elem, 'isoTransform', data ); + + // set name to vendor specific property + elem.style[ transformProp ] = valueFns; + }; + + // ==================== scale =================== + + $.cssNumber.scale = true; + + $.cssHooks.scale = { + set: function( elem, value ) { + // uncomment this bit if you want to properly parse strings + // if ( typeof value === 'string' ) { + // value = parseFloat( value ); + // } + setIsoTransform( elem, 'scale', value ); + }, + get: function( elem, computed ) { + var transform = $.data( elem, 'isoTransform' ); + return transform && transform.scale ? transform.scale : 1; + } + }; + + $.fx.step.scale = function( fx ) { + $.cssHooks.scale.set( fx.elem, fx.now+fx.unit ); + }; + + + // ==================== translate =================== + + $.cssNumber.translate = true; + + $.cssHooks.translate = { + set: function( elem, value ) { + + // uncomment this bit if you want to properly parse strings + // if ( typeof value === 'string' ) { + // value = value.split(' '); + // } + // + // var i, val; + // for ( i = 0; i < 2; i++ ) { + // val = value[i]; + // if ( typeof val === 'string' ) { + // val = parseInt( val ); + // } + // } + + setIsoTransform( elem, 'translate', value ); + }, + + get: function( elem, computed ) { + var transform = $.data( elem, 'isoTransform' ); + return transform && transform.translate ? transform.translate : [ 0, 0 ]; + } + }; + + } + + // ========================= get transition-end event =============================== + var transitionEndEvent, transitionDurProp; + + if ( Modernizr.csstransitions ) { + transitionEndEvent = { + WebkitTransitionProperty: 'webkitTransitionEnd', // webkit + MozTransitionProperty: 'transitionend', + OTransitionProperty: 'oTransitionEnd otransitionend', + transitionProperty: 'transitionend' + }[ transitionProp ]; + + transitionDurProp = getStyleProperty('transitionDuration'); + } + + // ========================= smartresize =============================== + + /* + * smartresize: debounced resize event for jQuery + * + * latest version and complete README available on Github: + * https://github.com/louisremi/jquery.smartresize.js + * + * Copyright 2011 @louis_remi + * Licensed under the MIT license. + */ + + var $event = $.event, + dispatchMethod = $.event.handle ? 'handle' : 'dispatch', + resizeTimeout; + + $event.special.smartresize = { + setup: function() { + $(this).bind( "resize", $event.special.smartresize.handler ); + }, + teardown: function() { + $(this).unbind( "resize", $event.special.smartresize.handler ); + }, + handler: function( event, execAsap ) { + // Save the context + var context = this, + args = arguments; + + // set correct event type + event.type = "smartresize"; + + if ( resizeTimeout ) { clearTimeout( resizeTimeout ); } + resizeTimeout = setTimeout(function() { + $event[ dispatchMethod ].apply( context, args ); + }, execAsap === "execAsap"? 0 : 100 ); + } + }; + + $.fn.smartresize = function( fn ) { + return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] ); + }; + + + +// ========================= Isotope =============================== + + + // our "Widget" object constructor + $.Isotope = function( options, element, callback ){ + this.element = $( element ); + + this._create( options ); + this._init( callback ); + }; + + // styles of container element we want to keep track of + var isoContainerStyles = [ 'width', 'height' ]; + + var $window = $(window); + + $.Isotope.settings = { + resizable: true, + layoutMode : 'masonry', + containerClass : 'isotope', + itemClass : 'isotope-item', + hiddenClass : 'isotope-hidden', + hiddenStyle: { opacity: 0, scale: 0.001 }, + visibleStyle: { opacity: 1, scale: 1 }, + containerStyle: { + position: 'relative', + overflow: 'hidden' + }, + animationEngine: 'best-available', + animationOptions: { + queue: false, + duration: 800 + }, + sortBy : 'original-order', + sortAscending : true, + resizesContainer : true, + transformsEnabled: true, + itemPositionDataEnabled: false + }; + + $.Isotope.prototype = { + + // sets up widget + _create : function( options ) { + + this.options = $.extend( {}, $.Isotope.settings, options ); + + this.styleQueue = []; + this.elemCount = 0; + + // get original styles in case we re-apply them in .destroy() + var elemStyle = this.element[0].style; + this.originalStyle = {}; + // keep track of container styles + var containerStyles = isoContainerStyles.slice(0); + for ( var prop in this.options.containerStyle ) { + containerStyles.push( prop ); + } + for ( var i=0, len = containerStyles.length; i < len; i++ ) { + prop = containerStyles[i]; + this.originalStyle[ prop ] = elemStyle[ prop ] || ''; + } + // apply container style from options + this.element.css( this.options.containerStyle ); + + this._updateAnimationEngine(); + this._updateUsingTransforms(); + + // sorting + var originalOrderSorter = { + 'original-order' : function( $elem, instance ) { + instance.elemCount ++; + return instance.elemCount; + }, + random : function() { + return Math.random(); + } + }; + + this.options.getSortData = $.extend( this.options.getSortData, originalOrderSorter ); + + // need to get atoms + this.reloadItems(); + + // get top left position of where the bricks should be + this.offset = { + left: parseInt( ( this.element.css('padding-left') || 0 ), 10 ), + top: parseInt( ( this.element.css('padding-top') || 0 ), 10 ) + }; + + // add isotope class first time around + var instance = this; + setTimeout( function() { + instance.element.addClass( instance.options.containerClass ); + }, 0 ); + + // bind resize method + if ( this.options.resizable ) { + $window.bind( 'smartresize.isotope', function() { + instance.resize(); + }); + } + + // dismiss all click events from hidden events + this.element.delegate( '.' + this.options.hiddenClass, 'click', function(){ + return false; + }); + + }, + + _getAtoms : function( $elems ) { + var selector = this.options.itemSelector, + // filter & find + $atoms = selector ? $elems.filter( selector ).add( $elems.find( selector ) ) : $elems, + // base style for atoms + atomStyle = { position: 'absolute' }; + + // filter out text nodes + $atoms = $atoms.filter( function( i, atom ) { + return atom.nodeType === 1; + }); + + if ( this.usingTransforms ) { + atomStyle.left = 0; + atomStyle.top = 0; + } + + $atoms.css( atomStyle ).addClass( this.options.itemClass ); + + this.updateSortData( $atoms, true ); + + return $atoms; + }, + + // _init fires when your instance is first created + // (from the constructor above), and when you + // attempt to initialize the widget again (by the bridge) + // after it has already been initialized. + _init : function( callback ) { + + this.$filteredAtoms = this._filter( this.$allAtoms ); + this._sort(); + this.reLayout( callback ); + + }, + + option : function( opts ){ + // change options AFTER initialization: + // signature: $('#foo').bar({ cool:false }); + if ( $.isPlainObject( opts ) ){ + this.options = $.extend( true, this.options, opts ); + + // trigger _updateOptionName if it exists + var updateOptionFn; + for ( var optionName in opts ) { + updateOptionFn = '_update' + capitalize( optionName ); + if ( this[ updateOptionFn ] ) { + this[ updateOptionFn ](); + } + } + } + }, + + // ====================== updaters ====================== // + // kind of like setters + + _updateAnimationEngine : function() { + var animationEngine = this.options.animationEngine.toLowerCase().replace( /[ _\-]/g, ''); + var isUsingJQueryAnimation; + // set applyStyleFnName + switch ( animationEngine ) { + case 'css' : + case 'none' : + isUsingJQueryAnimation = false; + break; + case 'jquery' : + isUsingJQueryAnimation = true; + break; + default : // best available + isUsingJQueryAnimation = !Modernizr.csstransitions; + } + this.isUsingJQueryAnimation = isUsingJQueryAnimation; + this._updateUsingTransforms(); + }, + + _updateTransformsEnabled : function() { + this._updateUsingTransforms(); + }, + + _updateUsingTransforms : function() { + var usingTransforms = this.usingTransforms = this.options.transformsEnabled && + Modernizr.csstransforms && Modernizr.csstransitions && !this.isUsingJQueryAnimation; + + // prevent scales when transforms are disabled + if ( !usingTransforms ) { + delete this.options.hiddenStyle.scale; + delete this.options.visibleStyle.scale; + } + + this.getPositionStyles = usingTransforms ? this._translate : this._positionAbs; + }, + + + // ====================== Filtering ====================== + + _filter : function( $atoms ) { + var filter = this.options.filter === '' ? '*' : this.options.filter; + + if ( !filter ) { + return $atoms; + } + + var hiddenClass = this.options.hiddenClass, + hiddenSelector = '.' + hiddenClass, + $hiddenAtoms = $atoms.filter( hiddenSelector ), + $atomsToShow = $hiddenAtoms; + + if ( filter !== '*' ) { + $atomsToShow = $hiddenAtoms.filter( filter ); + var $atomsToHide = $atoms.not( hiddenSelector ).not( filter ).addClass( hiddenClass ); + this.styleQueue.push({ $el: $atomsToHide, style: this.options.hiddenStyle }); + } + + this.styleQueue.push({ $el: $atomsToShow, style: this.options.visibleStyle }); + $atomsToShow.removeClass( hiddenClass ); + + return $atoms.filter( filter ); + }, + + // ====================== Sorting ====================== + + updateSortData : function( $atoms, isIncrementingElemCount ) { + var instance = this, + getSortData = this.options.getSortData, + $this, sortData; + $atoms.each(function(){ + $this = $(this); + sortData = {}; + // get value for sort data based on fn( $elem ) passed in + for ( var key in getSortData ) { + if ( !isIncrementingElemCount && key === 'original-order' ) { + // keep original order original + sortData[ key ] = $.data( this, 'isotope-sort-data' )[ key ]; + } else { + sortData[ key ] = getSortData[ key ]( $this, instance ); + } + } + // apply sort data to element + $.data( this, 'isotope-sort-data', sortData ); + }); + }, + + // used on all the filtered atoms + _sort : function() { + + var sortBy = this.options.sortBy, + getSorter = this._getSorter, + sortDir = this.options.sortAscending ? 1 : -1, + sortFn = function( alpha, beta ) { + var a = getSorter( alpha, sortBy ), + b = getSorter( beta, sortBy ); + // fall back to original order if data matches + if ( a === b && sortBy !== 'original-order') { + a = getSorter( alpha, 'original-order' ); + b = getSorter( beta, 'original-order' ); + } + return ( ( a > b ) ? 1 : ( a < b ) ? -1 : 0 ) * sortDir; + }; + + this.$filteredAtoms.sort( sortFn ); + }, + + _getSorter : function( elem, sortBy ) { + return $.data( elem, 'isotope-sort-data' )[ sortBy ]; + }, + + // ====================== Layout Helpers ====================== + + _translate : function( x, y ) { + return { translate : [ x, y ] }; + }, + + _positionAbs : function( x, y ) { + return { left: x, top: y }; + }, + + _pushPosition : function( $elem, x, y ) { + x = Math.round( x + this.offset.left ); + y = Math.round( y + this.offset.top ); + var position = this.getPositionStyles( x, y ); + this.styleQueue.push({ $el: $elem, style: position }); + if ( this.options.itemPositionDataEnabled ) { + $elem.data('isotope-item-position', {x: x, y: y} ); + } + }, + + + // ====================== General Layout ====================== + + // used on collection of atoms (should be filtered, and sorted before ) + // accepts atoms-to-be-laid-out to start with + layout : function( $elems, callback ) { + + var layoutMode = this.options.layoutMode; + + // layout logic + this[ '_' + layoutMode + 'Layout' ]( $elems ); + + // set the size of the container + if ( this.options.resizesContainer ) { + var containerStyle = this[ '_' + layoutMode + 'GetContainerSize' ](); + this.styleQueue.push({ $el: this.element, style: containerStyle }); + } + + this._processStyleQueue( $elems, callback ); + + this.isLaidOut = true; + }, + + _processStyleQueue : function( $elems, callback ) { + // are we animating the layout arrangement? + // use plugin-ish syntax for css or animate + var styleFn = !this.isLaidOut ? 'css' : ( + this.isUsingJQueryAnimation ? 'animate' : 'css' + ), + animOpts = this.options.animationOptions, + onLayout = this.options.onLayout, + objStyleFn, processor, + triggerCallbackNow, callbackFn; + + // default styleQueue processor, may be overwritten down below + processor = function( i, obj ) { + obj.$el[ styleFn ]( obj.style, animOpts ); + }; + + if ( this._isInserting && this.isUsingJQueryAnimation ) { + // if using styleQueue to insert items + processor = function( i, obj ) { + // only animate if it not being inserted + objStyleFn = obj.$el.hasClass('no-transition') ? 'css' : styleFn; + obj.$el[ objStyleFn ]( obj.style, animOpts ); + }; + + } else if ( callback || onLayout || animOpts.complete ) { + // has callback + var isCallbackTriggered = false, + // array of possible callbacks to trigger + callbacks = [ callback, onLayout, animOpts.complete ], + instance = this; + triggerCallbackNow = true; + // trigger callback only once + callbackFn = function() { + if ( isCallbackTriggered ) { + return; + } + var hollaback; + for (var i=0, len = callbacks.length; i < len; i++) { + hollaback = callbacks[i]; + if ( typeof hollaback === 'function' ) { + hollaback.call( instance.element, $elems, instance ); + } + } + isCallbackTriggered = true; + }; + + if ( this.isUsingJQueryAnimation && styleFn === 'animate' ) { + // add callback to animation options + animOpts.complete = callbackFn; + triggerCallbackNow = false; + + } else if ( Modernizr.csstransitions ) { + // detect if first item has transition + var i = 0, + firstItem = this.styleQueue[0], + testElem = firstItem && firstItem.$el, + styleObj; + // get first non-empty jQ object + while ( !testElem || !testElem.length ) { + styleObj = this.styleQueue[ i++ ]; + // HACK: sometimes styleQueue[i] is undefined + if ( !styleObj ) { + return; + } + testElem = styleObj.$el; + } + // get transition duration of the first element in that object + // yeah, this is inexact + var duration = parseFloat( getComputedStyle( testElem[0] )[ transitionDurProp ] ); + if ( duration > 0 ) { + processor = function( i, obj ) { + obj.$el[ styleFn ]( obj.style, animOpts ) + // trigger callback at transition end + .one( transitionEndEvent, callbackFn ); + }; + triggerCallbackNow = false; + } + } + } + + // process styleQueue + $.each( this.styleQueue, processor ); + + if ( triggerCallbackNow ) { + callbackFn(); + } + + // clear out queue for next time + this.styleQueue = []; + }, + + + resize : function() { + if ( this[ '_' + this.options.layoutMode + 'ResizeChanged' ]() ) { + this.reLayout(); + } + }, + + + reLayout : function( callback ) { + + this[ '_' + this.options.layoutMode + 'Reset' ](); + this.layout( this.$filteredAtoms, callback ); + + }, + + // ====================== Convenience methods ====================== + + // ====================== Adding items ====================== + + // adds a jQuery object of items to a isotope container + addItems : function( $content, callback ) { + var $newAtoms = this._getAtoms( $content ); + // add new atoms to atoms pools + this.$allAtoms = this.$allAtoms.add( $newAtoms ); + + if ( callback ) { + callback( $newAtoms ); + } + }, + + // convienence method for adding elements properly to any layout + // positions items, hides them, then animates them back in <--- very sezzy + insert : function( $content, callback ) { + // position items + this.element.append( $content ); + + var instance = this; + this.addItems( $content, function( $newAtoms ) { + var $newFilteredAtoms = instance._filter( $newAtoms ); + instance._addHideAppended( $newFilteredAtoms ); + instance._sort(); + instance.reLayout(); + instance._revealAppended( $newFilteredAtoms, callback ); + }); + + }, + + // convienence method for working with Infinite Scroll + appended : function( $content, callback ) { + var instance = this; + this.addItems( $content, function( $newAtoms ) { + instance._addHideAppended( $newAtoms ); + instance.layout( $newAtoms ); + instance._revealAppended( $newAtoms, callback ); + }); + }, + + // adds new atoms, then hides them before positioning + _addHideAppended : function( $newAtoms ) { + this.$filteredAtoms = this.$filteredAtoms.add( $newAtoms ); + $newAtoms.addClass('no-transition'); + + this._isInserting = true; + + // apply hidden styles + this.styleQueue.push({ $el: $newAtoms, style: this.options.hiddenStyle }); + }, + + // sets visible style on new atoms + _revealAppended : function( $newAtoms, callback ) { + var instance = this; + // apply visible style after a sec + setTimeout( function() { + // enable animation + $newAtoms.removeClass('no-transition'); + // reveal newly inserted filtered elements + instance.styleQueue.push({ $el: $newAtoms, style: instance.options.visibleStyle }); + instance._isInserting = false; + instance._processStyleQueue( $newAtoms, callback ); + }, 10 ); + }, + + // gathers all atoms + reloadItems : function() { + this.$allAtoms = this._getAtoms( this.element.children() ); + }, + + // removes elements from Isotope widget + remove: function( $content, callback ) { + // remove elements immediately from Isotope instance + this.$allAtoms = this.$allAtoms.not( $content ); + this.$filteredAtoms = this.$filteredAtoms.not( $content ); + // remove() as a callback, for after transition / animation + var instance = this; + var removeContent = function() { + $content.remove(); + if ( callback ) { + callback.call( instance.element ); + } + }; + + if ( $content.filter( ':not(.' + this.options.hiddenClass + ')' ).length ) { + // if any non-hidden content needs to be removed + this.styleQueue.push({ $el: $content, style: this.options.hiddenStyle }); + this._sort(); + this.reLayout( removeContent ); + } else { + // remove it now + removeContent(); + } + + }, + + shuffle : function( callback ) { + this.updateSortData( this.$allAtoms ); + this.options.sortBy = 'random'; + this._sort(); + this.reLayout( callback ); + }, + + // destroys widget, returns elements and container back (close) to original style + destroy : function() { + + var usingTransforms = this.usingTransforms; + var options = this.options; + + this.$allAtoms + .removeClass( options.hiddenClass + ' ' + options.itemClass ) + .each(function(){ + var style = this.style; + style.position = ''; + style.top = ''; + style.left = ''; + style.opacity = ''; + if ( usingTransforms ) { + style[ transformProp ] = ''; + } + }); + + // re-apply saved container styles + var elemStyle = this.element[0].style; + for ( var prop in this.originalStyle ) { + elemStyle[ prop ] = this.originalStyle[ prop ]; + } + + this.element + .unbind('.isotope') + .undelegate( '.' + options.hiddenClass, 'click' ) + .removeClass( options.containerClass ) + .removeData('isotope'); + + $window.unbind('.isotope'); + + }, + + + // ====================== LAYOUTS ====================== + + // calculates number of rows or columns + // requires columnWidth or rowHeight to be set on namespaced object + // i.e. this.masonry.columnWidth = 200 + _getSegments : function( isRows ) { + var namespace = this.options.layoutMode, + measure = isRows ? 'rowHeight' : 'columnWidth', + size = isRows ? 'height' : 'width', + segmentsName = isRows ? 'rows' : 'cols', + containerSize = this.element[ size ](), + segments, + // i.e. options.masonry && options.masonry.columnWidth + segmentSize = this.options[ namespace ] && this.options[ namespace ][ measure ] || + // or use the size of the first item, i.e. outerWidth + this.$filteredAtoms[ 'outer' + capitalize(size) ](true) || + // if there's no items, use size of container + containerSize; + + segments = Math.floor( containerSize / segmentSize ); + segments = Math.max( segments, 1 ); + + // i.e. this.masonry.cols = .... + this[ namespace ][ segmentsName ] = segments; + // i.e. this.masonry.columnWidth = ... + this[ namespace ][ measure ] = segmentSize; + + }, + + _checkIfSegmentsChanged : function( isRows ) { + var namespace = this.options.layoutMode, + segmentsName = isRows ? 'rows' : 'cols', + prevSegments = this[ namespace ][ segmentsName ]; + // update cols/rows + this._getSegments( isRows ); + // return if updated cols/rows is not equal to previous + return ( this[ namespace ][ segmentsName ] !== prevSegments ); + }, + + // ====================== Masonry ====================== + + _masonryReset : function() { + // layout-specific props + this.masonry = {}; + // FIXME shouldn't have to call this again + this._getSegments(); + var i = this.masonry.cols; + this.masonry.colYs = []; + while (i--) { + this.masonry.colYs.push( 0 ); + } + }, + + _masonryLayout : function( $elems ) { + var instance = this, + props = instance.masonry; + $elems.each(function(){ + var $this = $(this), + //how many columns does this brick span + colSpan = Math.ceil( $this.outerWidth(true) / props.columnWidth ); + colSpan = Math.min( colSpan, props.cols ); + + if ( colSpan === 1 ) { + // if brick spans only one column, just like singleMode + instance._masonryPlaceBrick( $this, props.colYs ); + } else { + // brick spans more than one column + // how many different places could this brick fit horizontally + var groupCount = props.cols + 1 - colSpan, + groupY = [], + groupColY, + i; + + // for each group potential horizontal position + for ( i=0; i < groupCount; i++ ) { + // make an array of colY values for that one group + groupColY = props.colYs.slice( i, i+colSpan ); + // and get the max value of the array + groupY[i] = Math.max.apply( Math, groupColY ); + } + + instance._masonryPlaceBrick( $this, groupY ); + } + }); + }, + + // worker method that places brick in the columnSet + // with the the minY + _masonryPlaceBrick : function( $brick, setY ) { + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, setY ), + shortCol = 0; + + // Find index of short column, the first from the left + for (var i=0, len = setY.length; i < len; i++) { + if ( setY[i] === minimumY ) { + shortCol = i; + break; + } + } + + // position the brick + var x = this.masonry.columnWidth * shortCol, + y = minimumY; + this._pushPosition( $brick, x, y ); + + // apply setHeight to necessary columns + var setHeight = minimumY + $brick.outerHeight(true), + setSpan = this.masonry.cols + 1 - len; + for ( i=0; i < setSpan; i++ ) { + this.masonry.colYs[ shortCol + i ] = setHeight; + } + + }, + + _masonryGetContainerSize : function() { + var containerHeight = Math.max.apply( Math, this.masonry.colYs ); + return { height: containerHeight }; + }, + + _masonryResizeChanged : function() { + return this._checkIfSegmentsChanged(); + }, + + // ====================== fitRows ====================== + + _fitRowsReset : function() { + this.fitRows = { + x : 0, + y : 0, + height : 0 + }; + }, + + _fitRowsLayout : function( $elems ) { + var instance = this, + containerWidth = this.element.width(), + props = this.fitRows; + + $elems.each( function() { + var $this = $(this), + atomW = $this.outerWidth(true), + atomH = $this.outerHeight(true); + + if ( props.x !== 0 && atomW + props.x > containerWidth ) { + // if this element cannot fit in the current row + props.x = 0; + props.y = props.height; + } + + // position the atom + instance._pushPosition( $this, props.x, props.y ); + + props.height = Math.max( props.y + atomH, props.height ); + props.x += atomW; + + }); + }, + + _fitRowsGetContainerSize : function () { + return { height : this.fitRows.height }; + }, + + _fitRowsResizeChanged : function() { + return true; + }, + + + // ====================== cellsByRow ====================== + + _cellsByRowReset : function() { + this.cellsByRow = { + index : 0 + }; + // get this.cellsByRow.columnWidth + this._getSegments(); + // get this.cellsByRow.rowHeight + this._getSegments(true); + }, + + _cellsByRowLayout : function( $elems ) { + var instance = this, + props = this.cellsByRow; + $elems.each( function(){ + var $this = $(this), + col = props.index % props.cols, + row = Math.floor( props.index / props.cols ), + x = ( col + 0.5 ) * props.columnWidth - $this.outerWidth(true) / 2, + y = ( row + 0.5 ) * props.rowHeight - $this.outerHeight(true) / 2; + instance._pushPosition( $this, x, y ); + props.index ++; + }); + }, + + _cellsByRowGetContainerSize : function() { + return { height : Math.ceil( this.$filteredAtoms.length / this.cellsByRow.cols ) * this.cellsByRow.rowHeight + this.offset.top }; + }, + + _cellsByRowResizeChanged : function() { + return this._checkIfSegmentsChanged(); + }, + + + // ====================== straightDown ====================== + + _straightDownReset : function() { + this.straightDown = { + y : 0 + }; + }, + + _straightDownLayout : function( $elems ) { + var instance = this; + $elems.each( function( i ){ + var $this = $(this); + instance._pushPosition( $this, 0, instance.straightDown.y ); + instance.straightDown.y += $this.outerHeight(true); + }); + }, + + _straightDownGetContainerSize : function() { + return { height : this.straightDown.y }; + }, + + _straightDownResizeChanged : function() { + return true; + }, + + + // ====================== masonryHorizontal ====================== + + _masonryHorizontalReset : function() { + // layout-specific props + this.masonryHorizontal = {}; + // FIXME shouldn't have to call this again + this._getSegments( true ); + var i = this.masonryHorizontal.rows; + this.masonryHorizontal.rowXs = []; + while (i--) { + this.masonryHorizontal.rowXs.push( 0 ); + } + }, + + _masonryHorizontalLayout : function( $elems ) { + var instance = this, + props = instance.masonryHorizontal; + $elems.each(function(){ + var $this = $(this), + //how many rows does this brick span + rowSpan = Math.ceil( $this.outerHeight(true) / props.rowHeight ); + rowSpan = Math.min( rowSpan, props.rows ); + + if ( rowSpan === 1 ) { + // if brick spans only one column, just like singleMode + instance._masonryHorizontalPlaceBrick( $this, props.rowXs ); + } else { + // brick spans more than one row + // how many different places could this brick fit horizontally + var groupCount = props.rows + 1 - rowSpan, + groupX = [], + groupRowX, i; + + // for each group potential horizontal position + for ( i=0; i < groupCount; i++ ) { + // make an array of colY values for that one group + groupRowX = props.rowXs.slice( i, i+rowSpan ); + // and get the max value of the array + groupX[i] = Math.max.apply( Math, groupRowX ); + } + + instance._masonryHorizontalPlaceBrick( $this, groupX ); + } + }); + }, + + _masonryHorizontalPlaceBrick : function( $brick, setX ) { + // get the minimum Y value from the columns + var minimumX = Math.min.apply( Math, setX ), + smallRow = 0; + // Find index of smallest row, the first from the top + for (var i=0, len = setX.length; i < len; i++) { + if ( setX[i] === minimumX ) { + smallRow = i; + break; + } + } + + // position the brick + var x = minimumX, + y = this.masonryHorizontal.rowHeight * smallRow; + this._pushPosition( $brick, x, y ); + + // apply setHeight to necessary columns + var setWidth = minimumX + $brick.outerWidth(true), + setSpan = this.masonryHorizontal.rows + 1 - len; + for ( i=0; i < setSpan; i++ ) { + this.masonryHorizontal.rowXs[ smallRow + i ] = setWidth; + } + }, + + _masonryHorizontalGetContainerSize : function() { + var containerWidth = Math.max.apply( Math, this.masonryHorizontal.rowXs ); + return { width: containerWidth }; + }, + + _masonryHorizontalResizeChanged : function() { + return this._checkIfSegmentsChanged(true); + }, + + + // ====================== fitColumns ====================== + + _fitColumnsReset : function() { + this.fitColumns = { + x : 0, + y : 0, + width : 0 + }; + }, + + _fitColumnsLayout : function( $elems ) { + var instance = this, + containerHeight = this.element.height(), + props = this.fitColumns; + $elems.each( function() { + var $this = $(this), + atomW = $this.outerWidth(true), + atomH = $this.outerHeight(true); + + if ( props.y !== 0 && atomH + props.y > containerHeight ) { + // if this element cannot fit in the current column + props.x = props.width; + props.y = 0; + } + + // position the atom + instance._pushPosition( $this, props.x, props.y ); + + props.width = Math.max( props.x + atomW, props.width ); + props.y += atomH; + + }); + }, + + _fitColumnsGetContainerSize : function () { + return { width : this.fitColumns.width }; + }, + + _fitColumnsResizeChanged : function() { + return true; + }, + + + + // ====================== cellsByColumn ====================== + + _cellsByColumnReset : function() { + this.cellsByColumn = { + index : 0 + }; + // get this.cellsByColumn.columnWidth + this._getSegments(); + // get this.cellsByColumn.rowHeight + this._getSegments(true); + }, + + _cellsByColumnLayout : function( $elems ) { + var instance = this, + props = this.cellsByColumn; + $elems.each( function(){ + var $this = $(this), + col = Math.floor( props.index / props.rows ), + row = props.index % props.rows, + x = ( col + 0.5 ) * props.columnWidth - $this.outerWidth(true) / 2, + y = ( row + 0.5 ) * props.rowHeight - $this.outerHeight(true) / 2; + instance._pushPosition( $this, x, y ); + props.index ++; + }); + }, + + _cellsByColumnGetContainerSize : function() { + return { width : Math.ceil( this.$filteredAtoms.length / this.cellsByColumn.rows ) * this.cellsByColumn.columnWidth }; + }, + + _cellsByColumnResizeChanged : function() { + return this._checkIfSegmentsChanged(true); + }, + + // ====================== straightAcross ====================== + + _straightAcrossReset : function() { + this.straightAcross = { + x : 0 + }; + }, + + _straightAcrossLayout : function( $elems ) { + var instance = this; + $elems.each( function( i ){ + var $this = $(this); + instance._pushPosition( $this, instance.straightAcross.x, 0 ); + instance.straightAcross.x += $this.outerWidth(true); + }); + }, + + _straightAcrossGetContainerSize : function() { + return { width : this.straightAcross.x }; + }, + + _straightAcrossResizeChanged : function() { + return true; + } + + }; + + + // ======================= imagesLoaded Plugin =============================== + /*! + * jQuery imagesLoaded plugin v1.1.0 + * http://github.com/desandro/imagesloaded + * + * MIT License. by Paul Irish et al. + */ + + + // $('#my-container').imagesLoaded(myFunction) + // or + // $('img').imagesLoaded(myFunction) + + // execute a callback when all images have loaded. + // needed because .load() doesn't work on cached images + + // callback function gets image collection as argument + // `this` is the container + + $.fn.imagesLoaded = function( callback ) { + var $this = this, + $images = $this.find('img').add( $this.filter('img') ), + len = $images.length, + blank = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==', + loaded = []; + + function triggerCallback() { + callback.call( $this, $images ); + } + + function imgLoaded( event ) { + var img = event.target; + if ( img.src !== blank && $.inArray( img, loaded ) === -1 ){ + loaded.push( img ); + if ( --len <= 0 ){ + setTimeout( triggerCallback ); + $images.unbind( '.imagesLoaded', imgLoaded ); + } + } + } + + // if no images, trigger immediately + if ( !len ) { + triggerCallback(); + } + + $images.bind( 'load.imagesLoaded error.imagesLoaded', imgLoaded ).each( function() { + // cached images don't fire load sometimes, so we reset src. + var src = this.src; + // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f + // data uri bypasses webkit log warning (thx doug jones) + this.src = blank; + this.src = src; + }); + + return $this; + }; + + + // helper function for logging errors + // $.error breaks jQuery chaining + var logError = function( message ) { + if ( window.console ) { + window.console.error( message ); + } + }; + + // ======================= Plugin bridge =============================== + // leverages data method to either create or return $.Isotope constructor + // A bit from jQuery UI + // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js + // A bit from jcarousel + // https://github.com/jsor/jcarousel/blob/master/lib/jquery.jcarousel.js + + $.fn.isotope = function( options, callback ) { + if ( typeof options === 'string' ) { + // call method + var args = Array.prototype.slice.call( arguments, 1 ); + + this.each(function(){ + var instance = $.data( this, 'isotope' ); + if ( !instance ) { + logError( "cannot call methods on isotope prior to initialization; " + + "attempted to call method '" + options + "'" ); + return; + } + if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { + logError( "no such method '" + options + "' for isotope instance" ); + return; + } + // apply method + instance[ options ].apply( instance, args ); + }); + } else { + this.each(function() { + var instance = $.data( this, 'isotope' ); + if ( instance ) { + // apply options & init + instance.option( options ); + instance._init( callback ); + } else { + // initialize new instance + $.data( this, 'isotope', new $.Isotope( options, this, callback ) ); + } + }); + } + // return jQuery object + // so plugin methods do not have to + return this; + }; + +})( window, jQuery ); \ No newline at end of file diff --git a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js index ea4afadaf..5b02fa490 100644 --- a/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js +++ b/modules/backend/widgets/reportcontainer/assets/vendor/isotope/jquery.isotope.min.js @@ -1,5 +1,5 @@ /** - * Isotope v1.5.25 + * Isotope v1.5.26 * An exquisite jQuery plugin for magical layouts * http://isotope.metafizzy.co * @@ -8,6 +8,6 @@ * * Non-commercial use is licensed under the MIT License * - * Copyright 2013 Metafizzy + * Copyright 2014 Metafizzy */ -(function(a,b,c){"use strict";var d=a.document,e=a.Modernizr,f=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},g="Moz Webkit O Ms".split(" "),h=function(a){var b=d.documentElement.style,c;if(typeof b[a]=="string")return a;a=f(a);for(var e=0,h=g.length;e"+d+"{#modernizr{height:3px}}"+"").appendTo("head"),f=b('
').appendTo("html");a=f.height()===3,f.remove(),e.remove()}return a},csstransitions:function(){return!!j}},l;if(e)for(l in k)e.hasOwnProperty(l)||e.addTest(l,k[l]);else{e=a.Modernizr={_version:"1.6ish: miniModernizr for Isotope"};var m=" ",n;for(l in k)n=k[l](),e[l]=n,m+=" "+(n?"":"no-")+l;b("html").addClass(m)}if(e.csstransforms){var o=e.csstransforms3d?{translate:function(a){return"translate3d("+a[0]+"px, "+a[1]+"px, 0) "},scale:function(a){return"scale3d("+a+", "+a+", 1) "}}:{translate:function(a){return"translate("+a[0]+"px, "+a[1]+"px) "},scale:function(a){return"scale("+a+") "}},p=function(a,c,d){var e=b.data(a,"isoTransform")||{},f={},g,h={},j;f[c]=d,b.extend(e,f);for(g in e)j=e[g],h[g]=o[g](j);var k=h.translate||"",l=h.scale||"",m=k+l;b.data(a,"isoTransform",e),a.style[i]=m};b.cssNumber.scale=!0,b.cssHooks.scale={set:function(a,b){p(a,"scale",b)},get:function(a,c){var d=b.data(a,"isoTransform");return d&&d.scale?d.scale:1}},b.fx.step.scale=function(a){b.cssHooks.scale.set(a.elem,a.now+a.unit)},b.cssNumber.translate=!0,b.cssHooks.translate={set:function(a,b){p(a,"translate",b)},get:function(a,c){var d=b.data(a,"isoTransform");return d&&d.translate?d.translate:[0,0]}}}var q,r;e.csstransitions&&(q={WebkitTransitionProperty:"webkitTransitionEnd",MozTransitionProperty:"transitionend",OTransitionProperty:"oTransitionEnd otransitionend",transitionProperty:"transitionend"}[j],r=h("transitionDuration"));var s=b.event,t=b.event.handle?"handle":"dispatch",u;s.special.smartresize={setup:function(){b(this).bind("resize",s.special.smartresize.handler)},teardown:function(){b(this).unbind("resize",s.special.smartresize.handler)},handler:function(a,b){var c=this,d=arguments;a.type="smartresize",u&&clearTimeout(u),u=setTimeout(function(){s[t].apply(c,d)},b==="execAsap"?0:100)}},b.fn.smartresize=function(a){return a?this.bind("smartresize",a):this.trigger("smartresize",["execAsap"])},b.Isotope=function(a,c,d){this.element=b(c),this._create(a),this._init(d)};var v=["width","height"],w=b(a);b.Isotope.settings={resizable:!0,layoutMode:"masonry",containerClass:"isotope",itemClass:"isotope-item",hiddenClass:"isotope-hidden",hiddenStyle:{opacity:0,scale:.001},visibleStyle:{opacity:1,scale:1},containerStyle:{position:"relative",overflow:"hidden"},animationEngine:"best-available",animationOptions:{queue:!1,duration:800},sortBy:"original-order",sortAscending:!0,resizesContainer:!0,transformsEnabled:!0,itemPositionDataEnabled:!1},b.Isotope.prototype={_create:function(a){this.options=b.extend({},b.Isotope.settings,a),this.styleQueue=[],this.elemCount=0;var c=this.element[0].style;this.originalStyle={};var d=v.slice(0);for(var e in this.options.containerStyle)d.push(e);for(var f=0,g=d.length;fg?1:f0&&(i=function(a,b){b.$el[d](b.style,f).one(q,k)},j=!1)}}b.each(this.styleQueue,i),j&&k(),this.styleQueue=[]},resize:function(){this["_"+this.options.layoutMode+"ResizeChanged"]()&&this.reLayout()},reLayout:function(a){this["_"+this.options.layoutMode+"Reset"](),this.layout(this.$filteredAtoms,a)},addItems:function(a,b){var c=this._getAtoms(a);this.$allAtoms=this.$allAtoms.add(c),b&&b(c)},insert:function(a,b){this.element.append(a);var c=this;this.addItems(a,function(a){var d=c._filter(a);c._addHideAppended(d),c._sort(),c.reLayout(),c._revealAppended(d,b)})},appended:function(a,b){var c=this;this.addItems(a,function(a){c._addHideAppended(a),c.layout(a),c._revealAppended(a,b)})},_addHideAppended:function(a){this.$filteredAtoms=this.$filteredAtoms.add(a),a.addClass("no-transition"),this._isInserting=!0,this.styleQueue.push({$el:a,style:this.options.hiddenStyle})},_revealAppended:function(a,b){var c=this;setTimeout(function(){a.removeClass("no-transition"),c.styleQueue.push({$el:a,style:c.options.visibleStyle}),c._isInserting=!1,c._processStyleQueue(a,b)},10)},reloadItems:function(){this.$allAtoms=this._getAtoms(this.element.children())},remove:function(a,b){this.$allAtoms=this.$allAtoms.not(a),this.$filteredAtoms=this.$filteredAtoms.not(a);var c=this,d=function(){a.remove(),b&&b.call(c.element)};a.filter(":not(."+this.options.hiddenClass+")").length?(this.styleQueue.push({$el:a,style:this.options.hiddenStyle}),this._sort(),this.reLayout(d)):d()},shuffle:function(a){this.updateSortData(this.$allAtoms),this.options.sortBy="random",this._sort(),this.reLayout(a)},destroy:function(){var a=this.usingTransforms,b=this.options;this.$allAtoms.removeClass(b.hiddenClass+" "+b.itemClass).each(function(){var b=this.style;b.position="",b.top="",b.left="",b.opacity="",a&&(b[i]="")});var c=this.element[0].style;for(var d in this.originalStyle)c[d]=this.originalStyle[d];this.element.unbind(".isotope").undelegate("."+b.hiddenClass,"click").removeClass(b.containerClass).removeData("isotope"),w.unbind(".isotope")},_getSegments:function(a){var b=this.options.layoutMode,c=a?"rowHeight":"columnWidth",d=a?"height":"width",e=a?"rows":"cols",g=this.element[d](),h,i=this.options[b]&&this.options[b][c]||this.$filteredAtoms["outer"+f(d)](!0)||g;h=Math.floor(g/i),h=Math.max(h,1),this[b][e]=h,this[b][c]=i},_checkIfSegmentsChanged:function(a){var b=this.options.layoutMode,c=a?"rows":"cols",d=this[b][c];return this._getSegments(a),this[b][c]!==d},_masonryReset:function(){this.masonry={},this._getSegments();var a=this.masonry.cols;this.masonry.colYs=[];while(a--)this.masonry.colYs.push(0)},_masonryLayout:function(a){var c=this,d=c.masonry;a.each(function(){var a=b(this),e=Math.ceil(a.outerWidth(!0)/d.columnWidth);e=Math.min(e,d.cols);if(e===1)c._masonryPlaceBrick(a,d.colYs);else{var f=d.cols+1-e,g=[],h,i;for(i=0;id&&(e.x=0,e.y=e.height),c._pushPosition(a,e.x,e.y),e.height=Math.max(e.y+g,e.height),e.x+=f})},_fitRowsGetContainerSize:function(){return{height:this.fitRows.height}},_fitRowsResizeChanged:function(){return!0},_cellsByRowReset:function(){this.cellsByRow={index:0},this._getSegments(),this._getSegments(!0)},_cellsByRowLayout:function(a){var c=this,d=this.cellsByRow;a.each(function(){var a=b(this),e=d.index%d.cols,f=Math.floor(d.index/d.cols),g=(e+.5)*d.columnWidth-a.outerWidth(!0)/2,h=(f+.5)*d.rowHeight-a.outerHeight(!0)/2;c._pushPosition(a,g,h),d.index++})},_cellsByRowGetContainerSize:function(){return{height:Math.ceil(this.$filteredAtoms.length/this.cellsByRow.cols)*this.cellsByRow.rowHeight+this.offset.top}},_cellsByRowResizeChanged:function(){return this._checkIfSegmentsChanged()},_straightDownReset:function(){this.straightDown={y:0}},_straightDownLayout:function(a){var c=this;a.each(function(a){var d=b(this);c._pushPosition(d,0,c.straightDown.y),c.straightDown.y+=d.outerHeight(!0)})},_straightDownGetContainerSize:function(){return{height:this.straightDown.y}},_straightDownResizeChanged:function(){return!0},_masonryHorizontalReset:function(){this.masonryHorizontal={},this._getSegments(!0);var a=this.masonryHorizontal.rows;this.masonryHorizontal.rowXs=[];while(a--)this.masonryHorizontal.rowXs.push(0)},_masonryHorizontalLayout:function(a){var c=this,d=c.masonryHorizontal;a.each(function(){var a=b(this),e=Math.ceil(a.outerHeight(!0)/d.rowHeight);e=Math.min(e,d.rows);if(e===1)c._masonryHorizontalPlaceBrick(a,d.rowXs);else{var f=d.rows+1-e,g=[],h,i;for(i=0;id&&(e.x=e.width,e.y=0),c._pushPosition(a,e.x,e.y),e.width=Math.max(e.x+f,e.width),e.y+=g})},_fitColumnsGetContainerSize:function(){return{width:this.fitColumns.width}},_fitColumnsResizeChanged:function(){return!0},_cellsByColumnReset:function(){this.cellsByColumn={index:0},this._getSegments(),this._getSegments(!0)},_cellsByColumnLayout:function(a){var c=this,d=this.cellsByColumn;a.each(function(){var a=b(this),e=Math.floor(d.index/d.rows),f=d.index%d.rows,g=(e+.5)*d.columnWidth-a.outerWidth(!0)/2,h=(f+.5)*d.rowHeight-a.outerHeight(!0)/2;c._pushPosition(a,g,h),d.index++})},_cellsByColumnGetContainerSize:function(){return{width:Math.ceil(this.$filteredAtoms.length/this.cellsByColumn.rows)*this.cellsByColumn.columnWidth}},_cellsByColumnResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_straightAcrossReset:function(){this.straightAcross={x:0}},_straightAcrossLayout:function(a){var c=this;a.each(function(a){var d=b(this);c._pushPosition(d,c.straightAcross.x,0),c.straightAcross.x+=d.outerWidth(!0)})},_straightAcrossGetContainerSize:function(){return{width:this.straightAcross.x}},_straightAcrossResizeChanged:function(){return!0}},b.fn.imagesLoaded=function(a){function h(){a.call(c,d)}function i(a){var c=a.target;c.src!==f&&b.inArray(c,g)===-1&&(g.push(c),--e<=0&&(setTimeout(h),d.unbind(".imagesLoaded",i)))}var c=this,d=c.find("img").add(c.filter("img")),e=d.length,f="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",g=[];return e||h(),d.bind("load.imagesLoaded error.imagesLoaded",i).each(function(){var a=this.src;this.src=f,this.src=a}),c};var x=function(b){a.console&&a.console.error(b)};b.fn.isotope=function(a,c){if(typeof a=="string"){var d=Array.prototype.slice.call(arguments,1);this.each(function(){var c=b.data(this,"isotope");if(!c){x("cannot call methods on isotope prior to initialization; attempted to call method '"+a+"'");return}if(!b.isFunction(c[a])||a.charAt(0)==="_"){x("no such method '"+a+"' for isotope instance");return}c[a].apply(c,d)})}else this.each(function(){var d=b.data(this,"isotope");d?(d.option(a),d._init(c)):b.data(this,"isotope",new b.Isotope(a,this,c))});return this}})(window,jQuery); \ No newline at end of file +!function(t,i){"use strict";var s,e=t.document,n=e.documentElement,o=t.Modernizr,r=function(t){return t.charAt(0).toUpperCase()+t.slice(1)},a="Moz Webkit O Ms".split(" "),h=function(t){var i,s=n.style;if("string"==typeof s[t])return t;t=r(t);for(var e=0,o=a.length;o>e;e++)if(i=a[e]+t,"string"==typeof s[i])return i},l=h("transform"),u=h("transitionProperty"),c={csstransforms:function(){return!!l},csstransforms3d:function(){var t=!!h("perspective");if(t&&"webkitPerspective"in n.style){var s=i("").appendTo("head"),e=i('
').appendTo("html");t=3===e.height(),e.remove(),s.remove()}return t},csstransitions:function(){return!!u}};if(o)for(s in c)o.hasOwnProperty(s)||o.addTest(s,c[s]);else{o=t.Modernizr={_version:"1.6ish: miniModernizr for Isotope"};var d,f=" ";for(s in c)d=c[s](),o[s]=d,f+=" "+(d?"":"no-")+s;i("html").addClass(f)}if(o.csstransforms){var m=o.csstransforms3d?{translate:function(t){return"translate3d("+t[0]+"px, "+t[1]+"px, 0) "},scale:function(t){return"scale3d("+t+", "+t+", 1) "}}:{translate:function(t){return"translate("+t[0]+"px, "+t[1]+"px) "},scale:function(t){return"scale("+t+") "}},p=function(t,s,e){var n,o,r=i.data(t,"isoTransform")||{},a={},h={};a[s]=e,i.extend(r,a);for(n in r)o=r[n],h[n]=m[n](o);var u=h.translate||"",c=h.scale||"",d=u+c;i.data(t,"isoTransform",r),t.style[l]=d};i.cssNumber.scale=!0,i.cssHooks.scale={set:function(t,i){p(t,"scale",i)},get:function(t){var s=i.data(t,"isoTransform");return s&&s.scale?s.scale:1}},i.fx.step.scale=function(t){i.cssHooks.scale.set(t.elem,t.now+t.unit)},i.cssNumber.translate=!0,i.cssHooks.translate={set:function(t,i){p(t,"translate",i)},get:function(t){var s=i.data(t,"isoTransform");return s&&s.translate?s.translate:[0,0]}}}var y,g;o.csstransitions&&(y={WebkitTransitionProperty:"webkitTransitionEnd",MozTransitionProperty:"transitionend",OTransitionProperty:"oTransitionEnd otransitionend",transitionProperty:"transitionend"}[u],g=h("transitionDuration"));var v,_=i.event,A=i.event.handle?"handle":"dispatch";_.special.smartresize={setup:function(){i(this).bind("resize",_.special.smartresize.handler)},teardown:function(){i(this).unbind("resize",_.special.smartresize.handler)},handler:function(t,i){var s=this,e=arguments;t.type="smartresize",v&&clearTimeout(v),v=setTimeout(function(){_[A].apply(s,e)},"execAsap"===i?0:100)}},i.fn.smartresize=function(t){return t?this.bind("smartresize",t):this.trigger("smartresize",["execAsap"])},i.Isotope=function(t,s,e){this.element=i(s),this._create(t),this._init(e)};var w=["width","height"],C=i(t);i.Isotope.settings={resizable:!0,layoutMode:"masonry",containerClass:"isotope",itemClass:"isotope-item",hiddenClass:"isotope-hidden",hiddenStyle:{opacity:0,scale:.001},visibleStyle:{opacity:1,scale:1},containerStyle:{position:"relative",overflow:"hidden"},animationEngine:"best-available",animationOptions:{queue:!1,duration:800},sortBy:"original-order",sortAscending:!0,resizesContainer:!0,transformsEnabled:!0,itemPositionDataEnabled:!1},i.Isotope.prototype={_create:function(t){this.options=i.extend({},i.Isotope.settings,t),this.styleQueue=[],this.elemCount=0;var s=this.element[0].style;this.originalStyle={};var e=w.slice(0);for(var n in this.options.containerStyle)e.push(n);for(var o=0,r=e.length;r>o;o++)n=e[o],this.originalStyle[n]=s[n]||"";this.element.css(this.options.containerStyle),this._updateAnimationEngine(),this._updateUsingTransforms();var a={"original-order":function(t,i){return i.elemCount++,i.elemCount},random:function(){return Math.random()}};this.options.getSortData=i.extend(this.options.getSortData,a),this.reloadItems(),this.offset={left:parseInt(this.element.css("padding-left")||0,10),top:parseInt(this.element.css("padding-top")||0,10)};var h=this;setTimeout(function(){h.element.addClass(h.options.containerClass)},0),this.options.resizable&&C.bind("smartresize.isotope",function(){h.resize()}),this.element.delegate("."+this.options.hiddenClass,"click",function(){return!1})},_getAtoms:function(t){var i=this.options.itemSelector,s=i?t.filter(i).add(t.find(i)):t,e={position:"absolute"};return s=s.filter(function(t,i){return 1===i.nodeType}),this.usingTransforms&&(e.left=0,e.top=0),s.css(e).addClass(this.options.itemClass),this.updateSortData(s,!0),s},_init:function(t){this.$filteredAtoms=this._filter(this.$allAtoms),this._sort(),this.reLayout(t)},option:function(t){if(i.isPlainObject(t)){this.options=i.extend(!0,this.options,t);var s;for(var e in t)s="_update"+r(e),this[s]&&this[s]()}},_updateAnimationEngine:function(){var t,i=this.options.animationEngine.toLowerCase().replace(/[ _\-]/g,"");switch(i){case"css":case"none":t=!1;break;case"jquery":t=!0;break;default:t=!o.csstransitions}this.isUsingJQueryAnimation=t,this._updateUsingTransforms()},_updateTransformsEnabled:function(){this._updateUsingTransforms()},_updateUsingTransforms:function(){var t=this.usingTransforms=this.options.transformsEnabled&&o.csstransforms&&o.csstransitions&&!this.isUsingJQueryAnimation;t||(delete this.options.hiddenStyle.scale,delete this.options.visibleStyle.scale),this.getPositionStyles=t?this._translate:this._positionAbs},_filter:function(t){var i=""===this.options.filter?"*":this.options.filter;if(!i)return t;var s=this.options.hiddenClass,e="."+s,n=t.filter(e),o=n;if("*"!==i){o=n.filter(i);var r=t.not(e).not(i).addClass(s);this.styleQueue.push({$el:r,style:this.options.hiddenStyle})}return this.styleQueue.push({$el:o,style:this.options.visibleStyle}),o.removeClass(s),t.filter(i)},updateSortData:function(t,s){var e,n,o=this,r=this.options.getSortData;t.each(function(){e=i(this),n={};for(var t in r)n[t]=s||"original-order"!==t?r[t](e,o):i.data(this,"isotope-sort-data")[t];i.data(this,"isotope-sort-data",n)})},_sort:function(){var t=this.options.sortBy,i=this._getSorter,s=this.options.sortAscending?1:-1,e=function(e,n){var o=i(e,t),r=i(n,t);return o===r&&"original-order"!==t&&(o=i(e,"original-order"),r=i(n,"original-order")),(o>r?1:r>o?-1:0)*s};this.$filteredAtoms.sort(e)},_getSorter:function(t,s){return i.data(t,"isotope-sort-data")[s]},_translate:function(t,i){return{translate:[t,i]}},_positionAbs:function(t,i){return{left:t,top:i}},_pushPosition:function(t,i,s){i=Math.round(i+this.offset.left),s=Math.round(s+this.offset.top);var e=this.getPositionStyles(i,s);this.styleQueue.push({$el:t,style:e}),this.options.itemPositionDataEnabled&&t.data("isotope-item-position",{x:i,y:s})},layout:function(t,i){var s=this.options.layoutMode;if(this["_"+s+"Layout"](t),this.options.resizesContainer){var e=this["_"+s+"GetContainerSize"]();this.styleQueue.push({$el:this.element,style:e})}this._processStyleQueue(t,i),this.isLaidOut=!0},_processStyleQueue:function(t,s){var e,n,r,a,h=this.isLaidOut?this.isUsingJQueryAnimation?"animate":"css":"css",l=this.options.animationOptions,u=this.options.onLayout;if(n=function(t,i){i.$el[h](i.style,l)},this._isInserting&&this.isUsingJQueryAnimation)n=function(t,i){e=i.$el.hasClass("no-transition")?"css":h,i.$el[e](i.style,l)};else if(s||u||l.complete){var c=!1,d=[s,u,l.complete],f=this;if(r=!0,a=function(){if(!c){for(var i,s=0,e=d.length;e>s;s++)i=d[s],"function"==typeof i&&i.call(f.element,t,f);c=!0}},this.isUsingJQueryAnimation&&"animate"===h)l.complete=a,r=!1;else if(o.csstransitions){for(var m,p=0,v=this.styleQueue[0],_=v&&v.$el;!_||!_.length;){if(m=this.styleQueue[p++],!m)return;_=m.$el}var A=parseFloat(getComputedStyle(_[0])[g]);A>0&&(n=function(t,i){i.$el[h](i.style,l).one(y,a)},r=!1)}}i.each(this.styleQueue,n),r&&a(),this.styleQueue=[]},resize:function(){this["_"+this.options.layoutMode+"ResizeChanged"]()&&this.reLayout()},reLayout:function(t){this["_"+this.options.layoutMode+"Reset"](),this.layout(this.$filteredAtoms,t)},addItems:function(t,i){var s=this._getAtoms(t);this.$allAtoms=this.$allAtoms.add(s),i&&i(s)},insert:function(t,i){this.element.append(t);var s=this;this.addItems(t,function(t){var e=s._filter(t);s._addHideAppended(e),s._sort(),s.reLayout(),s._revealAppended(e,i)})},appended:function(t,i){var s=this;this.addItems(t,function(t){s._addHideAppended(t),s.layout(t),s._revealAppended(t,i)})},_addHideAppended:function(t){this.$filteredAtoms=this.$filteredAtoms.add(t),t.addClass("no-transition"),this._isInserting=!0,this.styleQueue.push({$el:t,style:this.options.hiddenStyle})},_revealAppended:function(t,i){var s=this;setTimeout(function(){t.removeClass("no-transition"),s.styleQueue.push({$el:t,style:s.options.visibleStyle}),s._isInserting=!1,s._processStyleQueue(t,i)},10)},reloadItems:function(){this.$allAtoms=this._getAtoms(this.element.children())},remove:function(t,i){this.$allAtoms=this.$allAtoms.not(t),this.$filteredAtoms=this.$filteredAtoms.not(t);var s=this,e=function(){t.remove(),i&&i.call(s.element)};t.filter(":not(."+this.options.hiddenClass+")").length?(this.styleQueue.push({$el:t,style:this.options.hiddenStyle}),this._sort(),this.reLayout(e)):e()},shuffle:function(t){this.updateSortData(this.$allAtoms),this.options.sortBy="random",this._sort(),this.reLayout(t)},destroy:function(){var t=this.usingTransforms,i=this.options;this.$allAtoms.removeClass(i.hiddenClass+" "+i.itemClass).each(function(){var i=this.style;i.position="",i.top="",i.left="",i.opacity="",t&&(i[l]="")});var s=this.element[0].style;for(var e in this.originalStyle)s[e]=this.originalStyle[e];this.element.unbind(".isotope").undelegate("."+i.hiddenClass,"click").removeClass(i.containerClass).removeData("isotope"),C.unbind(".isotope")},_getSegments:function(t){var i,s=this.options.layoutMode,e=t?"rowHeight":"columnWidth",n=t?"height":"width",o=t?"rows":"cols",a=this.element[n](),h=this.options[s]&&this.options[s][e]||this.$filteredAtoms["outer"+r(n)](!0)||a;i=Math.floor(a/h),i=Math.max(i,1),this[s][o]=i,this[s][e]=h},_checkIfSegmentsChanged:function(t){var i=this.options.layoutMode,s=t?"rows":"cols",e=this[i][s];return this._getSegments(t),this[i][s]!==e},_masonryReset:function(){this.masonry={},this._getSegments();var t=this.masonry.cols;for(this.masonry.colYs=[];t--;)this.masonry.colYs.push(0)},_masonryLayout:function(t){var s=this,e=s.masonry;t.each(function(){var t=i(this),n=Math.ceil(t.outerWidth(!0)/e.columnWidth);if(n=Math.min(n,e.cols),1===n)s._masonryPlaceBrick(t,e.colYs);else{var o,r,a=e.cols+1-n,h=[];for(r=0;a>r;r++)o=e.colYs.slice(r,r+n),h[r]=Math.max.apply(Math,o);s._masonryPlaceBrick(t,h)}})},_masonryPlaceBrick:function(t,i){for(var s=Math.min.apply(Math,i),e=0,n=0,o=i.length;o>n;n++)if(i[n]===s){e=n;break}var r=this.masonry.columnWidth*e,a=s;this._pushPosition(t,r,a);var h=s+t.outerHeight(!0),l=this.masonry.cols+1-o;for(n=0;l>n;n++)this.masonry.colYs[e+n]=h},_masonryGetContainerSize:function(){var t=Math.max.apply(Math,this.masonry.colYs);return{height:t}},_masonryResizeChanged:function(){return this._checkIfSegmentsChanged()},_fitRowsReset:function(){this.fitRows={x:0,y:0,height:0}},_fitRowsLayout:function(t){var s=this,e=this.element.width(),n=this.fitRows;t.each(function(){var t=i(this),o=t.outerWidth(!0),r=t.outerHeight(!0);0!==n.x&&o+n.x>e&&(n.x=0,n.y=n.height),s._pushPosition(t,n.x,n.y),n.height=Math.max(n.y+r,n.height),n.x+=o})},_fitRowsGetContainerSize:function(){return{height:this.fitRows.height}},_fitRowsResizeChanged:function(){return!0},_cellsByRowReset:function(){this.cellsByRow={index:0},this._getSegments(),this._getSegments(!0)},_cellsByRowLayout:function(t){var s=this,e=this.cellsByRow;t.each(function(){var t=i(this),n=e.index%e.cols,o=Math.floor(e.index/e.cols),r=(n+.5)*e.columnWidth-t.outerWidth(!0)/2,a=(o+.5)*e.rowHeight-t.outerHeight(!0)/2;s._pushPosition(t,r,a),e.index++})},_cellsByRowGetContainerSize:function(){return{height:Math.ceil(this.$filteredAtoms.length/this.cellsByRow.cols)*this.cellsByRow.rowHeight+this.offset.top}},_cellsByRowResizeChanged:function(){return this._checkIfSegmentsChanged()},_straightDownReset:function(){this.straightDown={y:0}},_straightDownLayout:function(t){var s=this;t.each(function(){var t=i(this);s._pushPosition(t,0,s.straightDown.y),s.straightDown.y+=t.outerHeight(!0)})},_straightDownGetContainerSize:function(){return{height:this.straightDown.y}},_straightDownResizeChanged:function(){return!0},_masonryHorizontalReset:function(){this.masonryHorizontal={},this._getSegments(!0);var t=this.masonryHorizontal.rows;for(this.masonryHorizontal.rowXs=[];t--;)this.masonryHorizontal.rowXs.push(0)},_masonryHorizontalLayout:function(t){var s=this,e=s.masonryHorizontal;t.each(function(){var t=i(this),n=Math.ceil(t.outerHeight(!0)/e.rowHeight);if(n=Math.min(n,e.rows),1===n)s._masonryHorizontalPlaceBrick(t,e.rowXs);else{var o,r,a=e.rows+1-n,h=[];for(r=0;a>r;r++)o=e.rowXs.slice(r,r+n),h[r]=Math.max.apply(Math,o);s._masonryHorizontalPlaceBrick(t,h)}})},_masonryHorizontalPlaceBrick:function(t,i){for(var s=Math.min.apply(Math,i),e=0,n=0,o=i.length;o>n;n++)if(i[n]===s){e=n;break}var r=s,a=this.masonryHorizontal.rowHeight*e;this._pushPosition(t,r,a);var h=s+t.outerWidth(!0),l=this.masonryHorizontal.rows+1-o;for(n=0;l>n;n++)this.masonryHorizontal.rowXs[e+n]=h},_masonryHorizontalGetContainerSize:function(){var t=Math.max.apply(Math,this.masonryHorizontal.rowXs);return{width:t}},_masonryHorizontalResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_fitColumnsReset:function(){this.fitColumns={x:0,y:0,width:0}},_fitColumnsLayout:function(t){var s=this,e=this.element.height(),n=this.fitColumns;t.each(function(){var t=i(this),o=t.outerWidth(!0),r=t.outerHeight(!0);0!==n.y&&r+n.y>e&&(n.x=n.width,n.y=0),s._pushPosition(t,n.x,n.y),n.width=Math.max(n.x+o,n.width),n.y+=r})},_fitColumnsGetContainerSize:function(){return{width:this.fitColumns.width}},_fitColumnsResizeChanged:function(){return!0},_cellsByColumnReset:function(){this.cellsByColumn={index:0},this._getSegments(),this._getSegments(!0)},_cellsByColumnLayout:function(t){var s=this,e=this.cellsByColumn;t.each(function(){var t=i(this),n=Math.floor(e.index/e.rows),o=e.index%e.rows,r=(n+.5)*e.columnWidth-t.outerWidth(!0)/2,a=(o+.5)*e.rowHeight-t.outerHeight(!0)/2;s._pushPosition(t,r,a),e.index++})},_cellsByColumnGetContainerSize:function(){return{width:Math.ceil(this.$filteredAtoms.length/this.cellsByColumn.rows)*this.cellsByColumn.columnWidth}},_cellsByColumnResizeChanged:function(){return this._checkIfSegmentsChanged(!0)},_straightAcrossReset:function(){this.straightAcross={x:0}},_straightAcrossLayout:function(t){var s=this;t.each(function(){var t=i(this);s._pushPosition(t,s.straightAcross.x,0),s.straightAcross.x+=t.outerWidth(!0)})},_straightAcrossGetContainerSize:function(){return{width:this.straightAcross.x}},_straightAcrossResizeChanged:function(){return!0}},i.fn.imagesLoaded=function(t){function s(){t.call(n,o)}function e(t){var n=t.target;n.src!==a&&-1===i.inArray(n,h)&&(h.push(n),--r<=0&&(setTimeout(s),o.unbind(".imagesLoaded",e)))}var n=this,o=n.find("img").add(n.filter("img")),r=o.length,a="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",h=[];return r||s(),o.bind("load.imagesLoaded error.imagesLoaded",e).each(function(){var t=this.src;this.src=a,this.src=t}),n};var z=function(i){t.console&&t.console.error(i)};i.fn.isotope=function(t,s){if("string"==typeof t){var e=Array.prototype.slice.call(arguments,1);this.each(function(){var s=i.data(this,"isotope");return s?i.isFunction(s[t])&&"_"!==t.charAt(0)?void s[t].apply(s,e):void z("no such method '"+t+"' for isotope instance"):void z("cannot call methods on isotope prior to initialization; attempted to call method '"+t+"'")})}else this.each(function(){var e=i.data(this,"isotope");e?(e.option(t),e._init(s)):i.data(this,"isotope",new i.Isotope(t,this,s))});return this}}(window,jQuery); \ No newline at end of file diff --git a/modules/system/assets/ui/docs/loader.md b/modules/system/assets/ui/docs/loader.md index c46f21a35..138ea90f1 100644 --- a/modules/system/assets/ui/docs/loader.md +++ b/modules/system/assets/ui/docs/loader.md @@ -8,9 +8,9 @@ A loading indicator used in a container.
-

This is some content inside the container

-

The loading indicator must be prepended to it

+

This is some content inside the container

+

The loading indicator must be prepended to it

#### Text Loading Indicator @@ -44,6 +44,15 @@ A loading indicator can be aligned to the center by adding `indicator-center` to
+You may add some optional text: + +
+
+ +
Loading...
+
+
+ # Example
diff --git a/modules/system/assets/ui/less/checkbox.less b/modules/system/assets/ui/less/checkbox.less index cc2ef6fd0..b96013a4d 100644 --- a/modules/system/assets/ui/less/checkbox.less +++ b/modules/system/assets/ui/less/checkbox.less @@ -98,7 +98,7 @@ display: inline-block; position: absolute; left: 0; - top: 3px; + top: 2px; .border-radius(17px); } } diff --git a/modules/system/assets/ui/less/loader.less b/modules/system/assets/ui/less/loader.less index c91747e07..4613a5d07 100644 --- a/modules/system/assets/ui/less/loader.less +++ b/modules/system/assets/ui/less/loader.less @@ -108,9 +108,9 @@ html.cssanimations { } > div { - top: auto; text-align: center; position: relative; + margin-top: 30px; } } diff --git a/modules/system/assets/ui/storm.css b/modules/system/assets/ui/storm.css index f52bec004..e41adcf76 100644 --- a/modules/system/assets/ui/storm.css +++ b/modules/system/assets/ui/storm.css @@ -2078,7 +2078,7 @@ html.cssanimations .loading-indicator.is-opaque > span,html.cssanimations .loadi html.cssanimations .loading-indicator.size-small > span,html.cssanimations .loading-indicator-container.size-small .loading-indicator > span{background-size:20px 20px} .loading-indicator.indicator-center,.loading-indicator-container.indicator-center .loading-indicator{padding:20px} .loading-indicator.indicator-center > span,.loading-indicator-container.indicator-center .loading-indicator > span{left:50%;margin-left:-20px;margin-top:-20px} -.loading-indicator.indicator-center > div,.loading-indicator-container.indicator-center .loading-indicator > div{top:auto;text-align:center;position:relative} +.loading-indicator.indicator-center > div,.loading-indicator-container.indicator-center .loading-indicator > div{text-align:center;position:relative;margin-top:30px} .loading-indicator.indicator-inset,.loading-indicator-container.indicator-inset .loading-indicator{padding-left:80px} .loading-indicator.indicator-inset > span,.loading-indicator-container.indicator-inset .loading-indicator > span{left:20px} .loading-indicator-container.size-form-field,.loading-indicator-container.size-input-text{min-height:0} @@ -2321,7 +2321,7 @@ html.cssanimations .cursor-loading-indicator.hide{display:none} .custom-checkbox label:hover:before,.custom-radio label:hover:before{border-color:#b5bdc2} .custom-checkbox label:active:before,.custom-radio label:active:before{border-color:#99a4ab;border-width:2px} .custom-checkbox input[type=radio]:checked + label:before,.custom-radio input[type=radio]:checked + label:before{border-color:#1f99dc;line-height:17px;border-width:2px} -.custom-checkbox input[type=radio]:checked + label:after,.custom-radio input[type=radio]:checked + label:after{content:'';width:12px;height:12px;background-color:#1f99dc;display:inline-block;position:absolute;left:0;top:3px;-webkit-border-radius:17px;-moz-border-radius:17px;border-radius:17px} +.custom-checkbox input[type=radio]:checked + label:after,.custom-radio input[type=radio]:checked + label:after{content:'';width:12px;height:12px;background-color:#1f99dc;display:inline-block;position:absolute;left:0;top:2px;-webkit-border-radius:17px;-moz-border-radius:17px;border-radius:17px} .custom-checkbox input[type=radio][data-radio-color=green]:checked + label:before,.custom-radio input[type=radio][data-radio-color=green]:checked + label:before{border-color:#76a544} .custom-checkbox input[type=radio][data-radio-color=green]:checked + label:after,.custom-radio input[type=radio][data-radio-color=green]:checked + label:after{background-color:#76a544} .custom-checkbox input[type=radio][data-radio-color=red]:checked + label:before,.custom-radio input[type=radio][data-radio-color=red]:checked + label:before{border-color:#bb2424}