diff --git a/_scss/shuffle-styles.scss b/_scss/shuffle-styles.scss index 4aae0bb..a07a0c2 100644 --- a/_scss/shuffle-styles.scss +++ b/_scss/shuffle-styles.scss @@ -75,7 +75,7 @@ $itemHeight: 220px; } } - @supports (filter: blur(1px)) { + @supports (filter: blur(1px)) and (clip-path: inset(0 0 0 0)) { .picture-item--overlay { diff --git a/css/shuffle-styles.css b/css/shuffle-styles.css index 8159e07..4fd281d 100644 --- a/css/shuffle-styles.css +++ b/css/shuffle-styles.css @@ -53,7 +53,7 @@ overflow: hidden; } .picture-item--overlay .picture-item__description { display: none; } - @supports ((-webkit-filter: blur(1px)) or (filter: blur(1px))) { + @supports ((-webkit-filter: blur(1px)) or (filter: blur(1px))) and ((-webkit-clip-path: inset(0 0 0 0)) or (clip-path: inset(0 0 0 0))) { .picture-item--overlay .picture-item__blur { position: absolute; z-index: 1; diff --git a/dist/shuffle.js b/dist/shuffle.js index 3a01165..45caa82 100644 --- a/dist/shuffle.js +++ b/dist/shuffle.js @@ -696,6 +696,7 @@ return /******/ (function(modules) { // webpackBootstrap var pos = _this3._getItemPosition(itemSize); function callback() { + item.element.style.transitionDelay = ''; item.applyCss(_shuffleItem2.default.Css.VISIBLE.after); } @@ -709,8 +710,10 @@ return /******/ (function(modules) { // webpackBootstrap item.point = pos; item.scale = _shuffleItem2.default.Scale.VISIBLE; - var styles = _shuffleItem2.default.Css.VISIBLE.before; - styles.transitionDelay = _this3._getStaggerAmount(count); + // Use xtend here to clone the object so that the `before` object isn't + // modified when the transition delay is added. + var styles = (0, _xtend2.default)(_shuffleItem2.default.Css.VISIBLE.before); + styles.transitionDelay = _this3._getStaggerAmount(count) + 'ms'; _this3._queue.push({ item: item, @@ -774,8 +777,8 @@ return /******/ (function(modules) { // webpackBootstrap item.scale = _shuffleItem2.default.Scale.HIDDEN; - var styles = _shuffleItem2.default.Css.HIDDEN.before; - styles.transitionDelay = _this4._getStaggerAmount(count); + var styles = (0, _xtend2.default)(_shuffleItem2.default.Css.HIDDEN.before); + styles.transitionDelay = _this4._getStaggerAmount(count) + 'ms'; _this4._queue.push({ item: item, @@ -853,7 +856,6 @@ return /******/ (function(modules) { // webpackBootstrap key: '_whenTransitionDone', value: function _whenTransitionDone(element, itemCallback, done) { var id = (0, _onTransitionEnd.onTransitionEnd)(element, function (evt) { - evt.currentTarget.style.transitionDelay = ''; itemCallback(); done(null, evt); }); @@ -888,29 +890,18 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: '_processQueue', value: function _processQueue() { - var _this6 = this; - if (this.isTransitioning) { this._cancelMovement(); } var hasSpeed = this.options.speed > 0; + var hasQueue = this._queue.length > 0; - // Iterate over the queue and keep track of ones that use transitions. - var immediates = []; - var transitions = []; - this._queue.forEach(function (obj) { - if (_this6.isInitialized && hasSpeed) { - transitions.push(obj); - } else { - immediates.push(obj); - } - }); - - this._styleImmediately(immediates); - - if (transitions.length > 0) { - this._startTransitions(transitions); + if (hasQueue && hasSpeed && this.isInitialized) { + this._startTransitions(this._queue); + } else if (hasQueue) { + this._styleImmediately(this._queue); + this._dispatchLayout(); // A call to layout happened, but none of the newly visible items will // change position or the transition duration is zero, which will not trigger @@ -931,14 +922,14 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: '_startTransitions', value: function _startTransitions(transitions) { - var _this7 = this; + var _this6 = this; // Set flag that shuffle is currently in motion. this.isTransitioning = true; // Create an array of functions to be called. var callbacks = transitions.map(function (obj) { - return _this7._getTransitionFunction(obj); + return _this6._getTransitionFunction(obj); }); (0, _arrayParallel2.default)(callbacks, this._movementFinished.bind(this)); @@ -965,7 +956,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: '_styleImmediately', value: function _styleImmediately(objects) { - var _this8 = this; + var _this7 = this; if (objects.length) { var elements = objects.map(function (obj) { @@ -974,7 +965,7 @@ return /******/ (function(modules) { // webpackBootstrap Shuffle._skipTransitions(elements, function () { objects.forEach(function (obj) { - obj.item.applyCss(_this8._getStylesForTransition(obj)); + obj.item.applyCss(_this7._getStylesForTransition(obj)); obj.callback(); }); }); @@ -1146,7 +1137,7 @@ return /******/ (function(modules) { // webpackBootstrap }, { key: 'remove', value: function remove(collection) { - var _this9 = this; + var _this8 = this; if (!collection.length) { return; @@ -1155,21 +1146,21 @@ return /******/ (function(modules) { // webpackBootstrap collection = (0, _arrayUniq2.default)(collection); var oldItems = collection.map(function (element) { - return _this9.getItemByElement(element); + return _this8.getItemByElement(element); }).filter(function (item) { return !!item; }); var handleLayout = function handleLayout() { - _this9.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout); - _this9._disposeItems(oldItems); + _this8.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout); + _this8._disposeItems(oldItems); // Remove the collection in the callback collection.forEach(function (element) { element.parentNode.removeChild(element); }); - _this9._dispatch(Shuffle.EventType.REMOVED, { collection: collection }); + _this8._dispatch(Shuffle.EventType.REMOVED, { collection: collection }); // Let it get garbage collected collection = null; diff --git a/dist/shuffle.js.map b/dist/shuffle.js.map index 5b1aab5..809b5e6 100644 --- a/dist/shuffle.js.map +++ b/dist/shuffle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 3df2ce46efdbed4acd71","webpack:///./src/index.js","webpack:///./src/shuffle.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/array-uniq/index.js","webpack:///./~/xtend/immutable.js","webpack:///./~/throttleit/index.js","webpack:///./~/array-parallel/index.js","webpack:///./src/point.js","webpack:///./src/get-number.js","webpack:///./src/shuffle-item.js","webpack:///./src/classes.js","webpack:///./src/get-number-style.js","webpack:///./src/computed-size.js","webpack:///./src/sorter.js","webpack:///./src/on-transition-end.js","webpack:///./src/layout.js"],"names":[],"mappings":"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Cf;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC;;;;;;;ACxBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,kBAAiB,kBAAkB;AACnC;AACA;AACA;AACA,E;;;;;;AC5BA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,EAAC;AACD;AACA;;;;;;;;AC3DA;;AAEA;;AAEA;AACA;;AAEA,oBAAmB,sBAAsB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;AClBA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,OAAO;AAClB,aAAY,SAAS;AACrB;;AAEA;AACA,iCAAgC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;ACvCA;;;;;;AAEA;;;;;;;;;;;AAOA,KAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,CAAb,EAAgB;AAC5B,QAAK,CAAL,GAAS,yBAAU,CAAV,CAAT,CAD4B;AAE5B,QAAK,CAAL,GAAS,yBAAU,CAAV,CAAT,CAF4B;EAAhB;;;;;;;;AAWd,OAAM,MAAN,GAAe,UAAU,CAAV,EAAa,CAAb,EAAgB;AAC7B,UAAO,EAAE,CAAF,KAAQ,EAAE,CAAF,IAAO,EAAE,CAAF,KAAQ,EAAE,CAAF,CADD;EAAhB;;mBAIA,M;;;;;;ACxBf;;;;;;;;;;;mBAOwB;AAAT,UAAS,SAAT,CAAmB,KAAnB,EAA0B;AACvC,UAAO,WAAW,KAAX,KAAqB,CAArB,CADgC;;;;;;;;;;;;;;;ACPzC;;;;AACA;;;;;;;;AAEA,KAAI,KAAK,CAAL;;KAEE;AACJ,YADI,WACJ,CAAY,OAAZ,EAAqB;2BADjB,aACiB;;AACnB,UAAK,EAAL,GAAU,IAAV,CADmB;AAEnB,UAAK,OAAL,GAAe,OAAf,CAFmB;AAGnB,UAAK,SAAL,GAAiB,IAAjB,CAHmB;IAArB;;gBADI;;4BAOG;AACL,YAAK,SAAL,GAAiB,IAAjB,CADK;AAEL,YAAK,OAAL,CAAa,SAAb,CAAuB,MAAvB,CAA8B,kBAAQ,MAAR,CAA9B,CAFK;AAGL,YAAK,OAAL,CAAa,SAAb,CAAuB,GAAvB,CAA2B,kBAAQ,OAAR,CAA3B,CAHK;;;;4BAMA;AACL,YAAK,SAAL,GAAiB,KAAjB,CADK;AAEL,YAAK,OAAL,CAAa,SAAb,CAAuB,MAAvB,CAA8B,kBAAQ,OAAR,CAA9B,CAFK;AAGL,YAAK,OAAL,CAAa,SAAb,CAAuB,GAAvB,CAA2B,kBAAQ,MAAR,CAA3B,CAHK;;;;4BAMA;AACL,YAAK,UAAL,CAAgB,CAAC,kBAAQ,YAAR,EAAsB,kBAAQ,OAAR,CAAvC,EADK;AAEL,YAAK,QAAL,CAAc,YAAY,GAAZ,CAAgB,OAAhB,CAAd,CAFK;AAGL,YAAK,KAAL,GAAa,YAAY,KAAZ,CAAkB,OAAlB,CAHR;AAIL,YAAK,KAAL,GAAa,qBAAb,CAJK;;;;gCAOI,SAAS;;;AAClB,eAAQ,OAAR,CAAgB,UAAC,SAAD,EAAe;AAC7B,eAAK,OAAL,CAAa,SAAb,CAAuB,GAAvB,CAA2B,SAA3B,EAD6B;QAAf,CAAhB,CADkB;;;;mCAMN,SAAS;;;AACrB,eAAQ,OAAR,CAAgB,UAAC,SAAD,EAAe;AAC7B,gBAAK,OAAL,CAAa,SAAb,CAAuB,MAAvB,CAA8B,SAA9B,EAD6B;QAAf,CAAhB,CADqB;;;;8BAMd,KAAK;AACZ,YAAK,IAAI,GAAJ,IAAW,GAAhB,EAAqB;AACnB,cAAK,OAAL,CAAa,KAAb,CAAmB,GAAnB,IAA0B,IAAI,GAAJ,CAA1B,CADmB;QAArB;;;;+BAKQ;AACR,YAAK,aAAL,CAAmB,CACjB,kBAAQ,MAAR,EACA,kBAAQ,OAAR,EACA,kBAAQ,YAAR,CAHF,EADQ;;AAOR,YAAK,OAAL,CAAa,eAAb,CAA6B,OAA7B,EAPQ;AAQR,YAAK,OAAL,GAAe,IAAf,CARQ;;;;UA5CN;;;AAwDN,aAAY,GAAZ,GAAkB;AAChB,YAAS;AACP,eAAU,UAAV;AACA,UAAK,CAAL;AACA,WAAM,CAAN;AACA,iBAAY,SAAZ;AACA,oBAAe,WAAf;IALF;AAOA,YAAS;AACP,aAAQ;AACN,gBAAS,CAAT;AACA,mBAAY,SAAZ;MAFF;AAIA,YAAO,EAAP;IALF;AAOA,WAAQ;AACN,aAAQ;AACN,gBAAS,CAAT;MADF;AAGA,YAAO;AACL,mBAAY,QAAZ;MADF;IAJF;EAfF;;AAyBA,aAAY,KAAZ,GAAoB;AAClB,YAAS,CAAT;AACA,WAAQ,KAAR;EAFF;;mBAKe,Y;;;;;;;;;;;mBC3FA;AACb,SAAM,SAAN;AACA,iBAAc,cAAd;AACA,YAAS,uBAAT;AACA,WAAQ,sBAAR;;;;;;;ACJF;;;;;mBAewB;;AAbxB;;;;AACA;;;;;;;;;;;;;;;;AAYe,UAAS,cAAT,CAAwB,OAAxB,EAAiC,KAAjC,EACsC;OAAjD,+DAAS,OAAO,gBAAP,CAAwB,OAAxB,EAAiC,IAAjC,iBAAwC;;AACnD,OAAI,QAAQ,yBAAU,OAAO,KAAP,CAAV,CAAR;;;AAD+C,OAI/C,2BAAmC,UAAU,OAAV,EAAmB;AACxD,cAAS,yBAAU,OAAO,WAAP,CAAV,GACP,yBAAU,OAAO,YAAP,CADH,GAEP,yBAAU,OAAO,eAAP,CAFH,GAGP,yBAAU,OAAO,gBAAP,CAHH,CAD+C;IAA1D,MAKO,IAAI,2BAAmC,UAAU,QAAV,EAAoB;AAChE,cAAS,yBAAU,OAAO,UAAP,CAAV,GACP,yBAAU,OAAO,aAAP,CADH,GAEP,yBAAU,OAAO,cAAP,CAFH,GAGP,yBAAU,OAAO,iBAAP,CAHH,CADuD;IAA3D;;AAOP,UAAO,KAAP,CAhBmD;;;;;;;;;;;;;ACfrD,KAAI,UAAU,SAAS,IAAT,IAAiB,SAAS,eAAT;AAC/B,KAAI,IAAI,SAAS,aAAT,CAAuB,KAAvB,CAAJ;AACJ,GAAE,KAAF,CAAQ,OAAR,GAAkB,+CAAlB;AACA,SAAQ,WAAR,CAAoB,CAApB;;AAEA,KAAI,QAAQ,OAAO,gBAAP,CAAwB,CAAxB,EAA2B,IAA3B,EAAiC,KAAjC;AACZ,KAAI,MAAM,UAAU,MAAV;;AAEV,SAAQ,WAAR,CAAoB,CAApB;;mBAEe,I;;;;;;ACXf;;;;;mBAwCwB;;AAtCxB;;;;;;;AAGA,UAAS,SAAT,CAAmB,KAAnB,EAA0B;AACxB,OAAI,GAAJ,CADwB;AAExB,OAAI,OAAJ,CAFwB;AAGxB,OAAI,MAAM,MAAM,MAAN,CAHc;;AAKxB,OAAI,CAAC,GAAD,EAAM;AACR,YAAO,KAAP,CADQ;IAAV;;AAIA,UAAO,EAAE,GAAF,EAAO;AACZ,eAAU,KAAK,KAAL,CAAW,KAAK,MAAL,MAAiB,MAAM,CAAN,CAAjB,CAArB,CADY;AAEZ,WAAM,MAAM,OAAN,CAAN,CAFY;AAGZ,WAAM,OAAN,IAAiB,MAAM,GAAN,CAAjB,CAHY;AAIZ,WAAM,GAAN,IAAa,GAAb,CAJY;IAAd;;AAOA,UAAO,KAAP,CAhBwB;EAA1B;;AAmBA,KAAI,WAAW;;AAEb,YAAS,KAAT;;;AAGA,OAAI,IAAJ;;;AAGA,cAAW,KAAX;;;;AAIA,QAAK,SAAL;EAZE;;;AAgBW,UAAS,MAAT,CAAgB,GAAhB,EAAqB,OAArB,EAA8B;AAC3C,OAAI,OAAO,qBAAM,QAAN,EAAgB,OAAhB,CAAP,CADuC;AAE3C,OAAI,WAAW,GAAG,KAAH,CAAS,IAAT,CAAc,GAAd,CAAX,CAFuC;AAG3C,OAAI,SAAS,KAAT,CAHuC;;AAK3C,OAAI,CAAC,IAAI,MAAJ,EAAY;AACf,YAAO,EAAP,CADe;IAAjB;;AAIA,OAAI,KAAK,SAAL,EAAgB;AAClB,YAAO,UAAU,GAAV,CAAP,CADkB;IAApB;;;;AAT2C,OAevC,OAAO,KAAK,EAAL,KAAY,UAAnB,EAA+B;AACjC,SAAI,IAAJ,CAAS,UAAU,CAAV,EAAa,CAAb,EAAgB;;;AAGvB,WAAI,MAAJ,EAAY;AACV,gBAAO,CAAP,CADU;QAAZ;;AAIA,WAAI,OAAO,KAAK,EAAL,CAAQ,EAAE,KAAK,GAAL,CAAV,CAAP,CAPmB;AAQvB,WAAI,OAAO,KAAK,EAAL,CAAQ,EAAE,KAAK,GAAL,CAAV,CAAP;;;AARmB,WAWnB,SAAS,SAAT,IAAsB,SAAS,SAAT,EAAoB;AAC5C,kBAAS,IAAT,CAD4C;AAE5C,gBAAO,CAAP,CAF4C;QAA9C;;AAKA,WAAI,OAAO,IAAP,IAAe,SAAS,WAAT,IAAwB,SAAS,UAAT,EAAqB;AAC9D,gBAAO,CAAC,CAAD,CADuD;QAAhE;;AAIA,WAAI,OAAO,IAAP,IAAe,SAAS,UAAT,IAAuB,SAAS,WAAT,EAAsB;AAC9D,gBAAO,CAAP,CAD8D;QAAhE;;AAIA,cAAO,CAAP,CAxBuB;MAAhB,CAAT,CADiC;IAAnC;;;AAf2C,OA6CvC,MAAJ,EAAY;AACV,YAAO,QAAP,CADU;IAAZ;;AAIA,OAAI,KAAK,OAAL,EAAc;AAChB,SAAI,OAAJ,GADgB;IAAlB;;AAIA,UAAO,GAAP,CArD2C;;;;;;;ACxC7C;;;;;SAUgB;SAgBA;AAxBhB,KAAI,cAAc,EAAd;AACJ,KAAI,YAAY,eAAZ;AACJ,KAAI,QAAQ,CAAR;;AAEJ,UAAS,QAAT,GAAoB;AAClB,UAAO,YAAY,OAAZ,CADW;EAApB;;AAIO,UAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C;AACjD,OAAI,KAAK,UAAL,CAD6C;AAEjD,OAAI,WAAW,SAAX,QAAW,CAAC,GAAD,EAAS;AACtB,SAAI,IAAI,aAAJ,KAAsB,IAAI,MAAJ,EAAY;AACpC,2BAAoB,EAApB,EADoC;AAEpC,gBAAS,GAAT,EAFoC;MAAtC;IADa,CAFkC;;AASjD,WAAQ,gBAAR,CAAyB,SAAzB,EAAoC,QAApC,EATiD;;AAWjD,eAAY,EAAZ,IAAkB,EAAE,gBAAF,EAAW,kBAAX,EAAlB,CAXiD;;AAajD,UAAO,EAAP,CAbiD;EAA5C;;AAgBA,UAAS,mBAAT,CAA6B,EAA7B,EAAiC;AACtC,OAAI,YAAY,EAAZ,CAAJ,EAAqB;AACnB,iBAAY,EAAZ,EAAgB,OAAhB,CAAwB,mBAAxB,CAA4C,SAA5C,EAAuD,YAAY,EAAZ,EAAgB,QAAhB,CAAvD,CADmB;AAEnB,iBAAY,EAAZ,IAAkB,IAAlB,CAFmB;AAGnB,YAAO,IAAP,CAHmB;IAArB;;AAMA,UAAO,KAAP,CAPsC;;;;;;;AC1BxC;;;;;SAsBgB;SA6BA;SAqBA;SA+CA;;AArHhB;;;;;;AAEA,UAAS,QAAT,CAAkB,KAAlB,EAAyB;AACvB,UAAO,KAAK,GAAL,CAAS,KAAT,CAAe,IAAf,EAAqB,KAArB,CAAP,CADuB;EAAzB;;AAIA,UAAS,QAAT,CAAkB,KAAlB,EAAyB;AACvB,UAAO,KAAK,GAAL,CAAS,KAAT,CAAe,IAAf,EAAqB,KAArB,CAAP,CADuB;EAAzB;;;;;;;;;;;;AAcO,UAAS,eAAT,OAAsF;OAA3D,yBAA2D;OAAjD,2BAAiD;OAAtC,yBAAsC;OAA5B,mBAA4B;OAArB,2BAAqB;OAAV,qBAAU;;AAC3F,OAAI,OAAO,cAAc,SAAS,KAAT,EAAgB,QAA9B,EAAwC,KAAxC,EAA+C,SAA/C,CAAP,CADuF;AAE3F,OAAI,OAAO,sBAAsB,SAAtB,EAAiC,IAAjC,EAAuC,KAAvC,CAAP,CAFuF;AAG3F,OAAI,mBAAmB,eAAe,IAAf,EAAqB,MAArB,CAAnB;;;AAHuF,OAMvF,QAAQ,oBACV,KAAK,KAAL,CAAW,WAAW,gBAAX,CADD,EAEV,KAAK,KAAL,CAAW,KAAK,gBAAL,CAAX,CAFU,CAAR;;;;;AANuF,OAavF,YAAY,KAAK,gBAAL,IAAyB,SAAS,MAAT,CAbkD;AAc3F,QAAK,IAAI,IAAI,CAAJ,EAAO,IAAI,IAAJ,EAAU,GAA1B,EAA+B;AAC7B,eAAU,mBAAmB,CAAnB,CAAV,GAAkC,SAAlC,CAD6B;IAA/B;;AAIA,UAAO,KAAP,CAlB2F;EAAtF;;;;;;;;;;AA6BA,UAAS,aAAT,CAAuB,SAAvB,EAAkC,WAAlC,EAA+C,OAA/C,EAAwD,SAAxD,EAAmE;AACxE,OAAI,aAAa,YAAY,WAAZ;;;;;AADuD,OAMpE,KAAK,GAAL,CAAS,KAAK,KAAL,CAAW,UAAX,IAAyB,UAAzB,CAAT,GAAgD,SAAhD,EAA2D;;AAE7D,kBAAa,KAAK,KAAL,CAAW,UAAX,CAAb,CAF6D;IAA/D;;;AANwE,UAYjE,KAAK,GAAL,CAAS,KAAK,IAAL,CAAU,UAAV,CAAT,EAAgC,OAAhC,CAAP,CAZwE;EAAnE;;;;;;;;AAqBA,UAAS,qBAAT,CAA+B,SAA/B,EAA0C,UAA1C,EAAsD,OAAtD,EAA+D;;AAEpE,OAAI,eAAe,CAAf,EAAkB;AACpB,YAAO,SAAP,CADoB;IAAtB;;;;;;;;;;;;;;;;;;;;;;;;AAFoE,OA4BhE,YAAY,EAAZ;;;AA5BgE,QA+B/D,IAAI,IAAI,CAAJ,EAAO,KAAK,UAAU,UAAV,EAAsB,GAA3C,EAAgD;;AAE9C,eAAU,IAAV,CAAe,SAAS,UAAU,KAAV,CAAgB,CAAhB,EAAmB,IAAI,UAAJ,CAA5B,CAAf,EAF8C;IAAhD;;AAKA,UAAO,SAAP,CApCoE;EAA/D;;;;;;;;;;AA+CA,UAAS,cAAT,CAAwB,SAAxB,EAAmC,MAAnC,EAA2C;AAChD,OAAI,cAAc,SAAS,SAAT,CAAd,CAD4C;AAEhD,QAAK,IAAI,IAAI,CAAJ,EAAO,MAAM,UAAU,MAAV,EAAkB,IAAI,GAAJ,EAAS,GAAjD,EAAsD;AACpD,SAAI,UAAU,CAAV,KAAgB,cAAc,MAAd,IAAwB,UAAU,CAAV,KAAgB,cAAc,MAAd,EAAsB;AAChF,cAAO,CAAP,CADgF;MAAlF;IADF;;AAMA,UAAO,CAAP,CARgD","file":"shuffle.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 3df2ce46efdbed4acd71\n **/","module.exports = require('./shuffle').default;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","'use strict';\n\nimport 'custom-event-polyfill';\nimport matches from 'matches-selector';\nimport arrayUnique from 'array-uniq';\nimport xtend from 'xtend';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\nimport Point from './point';\nimport ShuffleItem from './shuffle-item';\nimport Classes from './classes';\nimport getNumberStyle from './get-number-style';\nimport sorter from './sorter';\nimport { onTransitionEnd, cancelTransitionEnd } from './on-transition-end';\nimport { getItemPosition, getColumnSpan, getAvailablePositions, getShortColumn } from './layout';\n\nfunction toArray(arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n}\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayIncludes(array, obj) {\n if (arguments.length === 2) {\n return arrayIncludes(array)(obj);\n }\n\n return function (obj) {\n return array.indexOf(obj) > -1;\n };\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle {\n\n /**\n * Categorize, sort, and filter a responsive grid of items.\n *\n * @param {Element} element An element which is the parent container for the grid items.\n * @param {Object} [options=Shuffle.options] Options object.\n * @constructor\n */\n constructor(element, options = {}) {\n this.options = xtend(Shuffle.options, options);\n\n this.useSizer = false;\n this.lastSort = {};\n this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n this.isEnabled = true;\n this.isDestroyed = false;\n this.isInitialized = false;\n this._transitions = [];\n this.isTransitioning = false;\n this._queue = [];\n\n element = this._getElementOption(element);\n\n if (!element) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = element;\n this.id = 'shuffle_' + id++;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n\n this.options.sizer = this._getElementOption(this.options.sizer);\n\n if (this.options.sizer) {\n this.useSizer = true;\n }\n\n // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems();\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // Get container css all in one request. Causes reflow\n var containerCss = window.getComputedStyle(this.element, null);\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // Add styles to the container if it doesn't have them.\n this._validateStyles(containerCss);\n\n // We already got the container's width above, no need to cause another\n // reflow getting it again... Calculate the number of columns there will be\n this._setColumns(containerWidth);\n\n // Kick off!\n this.filter(this.options.group, this.options.initialSort);\n\n // The shuffle items haven't had transitions set on them yet so the user\n // doesn't see the first layout. Set them now that the first layout is done.\n // First, however, a synchronous layout must be caused for the previous\n // styles to be applied without transitions.\n this.element.offsetWidth; // jshint ignore: line\n this._setTransitions();\n this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n }\n\n /**\n * Returns a throttled and proxied function for the resize handler.\n * @return {Function}\n * @private\n */\n _getResizeFunction() {\n var resizeFunction = this._handleResize.bind(this);\n return this.options.throttle ?\n this.options.throttle(resizeFunction, this.options.throttleTime) :\n resizeFunction;\n }\n\n /**\n * Retrieve an element from an option.\n * @param {string|jQuery|Element} option The option to check.\n * @return {?Element} The plain element or null.\n * @private\n */\n _getElementOption(option) {\n // If column width is a string, treat is as a selector and search for the\n // sizer element within the outermost container\n if (typeof option === 'string') {\n return this.element.querySelector(option);\n\n // Check for an element\n } else if (option && option.nodeType && option.nodeType === 1) {\n return option;\n\n // Check for jQuery object\n } else if (option && option.jquery) {\n return option[0];\n }\n\n return null;\n }\n\n /**\n * Ensures the shuffle container has the css styles it needs applied to it.\n * @param {Object} styles Key value pairs for position and overflow.\n * @private\n */\n _validateStyles(styles) {\n // Position cannot be static.\n if (styles.position === 'static') {\n this.element.style.position = 'relative';\n }\n\n // Overflow has to be hidden.\n if (styles.overflow !== 'hidden') {\n this.element.style.overflow = 'hidden';\n }\n }\n\n /**\n * Filter the elements by a category.\n * @param {string} [category] Category to filter by. If it's given, the last\n * category will be used to filter the items.\n * @param {Array} [collection] Optionally filter a collection. Defaults to\n * all the items.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n var set = this._getFilteredSets(category, collection);\n\n // Individually add/remove hidden/visible classes\n this._toggleFilterClasses(set);\n\n // Save the last filter in case elements are appended.\n this.lastFilter = category;\n\n // This is saved mainly because providing a filter function (like searching)\n // will overwrite the `lastFilter` property every time its called.\n if (typeof category === 'string') {\n this.group = category;\n }\n\n return set;\n }\n\n /**\n * Returns an object containing the visible and hidden elements.\n * @param {string|Function} category Category or function to filter by.\n * @param {Array.} items A collection of items to filter.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n let hidden = [];\n\n // category === 'all', add visible class to everything\n if (category === Shuffle.ALL_ITEMS) {\n visible = items;\n\n // Loop through each item and use provided function to determine\n // whether to hide it or not.\n } else {\n items.forEach((item) => {\n if (this._doesPassFilter(category, item.element)) {\n visible.push(item);\n } else {\n hidden.push(item);\n }\n });\n }\n\n return {\n visible,\n hidden,\n };\n }\n\n /**\n * Test an item to see if it passes a category.\n * @param {string|Function} category Category or function to filter by.\n * @param {Element} element An element to test.\n * @return {boolean} Whether it passes the category/filter.\n * @private\n */\n _doesPassFilter(category, element) {\n\n if (typeof category === 'function') {\n return category.call(element, element, this);\n\n // Check each element's data-groups attribute against the given category.\n } else {\n let attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n let groups = JSON.parse(attr);\n let keys = this.delimeter && !Array.isArray(groups) ?\n groups.split(this.delimeter) :\n groups;\n\n if (Array.isArray(category)) {\n return category.some(arrayIncludes(keys));\n }\n\n return arrayIncludes(keys, category);\n }\n }\n\n /**\n * Toggles the visible and hidden class names.\n * @param {{visible, hidden}} Object with visible and hidden arrays.\n * @private\n */\n _toggleFilterClasses({ visible, hidden }) {\n visible.forEach((item) => {\n item.show();\n });\n\n hidden.forEach((item) => {\n item.hide();\n });\n }\n\n /**\n * Set the initial css for each item\n * @param {Array.} [items] Optionally specifiy at set to initialize.\n * @private\n */\n _initItems(items = this.items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @private\n */\n _disposeItems(items = this.items) {\n items.forEach((item) => {\n item.dispose();\n });\n }\n\n /**\n * Updates the visible item count.\n * @private\n */\n _updateItemCount() {\n this.visibleItems = this._getFilteredItems().length;\n }\n\n /**\n * Sets css transform transition on a group of elements. This is not executed\n * at the same time as `item.init` so that transitions don't occur upon\n * initialization of Shuffle.\n * @param {Array.} items Shuffle items to set transitions on.\n * @private\n */\n _setTransitions(items = this.items) {\n let speed = this.options.speed;\n let easing = this.options.easing;\n\n var str;\n if (this.options.useTransforms) {\n str = 'transform ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n } else {\n str = 'top ' + speed + 'ms ' + easing +\n ', left ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n }\n\n items.forEach((item) => {\n item.element.style.transition = str;\n });\n }\n\n _getItems() {\n return toArray(this.element.children)\n .filter(el => matches(el, this.options.itemSelector))\n .map(el => new ShuffleItem(el));\n }\n\n /**\n * When new elements are added to the shuffle container, update the array of\n * items because that is the order `_layout` calls them.\n */\n _updateItemsOrder() {\n let children = this.element.children;\n this.items = sorter(this.items, {\n by(element) {\n return Array.prototype.indexOf.call(children, element);\n },\n });\n }\n\n _getFilteredItems() {\n return this.items.filter(item => item.isVisible);\n }\n\n _getConcealedItems() {\n return this.items.filter(item => !item.isVisible);\n }\n\n /**\n * Returns the column size, based on column width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @param {number} gutterSize Size of the gutters.\n * @return {number}\n * @private\n */\n _getColumnSize(containerWidth, gutterSize) {\n var size;\n\n // If the columnWidth property is a function, then the grid is fluid\n if (typeof this.options.columnWidth === 'function') {\n size = this.options.columnWidth(containerWidth);\n\n // columnWidth option isn't a function, are they using a sizing element?\n } else if (this.useSizer) {\n size = Shuffle.getSize(this.options.sizer).width;\n\n // if not, how about the explicitly set option?\n } else if (this.options.columnWidth) {\n size = this.options.columnWidth;\n\n // or use the size of the first item\n } else if (this.items.length > 0) {\n size = Shuffle.getSize(this.items[0].element, true).width;\n\n // if there's no items, use size of container\n } else {\n size = containerWidth;\n }\n\n // Don't let them set a column width of zero.\n if (size === 0) {\n size = containerWidth;\n }\n\n return size + gutterSize;\n }\n\n /**\n * Returns the gutter size, based on gutter width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @return {number}\n * @private\n */\n _getGutterSize(containerWidth) {\n var size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.useSizer) {\n size = getNumberStyle(this.options.sizer, 'marginLeft');\n } else {\n size = this.options.gutterWidth;\n }\n\n return size;\n }\n\n /**\n * Calculate the number of columns to be used. Gets css if using sizer element.\n * @param {number} [containerWidth] Optionally specify a container width if\n * it's already available.\n */\n _setColumns(containerWidth = Shuffle.getSize(this.element).width) {\n var gutter = this._getGutterSize(containerWidth);\n var columnWidth = this._getColumnSize(containerWidth, gutter);\n var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\n // Widths given from getStyles are not precise enough...\n if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) <\n this.options.columnThreshold) {\n // e.g. calculatedColumns = 11.998876\n calculatedColumns = Math.round(calculatedColumns);\n }\n\n this.cols = Math.max(Math.floor(calculatedColumns), 1);\n this.containerWidth = containerWidth;\n this.colWidth = columnWidth;\n }\n\n /**\n * Adjust the height of the grid\n */\n _setContainerSize() {\n this.element.style.height = this._getContainerSize() + 'px';\n }\n\n /**\n * Based on the column heights, it returns the biggest one.\n * @return {number}\n * @private\n */\n _getContainerSize() {\n return arrayMax(this.positions);\n }\n\n /**\n * Get the clamped stagger amount.\n * @param {number} index Index of the item to be staggered.\n * @return {number}\n */\n _getStaggerAmount(index) {\n return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n }\n\n /**\n * @return {boolean} Whether the event was prevented or not.\n */\n _dispatch(name, details = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n details.shuffle = this;\n return !this.element.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n cancelable: false,\n detail: details,\n }));\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n var i = this.cols;\n this.positions = [];\n while (i--) {\n this.positions.push(0);\n }\n }\n\n /**\n * Loops through each item that should be shown and calculates the x, y position.\n * @param {Array.} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n let count = 0;\n items.forEach((item) => {\n var currPos = item.point;\n var currScale = item.scale;\n var itemSize = Shuffle.getSize(item.element, true);\n var pos = this._getItemPosition(itemSize);\n\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(currPos, pos) && currScale === ShuffleItem.Scale.VISIBLE) {\n callback();\n return;\n }\n\n item.point = pos;\n item.scale = ShuffleItem.Scale.VISIBLE;\n\n let styles = ShuffleItem.Css.VISIBLE.before;\n styles.transitionDelay = this._getStaggerAmount(count);\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Determine the location of the next item, based on its size.\n * @param {{width: number, height: number}} itemSize Object with width and height.\n * @return {Point}\n * @private\n */\n _getItemPosition(itemSize) {\n return getItemPosition({\n itemSize,\n positions: this.positions,\n gridSize: this.colWidth,\n total: this.cols,\n threshold: this.options.columnThreshold,\n buffer: this.options.buffer,\n });\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {Array.} collection Collection to shrink.\n * @private\n */\n _shrink(collection = this._getConcealedItems()) {\n let count = 0;\n collection.forEach((item) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n }\n\n // Continuing would add a transitionend event listener to the element, but\n // that listener would not execute because the transform and opacity would\n // stay the same.\n // The callback is executed here because it is not guaranteed to be called\n // after the transitionend event because the transitionend could be\n // canceled if another animation starts.\n if (item.scale === ShuffleItem.Scale.HIDDEN) {\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n\n let styles = ShuffleItem.Css.HIDDEN.before;\n styles.transitionDelay = this._getStaggerAmount(count);\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Resize handler.\n * @private\n */\n _handleResize() {\n // If shuffle is disabled, destroyed, don't do anything\n if (!this.isEnabled || this.isDestroyed) {\n return;\n }\n\n // Will need to check height in the future if it's layed out horizontaly\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // containerWidth hasn't changed, don't do anything\n if (containerWidth === this.containerWidth) {\n return;\n }\n\n this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {Object} obj Transition options.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @private\n */\n _getStylesForTransition({ item, styles }) {\n if (!styles.transitionDelay) {\n styles.transitionDelay = '0ms';\n }\n\n let x = item.point.x;\n let y = item.point.y;\n\n if (this.options.useTransforms) {\n styles.transform = `translate(${x}px, ${y}px) scale(${item.scale})`;\n } else {\n styles.left = x + 'px';\n styles.top = y + 'px';\n }\n\n return styles;\n }\n\n /**\n * Listen for the transition end on an element and execute the itemCallback\n * when it finishes.\n * @param {Element} element Element to listen on.\n * @param {Function} itemCallback Callback for the item.\n * @param {Function} done Callback to notify `parallel` that this one is done.\n */\n _whenTransitionDone(element, itemCallback, done) {\n let id = onTransitionEnd(element, (evt) => {\n evt.currentTarget.style.transitionDelay = '';\n itemCallback();\n done(null, evt);\n });\n\n this._transitions.push(id);\n }\n\n /**\n * Return a function which will set CSS styles and call the `done` function\n * when (if) the transition finishes.\n * @param {Object} opts Transition object.\n * @return {Function} A function to be called with a `done` function.\n */\n _getTransitionFunction(opts) {\n return (done) => {\n opts.item.applyCss(this._getStylesForTransition(opts));\n this._whenTransitionDone(opts.item.element, opts.callback, done);\n };\n }\n\n /**\n * Execute the styles gathered in the style queue. This applies styles to elements,\n * triggering transitions.\n * @private\n */\n _processQueue() {\n if (this.isTransitioning) {\n this._cancelMovement();\n }\n\n let hasSpeed = this.options.speed > 0;\n\n // Iterate over the queue and keep track of ones that use transitions.\n let immediates = [];\n let transitions = [];\n this._queue.forEach((obj) => {\n if (this.isInitialized && hasSpeed) {\n transitions.push(obj);\n } else {\n immediates.push(obj);\n }\n });\n\n this._styleImmediately(immediates);\n\n if (transitions.length > 0) {\n this._startTransitions(transitions);\n\n // A call to layout happened, but none of the newly visible items will\n // change position or the transition duration is zero, which will not trigger\n // the transitionend event.\n } else {\n this._dispatchLayout();\n }\n\n // Remove everything in the style queue\n this._queue.length = 0;\n }\n\n /**\n * Wait for each transition to finish, the emit the layout event.\n * @param {Array.} transitions Array of transition objects.\n */\n _startTransitions(transitions) {\n // Set flag that shuffle is currently in motion.\n this.isTransitioning = true;\n\n // Create an array of functions to be called.\n let callbacks = transitions.map(obj => this._getTransitionFunction(obj));\n\n parallel(callbacks, this._movementFinished.bind(this));\n }\n\n _cancelMovement() {\n // Remove the transition end event for each listener.\n this._transitions.forEach(cancelTransitionEnd);\n\n // Reset the array.\n this._transitions.length = 0;\n\n // Show it's no longer active.\n this.isTransitioning = false;\n }\n\n /**\n * Apply styles without a transition.\n * @param {Array.} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n let elements = objects.map(obj => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(this._getStylesForTransition(obj));\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatchLayout();\n }\n\n _dispatchLayout() {\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|Function|Array.} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {Object} [sortObj] A sort object which can sort the visible set\n */\n filter(category, sortObj) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS;\n }\n\n this._filter(category);\n\n // Shrink each hidden item\n this._shrink();\n\n // How many visible elements?\n this._updateItemCount();\n\n // Update transforms on visible elements so they will animate to their new positions.\n this.sort(sortObj);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {Object} opts the options object for the sorted plugin\n */\n sort(opts = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n var items = this._getFilteredItems();\n items = sorter(items, opts);\n\n this._layout(items);\n\n // `_layout` always happens after `_shrink`, so it's safe to process the style\n // queue here with styles from the shrink method.\n this._processQueue();\n\n // Adjust the height of the container.\n this._setContainerSize();\n\n this.lastSort = opts;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n * recalculated.\n */\n update(isOnlyLayout) {\n if (this.isEnabled) {\n\n if (!isOnlyLayout) {\n // Get updated colCount\n this._setColumns();\n }\n\n // Layout items\n this.sort();\n }\n }\n\n /**\n * Use this instead of `update()` if you don't need the columns and gutters updated\n * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n * could be off.\n */\n layout() {\n this.update(true);\n }\n\n /**\n * New items have been appended to shuffle. Mix them in with the current\n * filter or sort status.\n * @param {Array.} newItems Collection of new items.\n */\n add(newItems) {\n newItems = arrayUnique(newItems).map(el => new ShuffleItem(el));\n\n // Add classes and set initial positions.\n this._initItems(newItems);\n\n // Add transition to each item.\n this._setTransitions(newItems);\n\n // Update the list of items.\n this.items = this.items.concat(newItems);\n this._updateItemsOrder();\n this.filter(this.lastFilter);\n }\n\n /**\n * Disables shuffle from updating dimensions and layout on resize\n */\n disable() {\n this.isEnabled = false;\n }\n\n /**\n * Enables shuffle again\n * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n */\n enable(isUpdateLayout) {\n this.isEnabled = true;\n if (isUpdateLayout !== false) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items\n * @param {Array.} collection An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle object\n */\n remove(collection) {\n if (!collection.length) {\n return;\n }\n\n collection = arrayUnique(collection);\n\n let oldItems = collection\n .map(element => this.getItemByElement(element))\n .filter(item => !!item);\n\n let handleLayout = () => {\n this.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n this._disposeItems(oldItems);\n\n // Remove the collection in the callback\n collection.forEach((element) => {\n element.parentNode.removeChild(element);\n });\n\n this._dispatch(Shuffle.EventType.REMOVED, { collection });\n\n // Let it get garbage collected\n collection = null;\n oldItems = null;\n };\n\n // Hide collection first.\n this._toggleFilterClasses({\n visible: [],\n hidden: oldItems,\n });\n\n this._shrink(oldItems);\n\n this.sort();\n\n // Update the list of items here because `remove` could be called again\n // with an item that is in the process of being removed.\n this.items = this.items.filter(item => !arrayIncludes(oldItems, item));\n this._updateItemCount();\n\n this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n }\n\n /**\n * Retrieve a shuffle item by its element.\n * @param {Element} element Element to look for.\n * @return {?ShuffleItem} A shuffle item or null if it's not found.\n */\n getItemByElement(element) {\n for (var i = this.items.length - 1; i >= 0; i--) {\n if (this.items[i].element === element) {\n return this.items[i];\n }\n }\n\n return null;\n }\n\n /**\n * Destroys shuffle, removes events, styles, and classes\n */\n destroy() {\n this._cancelMovement();\n window.removeEventListener('resize', this._onResize);\n\n // Reset container styles\n this.element.classList.remove('shuffle');\n this.element.removeAttribute('style');\n\n // Reset individual item styles\n this._disposeItems();\n\n // Null DOM references\n this.items = null;\n this.options.sizer = null;\n this.element = null;\n this._transitions = null;\n\n // Set a flag so if a debounced resize has been triggered,\n // it can first check if it is actually isDestroyed and not doing anything\n this.isDestroyed = true;\n }\n\n /**\n * Returns the outer width of an element, optionally including its margins.\n *\n * There are a few different methods for getting the width of an element, none of\n * which work perfectly for all Shuffle's use cases.\n *\n * 1. getBoundingClientRect() `left` and `right` properties.\n * - Accounts for transform scaled elements, making it useless for Shuffle\n * elements which have shrunk.\n * 2. The `offsetWidth` property.\n * - This value stays the same regardless of the elements transform property,\n * however, it does not return subpixel values.\n * 3. getComputedStyle()\n * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n * padding and border when box-sizing: border-box is set, requiring a feature\n * test and extra work to add the padding back for IE and other browsers which\n * follow the W3C spec here.\n *\n * @param {Element} element The element.\n * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins) {\n // Store the styles so that they can be used by others without asking for it again.\n var styles = window.getComputedStyle(element, null);\n var width = getNumberStyle(element, 'width', styles);\n var height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n var marginLeft = getNumberStyle(element, 'marginLeft', styles);\n var marginRight = getNumberStyle(element, 'marginRight', styles);\n var marginTop = getNumberStyle(element, 'marginTop', styles);\n var marginBottom = getNumberStyle(element, 'marginBottom', styles);\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n }\n\n return {\n width,\n height,\n };\n }\n\n /**\n * Change a property or execute a function which will not have a transition\n * @param {Array.} elements DOM elements that won't be transitioned.\n * @param {Function} callback A function which will be called while transition\n * is set to 0ms.\n * @private\n */\n static _skipTransitions(elements, callback) {\n let zero = '0ms';\n\n // Save current duration and delay.\n let data = elements.map((element) => {\n let style = element.style;\n let duration = style.transitionDuration;\n let delay = style.transitionDelay;\n\n // Set the duration to zero so it happens immediately\n style.transitionDuration = zero;\n style.transitionDelay = zero;\n\n return {\n duration,\n delay,\n };\n });\n\n callback();\n\n // Cause reflow.\n elements[0].offsetWidth; // jshint ignore:line\n\n // Put the duration back\n elements.forEach((element, i) => {\n element.style.transitionDuration = data[i].duration;\n element.style.transitionDelay = data[i].delay;\n });\n }\n}\n\nShuffle.ShuffleItem = ShuffleItem;\n\nShuffle.ALL_ITEMS = 'all';\nShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\n/**\n * @enum {string}\n */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n// Overrideable options\nShuffle.options = {\n // Initial filter group.\n group: Shuffle.ALL_ITEMS,\n\n // Transition/animation speed (milliseconds).\n speed: 250,\n\n // CSS easing function to use.\n easing: 'ease',\n\n // e.g. '.picture-item'.\n itemSelector: '*',\n\n // Element or selector string. Use an element to determine the size of columns\n // and gutters.\n sizer: null,\n\n // A static number or function that tells the plugin how wide the gutters\n // between columns are (in pixels).\n gutterWidth: 0,\n\n // A static number or function that returns a number which tells the plugin\n // how wide the columns are (in pixels).\n columnWidth: 0,\n\n // If your group is not json, and is comma delimeted, you could set delimeter\n // to ','.\n delimeter: null,\n\n // Useful for percentage based heights when they might not always be exactly\n // the same (in pixels).\n buffer: 0,\n\n // Reading the width of elements isn't precise enough and can cause columns to\n // jump between values.\n columnThreshold: 0.01,\n\n // Shuffle can be isInitialized with a sort object. It is the same object\n // given to the sort method.\n initialSort: null,\n\n // By default, shuffle will throttle resize events. This can be changed or\n // removed.\n throttle: throttle,\n\n // How often shuffle can be called on resize (in milliseconds).\n throttleTime: 300,\n\n // Transition delay offset for each item in milliseconds.\n staggerAmount: 15,\n\n // Maximum stagger delay in milliseconds.\n staggerAmountMax: 250,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n};\n\n// Expose for testing. Hack at your own risk.\nShuffle.__Point = Point;\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\n\nexport default Shuffle;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle.js\n **/","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n new window.CustomEvent(\"test\");\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/custom-event-polyfill/custom-event-polyfill.js\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nvar proto = Element.prototype;\nvar vendor = proto.matches\n || proto.matchesSelector\n || proto.webkitMatchesSelector\n || proto.mozMatchesSelector\n || proto.msMatchesSelector\n || proto.oMatchesSelector;\n\nmodule.exports = match;\n\n/**\n * Match `el` to `selector`.\n *\n * @param {Element} el\n * @param {String} selector\n * @return {Boolean}\n * @api public\n */\n\nfunction match(el, selector) {\n if (vendor) return vendor.call(el, selector);\n var nodes = el.parentNode.querySelectorAll(selector);\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] == el) return true;\n }\n return false;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/matches-selector/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-uniq/index.js\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/xtend/immutable.js\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = throttle;\n\n/**\n * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n *\n * @param {Function} func Function to wrap.\n * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n * @return {Function} A new function that wraps the `func` function passed in.\n */\n\nfunction throttle (func, wait) {\n var ctx, args, rtn, timeoutID; // caching\n var last = 0;\n\n return function throttled () {\n ctx = this;\n args = arguments;\n var delta = new Date() - last;\n if (!timeoutID)\n if (delta >= wait) call();\n else timeoutID = setTimeout(call, wait - delta);\n return rtn;\n };\n\n function call () {\n timeoutID = 0;\n last = +new Date();\n rtn = func.apply(ctx, args);\n ctx = null;\n args = null;\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/throttleit/index.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function parallel(fns, context, callback) {\n if (!callback) {\n if (typeof context === 'function') {\n callback = context\n context = null\n } else {\n callback = noop\n }\n }\n\n var pending = fns && fns.length\n if (!pending) return callback(null, []);\n\n var finished = false\n var results = new Array(pending)\n\n fns.forEach(context ? function (fn, i) {\n fn.call(context, maybeDone(i))\n } : function (fn, i) {\n fn(maybeDone(i))\n })\n\n function maybeDone(i) {\n return function (err, result) {\n if (finished) return;\n\n if (err) {\n callback(err, results)\n finished = true\n return\n }\n\n results[i] = result\n\n if (!--pending) callback(null, results);\n }\n }\n}\n\nfunction noop() {}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-parallel/index.js\n ** module id = 7\n ** module chunks = 0\n **/","'use strict';\n\nimport getNumber from './get-number';\n\n/**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\nconst Point = function (x, y) {\n this.x = getNumber(x);\n this.y = getNumber(y);\n};\n\n/**\n * Whether two points are equal.\n * @param {Point} a Point A.\n * @param {Point} b Point B.\n * @return {boolean}\n */\nPoint.equals = function (a, b) {\n return a.x === b.x && a.y === b.y;\n};\n\nexport default Point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/point.js\n **/","'use strict';\n\n/**\n * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n * @param {*} value Possibly numeric value.\n * @return {number} `value` or zero if `value` isn't numeric.\n */\nexport default function getNumber(value) {\n return parseFloat(value) || 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number.js\n **/","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element) {\n this.id = id++;\n this.element = element;\n this.isVisible = true;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.scale = ShuffleItem.Scale.VISIBLE;\n this.point = new Point();\n }\n\n addClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.add(className);\n });\n }\n\n removeClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.remove(className);\n });\n }\n\n applyCss(obj) {\n for (var key in obj) {\n this.element.style[key] = obj[key];\n }\n }\n\n dispose() {\n this.removeClasses([\n Classes.HIDDEN,\n Classes.VISIBLE,\n Classes.SHUFFLE_ITEM,\n ]);\n\n this.element.removeAttribute('style');\n this.element = null;\n }\n}\n\nShuffleItem.Css = {\n INITIAL: {\n position: 'absolute',\n top: 0,\n left: 0,\n visibility: 'visible',\n 'will-change': 'transform',\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {},\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle-item.js\n **/","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/classes.js\n **/","'use strict';\n\nimport getNumber from './get-number';\nimport COMPUTED_SIZE_INCLUDES_PADDING from './computed-size';\n\n/**\n * Retrieve the computed style for an element, parsed as a float.\n * @param {Element} element Element to get style for.\n * @param {string} style Style property.\n * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n * use instead of asking for them again.\n * @return {number} The parsed computed value or zero if that fails because IE\n * will return 'auto' when the element doesn't have margins instead of\n * the computed style.\n */\nexport default function getNumberStyle(element, style,\n styles = window.getComputedStyle(element, null)) {\n var value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'width') {\n value += getNumber(styles.paddingLeft) +\n getNumber(styles.paddingRight) +\n getNumber(styles.borderLeftWidth) +\n getNumber(styles.borderRightWidth);\n } else if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'height') {\n value += getNumber(styles.paddingTop) +\n getNumber(styles.paddingBottom) +\n getNumber(styles.borderTopWidth) +\n getNumber(styles.borderBottomWidth);\n }\n\n return value;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number-style.js\n **/","\nlet element = document.body || document.documentElement;\nlet e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nlet width = window.getComputedStyle(e, null).width;\nlet ret = width === '10px';\n\nelement.removeChild(e);\n\nexport default ret;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/computed-size.js\n **/","'use strict';\n\nimport xtend from 'xtend';\n\n// http://stackoverflow.com/a/962890/373422\nfunction randomize(array) {\n var tmp;\n var current;\n let top = array.length;\n\n if (!top) {\n return array;\n }\n\n while (--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n\n return array;\n}\n\nlet defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // If true, this will skip the sorting and return a randomized order in the array\n randomize: false,\n\n // Determines which property of each item in the array is passed to the\n // sorting method.\n key: 'element',\n};\n\n// You can return `undefined` from the `by` function to revert to DOM order.\nexport default function sorter(arr, options) {\n let opts = xtend(defaults, options);\n let original = [].slice.call(arr);\n let revert = false;\n\n if (!arr.length) {\n return [];\n }\n\n if (opts.randomize) {\n return randomize(arr);\n }\n\n // Sort the elements by the opts.by function.\n // If we don't have opts.by, default to DOM order\n if (typeof opts.by === 'function') {\n arr.sort(function (a, b) {\n\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n let valA = opts.by(a[opts.key]);\n let valB = opts.by(b[opts.key]);\n\n // If both values are undefined, use the DOM order\n if (valA === undefined && valB === undefined) {\n revert = true;\n return 0;\n }\n\n if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n return -1;\n }\n\n if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n return 1;\n }\n\n return 0;\n });\n }\n\n // Revert to the original array if necessary\n if (revert) {\n return original;\n }\n\n if (opts.reverse) {\n arr.reverse();\n }\n\n return arr;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/sorter.js\n **/","'use strict';\n\nlet transitions = {};\nlet eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n return eventName + count++;\n}\n\nexport function onTransitionEnd(element, callback) {\n let id = uniqueId();\n let listener = (evt) => {\n if (evt.currentTarget === evt.target) {\n cancelTransitionEnd(id);\n callback(evt);\n }\n };\n\n element.addEventListener(eventName, listener);\n\n transitions[id] = { element, listener };\n\n return id;\n}\n\nexport function cancelTransitionEnd(id) {\n if (transitions[id]) {\n transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n transitions[id] = null;\n return true;\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/on-transition-end.js\n **/","'use strict';\n\nimport Point from './point';\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayMin(array) {\n return Math.min.apply(Math, array);\n}\n\n/**\n * Determine the location of the next item, based on its size.\n * @param {Object} itemSize Object with width and height.\n * @param {Array.} positions Positions of the other current items.\n * @param {number} gridSize The column width or row height.\n * @param {number} total The total number of columns or rows.\n * @param {number} threshold Buffer value for the column to fit.\n * @param {number} buffer Vertical buffer for the height of items.\n * @return {Point}\n */\nexport function getItemPosition({ itemSize, positions, gridSize, total, threshold, buffer }) {\n var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n var setY = getAvailablePositions(positions, span, total);\n var shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n var point = new Point(\n Math.round(gridSize * shortColumnIndex),\n Math.round(setY[shortColumnIndex]));\n\n // Update the columns array with the new values for each column.\n // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n var setHeight = setY[shortColumnIndex] + itemSize.height;\n for (var i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * Determine the number of columns an items spans.\n * @param {number} itemWidth Width of the item.\n * @param {number} columnWidth Width of the column (includes gutter).\n * @param {number} columns Total number of columns\n * @param {number} threshold A buffer value for the size of the column to fit.\n * @return {number}\n */\nexport function getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n var columnSpan = itemWidth / columnWidth;\n\n // If the difference between the rounded column span number and the\n // calculated column span number is really small, round the number to\n // make it fit.\n if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n // e.g. columnSpan = 4.0089945390298745\n columnSpan = Math.round(columnSpan);\n }\n\n // Ensure the column span is not more than the amount of columns in the whole layout.\n return Math.min(Math.ceil(columnSpan), columns);\n}\n\n/**\n * Retrieves the column set to use for placement.\n * @param {number} columnSpan The number of columns this current item spans.\n * @param {number} columns The total columns in the grid.\n * @return {Array.} An array of numbers represeting the column set.\n */\nexport function getAvailablePositions(positions, columnSpan, columns) {\n // The item spans only one column.\n if (columnSpan === 1) {\n return positions;\n }\n\n // The item spans more than one column, figure out how many different\n // places it could fit horizontally.\n // The group count is the number of places within the positions this block\n // could fit, ignoring the current positions of items.\n // Imagine a 2 column brick as the second item in a 4 column grid with\n // 10px height each. Find the places it would fit:\n // [20, 10, 10, 0]\n // | | |\n // * * *\n //\n // Then take the places which fit and get the bigger of the two:\n // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 0]\n // |\n // *\n //\n // And that's where it should be placed!\n //\n // Another example where the second column's item extends past the first:\n // [10, 20, 10, 0] => [20, 20, 10] => 10\n var available = [];\n\n // For how many possible positions for this item there are.\n for (var i = 0; i <= columns - columnSpan; i++) {\n // Find the bigger value for each place it could fit.\n available.push(arrayMax(positions.slice(i, i + columnSpan)));\n }\n\n return available;\n}\n\n/**\n * Find index of short column, the first from the left where this item will go.\n *\n * @param {Array.} positions The array to search for the smallest number.\n * @param {number} buffer Optional buffer which is very useful when the height\n * is a percentage of the width.\n * @return {number} Index of the short column.\n */\nexport function getShortColumn(positions, buffer) {\n var minPosition = arrayMin(positions);\n for (var i = 0, len = positions.length; i < len; i++) {\n if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n return i;\n }\n }\n\n return 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layout.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 4095056dc73f103cea04","webpack:///./src/index.js","webpack:///./src/shuffle.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/array-uniq/index.js","webpack:///./~/xtend/immutable.js","webpack:///./~/throttleit/index.js","webpack:///./~/array-parallel/index.js","webpack:///./src/point.js","webpack:///./src/get-number.js","webpack:///./src/shuffle-item.js","webpack:///./src/classes.js","webpack:///./src/get-number-style.js","webpack:///./src/computed-size.js","webpack:///./src/sorter.js","webpack:///./src/on-transition-end.js","webpack:///./src/layout.js"],"names":[],"mappings":"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AACA;AACA;;AAEA;AACA,oCAAmC;AACnC;;;;;;;ACxBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,kBAAiB,kBAAkB;AACnC;AACA;AACA;AACA,E;;;;;;AC5BA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,EAAC;AACD;AACA;;;;;;;;AC3DA;;AAEA;;AAEA;AACA;;AAEA,oBAAmB,sBAAsB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;AClBA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,OAAO;AAClB,aAAY,SAAS;AACrB;;AAEA;AACA,iCAAgC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;ACvCA;;;;;;AAEA;;;;;;;;;;;AAOA,KAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,CAAb,EAAgB;AAC5B,QAAK,CAAL,GAAS,yBAAU,CAAV,CAAT,CAD4B;AAE5B,QAAK,CAAL,GAAS,yBAAU,CAAV,CAAT,CAF4B;EAAhB;;;;;;;;AAWd,OAAM,MAAN,GAAe,UAAU,C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","file":"shuffle.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 4095056dc73f103cea04\n **/","module.exports = require('./shuffle').default;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","'use strict';\n\nimport 'custom-event-polyfill';\nimport matches from 'matches-selector';\nimport arrayUnique from 'array-uniq';\nimport xtend from 'xtend';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\nimport Point from './point';\nimport ShuffleItem from './shuffle-item';\nimport Classes from './classes';\nimport getNumberStyle from './get-number-style';\nimport sorter from './sorter';\nimport { onTransitionEnd, cancelTransitionEnd } from './on-transition-end';\nimport { getItemPosition, getColumnSpan, getAvailablePositions, getShortColumn } from './layout';\n\nfunction toArray(arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n}\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayIncludes(array, obj) {\n if (arguments.length === 2) {\n return arrayIncludes(array)(obj);\n }\n\n return function (obj) {\n return array.indexOf(obj) > -1;\n };\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle {\n\n /**\n * Categorize, sort, and filter a responsive grid of items.\n *\n * @param {Element} element An element which is the parent container for the grid items.\n * @param {Object} [options=Shuffle.options] Options object.\n * @constructor\n */\n constructor(element, options = {}) {\n this.options = xtend(Shuffle.options, options);\n\n this.useSizer = false;\n this.lastSort = {};\n this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n this.isEnabled = true;\n this.isDestroyed = false;\n this.isInitialized = false;\n this._transitions = [];\n this.isTransitioning = false;\n this._queue = [];\n\n element = this._getElementOption(element);\n\n if (!element) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = element;\n this.id = 'shuffle_' + id++;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n\n this.options.sizer = this._getElementOption(this.options.sizer);\n\n if (this.options.sizer) {\n this.useSizer = true;\n }\n\n // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems();\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // Get container css all in one request. Causes reflow\n var containerCss = window.getComputedStyle(this.element, null);\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // Add styles to the container if it doesn't have them.\n this._validateStyles(containerCss);\n\n // We already got the container's width above, no need to cause another\n // reflow getting it again... Calculate the number of columns there will be\n this._setColumns(containerWidth);\n\n // Kick off!\n this.filter(this.options.group, this.options.initialSort);\n\n // The shuffle items haven't had transitions set on them yet so the user\n // doesn't see the first layout. Set them now that the first layout is done.\n // First, however, a synchronous layout must be caused for the previous\n // styles to be applied without transitions.\n this.element.offsetWidth; // jshint ignore: line\n this._setTransitions();\n this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n }\n\n /**\n * Returns a throttled and proxied function for the resize handler.\n * @return {Function}\n * @private\n */\n _getResizeFunction() {\n var resizeFunction = this._handleResize.bind(this);\n return this.options.throttle ?\n this.options.throttle(resizeFunction, this.options.throttleTime) :\n resizeFunction;\n }\n\n /**\n * Retrieve an element from an option.\n * @param {string|jQuery|Element} option The option to check.\n * @return {?Element} The plain element or null.\n * @private\n */\n _getElementOption(option) {\n // If column width is a string, treat is as a selector and search for the\n // sizer element within the outermost container\n if (typeof option === 'string') {\n return this.element.querySelector(option);\n\n // Check for an element\n } else if (option && option.nodeType && option.nodeType === 1) {\n return option;\n\n // Check for jQuery object\n } else if (option && option.jquery) {\n return option[0];\n }\n\n return null;\n }\n\n /**\n * Ensures the shuffle container has the css styles it needs applied to it.\n * @param {Object} styles Key value pairs for position and overflow.\n * @private\n */\n _validateStyles(styles) {\n // Position cannot be static.\n if (styles.position === 'static') {\n this.element.style.position = 'relative';\n }\n\n // Overflow has to be hidden.\n if (styles.overflow !== 'hidden') {\n this.element.style.overflow = 'hidden';\n }\n }\n\n /**\n * Filter the elements by a category.\n * @param {string} [category] Category to filter by. If it's given, the last\n * category will be used to filter the items.\n * @param {Array} [collection] Optionally filter a collection. Defaults to\n * all the items.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n var set = this._getFilteredSets(category, collection);\n\n // Individually add/remove hidden/visible classes\n this._toggleFilterClasses(set);\n\n // Save the last filter in case elements are appended.\n this.lastFilter = category;\n\n // This is saved mainly because providing a filter function (like searching)\n // will overwrite the `lastFilter` property every time its called.\n if (typeof category === 'string') {\n this.group = category;\n }\n\n return set;\n }\n\n /**\n * Returns an object containing the visible and hidden elements.\n * @param {string|Function} category Category or function to filter by.\n * @param {Array.} items A collection of items to filter.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n let hidden = [];\n\n // category === 'all', add visible class to everything\n if (category === Shuffle.ALL_ITEMS) {\n visible = items;\n\n // Loop through each item and use provided function to determine\n // whether to hide it or not.\n } else {\n items.forEach((item) => {\n if (this._doesPassFilter(category, item.element)) {\n visible.push(item);\n } else {\n hidden.push(item);\n }\n });\n }\n\n return {\n visible,\n hidden,\n };\n }\n\n /**\n * Test an item to see if it passes a category.\n * @param {string|Function} category Category or function to filter by.\n * @param {Element} element An element to test.\n * @return {boolean} Whether it passes the category/filter.\n * @private\n */\n _doesPassFilter(category, element) {\n\n if (typeof category === 'function') {\n return category.call(element, element, this);\n\n // Check each element's data-groups attribute against the given category.\n } else {\n let attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n let groups = JSON.parse(attr);\n let keys = this.delimeter && !Array.isArray(groups) ?\n groups.split(this.delimeter) :\n groups;\n\n if (Array.isArray(category)) {\n return category.some(arrayIncludes(keys));\n }\n\n return arrayIncludes(keys, category);\n }\n }\n\n /**\n * Toggles the visible and hidden class names.\n * @param {{visible, hidden}} Object with visible and hidden arrays.\n * @private\n */\n _toggleFilterClasses({ visible, hidden }) {\n visible.forEach((item) => {\n item.show();\n });\n\n hidden.forEach((item) => {\n item.hide();\n });\n }\n\n /**\n * Set the initial css for each item\n * @param {Array.} [items] Optionally specifiy at set to initialize.\n * @private\n */\n _initItems(items = this.items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @private\n */\n _disposeItems(items = this.items) {\n items.forEach((item) => {\n item.dispose();\n });\n }\n\n /**\n * Updates the visible item count.\n * @private\n */\n _updateItemCount() {\n this.visibleItems = this._getFilteredItems().length;\n }\n\n /**\n * Sets css transform transition on a group of elements. This is not executed\n * at the same time as `item.init` so that transitions don't occur upon\n * initialization of Shuffle.\n * @param {Array.} items Shuffle items to set transitions on.\n * @private\n */\n _setTransitions(items = this.items) {\n let speed = this.options.speed;\n let easing = this.options.easing;\n\n var str;\n if (this.options.useTransforms) {\n str = 'transform ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n } else {\n str = 'top ' + speed + 'ms ' + easing +\n ', left ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n }\n\n items.forEach((item) => {\n item.element.style.transition = str;\n });\n }\n\n _getItems() {\n return toArray(this.element.children)\n .filter(el => matches(el, this.options.itemSelector))\n .map(el => new ShuffleItem(el));\n }\n\n /**\n * When new elements are added to the shuffle container, update the array of\n * items because that is the order `_layout` calls them.\n */\n _updateItemsOrder() {\n let children = this.element.children;\n this.items = sorter(this.items, {\n by(element) {\n return Array.prototype.indexOf.call(children, element);\n },\n });\n }\n\n _getFilteredItems() {\n return this.items.filter(item => item.isVisible);\n }\n\n _getConcealedItems() {\n return this.items.filter(item => !item.isVisible);\n }\n\n /**\n * Returns the column size, based on column width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @param {number} gutterSize Size of the gutters.\n * @return {number}\n * @private\n */\n _getColumnSize(containerWidth, gutterSize) {\n var size;\n\n // If the columnWidth property is a function, then the grid is fluid\n if (typeof this.options.columnWidth === 'function') {\n size = this.options.columnWidth(containerWidth);\n\n // columnWidth option isn't a function, are they using a sizing element?\n } else if (this.useSizer) {\n size = Shuffle.getSize(this.options.sizer).width;\n\n // if not, how about the explicitly set option?\n } else if (this.options.columnWidth) {\n size = this.options.columnWidth;\n\n // or use the size of the first item\n } else if (this.items.length > 0) {\n size = Shuffle.getSize(this.items[0].element, true).width;\n\n // if there's no items, use size of container\n } else {\n size = containerWidth;\n }\n\n // Don't let them set a column width of zero.\n if (size === 0) {\n size = containerWidth;\n }\n\n return size + gutterSize;\n }\n\n /**\n * Returns the gutter size, based on gutter width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @return {number}\n * @private\n */\n _getGutterSize(containerWidth) {\n var size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.useSizer) {\n size = getNumberStyle(this.options.sizer, 'marginLeft');\n } else {\n size = this.options.gutterWidth;\n }\n\n return size;\n }\n\n /**\n * Calculate the number of columns to be used. Gets css if using sizer element.\n * @param {number} [containerWidth] Optionally specify a container width if\n * it's already available.\n */\n _setColumns(containerWidth = Shuffle.getSize(this.element).width) {\n var gutter = this._getGutterSize(containerWidth);\n var columnWidth = this._getColumnSize(containerWidth, gutter);\n var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\n // Widths given from getStyles are not precise enough...\n if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) <\n this.options.columnThreshold) {\n // e.g. calculatedColumns = 11.998876\n calculatedColumns = Math.round(calculatedColumns);\n }\n\n this.cols = Math.max(Math.floor(calculatedColumns), 1);\n this.containerWidth = containerWidth;\n this.colWidth = columnWidth;\n }\n\n /**\n * Adjust the height of the grid\n */\n _setContainerSize() {\n this.element.style.height = this._getContainerSize() + 'px';\n }\n\n /**\n * Based on the column heights, it returns the biggest one.\n * @return {number}\n * @private\n */\n _getContainerSize() {\n return arrayMax(this.positions);\n }\n\n /**\n * Get the clamped stagger amount.\n * @param {number} index Index of the item to be staggered.\n * @return {number}\n */\n _getStaggerAmount(index) {\n return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n }\n\n /**\n * @return {boolean} Whether the event was prevented or not.\n */\n _dispatch(name, details = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n details.shuffle = this;\n return !this.element.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n cancelable: false,\n detail: details,\n }));\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n var i = this.cols;\n this.positions = [];\n while (i--) {\n this.positions.push(0);\n }\n }\n\n /**\n * Loops through each item that should be shown and calculates the x, y position.\n * @param {Array.} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n let count = 0;\n items.forEach((item) => {\n var currPos = item.point;\n var currScale = item.scale;\n var itemSize = Shuffle.getSize(item.element, true);\n var pos = this._getItemPosition(itemSize);\n\n function callback() {\n item.element.style.transitionDelay = '';\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(currPos, pos) && currScale === ShuffleItem.Scale.VISIBLE) {\n callback();\n return;\n }\n\n item.point = pos;\n item.scale = ShuffleItem.Scale.VISIBLE;\n\n // Use xtend here to clone the object so that the `before` object isn't\n // modified when the transition delay is added.\n let styles = xtend(ShuffleItem.Css.VISIBLE.before);\n styles.transitionDelay = this._getStaggerAmount(count) + 'ms';\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Determine the location of the next item, based on its size.\n * @param {{width: number, height: number}} itemSize Object with width and height.\n * @return {Point}\n * @private\n */\n _getItemPosition(itemSize) {\n return getItemPosition({\n itemSize,\n positions: this.positions,\n gridSize: this.colWidth,\n total: this.cols,\n threshold: this.options.columnThreshold,\n buffer: this.options.buffer,\n });\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {Array.} collection Collection to shrink.\n * @private\n */\n _shrink(collection = this._getConcealedItems()) {\n let count = 0;\n collection.forEach((item) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n }\n\n // Continuing would add a transitionend event listener to the element, but\n // that listener would not execute because the transform and opacity would\n // stay the same.\n // The callback is executed here because it is not guaranteed to be called\n // after the transitionend event because the transitionend could be\n // canceled if another animation starts.\n if (item.scale === ShuffleItem.Scale.HIDDEN) {\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n\n let styles = xtend(ShuffleItem.Css.HIDDEN.before);\n styles.transitionDelay = this._getStaggerAmount(count) + 'ms';\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Resize handler.\n * @private\n */\n _handleResize() {\n // If shuffle is disabled, destroyed, don't do anything\n if (!this.isEnabled || this.isDestroyed) {\n return;\n }\n\n // Will need to check height in the future if it's layed out horizontaly\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // containerWidth hasn't changed, don't do anything\n if (containerWidth === this.containerWidth) {\n return;\n }\n\n this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {Object} obj Transition options.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @private\n */\n _getStylesForTransition({ item, styles }) {\n if (!styles.transitionDelay) {\n styles.transitionDelay = '0ms';\n }\n\n let x = item.point.x;\n let y = item.point.y;\n\n if (this.options.useTransforms) {\n styles.transform = `translate(${x}px, ${y}px) scale(${item.scale})`;\n } else {\n styles.left = x + 'px';\n styles.top = y + 'px';\n }\n\n return styles;\n }\n\n /**\n * Listen for the transition end on an element and execute the itemCallback\n * when it finishes.\n * @param {Element} element Element to listen on.\n * @param {Function} itemCallback Callback for the item.\n * @param {Function} done Callback to notify `parallel` that this one is done.\n */\n _whenTransitionDone(element, itemCallback, done) {\n let id = onTransitionEnd(element, (evt) => {\n itemCallback();\n done(null, evt);\n });\n\n this._transitions.push(id);\n }\n\n /**\n * Return a function which will set CSS styles and call the `done` function\n * when (if) the transition finishes.\n * @param {Object} opts Transition object.\n * @return {Function} A function to be called with a `done` function.\n */\n _getTransitionFunction(opts) {\n return (done) => {\n opts.item.applyCss(this._getStylesForTransition(opts));\n this._whenTransitionDone(opts.item.element, opts.callback, done);\n };\n }\n\n /**\n * Execute the styles gathered in the style queue. This applies styles to elements,\n * triggering transitions.\n * @private\n */\n _processQueue() {\n if (this.isTransitioning) {\n this._cancelMovement();\n }\n\n let hasSpeed = this.options.speed > 0;\n let hasQueue = this._queue.length > 0;\n\n if (hasQueue && hasSpeed && this.isInitialized) {\n this._startTransitions(this._queue);\n\n } else if (hasQueue) {\n this._styleImmediately(this._queue);\n this._dispatchLayout();\n\n // A call to layout happened, but none of the newly visible items will\n // change position or the transition duration is zero, which will not trigger\n // the transitionend event.\n } else {\n this._dispatchLayout();\n }\n\n // Remove everything in the style queue\n this._queue.length = 0;\n }\n\n /**\n * Wait for each transition to finish, the emit the layout event.\n * @param {Array.} transitions Array of transition objects.\n */\n _startTransitions(transitions) {\n // Set flag that shuffle is currently in motion.\n this.isTransitioning = true;\n\n // Create an array of functions to be called.\n let callbacks = transitions.map(obj => this._getTransitionFunction(obj));\n\n parallel(callbacks, this._movementFinished.bind(this));\n }\n\n _cancelMovement() {\n // Remove the transition end event for each listener.\n this._transitions.forEach(cancelTransitionEnd);\n\n // Reset the array.\n this._transitions.length = 0;\n\n // Show it's no longer active.\n this.isTransitioning = false;\n }\n\n /**\n * Apply styles without a transition.\n * @param {Array.} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n let elements = objects.map(obj => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(this._getStylesForTransition(obj));\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatchLayout();\n }\n\n _dispatchLayout() {\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|Function|Array.} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {Object} [sortObj] A sort object which can sort the visible set\n */\n filter(category, sortObj) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS;\n }\n\n this._filter(category);\n\n // Shrink each hidden item\n this._shrink();\n\n // How many visible elements?\n this._updateItemCount();\n\n // Update transforms on visible elements so they will animate to their new positions.\n this.sort(sortObj);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {Object} opts the options object for the sorted plugin\n */\n sort(opts = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n var items = this._getFilteredItems();\n items = sorter(items, opts);\n\n this._layout(items);\n\n // `_layout` always happens after `_shrink`, so it's safe to process the style\n // queue here with styles from the shrink method.\n this._processQueue();\n\n // Adjust the height of the container.\n this._setContainerSize();\n\n this.lastSort = opts;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n * recalculated.\n */\n update(isOnlyLayout) {\n if (this.isEnabled) {\n\n if (!isOnlyLayout) {\n // Get updated colCount\n this._setColumns();\n }\n\n // Layout items\n this.sort();\n }\n }\n\n /**\n * Use this instead of `update()` if you don't need the columns and gutters updated\n * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n * could be off.\n */\n layout() {\n this.update(true);\n }\n\n /**\n * New items have been appended to shuffle. Mix them in with the current\n * filter or sort status.\n * @param {Array.} newItems Collection of new items.\n */\n add(newItems) {\n newItems = arrayUnique(newItems).map(el => new ShuffleItem(el));\n\n // Add classes and set initial positions.\n this._initItems(newItems);\n\n // Add transition to each item.\n this._setTransitions(newItems);\n\n // Update the list of items.\n this.items = this.items.concat(newItems);\n this._updateItemsOrder();\n this.filter(this.lastFilter);\n }\n\n /**\n * Disables shuffle from updating dimensions and layout on resize\n */\n disable() {\n this.isEnabled = false;\n }\n\n /**\n * Enables shuffle again\n * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n */\n enable(isUpdateLayout) {\n this.isEnabled = true;\n if (isUpdateLayout !== false) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items\n * @param {Array.} collection An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle object\n */\n remove(collection) {\n if (!collection.length) {\n return;\n }\n\n collection = arrayUnique(collection);\n\n let oldItems = collection\n .map(element => this.getItemByElement(element))\n .filter(item => !!item);\n\n let handleLayout = () => {\n this.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n this._disposeItems(oldItems);\n\n // Remove the collection in the callback\n collection.forEach((element) => {\n element.parentNode.removeChild(element);\n });\n\n this._dispatch(Shuffle.EventType.REMOVED, { collection });\n\n // Let it get garbage collected\n collection = null;\n oldItems = null;\n };\n\n // Hide collection first.\n this._toggleFilterClasses({\n visible: [],\n hidden: oldItems,\n });\n\n this._shrink(oldItems);\n\n this.sort();\n\n // Update the list of items here because `remove` could be called again\n // with an item that is in the process of being removed.\n this.items = this.items.filter(item => !arrayIncludes(oldItems, item));\n this._updateItemCount();\n\n this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n }\n\n /**\n * Retrieve a shuffle item by its element.\n * @param {Element} element Element to look for.\n * @return {?ShuffleItem} A shuffle item or null if it's not found.\n */\n getItemByElement(element) {\n for (var i = this.items.length - 1; i >= 0; i--) {\n if (this.items[i].element === element) {\n return this.items[i];\n }\n }\n\n return null;\n }\n\n /**\n * Destroys shuffle, removes events, styles, and classes\n */\n destroy() {\n this._cancelMovement();\n window.removeEventListener('resize', this._onResize);\n\n // Reset container styles\n this.element.classList.remove('shuffle');\n this.element.removeAttribute('style');\n\n // Reset individual item styles\n this._disposeItems();\n\n // Null DOM references\n this.items = null;\n this.options.sizer = null;\n this.element = null;\n this._transitions = null;\n\n // Set a flag so if a debounced resize has been triggered,\n // it can first check if it is actually isDestroyed and not doing anything\n this.isDestroyed = true;\n }\n\n /**\n * Returns the outer width of an element, optionally including its margins.\n *\n * There are a few different methods for getting the width of an element, none of\n * which work perfectly for all Shuffle's use cases.\n *\n * 1. getBoundingClientRect() `left` and `right` properties.\n * - Accounts for transform scaled elements, making it useless for Shuffle\n * elements which have shrunk.\n * 2. The `offsetWidth` property.\n * - This value stays the same regardless of the elements transform property,\n * however, it does not return subpixel values.\n * 3. getComputedStyle()\n * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n * padding and border when box-sizing: border-box is set, requiring a feature\n * test and extra work to add the padding back for IE and other browsers which\n * follow the W3C spec here.\n *\n * @param {Element} element The element.\n * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins) {\n // Store the styles so that they can be used by others without asking for it again.\n var styles = window.getComputedStyle(element, null);\n var width = getNumberStyle(element, 'width', styles);\n var height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n var marginLeft = getNumberStyle(element, 'marginLeft', styles);\n var marginRight = getNumberStyle(element, 'marginRight', styles);\n var marginTop = getNumberStyle(element, 'marginTop', styles);\n var marginBottom = getNumberStyle(element, 'marginBottom', styles);\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n }\n\n return {\n width,\n height,\n };\n }\n\n /**\n * Change a property or execute a function which will not have a transition\n * @param {Array.} elements DOM elements that won't be transitioned.\n * @param {Function} callback A function which will be called while transition\n * is set to 0ms.\n * @private\n */\n static _skipTransitions(elements, callback) {\n let zero = '0ms';\n\n // Save current duration and delay.\n let data = elements.map((element) => {\n let style = element.style;\n let duration = style.transitionDuration;\n let delay = style.transitionDelay;\n\n // Set the duration to zero so it happens immediately\n style.transitionDuration = zero;\n style.transitionDelay = zero;\n\n return {\n duration,\n delay,\n };\n });\n\n callback();\n\n // Cause reflow.\n elements[0].offsetWidth; // jshint ignore:line\n\n // Put the duration back\n elements.forEach((element, i) => {\n element.style.transitionDuration = data[i].duration;\n element.style.transitionDelay = data[i].delay;\n });\n }\n}\n\nShuffle.ShuffleItem = ShuffleItem;\n\nShuffle.ALL_ITEMS = 'all';\nShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\n/**\n * @enum {string}\n */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n// Overrideable options\nShuffle.options = {\n // Initial filter group.\n group: Shuffle.ALL_ITEMS,\n\n // Transition/animation speed (milliseconds).\n speed: 250,\n\n // CSS easing function to use.\n easing: 'ease',\n\n // e.g. '.picture-item'.\n itemSelector: '*',\n\n // Element or selector string. Use an element to determine the size of columns\n // and gutters.\n sizer: null,\n\n // A static number or function that tells the plugin how wide the gutters\n // between columns are (in pixels).\n gutterWidth: 0,\n\n // A static number or function that returns a number which tells the plugin\n // how wide the columns are (in pixels).\n columnWidth: 0,\n\n // If your group is not json, and is comma delimeted, you could set delimeter\n // to ','.\n delimeter: null,\n\n // Useful for percentage based heights when they might not always be exactly\n // the same (in pixels).\n buffer: 0,\n\n // Reading the width of elements isn't precise enough and can cause columns to\n // jump between values.\n columnThreshold: 0.01,\n\n // Shuffle can be isInitialized with a sort object. It is the same object\n // given to the sort method.\n initialSort: null,\n\n // By default, shuffle will throttle resize events. This can be changed or\n // removed.\n throttle: throttle,\n\n // How often shuffle can be called on resize (in milliseconds).\n throttleTime: 300,\n\n // Transition delay offset for each item in milliseconds.\n staggerAmount: 15,\n\n // Maximum stagger delay in milliseconds.\n staggerAmountMax: 250,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n};\n\n// Expose for testing. Hack at your own risk.\nShuffle.__Point = Point;\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\n\nexport default Shuffle;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle.js\n **/","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n new window.CustomEvent(\"test\");\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/custom-event-polyfill/custom-event-polyfill.js\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nvar proto = Element.prototype;\nvar vendor = proto.matches\n || proto.matchesSelector\n || proto.webkitMatchesSelector\n || proto.mozMatchesSelector\n || proto.msMatchesSelector\n || proto.oMatchesSelector;\n\nmodule.exports = match;\n\n/**\n * Match `el` to `selector`.\n *\n * @param {Element} el\n * @param {String} selector\n * @return {Boolean}\n * @api public\n */\n\nfunction match(el, selector) {\n if (vendor) return vendor.call(el, selector);\n var nodes = el.parentNode.querySelectorAll(selector);\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] == el) return true;\n }\n return false;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/matches-selector/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-uniq/index.js\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/xtend/immutable.js\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = throttle;\n\n/**\n * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n *\n * @param {Function} func Function to wrap.\n * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n * @return {Function} A new function that wraps the `func` function passed in.\n */\n\nfunction throttle (func, wait) {\n var ctx, args, rtn, timeoutID; // caching\n var last = 0;\n\n return function throttled () {\n ctx = this;\n args = arguments;\n var delta = new Date() - last;\n if (!timeoutID)\n if (delta >= wait) call();\n else timeoutID = setTimeout(call, wait - delta);\n return rtn;\n };\n\n function call () {\n timeoutID = 0;\n last = +new Date();\n rtn = func.apply(ctx, args);\n ctx = null;\n args = null;\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/throttleit/index.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function parallel(fns, context, callback) {\n if (!callback) {\n if (typeof context === 'function') {\n callback = context\n context = null\n } else {\n callback = noop\n }\n }\n\n var pending = fns && fns.length\n if (!pending) return callback(null, []);\n\n var finished = false\n var results = new Array(pending)\n\n fns.forEach(context ? function (fn, i) {\n fn.call(context, maybeDone(i))\n } : function (fn, i) {\n fn(maybeDone(i))\n })\n\n function maybeDone(i) {\n return function (err, result) {\n if (finished) return;\n\n if (err) {\n callback(err, results)\n finished = true\n return\n }\n\n results[i] = result\n\n if (!--pending) callback(null, results);\n }\n }\n}\n\nfunction noop() {}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-parallel/index.js\n ** module id = 7\n ** module chunks = 0\n **/","'use strict';\n\nimport getNumber from './get-number';\n\n/**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\nconst Point = function (x, y) {\n this.x = getNumber(x);\n this.y = getNumber(y);\n};\n\n/**\n * Whether two points are equal.\n * @param {Point} a Point A.\n * @param {Point} b Point B.\n * @return {boolean}\n */\nPoint.equals = function (a, b) {\n return a.x === b.x && a.y === b.y;\n};\n\nexport default Point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/point.js\n **/","'use strict';\n\n/**\n * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n * @param {*} value Possibly numeric value.\n * @return {number} `value` or zero if `value` isn't numeric.\n */\nexport default function getNumber(value) {\n return parseFloat(value) || 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number.js\n **/","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element) {\n this.id = id++;\n this.element = element;\n this.isVisible = true;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.scale = ShuffleItem.Scale.VISIBLE;\n this.point = new Point();\n }\n\n addClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.add(className);\n });\n }\n\n removeClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.remove(className);\n });\n }\n\n applyCss(obj) {\n for (var key in obj) {\n this.element.style[key] = obj[key];\n }\n }\n\n dispose() {\n this.removeClasses([\n Classes.HIDDEN,\n Classes.VISIBLE,\n Classes.SHUFFLE_ITEM,\n ]);\n\n this.element.removeAttribute('style');\n this.element = null;\n }\n}\n\nShuffleItem.Css = {\n INITIAL: {\n position: 'absolute',\n top: 0,\n left: 0,\n visibility: 'visible',\n 'will-change': 'transform',\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {},\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle-item.js\n **/","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/classes.js\n **/","'use strict';\n\nimport getNumber from './get-number';\nimport COMPUTED_SIZE_INCLUDES_PADDING from './computed-size';\n\n/**\n * Retrieve the computed style for an element, parsed as a float.\n * @param {Element} element Element to get style for.\n * @param {string} style Style property.\n * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n * use instead of asking for them again.\n * @return {number} The parsed computed value or zero if that fails because IE\n * will return 'auto' when the element doesn't have margins instead of\n * the computed style.\n */\nexport default function getNumberStyle(element, style,\n styles = window.getComputedStyle(element, null)) {\n var value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'width') {\n value += getNumber(styles.paddingLeft) +\n getNumber(styles.paddingRight) +\n getNumber(styles.borderLeftWidth) +\n getNumber(styles.borderRightWidth);\n } else if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'height') {\n value += getNumber(styles.paddingTop) +\n getNumber(styles.paddingBottom) +\n getNumber(styles.borderTopWidth) +\n getNumber(styles.borderBottomWidth);\n }\n\n return value;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number-style.js\n **/","\nlet element = document.body || document.documentElement;\nlet e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nlet width = window.getComputedStyle(e, null).width;\nlet ret = width === '10px';\n\nelement.removeChild(e);\n\nexport default ret;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/computed-size.js\n **/","'use strict';\n\nimport xtend from 'xtend';\n\n// http://stackoverflow.com/a/962890/373422\nfunction randomize(array) {\n var tmp;\n var current;\n let top = array.length;\n\n if (!top) {\n return array;\n }\n\n while (--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n\n return array;\n}\n\nlet defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // If true, this will skip the sorting and return a randomized order in the array\n randomize: false,\n\n // Determines which property of each item in the array is passed to the\n // sorting method.\n key: 'element',\n};\n\n// You can return `undefined` from the `by` function to revert to DOM order.\nexport default function sorter(arr, options) {\n let opts = xtend(defaults, options);\n let original = [].slice.call(arr);\n let revert = false;\n\n if (!arr.length) {\n return [];\n }\n\n if (opts.randomize) {\n return randomize(arr);\n }\n\n // Sort the elements by the opts.by function.\n // If we don't have opts.by, default to DOM order\n if (typeof opts.by === 'function') {\n arr.sort(function (a, b) {\n\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n let valA = opts.by(a[opts.key]);\n let valB = opts.by(b[opts.key]);\n\n // If both values are undefined, use the DOM order\n if (valA === undefined && valB === undefined) {\n revert = true;\n return 0;\n }\n\n if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n return -1;\n }\n\n if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n return 1;\n }\n\n return 0;\n });\n }\n\n // Revert to the original array if necessary\n if (revert) {\n return original;\n }\n\n if (opts.reverse) {\n arr.reverse();\n }\n\n return arr;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/sorter.js\n **/","'use strict';\n\nlet transitions = {};\nlet eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n return eventName + count++;\n}\n\nexport function onTransitionEnd(element, callback) {\n let id = uniqueId();\n let listener = (evt) => {\n if (evt.currentTarget === evt.target) {\n cancelTransitionEnd(id);\n callback(evt);\n }\n };\n\n element.addEventListener(eventName, listener);\n\n transitions[id] = { element, listener };\n\n return id;\n}\n\nexport function cancelTransitionEnd(id) {\n if (transitions[id]) {\n transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n transitions[id] = null;\n return true;\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/on-transition-end.js\n **/","'use strict';\n\nimport Point from './point';\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayMin(array) {\n return Math.min.apply(Math, array);\n}\n\n/**\n * Determine the location of the next item, based on its size.\n * @param {Object} itemSize Object with width and height.\n * @param {Array.} positions Positions of the other current items.\n * @param {number} gridSize The column width or row height.\n * @param {number} total The total number of columns or rows.\n * @param {number} threshold Buffer value for the column to fit.\n * @param {number} buffer Vertical buffer for the height of items.\n * @return {Point}\n */\nexport function getItemPosition({ itemSize, positions, gridSize, total, threshold, buffer }) {\n var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n var setY = getAvailablePositions(positions, span, total);\n var shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n var point = new Point(\n Math.round(gridSize * shortColumnIndex),\n Math.round(setY[shortColumnIndex]));\n\n // Update the columns array with the new values for each column.\n // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n var setHeight = setY[shortColumnIndex] + itemSize.height;\n for (var i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * Determine the number of columns an items spans.\n * @param {number} itemWidth Width of the item.\n * @param {number} columnWidth Width of the column (includes gutter).\n * @param {number} columns Total number of columns\n * @param {number} threshold A buffer value for the size of the column to fit.\n * @return {number}\n */\nexport function getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n var columnSpan = itemWidth / columnWidth;\n\n // If the difference between the rounded column span number and the\n // calculated column span number is really small, round the number to\n // make it fit.\n if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n // e.g. columnSpan = 4.0089945390298745\n columnSpan = Math.round(columnSpan);\n }\n\n // Ensure the column span is not more than the amount of columns in the whole layout.\n return Math.min(Math.ceil(columnSpan), columns);\n}\n\n/**\n * Retrieves the column set to use for placement.\n * @param {number} columnSpan The number of columns this current item spans.\n * @param {number} columns The total columns in the grid.\n * @return {Array.} An array of numbers represeting the column set.\n */\nexport function getAvailablePositions(positions, columnSpan, columns) {\n // The item spans only one column.\n if (columnSpan === 1) {\n return positions;\n }\n\n // The item spans more than one column, figure out how many different\n // places it could fit horizontally.\n // The group count is the number of places within the positions this block\n // could fit, ignoring the current positions of items.\n // Imagine a 2 column brick as the second item in a 4 column grid with\n // 10px height each. Find the places it would fit:\n // [20, 10, 10, 0]\n // | | |\n // * * *\n //\n // Then take the places which fit and get the bigger of the two:\n // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 0]\n // |\n // *\n //\n // And that's where it should be placed!\n //\n // Another example where the second column's item extends past the first:\n // [10, 20, 10, 0] => [20, 20, 10] => 10\n var available = [];\n\n // For how many possible positions for this item there are.\n for (var i = 0; i <= columns - columnSpan; i++) {\n // Find the bigger value for each place it could fit.\n available.push(arrayMax(positions.slice(i, i + columnSpan)));\n }\n\n return available;\n}\n\n/**\n * Find index of short column, the first from the left where this item will go.\n *\n * @param {Array.} positions The array to search for the smallest number.\n * @param {number} buffer Optional buffer which is very useful when the height\n * is a percentage of the width.\n * @return {number} Index of the short column.\n */\nexport function getShortColumn(positions, buffer) {\n var minPosition = arrayMin(positions);\n for (var i = 0, len = positions.length; i < len; i++) {\n if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n return i;\n }\n }\n\n return 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layout.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/shuffle.min.js b/dist/shuffle.min.js index 796963e..5397f52 100644 --- a/dist/shuffle.min.js +++ b/dist/shuffle.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.shuffle=e():t.shuffle=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var s=i[n]={exports:{},id:n,loaded:!1};return t[n].call(s.exports,s,s.exports,e),s.loaded=!0,s.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){"use strict";t.exports=i(1)["default"]},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return Array.prototype.slice.call(t)}function r(t){return Math.max.apply(Math,t)}function u(t,e){return 2===arguments.length?u(t)(e):function(e){return t.indexOf(e)>-1}}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var i=0;i0?t.getSize(this.items[0].element,!0).width:e,0===n&&(n=e),n+i}},{key:"_getGutterSize",value:function(t){var e;return e="function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.useSizer?(0,w["default"])(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var e=arguments.length<=0||void 0===arguments[0]?t.getSize(this.element).width:arguments[0],i=this._getGutterSize(e),n=this._getColumnSize(e,i),s=(e+i)/n;Math.abs(Math.round(s)-s)0,i=[],n=[];this._queue.forEach(function(s){t.isInitialized&&e?n.push(s):i.push(s)}),this._styleImmediately(i),n.length>0?this._startTransitions(n):this._dispatchLayout(),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0;var i=t.map(function(t){return e._getTransitionFunction(t)});(0,_["default"])(i,this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(M.cancelTransitionEnd),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(e){var i=this;if(e.length){var n=e.map(function(t){return t.item.element});t._skipTransitions(n,function(){e.forEach(function(t){t.item.applyCss(i._getStylesForTransition(t)),t.callback()})})}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatchLayout()}},{key:"_dispatchLayout",value:function(){this._dispatch(t.EventType.LAYOUT)}},{key:"filter",value:function(e,i){this.isEnabled&&((!e||e&&0===e.length)&&(e=t.ALL_ITEMS),this._filter(e),this._shrink(),this._updateItemCount(),this.sort(i))}},{key:"sort",value:function(){var t=arguments.length<=0||void 0===arguments[0]?this.lastSort:arguments[0];if(this.isEnabled){this._resetCols();var e=this._getFilteredItems();e=(0,L["default"])(e,t),this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(t){this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){t=(0,c["default"])(t).map(function(t){return new S["default"](t)}),this._initItems(t),this._setTransitions(t),this.items=this.items.concat(t),this._updateItemsOrder(),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(t){this.isEnabled=!0,t!==!1&&this.update()}},{key:"remove",value:function(e){var i=this;if(e.length){e=(0,c["default"])(e);var n=e.map(function(t){return i.getItemByElement(t)}).filter(function(t){return!!t}),s=function o(){i.element.removeEventListener(t.EventType.LAYOUT,o),i._disposeItems(n),e.forEach(function(t){t.parentNode.removeChild(t)}),i._dispatch(t.EventType.REMOVED,{collection:e}),e=null,n=null};this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter(function(t){return!u(n,t)}),this._updateItemCount(),this.element.addEventListener(t.EventType.LAYOUT,s)}}},{key:"getItemByElement",value:function(t){for(var e=this.items.length-1;e>=0;e--)if(this.items[e].element===t)return this.items[e];return null}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(),this.items=null,this.options.sizer=null,this.element=null,this._transitions=null,this.isDestroyed=!0}}],[{key:"getSize",value:function(t,e){var i=window.getComputedStyle(t,null),n=(0,w["default"])(t,"width",i),s=(0,w["default"])(t,"height",i);if(e){var o=(0,w["default"])(t,"marginLeft",i),r=(0,w["default"])(t,"marginRight",i),u=(0,w["default"])(t,"marginTop",i),a=(0,w["default"])(t,"marginBottom",i);n+=o+r,s+=u+a}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i="0ms",n=t.map(function(t){var e=t.style,n=e.transitionDuration,s=e.transitionDelay;return e.transitionDuration=i,e.transitionDelay=i,{duration:n,delay:s}});e(),t[0].offsetWidth,t.forEach(function(t,e){t.style.transitionDuration=n[e].duration,t.style.transitionDelay=n[e].delay})}}]),t}();x.ShuffleItem=S["default"],x.ALL_ITEMS="all",x.FILTER_ATTRIBUTE_KEY="groups",x.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},x.Classes=k["default"],x.options={group:x.ALL_ITEMS,speed:250,easing:"ease",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimeter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:p["default"],throttleTime:300,staggerAmount:15,staggerAmountMax:250,useTransforms:!0},x.__Point=E["default"],x.__sorter=L["default"],x.__getColumnSpan=z.getColumnSpan,x.__getAvailablePositions=z.getAvailablePositions,x.__getShortColumn=z.getShortColumn,e["default"]=x},function(t,e){try{new window.CustomEvent("test")}catch(i){var n=function(t,e){var i;return e=e||{bubbles:!1,cancelable:!1,detail:void 0},i=document.createEvent("CustomEvent"),i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),i};n.prototype=window.Event.prototype,window.CustomEvent=n}},function(t,e){"use strict";function i(t,e){if(s)return s.call(t,e);for(var i=t.parentNode.querySelectorAll(e),n=0;n=e?i():r=setTimeout(i,e-t)),o}}t.exports=i},function(t,e){function i(){}t.exports=function(t,e,n){function s(t){return function(e,i){if(!r){if(e)return n(e,u),void(r=!0);u[t]=i,--o||n(null,u)}}}n||("function"==typeof e?(n=e,e=null):n=i);var o=t&&t.length;if(!o)return n(null,[]);var r=!1,u=new Array(o);t.forEach(e?function(t,i){t.call(e,s(i))}:function(t,e){t(s(e))})}},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var s=i(9),o=n(s),r=function(t,e){this.x=(0,o["default"])(t),this.y=(0,o["default"])(e)};r.equals=function(t,e){return t.x===e.x&&t.y===e.y},e["default"]=r},function(t,e){"use strict";function i(t){return parseFloat(t)||0}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=i},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;in||"sortFirst"===n||"sortLast"===s?-1:n>s||"sortLast"===n||"sortFirst"===s?1:0}),o?n:(i.reverse&&t.reverse(),t)):[]}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=o;var r=i(5),u=n(r),a={reverse:!1,by:null,randomize:!1,key:"element"}},function(t,e){"use strict";function i(){return r+u++}function n(t,e){var n=i(),u=function(t){t.currentTarget===t.target&&(s(n),e(t))};return t.addEventListener(r,u),o[n]={element:t,listener:u},n}function s(t){return o[t]?(o[t].element.removeEventListener(r,o[t].listener),o[t]=null,!0):!1}Object.defineProperty(e,"__esModule",{value:!0}),e.onTransitionEnd=n,e.cancelTransitionEnd=s;var o={},r="transitionend",u=0},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t){return Math.max.apply(Math,t)}function o(t){return Math.min.apply(Math,t)}function r(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,h=u(e.width,n,s,o),c=a(i,h,s),d=l(c,r),v=new f["default"](Math.round(n*d),Math.round(c[d])),m=c[d]+e.height,p=0;h>p;p++)i[d+p]=m;return v}function u(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=o;o++)n.push(s(t.slice(o,o+e)));return n}function l(t,e){for(var i=o(t),n=0,s=t.length;s>n;n++)if(t[n]>=i-e&&t[n]<=i+e)return n;return 0}Object.defineProperty(e,"__esModule",{value:!0}),e.getItemPosition=r,e.getColumnSpan=u,e.getAvailablePositions=a,e.getShortColumn=l;var h=i(8),f=n(h)}])}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.shuffle=e():t.shuffle=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var s=i[n]={exports:{},id:n,loaded:!1};return t[n].call(s.exports,s,s.exports,e),s.loaded=!0,s.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){"use strict";t.exports=i(1)["default"]},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return Array.prototype.slice.call(t)}function r(t){return Math.max.apply(Math,t)}function u(t,e){return 2===arguments.length?u(t)(e):function(e){return t.indexOf(e)>-1}}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var i=0;i0?t.getSize(this.items[0].element,!0).width:e,0===n&&(n=e),n+i}},{key:"_getGutterSize",value:function(t){var e;return e="function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.useSizer?(0,w["default"])(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var e=arguments.length<=0||void 0===arguments[0]?t.getSize(this.element).width:arguments[0],i=this._getGutterSize(e),n=this._getColumnSize(e,i),s=(e+i)/n;Math.abs(Math.round(s)-s)0,e=this._queue.length>0;e&&t&&this.isInitialized?this._startTransitions(this._queue):e?(this._styleImmediately(this._queue),this._dispatchLayout()):this._dispatchLayout(),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0;var i=t.map(function(t){return e._getTransitionFunction(t)});(0,_["default"])(i,this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(M.cancelTransitionEnd),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(e){var i=this;if(e.length){var n=e.map(function(t){return t.item.element});t._skipTransitions(n,function(){e.forEach(function(t){t.item.applyCss(i._getStylesForTransition(t)),t.callback()})})}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatchLayout()}},{key:"_dispatchLayout",value:function(){this._dispatch(t.EventType.LAYOUT)}},{key:"filter",value:function(e,i){this.isEnabled&&((!e||e&&0===e.length)&&(e=t.ALL_ITEMS),this._filter(e),this._shrink(),this._updateItemCount(),this.sort(i))}},{key:"sort",value:function(){var t=arguments.length<=0||void 0===arguments[0]?this.lastSort:arguments[0];if(this.isEnabled){this._resetCols();var e=this._getFilteredItems();e=(0,L["default"])(e,t),this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(t){this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){t=(0,c["default"])(t).map(function(t){return new S["default"](t)}),this._initItems(t),this._setTransitions(t),this.items=this.items.concat(t),this._updateItemsOrder(),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(t){this.isEnabled=!0,t!==!1&&this.update()}},{key:"remove",value:function(e){var i=this;if(e.length){e=(0,c["default"])(e);var n=e.map(function(t){return i.getItemByElement(t)}).filter(function(t){return!!t}),s=function o(){i.element.removeEventListener(t.EventType.LAYOUT,o),i._disposeItems(n),e.forEach(function(t){t.parentNode.removeChild(t)}),i._dispatch(t.EventType.REMOVED,{collection:e}),e=null,n=null};this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter(function(t){return!u(n,t)}),this._updateItemCount(),this.element.addEventListener(t.EventType.LAYOUT,s)}}},{key:"getItemByElement",value:function(t){for(var e=this.items.length-1;e>=0;e--)if(this.items[e].element===t)return this.items[e];return null}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(),this.items=null,this.options.sizer=null,this.element=null,this._transitions=null,this.isDestroyed=!0}}],[{key:"getSize",value:function(t,e){var i=window.getComputedStyle(t,null),n=(0,w["default"])(t,"width",i),s=(0,w["default"])(t,"height",i);if(e){var o=(0,w["default"])(t,"marginLeft",i),r=(0,w["default"])(t,"marginRight",i),u=(0,w["default"])(t,"marginTop",i),l=(0,w["default"])(t,"marginBottom",i);n+=o+r,s+=u+l}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i="0ms",n=t.map(function(t){var e=t.style,n=e.transitionDuration,s=e.transitionDelay;return e.transitionDuration=i,e.transitionDelay=i,{duration:n,delay:s}});e(),t[0].offsetWidth,t.forEach(function(t,e){t.style.transitionDuration=n[e].duration,t.style.transitionDelay=n[e].delay})}}]),t}();x.ShuffleItem=S["default"],x.ALL_ITEMS="all",x.FILTER_ATTRIBUTE_KEY="groups",x.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},x.Classes=k["default"],x.options={group:x.ALL_ITEMS,speed:250,easing:"ease",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimeter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:p["default"],throttleTime:300,staggerAmount:15,staggerAmountMax:250,useTransforms:!0},x.__Point=E["default"],x.__sorter=L["default"],x.__getColumnSpan=z.getColumnSpan,x.__getAvailablePositions=z.getAvailablePositions,x.__getShortColumn=z.getShortColumn,e["default"]=x},function(t,e){try{new window.CustomEvent("test")}catch(i){var n=function(t,e){var i;return e=e||{bubbles:!1,cancelable:!1,detail:void 0},i=document.createEvent("CustomEvent"),i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),i};n.prototype=window.Event.prototype,window.CustomEvent=n}},function(t,e){"use strict";function i(t,e){if(s)return s.call(t,e);for(var i=t.parentNode.querySelectorAll(e),n=0;n=e?i():r=setTimeout(i,e-t)),o}}t.exports=i},function(t,e){function i(){}t.exports=function(t,e,n){function s(t){return function(e,i){if(!r){if(e)return n(e,u),void(r=!0);u[t]=i,--o||n(null,u)}}}n||("function"==typeof e?(n=e,e=null):n=i);var o=t&&t.length;if(!o)return n(null,[]);var r=!1,u=new Array(o);t.forEach(e?function(t,i){t.call(e,s(i))}:function(t,e){t(s(e))})}},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var s=i(9),o=n(s),r=function(t,e){this.x=(0,o["default"])(t),this.y=(0,o["default"])(e)};r.equals=function(t,e){return t.x===e.x&&t.y===e.y},e["default"]=r},function(t,e){"use strict";function i(t){return parseFloat(t)||0}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=i},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var i=0;in||"sortFirst"===n||"sortLast"===s?-1:n>s||"sortLast"===n||"sortFirst"===s?1:0}),o?n:(i.reverse&&t.reverse(),t)):[]}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=o;var r=i(5),u=n(r),l={reverse:!1,by:null,randomize:!1,key:"element"}},function(t,e){"use strict";function i(){return r+u++}function n(t,e){var n=i(),u=function(t){t.currentTarget===t.target&&(s(n),e(t))};return t.addEventListener(r,u),o[n]={element:t,listener:u},n}function s(t){return o[t]?(o[t].element.removeEventListener(r,o[t].listener),o[t]=null,!0):!1}Object.defineProperty(e,"__esModule",{value:!0}),e.onTransitionEnd=n,e.cancelTransitionEnd=s;var o={},r="transitionend",u=0},function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function s(t){return Math.max.apply(Math,t)}function o(t){return Math.min.apply(Math,t)}function r(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,h=u(e.width,n,s,o),c=l(i,h,s),d=a(c,r),m=new f["default"](Math.round(n*d),Math.round(c[d])),v=c[d]+e.height,p=0;h>p;p++)i[d+p]=v;return m}function u(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=o;o++)n.push(s(t.slice(o,o+e)));return n}function a(t,e){for(var i=o(t),n=0,s=t.length;s>n;n++)if(t[n]>=i-e&&t[n]<=i+e)return n;return 0}Object.defineProperty(e,"__esModule",{value:!0}),e.getItemPosition=r,e.getColumnSpan=u,e.getAvailablePositions=l,e.getShortColumn=a;var h=i(8),f=n(h)}])}); //# sourceMappingURL=shuffle.min.js.map \ No newline at end of file diff --git a/dist/shuffle.min.js.map b/dist/shuffle.min.js.map index ccb5668..06273ec 100644 --- a/dist/shuffle.min.js.map +++ b/dist/shuffle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///shuffle.min.js","webpack:///webpack/bootstrap 1e8dff1889ac409e1855","webpack:///./src/index.js","webpack:///./src/shuffle.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/array-uniq/index.js","webpack:///./~/xtend/immutable.js","webpack:///./~/throttleit/index.js","webpack:///./~/array-parallel/index.js","webpack:///./src/point.js","webpack:///./src/get-number.js","webpack:///./src/shuffle-item.js","webpack:///./src/classes.js","webpack:///./src/get-number-style.js","webpack:///./src/computed-size.js","webpack:///./src/sorter.js","webpack:///./src/on-transition-end.js","webpack:///./src/layout.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_classCallCheck","instance","Constructor","TypeError","toArray","arrayLike","Array","prototype","slice","arrayMax","array","Math","max","apply","arrayIncludes","arguments","length","indexOf","Object","defineProperty","value","_createClass","defineProperties","target","props","i","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","_matchesSelector","_matchesSelector2","_arrayUniq","_arrayUniq2","_xtend","_xtend2","_throttleit","_throttleit2","_arrayParallel","_arrayParallel2","_point","_point2","_shuffleItem","_shuffleItem2","_classes","_classes2","_getNumberStyle","_getNumberStyle2","_sorter","_sorter2","_onTransitionEnd","_layout2","Shuffle","element","options","undefined","useSizer","lastSort","group","lastFilter","ALL_ITEMS","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","_init","items","_getItems","sizer","classList","add","Classes","BASE","_initItems","_onResize","_getResizeFunction","window","addEventListener","containerCss","getComputedStyle","containerWidth","getSize","width","_validateStyles","_setColumns","filter","initialSort","offsetWidth","_setTransitions","style","transition","speed","easing","resizeFunction","_handleResize","bind","throttle","throttleTime","option","querySelector","nodeType","jquery","styles","position","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","_this","visible","hidden","forEach","item","_doesPassFilter","push","attr","getAttribute","FILTER_ATTRIBUTE_KEY","groups","JSON","parse","keys","delimeter","isArray","split","some","_ref","show","hide","init","dispose","visibleItems","_getFilteredItems","str","useTransforms","_this2","children","el","itemSelector","map","by","isVisible","gutterSize","size","columnWidth","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","abs","round","columnThreshold","cols","floor","colWidth","height","_getContainerSize","positions","index","min","staggerAmount","staggerAmountMax","name","details","shuffle","dispatchEvent","CustomEvent","bubbles","cancelable","detail","_this3","count","callback","applyCss","Css","VISIBLE","after","currPos","point","currScale","scale","itemSize","pos","_getItemPosition","equals","Scale","before","transitionDelay","_getStaggerAmount","getItemPosition","gridSize","total","threshold","buffer","_this4","_getConcealedItems","HIDDEN","update","_ref2","x","y","transform","left","top","itemCallback","done","onTransitionEnd","evt","currentTarget","opts","_this5","_getStylesForTransition","_whenTransitionDone","_this6","_cancelMovement","hasSpeed","immediates","transitions","_styleImmediately","_startTransitions","_dispatchLayout","_this7","callbacks","_getTransitionFunction","_movementFinished","cancelTransitionEnd","objects","_this8","elements","_skipTransitions","_dispatch","EventType","LAYOUT","sortObj","_filter","_shrink","_updateItemCount","sort","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","concat","_updateItemsOrder","isUpdateLayout","_this9","oldItems","getItemByElement","handleLayout","removeEventListener","_disposeItems","parentNode","removeChild","REMOVED","remove","removeAttribute","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","data","duration","transitionDuration","delay","ShuffleItem","__Point","__sorter","__getColumnSpan","getColumnSpan","__getAvailablePositions","getAvailablePositions","__getShortColumn","getShortColumn","e","event","params","document","createEvent","initCustomEvent","Event","match","selector","vendor","nodes","querySelectorAll","proto","Element","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","global","uniqNoSet","arr","ret","uniqSet","seen","Set","has","uniqSetWithForEach","doesForEachActuallyWork","extend","source","hasOwnProperty","func","wait","timeoutID","last","Date","rtn","ctx","args","delta","setTimeout","noop","fns","context","maybeDone","err","result","finished","results","pending","fn","_getNumber","_getNumber2","Point","a","b","getNumber","parseFloat","addClasses","SHUFFLE_ITEM","INITIAL","classes","className","removeClasses","visibility","will-change","opacity","getNumberStyle","_computedSize2","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","_computedSize","body","documentElement","createElement","cssText","appendChild","randomize","tmp","current","random","sorter","defaults","original","revert","valA","valB","reverse","uniqueId","eventName","listener","arrayMin","span","setY","shortColumnIndex","setHeight","itemWidth","columns","columnSpan","ceil","available","minPosition","len"],"mappings":"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","file":"shuffle.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tmodule.exports = __webpack_require__(1).default;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\t__webpack_require__(2);\n\t\n\tvar _matchesSelector = __webpack_require__(3);\n\t\n\tvar _matchesSelector2 = _interopRequireDefault(_matchesSelector);\n\t\n\tvar _arrayUniq = __webpack_require__(4);\n\t\n\tvar _arrayUniq2 = _interopRequireDefault(_arrayUniq);\n\t\n\tvar _xtend = __webpack_require__(5);\n\t\n\tvar _xtend2 = _interopRequireDefault(_xtend);\n\t\n\tvar _throttleit = __webpack_require__(6);\n\t\n\tvar _throttleit2 = _interopRequireDefault(_throttleit);\n\t\n\tvar _arrayParallel = __webpack_require__(7);\n\t\n\tvar _arrayParallel2 = _interopRequireDefault(_arrayParallel);\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tvar _shuffleItem = __webpack_require__(10);\n\t\n\tvar _shuffleItem2 = _interopRequireDefault(_shuffleItem);\n\t\n\tvar _classes = __webpack_require__(11);\n\t\n\tvar _classes2 = _interopRequireDefault(_classes);\n\t\n\tvar _getNumberStyle = __webpack_require__(12);\n\t\n\tvar _getNumberStyle2 = _interopRequireDefault(_getNumberStyle);\n\t\n\tvar _sorter = __webpack_require__(14);\n\t\n\tvar _sorter2 = _interopRequireDefault(_sorter);\n\t\n\tvar _onTransitionEnd = __webpack_require__(15);\n\t\n\tvar _layout2 = __webpack_require__(16);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction toArray(arrayLike) {\n\t return Array.prototype.slice.call(arrayLike);\n\t}\n\t\n\tfunction arrayMax(array) {\n\t return Math.max.apply(Math, array);\n\t}\n\t\n\tfunction arrayIncludes(array, obj) {\n\t if (arguments.length === 2) {\n\t return arrayIncludes(array)(obj);\n\t }\n\t\n\t return function (obj) {\n\t return array.indexOf(obj) > -1;\n\t };\n\t}\n\t\n\t// Used for unique instance variables\n\tvar id = 0;\n\t\n\tvar Shuffle = function () {\n\t\n\t /**\n\t * Categorize, sort, and filter a responsive grid of items.\n\t *\n\t * @param {Element} element An element which is the parent container for the grid items.\n\t * @param {Object} [options=Shuffle.options] Options object.\n\t * @constructor\n\t */\n\t\n\t function Shuffle(element) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t _classCallCheck(this, Shuffle);\n\t\n\t this.options = (0, _xtend2.default)(Shuffle.options, options);\n\t\n\t this.useSizer = false;\n\t this.lastSort = {};\n\t this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n\t this.isEnabled = true;\n\t this.isDestroyed = false;\n\t this.isInitialized = false;\n\t this._transitions = [];\n\t this.isTransitioning = false;\n\t this._queue = [];\n\t\n\t element = this._getElementOption(element);\n\t\n\t if (!element) {\n\t throw new TypeError('Shuffle needs to be initialized with an element.');\n\t }\n\t\n\t this.element = element;\n\t this.id = 'shuffle_' + id++;\n\t\n\t this._init();\n\t this.isInitialized = true;\n\t }\n\t\n\t _createClass(Shuffle, [{\n\t key: '_init',\n\t value: function _init() {\n\t this.items = this._getItems();\n\t\n\t this.options.sizer = this._getElementOption(this.options.sizer);\n\t\n\t if (this.options.sizer) {\n\t this.useSizer = true;\n\t }\n\t\n\t // Add class and invalidate styles\n\t this.element.classList.add(Shuffle.Classes.BASE);\n\t\n\t // Set initial css for each item\n\t this._initItems();\n\t\n\t // Bind resize events\n\t this._onResize = this._getResizeFunction();\n\t window.addEventListener('resize', this._onResize);\n\t\n\t // Get container css all in one request. Causes reflow\n\t var containerCss = window.getComputedStyle(this.element, null);\n\t var containerWidth = Shuffle.getSize(this.element).width;\n\t\n\t // Add styles to the container if it doesn't have them.\n\t this._validateStyles(containerCss);\n\t\n\t // We already got the container's width above, no need to cause another\n\t // reflow getting it again... Calculate the number of columns there will be\n\t this._setColumns(containerWidth);\n\t\n\t // Kick off!\n\t this.filter(this.options.group, this.options.initialSort);\n\t\n\t // The shuffle items haven't had transitions set on them yet so the user\n\t // doesn't see the first layout. Set them now that the first layout is done.\n\t // First, however, a synchronous layout must be caused for the previous\n\t // styles to be applied without transitions.\n\t this.element.offsetWidth; // jshint ignore: line\n\t this._setTransitions();\n\t this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n\t }\n\t\n\t /**\n\t * Returns a throttled and proxied function for the resize handler.\n\t * @return {Function}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getResizeFunction',\n\t value: function _getResizeFunction() {\n\t var resizeFunction = this._handleResize.bind(this);\n\t return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : resizeFunction;\n\t }\n\t\n\t /**\n\t * Retrieve an element from an option.\n\t * @param {string|jQuery|Element} option The option to check.\n\t * @return {?Element} The plain element or null.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getElementOption',\n\t value: function _getElementOption(option) {\n\t // If column width is a string, treat is as a selector and search for the\n\t // sizer element within the outermost container\n\t if (typeof option === 'string') {\n\t return this.element.querySelector(option);\n\t\n\t // Check for an element\n\t } else if (option && option.nodeType && option.nodeType === 1) {\n\t return option;\n\t\n\t // Check for jQuery object\n\t } else if (option && option.jquery) {\n\t return option[0];\n\t }\n\t\n\t return null;\n\t }\n\t\n\t /**\n\t * Ensures the shuffle container has the css styles it needs applied to it.\n\t * @param {Object} styles Key value pairs for position and overflow.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_validateStyles',\n\t value: function _validateStyles(styles) {\n\t // Position cannot be static.\n\t if (styles.position === 'static') {\n\t this.element.style.position = 'relative';\n\t }\n\t\n\t // Overflow has to be hidden.\n\t if (styles.overflow !== 'hidden') {\n\t this.element.style.overflow = 'hidden';\n\t }\n\t }\n\t\n\t /**\n\t * Filter the elements by a category.\n\t * @param {string} [category] Category to filter by. If it's given, the last\n\t * category will be used to filter the items.\n\t * @param {Array} [collection] Optionally filter a collection. Defaults to\n\t * all the items.\n\t * @return {!{visible: Array, hidden: Array}}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_filter',\n\t value: function _filter() {\n\t var category = arguments.length <= 0 || arguments[0] === undefined ? this.lastFilter : arguments[0];\n\t var collection = arguments.length <= 1 || arguments[1] === undefined ? this.items : arguments[1];\n\t\n\t var set = this._getFilteredSets(category, collection);\n\t\n\t // Individually add/remove hidden/visible classes\n\t this._toggleFilterClasses(set);\n\t\n\t // Save the last filter in case elements are appended.\n\t this.lastFilter = category;\n\t\n\t // This is saved mainly because providing a filter function (like searching)\n\t // will overwrite the `lastFilter` property every time its called.\n\t if (typeof category === 'string') {\n\t this.group = category;\n\t }\n\t\n\t return set;\n\t }\n\t\n\t /**\n\t * Returns an object containing the visible and hidden elements.\n\t * @param {string|Function} category Category or function to filter by.\n\t * @param {Array.} items A collection of items to filter.\n\t * @return {!{visible: Array, hidden: Array}}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getFilteredSets',\n\t value: function _getFilteredSets(category, items) {\n\t var _this = this;\n\t\n\t var visible = [];\n\t var hidden = [];\n\t\n\t // category === 'all', add visible class to everything\n\t if (category === Shuffle.ALL_ITEMS) {\n\t visible = items;\n\t\n\t // Loop through each item and use provided function to determine\n\t // whether to hide it or not.\n\t } else {\n\t items.forEach(function (item) {\n\t if (_this._doesPassFilter(category, item.element)) {\n\t visible.push(item);\n\t } else {\n\t hidden.push(item);\n\t }\n\t });\n\t }\n\t\n\t return {\n\t visible: visible,\n\t hidden: hidden\n\t };\n\t }\n\t\n\t /**\n\t * Test an item to see if it passes a category.\n\t * @param {string|Function} category Category or function to filter by.\n\t * @param {Element} element An element to test.\n\t * @return {boolean} Whether it passes the category/filter.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_doesPassFilter',\n\t value: function _doesPassFilter(category, element) {\n\t\n\t if (typeof category === 'function') {\n\t return category.call(element, element, this);\n\t\n\t // Check each element's data-groups attribute against the given category.\n\t } else {\n\t var attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n\t var groups = JSON.parse(attr);\n\t var keys = this.delimeter && !Array.isArray(groups) ? groups.split(this.delimeter) : groups;\n\t\n\t if (Array.isArray(category)) {\n\t return category.some(arrayIncludes(keys));\n\t }\n\t\n\t return arrayIncludes(keys, category);\n\t }\n\t }\n\t\n\t /**\n\t * Toggles the visible and hidden class names.\n\t * @param {{visible, hidden}} Object with visible and hidden arrays.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_toggleFilterClasses',\n\t value: function _toggleFilterClasses(_ref) {\n\t var visible = _ref.visible;\n\t var hidden = _ref.hidden;\n\t\n\t visible.forEach(function (item) {\n\t item.show();\n\t });\n\t\n\t hidden.forEach(function (item) {\n\t item.hide();\n\t });\n\t }\n\t\n\t /**\n\t * Set the initial css for each item\n\t * @param {Array.} [items] Optionally specifiy at set to initialize.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_initItems',\n\t value: function _initItems() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t items.forEach(function (item) {\n\t item.init();\n\t });\n\t }\n\t\n\t /**\n\t * Remove element reference and styles.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_disposeItems',\n\t value: function _disposeItems() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t items.forEach(function (item) {\n\t item.dispose();\n\t });\n\t }\n\t\n\t /**\n\t * Updates the visible item count.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_updateItemCount',\n\t value: function _updateItemCount() {\n\t this.visibleItems = this._getFilteredItems().length;\n\t }\n\t\n\t /**\n\t * Sets css transform transition on a group of elements. This is not executed\n\t * at the same time as `item.init` so that transitions don't occur upon\n\t * initialization of Shuffle.\n\t * @param {Array.} items Shuffle items to set transitions on.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_setTransitions',\n\t value: function _setTransitions() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t var speed = this.options.speed;\n\t var easing = this.options.easing;\n\t\n\t var str;\n\t if (this.options.useTransforms) {\n\t str = 'transform ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n\t } else {\n\t str = 'top ' + speed + 'ms ' + easing + ', left ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n\t }\n\t\n\t items.forEach(function (item) {\n\t item.element.style.transition = str;\n\t });\n\t }\n\t }, {\n\t key: '_getItems',\n\t value: function _getItems() {\n\t var _this2 = this;\n\t\n\t return toArray(this.element.children).filter(function (el) {\n\t return (0, _matchesSelector2.default)(el, _this2.options.itemSelector);\n\t }).map(function (el) {\n\t return new _shuffleItem2.default(el);\n\t });\n\t }\n\t\n\t /**\n\t * When new elements are added to the shuffle container, update the array of\n\t * items because that is the order `_layout` calls them.\n\t */\n\t\n\t }, {\n\t key: '_updateItemsOrder',\n\t value: function _updateItemsOrder() {\n\t var children = this.element.children;\n\t this.items = (0, _sorter2.default)(this.items, {\n\t by: function by(element) {\n\t return Array.prototype.indexOf.call(children, element);\n\t }\n\t });\n\t }\n\t }, {\n\t key: '_getFilteredItems',\n\t value: function _getFilteredItems() {\n\t return this.items.filter(function (item) {\n\t return item.isVisible;\n\t });\n\t }\n\t }, {\n\t key: '_getConcealedItems',\n\t value: function _getConcealedItems() {\n\t return this.items.filter(function (item) {\n\t return !item.isVisible;\n\t });\n\t }\n\t\n\t /**\n\t * Returns the column size, based on column width and sizer options.\n\t * @param {number} containerWidth Size of the parent container.\n\t * @param {number} gutterSize Size of the gutters.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getColumnSize',\n\t value: function _getColumnSize(containerWidth, gutterSize) {\n\t var size;\n\t\n\t // If the columnWidth property is a function, then the grid is fluid\n\t if (typeof this.options.columnWidth === 'function') {\n\t size = this.options.columnWidth(containerWidth);\n\t\n\t // columnWidth option isn't a function, are they using a sizing element?\n\t } else if (this.useSizer) {\n\t size = Shuffle.getSize(this.options.sizer).width;\n\t\n\t // if not, how about the explicitly set option?\n\t } else if (this.options.columnWidth) {\n\t size = this.options.columnWidth;\n\t\n\t // or use the size of the first item\n\t } else if (this.items.length > 0) {\n\t size = Shuffle.getSize(this.items[0].element, true).width;\n\t\n\t // if there's no items, use size of container\n\t } else {\n\t size = containerWidth;\n\t }\n\t\n\t // Don't let them set a column width of zero.\n\t if (size === 0) {\n\t size = containerWidth;\n\t }\n\t\n\t return size + gutterSize;\n\t }\n\t\n\t /**\n\t * Returns the gutter size, based on gutter width and sizer options.\n\t * @param {number} containerWidth Size of the parent container.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getGutterSize',\n\t value: function _getGutterSize(containerWidth) {\n\t var size;\n\t if (typeof this.options.gutterWidth === 'function') {\n\t size = this.options.gutterWidth(containerWidth);\n\t } else if (this.useSizer) {\n\t size = (0, _getNumberStyle2.default)(this.options.sizer, 'marginLeft');\n\t } else {\n\t size = this.options.gutterWidth;\n\t }\n\t\n\t return size;\n\t }\n\t\n\t /**\n\t * Calculate the number of columns to be used. Gets css if using sizer element.\n\t * @param {number} [containerWidth] Optionally specify a container width if\n\t * it's already available.\n\t */\n\t\n\t }, {\n\t key: '_setColumns',\n\t value: function _setColumns() {\n\t var containerWidth = arguments.length <= 0 || arguments[0] === undefined ? Shuffle.getSize(this.element).width : arguments[0];\n\t\n\t var gutter = this._getGutterSize(containerWidth);\n\t var columnWidth = this._getColumnSize(containerWidth, gutter);\n\t var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\t\n\t // Widths given from getStyles are not precise enough...\n\t if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) < this.options.columnThreshold) {\n\t // e.g. calculatedColumns = 11.998876\n\t calculatedColumns = Math.round(calculatedColumns);\n\t }\n\t\n\t this.cols = Math.max(Math.floor(calculatedColumns), 1);\n\t this.containerWidth = containerWidth;\n\t this.colWidth = columnWidth;\n\t }\n\t\n\t /**\n\t * Adjust the height of the grid\n\t */\n\t\n\t }, {\n\t key: '_setContainerSize',\n\t value: function _setContainerSize() {\n\t this.element.style.height = this._getContainerSize() + 'px';\n\t }\n\t\n\t /**\n\t * Based on the column heights, it returns the biggest one.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getContainerSize',\n\t value: function _getContainerSize() {\n\t return arrayMax(this.positions);\n\t }\n\t\n\t /**\n\t * Get the clamped stagger amount.\n\t * @param {number} index Index of the item to be staggered.\n\t * @return {number}\n\t */\n\t\n\t }, {\n\t key: '_getStaggerAmount',\n\t value: function _getStaggerAmount(index) {\n\t return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n\t }\n\t\n\t /**\n\t * @return {boolean} Whether the event was prevented or not.\n\t */\n\t\n\t }, {\n\t key: '_dispatch',\n\t value: function _dispatch(name) {\n\t var details = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t if (this.isDestroyed) {\n\t return;\n\t }\n\t\n\t details.shuffle = this;\n\t return !this.element.dispatchEvent(new CustomEvent(name, {\n\t bubbles: true,\n\t cancelable: false,\n\t detail: details\n\t }));\n\t }\n\t\n\t /**\n\t * Zeros out the y columns array, which is used to determine item placement.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_resetCols',\n\t value: function _resetCols() {\n\t var i = this.cols;\n\t this.positions = [];\n\t while (i--) {\n\t this.positions.push(0);\n\t }\n\t }\n\t\n\t /**\n\t * Loops through each item that should be shown and calculates the x, y position.\n\t * @param {Array.} items Array of items that will be shown/layed\n\t * out in order in their array.\n\t */\n\t\n\t }, {\n\t key: '_layout',\n\t value: function _layout(items) {\n\t var _this3 = this;\n\t\n\t var count = 0;\n\t items.forEach(function (item) {\n\t var currPos = item.point;\n\t var currScale = item.scale;\n\t var itemSize = Shuffle.getSize(item.element, true);\n\t var pos = _this3._getItemPosition(itemSize);\n\t\n\t function callback() {\n\t item.applyCss(_shuffleItem2.default.Css.VISIBLE.after);\n\t }\n\t\n\t // If the item will not change its position, do not add it to the render\n\t // queue. Transitions don't fire when setting a property to the same value.\n\t if (_point2.default.equals(currPos, pos) && currScale === _shuffleItem2.default.Scale.VISIBLE) {\n\t callback();\n\t return;\n\t }\n\t\n\t item.point = pos;\n\t item.scale = _shuffleItem2.default.Scale.VISIBLE;\n\t\n\t var styles = _shuffleItem2.default.Css.VISIBLE.before;\n\t styles.transitionDelay = _this3._getStaggerAmount(count);\n\t\n\t _this3._queue.push({\n\t item: item,\n\t styles: styles,\n\t callback: callback\n\t });\n\t\n\t count++;\n\t });\n\t }\n\t\n\t /**\n\t * Determine the location of the next item, based on its size.\n\t * @param {{width: number, height: number}} itemSize Object with width and height.\n\t * @return {Point}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getItemPosition',\n\t value: function _getItemPosition(itemSize) {\n\t return (0, _layout2.getItemPosition)({\n\t itemSize: itemSize,\n\t positions: this.positions,\n\t gridSize: this.colWidth,\n\t total: this.cols,\n\t threshold: this.options.columnThreshold,\n\t buffer: this.options.buffer\n\t });\n\t }\n\t\n\t /**\n\t * Hides the elements that don't match our filter.\n\t * @param {Array.} collection Collection to shrink.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_shrink',\n\t value: function _shrink() {\n\t var _this4 = this;\n\t\n\t var collection = arguments.length <= 0 || arguments[0] === undefined ? this._getConcealedItems() : arguments[0];\n\t\n\t var count = 0;\n\t collection.forEach(function (item) {\n\t function callback() {\n\t item.applyCss(_shuffleItem2.default.Css.HIDDEN.after);\n\t }\n\t\n\t // Continuing would add a transitionend event listener to the element, but\n\t // that listener would not execute because the transform and opacity would\n\t // stay the same.\n\t // The callback is executed here because it is not guaranteed to be called\n\t // after the transitionend event because the transitionend could be\n\t // canceled if another animation starts.\n\t if (item.scale === _shuffleItem2.default.Scale.HIDDEN) {\n\t callback();\n\t return;\n\t }\n\t\n\t item.scale = _shuffleItem2.default.Scale.HIDDEN;\n\t\n\t var styles = _shuffleItem2.default.Css.HIDDEN.before;\n\t styles.transitionDelay = _this4._getStaggerAmount(count);\n\t\n\t _this4._queue.push({\n\t item: item,\n\t styles: styles,\n\t callback: callback\n\t });\n\t\n\t count++;\n\t });\n\t }\n\t\n\t /**\n\t * Resize handler.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_handleResize',\n\t value: function _handleResize() {\n\t // If shuffle is disabled, destroyed, don't do anything\n\t if (!this.isEnabled || this.isDestroyed) {\n\t return;\n\t }\n\t\n\t // Will need to check height in the future if it's layed out horizontaly\n\t var containerWidth = Shuffle.getSize(this.element).width;\n\t\n\t // containerWidth hasn't changed, don't do anything\n\t if (containerWidth === this.containerWidth) {\n\t return;\n\t }\n\t\n\t this.update();\n\t }\n\t\n\t /**\n\t * Returns styles which will be applied to the an item for a transition.\n\t * @param {Object} obj Transition options.\n\t * @return {!Object} Transforms for transitions, left/top for animate.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getStylesForTransition',\n\t value: function _getStylesForTransition(_ref2) {\n\t var item = _ref2.item;\n\t var styles = _ref2.styles;\n\t\n\t if (!styles.transitionDelay) {\n\t styles.transitionDelay = '0ms';\n\t }\n\t\n\t var x = item.point.x;\n\t var y = item.point.y;\n\t\n\t if (this.options.useTransforms) {\n\t styles.transform = 'translate(' + x + 'px, ' + y + 'px) scale(' + item.scale + ')';\n\t } else {\n\t styles.left = x + 'px';\n\t styles.top = y + 'px';\n\t }\n\t\n\t return styles;\n\t }\n\t\n\t /**\n\t * Listen for the transition end on an element and execute the itemCallback\n\t * when it finishes.\n\t * @param {Element} element Element to listen on.\n\t * @param {Function} itemCallback Callback for the item.\n\t * @param {Function} done Callback to notify `parallel` that this one is done.\n\t */\n\t\n\t }, {\n\t key: '_whenTransitionDone',\n\t value: function _whenTransitionDone(element, itemCallback, done) {\n\t var id = (0, _onTransitionEnd.onTransitionEnd)(element, function (evt) {\n\t evt.currentTarget.style.transitionDelay = '';\n\t itemCallback();\n\t done(null, evt);\n\t });\n\t\n\t this._transitions.push(id);\n\t }\n\t\n\t /**\n\t * Return a function which will set CSS styles and call the `done` function\n\t * when (if) the transition finishes.\n\t * @param {Object} opts Transition object.\n\t * @return {Function} A function to be called with a `done` function.\n\t */\n\t\n\t }, {\n\t key: '_getTransitionFunction',\n\t value: function _getTransitionFunction(opts) {\n\t var _this5 = this;\n\t\n\t return function (done) {\n\t opts.item.applyCss(_this5._getStylesForTransition(opts));\n\t _this5._whenTransitionDone(opts.item.element, opts.callback, done);\n\t };\n\t }\n\t\n\t /**\n\t * Execute the styles gathered in the style queue. This applies styles to elements,\n\t * triggering transitions.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_processQueue',\n\t value: function _processQueue() {\n\t var _this6 = this;\n\t\n\t if (this.isTransitioning) {\n\t this._cancelMovement();\n\t }\n\t\n\t var hasSpeed = this.options.speed > 0;\n\t\n\t // Iterate over the queue and keep track of ones that use transitions.\n\t var immediates = [];\n\t var transitions = [];\n\t this._queue.forEach(function (obj) {\n\t if (_this6.isInitialized && hasSpeed) {\n\t transitions.push(obj);\n\t } else {\n\t immediates.push(obj);\n\t }\n\t });\n\t\n\t this._styleImmediately(immediates);\n\t\n\t if (transitions.length > 0) {\n\t this._startTransitions(transitions);\n\t\n\t // A call to layout happened, but none of the newly visible items will\n\t // change position or the transition duration is zero, which will not trigger\n\t // the transitionend event.\n\t } else {\n\t this._dispatchLayout();\n\t }\n\t\n\t // Remove everything in the style queue\n\t this._queue.length = 0;\n\t }\n\t\n\t /**\n\t * Wait for each transition to finish, the emit the layout event.\n\t * @param {Array.} transitions Array of transition objects.\n\t */\n\t\n\t }, {\n\t key: '_startTransitions',\n\t value: function _startTransitions(transitions) {\n\t var _this7 = this;\n\t\n\t // Set flag that shuffle is currently in motion.\n\t this.isTransitioning = true;\n\t\n\t // Create an array of functions to be called.\n\t var callbacks = transitions.map(function (obj) {\n\t return _this7._getTransitionFunction(obj);\n\t });\n\t\n\t (0, _arrayParallel2.default)(callbacks, this._movementFinished.bind(this));\n\t }\n\t }, {\n\t key: '_cancelMovement',\n\t value: function _cancelMovement() {\n\t // Remove the transition end event for each listener.\n\t this._transitions.forEach(_onTransitionEnd.cancelTransitionEnd);\n\t\n\t // Reset the array.\n\t this._transitions.length = 0;\n\t\n\t // Show it's no longer active.\n\t this.isTransitioning = false;\n\t }\n\t\n\t /**\n\t * Apply styles without a transition.\n\t * @param {Array.} objects Array of transition objects.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_styleImmediately',\n\t value: function _styleImmediately(objects) {\n\t var _this8 = this;\n\t\n\t if (objects.length) {\n\t var elements = objects.map(function (obj) {\n\t return obj.item.element;\n\t });\n\t\n\t Shuffle._skipTransitions(elements, function () {\n\t objects.forEach(function (obj) {\n\t obj.item.applyCss(_this8._getStylesForTransition(obj));\n\t obj.callback();\n\t });\n\t });\n\t }\n\t }\n\t }, {\n\t key: '_movementFinished',\n\t value: function _movementFinished() {\n\t this._transitions.length = 0;\n\t this.isTransitioning = false;\n\t this._dispatchLayout();\n\t }\n\t }, {\n\t key: '_dispatchLayout',\n\t value: function _dispatchLayout() {\n\t this._dispatch(Shuffle.EventType.LAYOUT);\n\t }\n\t\n\t /**\n\t * The magic. This is what makes the plugin 'shuffle'\n\t * @param {string|Function|Array.} [category] Category to filter by.\n\t * Can be a function, string, or array of strings.\n\t * @param {Object} [sortObj] A sort object which can sort the visible set\n\t */\n\t\n\t }, {\n\t key: 'filter',\n\t value: function filter(category, sortObj) {\n\t if (!this.isEnabled) {\n\t return;\n\t }\n\t\n\t if (!category || category && category.length === 0) {\n\t category = Shuffle.ALL_ITEMS;\n\t }\n\t\n\t this._filter(category);\n\t\n\t // Shrink each hidden item\n\t this._shrink();\n\t\n\t // How many visible elements?\n\t this._updateItemCount();\n\t\n\t // Update transforms on visible elements so they will animate to their new positions.\n\t this.sort(sortObj);\n\t }\n\t\n\t /**\n\t * Gets the visible elements, sorts them, and passes them to layout.\n\t * @param {Object} opts the options object for the sorted plugin\n\t */\n\t\n\t }, {\n\t key: 'sort',\n\t value: function sort() {\n\t var opts = arguments.length <= 0 || arguments[0] === undefined ? this.lastSort : arguments[0];\n\t\n\t if (!this.isEnabled) {\n\t return;\n\t }\n\t\n\t this._resetCols();\n\t\n\t var items = this._getFilteredItems();\n\t items = (0, _sorter2.default)(items, opts);\n\t\n\t this._layout(items);\n\t\n\t // `_layout` always happens after `_shrink`, so it's safe to process the style\n\t // queue here with styles from the shrink method.\n\t this._processQueue();\n\t\n\t // Adjust the height of the container.\n\t this._setContainerSize();\n\t\n\t this.lastSort = opts;\n\t }\n\t\n\t /**\n\t * Reposition everything.\n\t * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n\t * recalculated.\n\t */\n\t\n\t }, {\n\t key: 'update',\n\t value: function update(isOnlyLayout) {\n\t if (this.isEnabled) {\n\t\n\t if (!isOnlyLayout) {\n\t // Get updated colCount\n\t this._setColumns();\n\t }\n\t\n\t // Layout items\n\t this.sort();\n\t }\n\t }\n\t\n\t /**\n\t * Use this instead of `update()` if you don't need the columns and gutters updated\n\t * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n\t * could be off.\n\t */\n\t\n\t }, {\n\t key: 'layout',\n\t value: function layout() {\n\t this.update(true);\n\t }\n\t\n\t /**\n\t * New items have been appended to shuffle. Mix them in with the current\n\t * filter or sort status.\n\t * @param {Array.} newItems Collection of new items.\n\t */\n\t\n\t }, {\n\t key: 'add',\n\t value: function add(newItems) {\n\t newItems = (0, _arrayUniq2.default)(newItems).map(function (el) {\n\t return new _shuffleItem2.default(el);\n\t });\n\t\n\t // Add classes and set initial positions.\n\t this._initItems(newItems);\n\t\n\t // Add transition to each item.\n\t this._setTransitions(newItems);\n\t\n\t // Update the list of items.\n\t this.items = this.items.concat(newItems);\n\t this._updateItemsOrder();\n\t this.filter(this.lastFilter);\n\t }\n\t\n\t /**\n\t * Disables shuffle from updating dimensions and layout on resize\n\t */\n\t\n\t }, {\n\t key: 'disable',\n\t value: function disable() {\n\t this.isEnabled = false;\n\t }\n\t\n\t /**\n\t * Enables shuffle again\n\t * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n\t */\n\t\n\t }, {\n\t key: 'enable',\n\t value: function enable(isUpdateLayout) {\n\t this.isEnabled = true;\n\t if (isUpdateLayout !== false) {\n\t this.update();\n\t }\n\t }\n\t\n\t /**\n\t * Remove 1 or more shuffle items\n\t * @param {Array.} collection An array containing one or more\n\t * elements in shuffle\n\t * @return {Shuffle} The shuffle object\n\t */\n\t\n\t }, {\n\t key: 'remove',\n\t value: function remove(collection) {\n\t var _this9 = this;\n\t\n\t if (!collection.length) {\n\t return;\n\t }\n\t\n\t collection = (0, _arrayUniq2.default)(collection);\n\t\n\t var oldItems = collection.map(function (element) {\n\t return _this9.getItemByElement(element);\n\t }).filter(function (item) {\n\t return !!item;\n\t });\n\t\n\t var handleLayout = function handleLayout() {\n\t _this9.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n\t _this9._disposeItems(oldItems);\n\t\n\t // Remove the collection in the callback\n\t collection.forEach(function (element) {\n\t element.parentNode.removeChild(element);\n\t });\n\t\n\t _this9._dispatch(Shuffle.EventType.REMOVED, { collection: collection });\n\t\n\t // Let it get garbage collected\n\t collection = null;\n\t oldItems = null;\n\t };\n\t\n\t // Hide collection first.\n\t this._toggleFilterClasses({\n\t visible: [],\n\t hidden: oldItems\n\t });\n\t\n\t this._shrink(oldItems);\n\t\n\t this.sort();\n\t\n\t // Update the list of items here because `remove` could be called again\n\t // with an item that is in the process of being removed.\n\t this.items = this.items.filter(function (item) {\n\t return !arrayIncludes(oldItems, item);\n\t });\n\t this._updateItemCount();\n\t\n\t this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n\t }\n\t\n\t /**\n\t * Retrieve a shuffle item by its element.\n\t * @param {Element} element Element to look for.\n\t * @return {?ShuffleItem} A shuffle item or null if it's not found.\n\t */\n\t\n\t }, {\n\t key: 'getItemByElement',\n\t value: function getItemByElement(element) {\n\t for (var i = this.items.length - 1; i >= 0; i--) {\n\t if (this.items[i].element === element) {\n\t return this.items[i];\n\t }\n\t }\n\t\n\t return null;\n\t }\n\t\n\t /**\n\t * Destroys shuffle, removes events, styles, and classes\n\t */\n\t\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cancelMovement();\n\t window.removeEventListener('resize', this._onResize);\n\t\n\t // Reset container styles\n\t this.element.classList.remove('shuffle');\n\t this.element.removeAttribute('style');\n\t\n\t // Reset individual item styles\n\t this._disposeItems();\n\t\n\t // Null DOM references\n\t this.items = null;\n\t this.options.sizer = null;\n\t this.element = null;\n\t this._transitions = null;\n\t\n\t // Set a flag so if a debounced resize has been triggered,\n\t // it can first check if it is actually isDestroyed and not doing anything\n\t this.isDestroyed = true;\n\t }\n\t\n\t /**\n\t * Returns the outer width of an element, optionally including its margins.\n\t *\n\t * There are a few different methods for getting the width of an element, none of\n\t * which work perfectly for all Shuffle's use cases.\n\t *\n\t * 1. getBoundingClientRect() `left` and `right` properties.\n\t * - Accounts for transform scaled elements, making it useless for Shuffle\n\t * elements which have shrunk.\n\t * 2. The `offsetWidth` property.\n\t * - This value stays the same regardless of the elements transform property,\n\t * however, it does not return subpixel values.\n\t * 3. getComputedStyle()\n\t * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n\t * padding and border when box-sizing: border-box is set, requiring a feature\n\t * test and extra work to add the padding back for IE and other browsers which\n\t * follow the W3C spec here.\n\t *\n\t * @param {Element} element The element.\n\t * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n\t * @return {{width: number, height: number}} The width and height.\n\t */\n\t\n\t }], [{\n\t key: 'getSize',\n\t value: function getSize(element, includeMargins) {\n\t // Store the styles so that they can be used by others without asking for it again.\n\t var styles = window.getComputedStyle(element, null);\n\t var width = (0, _getNumberStyle2.default)(element, 'width', styles);\n\t var height = (0, _getNumberStyle2.default)(element, 'height', styles);\n\t\n\t if (includeMargins) {\n\t var marginLeft = (0, _getNumberStyle2.default)(element, 'marginLeft', styles);\n\t var marginRight = (0, _getNumberStyle2.default)(element, 'marginRight', styles);\n\t var marginTop = (0, _getNumberStyle2.default)(element, 'marginTop', styles);\n\t var marginBottom = (0, _getNumberStyle2.default)(element, 'marginBottom', styles);\n\t width += marginLeft + marginRight;\n\t height += marginTop + marginBottom;\n\t }\n\t\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t }\n\t\n\t /**\n\t * Change a property or execute a function which will not have a transition\n\t * @param {Array.} elements DOM elements that won't be transitioned.\n\t * @param {Function} callback A function which will be called while transition\n\t * is set to 0ms.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_skipTransitions',\n\t value: function _skipTransitions(elements, callback) {\n\t var zero = '0ms';\n\t\n\t // Save current duration and delay.\n\t var data = elements.map(function (element) {\n\t var style = element.style;\n\t var duration = style.transitionDuration;\n\t var delay = style.transitionDelay;\n\t\n\t // Set the duration to zero so it happens immediately\n\t style.transitionDuration = zero;\n\t style.transitionDelay = zero;\n\t\n\t return {\n\t duration: duration,\n\t delay: delay\n\t };\n\t });\n\t\n\t callback();\n\t\n\t // Cause reflow.\n\t elements[0].offsetWidth; // jshint ignore:line\n\t\n\t // Put the duration back\n\t elements.forEach(function (element, i) {\n\t element.style.transitionDuration = data[i].duration;\n\t element.style.transitionDelay = data[i].delay;\n\t });\n\t }\n\t }]);\n\t\n\t return Shuffle;\n\t}();\n\t\n\tShuffle.ShuffleItem = _shuffleItem2.default;\n\t\n\tShuffle.ALL_ITEMS = 'all';\n\tShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\t\n\t/**\n\t * @enum {string}\n\t */\n\tShuffle.EventType = {\n\t LAYOUT: 'shuffle:layout',\n\t REMOVED: 'shuffle:removed'\n\t};\n\t\n\t/** @enum {string} */\n\tShuffle.Classes = _classes2.default;\n\t\n\t// Overrideable options\n\tShuffle.options = {\n\t // Initial filter group.\n\t group: Shuffle.ALL_ITEMS,\n\t\n\t // Transition/animation speed (milliseconds).\n\t speed: 250,\n\t\n\t // CSS easing function to use.\n\t easing: 'ease',\n\t\n\t // e.g. '.picture-item'.\n\t itemSelector: '*',\n\t\n\t // Element or selector string. Use an element to determine the size of columns\n\t // and gutters.\n\t sizer: null,\n\t\n\t // A static number or function that tells the plugin how wide the gutters\n\t // between columns are (in pixels).\n\t gutterWidth: 0,\n\t\n\t // A static number or function that returns a number which tells the plugin\n\t // how wide the columns are (in pixels).\n\t columnWidth: 0,\n\t\n\t // If your group is not json, and is comma delimeted, you could set delimeter\n\t // to ','.\n\t delimeter: null,\n\t\n\t // Useful for percentage based heights when they might not always be exactly\n\t // the same (in pixels).\n\t buffer: 0,\n\t\n\t // Reading the width of elements isn't precise enough and can cause columns to\n\t // jump between values.\n\t columnThreshold: 0.01,\n\t\n\t // Shuffle can be isInitialized with a sort object. It is the same object\n\t // given to the sort method.\n\t initialSort: null,\n\t\n\t // By default, shuffle will throttle resize events. This can be changed or\n\t // removed.\n\t throttle: _throttleit2.default,\n\t\n\t // How often shuffle can be called on resize (in milliseconds).\n\t throttleTime: 300,\n\t\n\t // Transition delay offset for each item in milliseconds.\n\t staggerAmount: 15,\n\t\n\t // Maximum stagger delay in milliseconds.\n\t staggerAmountMax: 250,\n\t\n\t // Whether to use transforms or absolute positioning.\n\t useTransforms: true\n\t};\n\t\n\t// Expose for testing. Hack at your own risk.\n\tShuffle.__Point = _point2.default;\n\tShuffle.__sorter = _sorter2.default;\n\tShuffle.__getColumnSpan = _layout2.getColumnSpan;\n\tShuffle.__getAvailablePositions = _layout2.getAvailablePositions;\n\tShuffle.__getShortColumn = _layout2.getShortColumn;\n\t\n\texports.default = Shuffle;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t// Polyfill for creating CustomEvents on IE9/10/11\n\t\n\t// code pulled from:\n\t// https://github.com/d4tocchini/customevent-polyfill\n\t// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\t\n\ttry {\n\t new window.CustomEvent(\"test\");\n\t} catch(e) {\n\t var CustomEvent = function(event, params) {\n\t var evt;\n\t params = params || {\n\t bubbles: false,\n\t cancelable: false,\n\t detail: undefined\n\t };\n\t\n\t evt = document.createEvent(\"CustomEvent\");\n\t evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t return evt;\n\t };\n\t\n\t CustomEvent.prototype = window.Event.prototype;\n\t window.CustomEvent = CustomEvent; // expose definition to window\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar proto = Element.prototype;\n\tvar vendor = proto.matches\n\t || proto.matchesSelector\n\t || proto.webkitMatchesSelector\n\t || proto.mozMatchesSelector\n\t || proto.msMatchesSelector\n\t || proto.oMatchesSelector;\n\t\n\tmodule.exports = match;\n\t\n\t/**\n\t * Match `el` to `selector`.\n\t *\n\t * @param {Element} el\n\t * @param {String} selector\n\t * @return {Boolean}\n\t * @api public\n\t */\n\t\n\tfunction match(el, selector) {\n\t if (vendor) return vendor.call(el, selector);\n\t var nodes = el.parentNode.querySelectorAll(selector);\n\t for (var i = 0; i < nodes.length; i++) {\n\t if (nodes[i] == el) return true;\n\t }\n\t return false;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\t// there's 3 implementations written in increasing order of efficiency\n\t\n\t// 1 - no Set type is defined\n\tfunction uniqNoSet(arr) {\n\t\tvar ret = [];\n\t\n\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\t\tret.push(arr[i]);\n\t\t\t}\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t// 2 - a simple Set type is defined\n\tfunction uniqSet(arr) {\n\t\tvar seen = new Set();\n\t\treturn arr.filter(function (el) {\n\t\t\tif (!seen.has(el)) {\n\t\t\t\tseen.add(el);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t}\n\t\n\t// 3 - a standard Set type is defined and it has a forEach method\n\tfunction uniqSetWithForEach(arr) {\n\t\tvar ret = [];\n\t\n\t\t(new Set(arr)).forEach(function (el) {\n\t\t\tret.push(el);\n\t\t});\n\t\n\t\treturn ret;\n\t}\n\t\n\t// V8 currently has a broken implementation\n\t// https://github.com/joyent/node/issues/8449\n\tfunction doesForEachActuallyWork() {\n\t\tvar ret = false;\n\t\n\t\t(new Set([true])).forEach(function (el) {\n\t\t\tret = el;\n\t\t});\n\t\n\t\treturn ret === true;\n\t}\n\t\n\tif ('Set' in global) {\n\t\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\t\tmodule.exports = uniqSetWithForEach;\n\t\t} else {\n\t\t\tmodule.exports = uniqSet;\n\t\t}\n\t} else {\n\t\tmodule.exports = uniqNoSet;\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\tmodule.exports = extend\n\t\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\t\n\tfunction extend() {\n\t var target = {}\n\t\n\t for (var i = 0; i < arguments.length; i++) {\n\t var source = arguments[i]\n\t\n\t for (var key in source) {\n\t if (hasOwnProperty.call(source, key)) {\n\t target[key] = source[key]\n\t }\n\t }\n\t }\n\t\n\t return target\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\tmodule.exports = throttle;\n\t\n\t/**\n\t * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n\t *\n\t * @param {Function} func Function to wrap.\n\t * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n\t * @return {Function} A new function that wraps the `func` function passed in.\n\t */\n\t\n\tfunction throttle (func, wait) {\n\t var ctx, args, rtn, timeoutID; // caching\n\t var last = 0;\n\t\n\t return function throttled () {\n\t ctx = this;\n\t args = arguments;\n\t var delta = new Date() - last;\n\t if (!timeoutID)\n\t if (delta >= wait) call();\n\t else timeoutID = setTimeout(call, wait - delta);\n\t return rtn;\n\t };\n\t\n\t function call () {\n\t timeoutID = 0;\n\t last = +new Date();\n\t rtn = func.apply(ctx, args);\n\t ctx = null;\n\t args = null;\n\t }\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function parallel(fns, context, callback) {\n\t if (!callback) {\n\t if (typeof context === 'function') {\n\t callback = context\n\t context = null\n\t } else {\n\t callback = noop\n\t }\n\t }\n\t\n\t var pending = fns && fns.length\n\t if (!pending) return callback(null, []);\n\t\n\t var finished = false\n\t var results = new Array(pending)\n\t\n\t fns.forEach(context ? function (fn, i) {\n\t fn.call(context, maybeDone(i))\n\t } : function (fn, i) {\n\t fn(maybeDone(i))\n\t })\n\t\n\t function maybeDone(i) {\n\t return function (err, result) {\n\t if (finished) return;\n\t\n\t if (err) {\n\t callback(err, results)\n\t finished = true\n\t return\n\t }\n\t\n\t results[i] = result\n\t\n\t if (!--pending) callback(null, results);\n\t }\n\t }\n\t}\n\t\n\tfunction noop() {}\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _getNumber = __webpack_require__(9);\n\t\n\tvar _getNumber2 = _interopRequireDefault(_getNumber);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Represents a coordinate pair.\n\t * @param {number} [x=0] X.\n\t * @param {number} [y=0] Y.\n\t */\n\tvar Point = function Point(x, y) {\n\t this.x = (0, _getNumber2.default)(x);\n\t this.y = (0, _getNumber2.default)(y);\n\t};\n\t\n\t/**\n\t * Whether two points are equal.\n\t * @param {Point} a Point A.\n\t * @param {Point} b Point B.\n\t * @return {boolean}\n\t */\n\tPoint.equals = function (a, b) {\n\t return a.x === b.x && a.y === b.y;\n\t};\n\t\n\texports.default = Point;\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n\t * @param {*} value Possibly numeric value.\n\t * @return {number} `value` or zero if `value` isn't numeric.\n\t */\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = getNumber;\n\tfunction getNumber(value) {\n\t return parseFloat(value) || 0;\n\t}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tvar _classes = __webpack_require__(11);\n\t\n\tvar _classes2 = _interopRequireDefault(_classes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar id = 0;\n\t\n\tvar ShuffleItem = function () {\n\t function ShuffleItem(element) {\n\t _classCallCheck(this, ShuffleItem);\n\t\n\t this.id = id++;\n\t this.element = element;\n\t this.isVisible = true;\n\t }\n\t\n\t _createClass(ShuffleItem, [{\n\t key: 'show',\n\t value: function show() {\n\t this.isVisible = true;\n\t this.element.classList.remove(_classes2.default.HIDDEN);\n\t this.element.classList.add(_classes2.default.VISIBLE);\n\t }\n\t }, {\n\t key: 'hide',\n\t value: function hide() {\n\t this.isVisible = false;\n\t this.element.classList.remove(_classes2.default.VISIBLE);\n\t this.element.classList.add(_classes2.default.HIDDEN);\n\t }\n\t }, {\n\t key: 'init',\n\t value: function init() {\n\t this.addClasses([_classes2.default.SHUFFLE_ITEM, _classes2.default.VISIBLE]);\n\t this.applyCss(ShuffleItem.Css.INITIAL);\n\t this.scale = ShuffleItem.Scale.VISIBLE;\n\t this.point = new _point2.default();\n\t }\n\t }, {\n\t key: 'addClasses',\n\t value: function addClasses(classes) {\n\t var _this = this;\n\t\n\t classes.forEach(function (className) {\n\t _this.element.classList.add(className);\n\t });\n\t }\n\t }, {\n\t key: 'removeClasses',\n\t value: function removeClasses(classes) {\n\t var _this2 = this;\n\t\n\t classes.forEach(function (className) {\n\t _this2.element.classList.remove(className);\n\t });\n\t }\n\t }, {\n\t key: 'applyCss',\n\t value: function applyCss(obj) {\n\t for (var key in obj) {\n\t this.element.style[key] = obj[key];\n\t }\n\t }\n\t }, {\n\t key: 'dispose',\n\t value: function dispose() {\n\t this.removeClasses([_classes2.default.HIDDEN, _classes2.default.VISIBLE, _classes2.default.SHUFFLE_ITEM]);\n\t\n\t this.element.removeAttribute('style');\n\t this.element = null;\n\t }\n\t }]);\n\t\n\t return ShuffleItem;\n\t}();\n\t\n\tShuffleItem.Css = {\n\t INITIAL: {\n\t position: 'absolute',\n\t top: 0,\n\t left: 0,\n\t visibility: 'visible',\n\t 'will-change': 'transform'\n\t },\n\t VISIBLE: {\n\t before: {\n\t opacity: 1,\n\t visibility: 'visible'\n\t },\n\t after: {}\n\t },\n\t HIDDEN: {\n\t before: {\n\t opacity: 0\n\t },\n\t after: {\n\t visibility: 'hidden'\n\t }\n\t }\n\t};\n\t\n\tShuffleItem.Scale = {\n\t VISIBLE: 1,\n\t HIDDEN: 0.001\n\t};\n\t\n\texports.default = ShuffleItem;\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = {\n\t BASE: 'shuffle',\n\t SHUFFLE_ITEM: 'shuffle-item',\n\t VISIBLE: 'shuffle-item--visible',\n\t HIDDEN: 'shuffle-item--hidden'\n\t};\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = getNumberStyle;\n\t\n\tvar _getNumber = __webpack_require__(9);\n\t\n\tvar _getNumber2 = _interopRequireDefault(_getNumber);\n\t\n\tvar _computedSize = __webpack_require__(13);\n\t\n\tvar _computedSize2 = _interopRequireDefault(_computedSize);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Retrieve the computed style for an element, parsed as a float.\n\t * @param {Element} element Element to get style for.\n\t * @param {string} style Style property.\n\t * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n\t * use instead of asking for them again.\n\t * @return {number} The parsed computed value or zero if that fails because IE\n\t * will return 'auto' when the element doesn't have margins instead of\n\t * the computed style.\n\t */\n\tfunction getNumberStyle(element, style) {\n\t var styles = arguments.length <= 2 || arguments[2] === undefined ? window.getComputedStyle(element, null) : arguments[2];\n\t\n\t var value = (0, _getNumber2.default)(styles[style]);\n\t\n\t // Support IE<=11 and W3C spec.\n\t if (!_computedSize2.default && style === 'width') {\n\t value += (0, _getNumber2.default)(styles.paddingLeft) + (0, _getNumber2.default)(styles.paddingRight) + (0, _getNumber2.default)(styles.borderLeftWidth) + (0, _getNumber2.default)(styles.borderRightWidth);\n\t } else if (!_computedSize2.default && style === 'height') {\n\t value += (0, _getNumber2.default)(styles.paddingTop) + (0, _getNumber2.default)(styles.paddingBottom) + (0, _getNumber2.default)(styles.borderTopWidth) + (0, _getNumber2.default)(styles.borderBottomWidth);\n\t }\n\t\n\t return value;\n\t}\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar element = document.body || document.documentElement;\n\tvar e = document.createElement('div');\n\te.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n\telement.appendChild(e);\n\t\n\tvar width = window.getComputedStyle(e, null).width;\n\tvar ret = width === '10px';\n\t\n\telement.removeChild(e);\n\t\n\texports.default = ret;\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = sorter;\n\t\n\tvar _xtend = __webpack_require__(5);\n\t\n\tvar _xtend2 = _interopRequireDefault(_xtend);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// http://stackoverflow.com/a/962890/373422\n\tfunction randomize(array) {\n\t var tmp;\n\t var current;\n\t var top = array.length;\n\t\n\t if (!top) {\n\t return array;\n\t }\n\t\n\t while (--top) {\n\t current = Math.floor(Math.random() * (top + 1));\n\t tmp = array[current];\n\t array[current] = array[top];\n\t array[top] = tmp;\n\t }\n\t\n\t return array;\n\t}\n\t\n\tvar defaults = {\n\t // Use array.reverse() to reverse the results\n\t reverse: false,\n\t\n\t // Sorting function\n\t by: null,\n\t\n\t // If true, this will skip the sorting and return a randomized order in the array\n\t randomize: false,\n\t\n\t // Determines which property of each item in the array is passed to the\n\t // sorting method.\n\t key: 'element'\n\t};\n\t\n\t// You can return `undefined` from the `by` function to revert to DOM order.\n\tfunction sorter(arr, options) {\n\t var opts = (0, _xtend2.default)(defaults, options);\n\t var original = [].slice.call(arr);\n\t var revert = false;\n\t\n\t if (!arr.length) {\n\t return [];\n\t }\n\t\n\t if (opts.randomize) {\n\t return randomize(arr);\n\t }\n\t\n\t // Sort the elements by the opts.by function.\n\t // If we don't have opts.by, default to DOM order\n\t if (typeof opts.by === 'function') {\n\t arr.sort(function (a, b) {\n\t\n\t // Exit early if we already know we want to revert\n\t if (revert) {\n\t return 0;\n\t }\n\t\n\t var valA = opts.by(a[opts.key]);\n\t var valB = opts.by(b[opts.key]);\n\t\n\t // If both values are undefined, use the DOM order\n\t if (valA === undefined && valB === undefined) {\n\t revert = true;\n\t return 0;\n\t }\n\t\n\t if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n\t return -1;\n\t }\n\t\n\t if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n\t return 1;\n\t }\n\t\n\t return 0;\n\t });\n\t }\n\t\n\t // Revert to the original array if necessary\n\t if (revert) {\n\t return original;\n\t }\n\t\n\t if (opts.reverse) {\n\t arr.reverse();\n\t }\n\t\n\t return arr;\n\t}\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.onTransitionEnd = onTransitionEnd;\n\texports.cancelTransitionEnd = cancelTransitionEnd;\n\tvar transitions = {};\n\tvar eventName = 'transitionend';\n\tvar count = 0;\n\t\n\tfunction uniqueId() {\n\t return eventName + count++;\n\t}\n\t\n\tfunction onTransitionEnd(element, callback) {\n\t var id = uniqueId();\n\t var listener = function listener(evt) {\n\t if (evt.currentTarget === evt.target) {\n\t cancelTransitionEnd(id);\n\t callback(evt);\n\t }\n\t };\n\t\n\t element.addEventListener(eventName, listener);\n\t\n\t transitions[id] = { element: element, listener: listener };\n\t\n\t return id;\n\t}\n\t\n\tfunction cancelTransitionEnd(id) {\n\t if (transitions[id]) {\n\t transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n\t transitions[id] = null;\n\t return true;\n\t }\n\t\n\t return false;\n\t}\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getItemPosition = getItemPosition;\n\texports.getColumnSpan = getColumnSpan;\n\texports.getAvailablePositions = getAvailablePositions;\n\texports.getShortColumn = getShortColumn;\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction arrayMax(array) {\n\t return Math.max.apply(Math, array);\n\t}\n\t\n\tfunction arrayMin(array) {\n\t return Math.min.apply(Math, array);\n\t}\n\t\n\t/**\n\t * Determine the location of the next item, based on its size.\n\t * @param {Object} itemSize Object with width and height.\n\t * @param {Array.} positions Positions of the other current items.\n\t * @param {number} gridSize The column width or row height.\n\t * @param {number} total The total number of columns or rows.\n\t * @param {number} threshold Buffer value for the column to fit.\n\t * @param {number} buffer Vertical buffer for the height of items.\n\t * @return {Point}\n\t */\n\tfunction getItemPosition(_ref) {\n\t var itemSize = _ref.itemSize;\n\t var positions = _ref.positions;\n\t var gridSize = _ref.gridSize;\n\t var total = _ref.total;\n\t var threshold = _ref.threshold;\n\t var buffer = _ref.buffer;\n\t\n\t var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n\t var setY = getAvailablePositions(positions, span, total);\n\t var shortColumnIndex = getShortColumn(setY, buffer);\n\t\n\t // Position the item\n\t var point = new _point2.default(Math.round(gridSize * shortColumnIndex), Math.round(setY[shortColumnIndex]));\n\t\n\t // Update the columns array with the new values for each column.\n\t // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n\t // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n\t var setHeight = setY[shortColumnIndex] + itemSize.height;\n\t for (var i = 0; i < span; i++) {\n\t positions[shortColumnIndex + i] = setHeight;\n\t }\n\t\n\t return point;\n\t}\n\t\n\t/**\n\t * Determine the number of columns an items spans.\n\t * @param {number} itemWidth Width of the item.\n\t * @param {number} columnWidth Width of the column (includes gutter).\n\t * @param {number} columns Total number of columns\n\t * @param {number} threshold A buffer value for the size of the column to fit.\n\t * @return {number}\n\t */\n\tfunction getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n\t var columnSpan = itemWidth / columnWidth;\n\t\n\t // If the difference between the rounded column span number and the\n\t // calculated column span number is really small, round the number to\n\t // make it fit.\n\t if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n\t // e.g. columnSpan = 4.0089945390298745\n\t columnSpan = Math.round(columnSpan);\n\t }\n\t\n\t // Ensure the column span is not more than the amount of columns in the whole layout.\n\t return Math.min(Math.ceil(columnSpan), columns);\n\t}\n\t\n\t/**\n\t * Retrieves the column set to use for placement.\n\t * @param {number} columnSpan The number of columns this current item spans.\n\t * @param {number} columns The total columns in the grid.\n\t * @return {Array.} An array of numbers represeting the column set.\n\t */\n\tfunction getAvailablePositions(positions, columnSpan, columns) {\n\t // The item spans only one column.\n\t if (columnSpan === 1) {\n\t return positions;\n\t }\n\t\n\t // The item spans more than one column, figure out how many different\n\t // places it could fit horizontally.\n\t // The group count is the number of places within the positions this block\n\t // could fit, ignoring the current positions of items.\n\t // Imagine a 2 column brick as the second item in a 4 column grid with\n\t // 10px height each. Find the places it would fit:\n\t // [20, 10, 10, 0]\n\t // | | |\n\t // * * *\n\t //\n\t // Then take the places which fit and get the bigger of the two:\n\t // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n\t //\n\t // Next, find the first smallest number (the short column).\n\t // [20, 10, 0]\n\t // |\n\t // *\n\t //\n\t // And that's where it should be placed!\n\t //\n\t // Another example where the second column's item extends past the first:\n\t // [10, 20, 10, 0] => [20, 20, 10] => 10\n\t var available = [];\n\t\n\t // For how many possible positions for this item there are.\n\t for (var i = 0; i <= columns - columnSpan; i++) {\n\t // Find the bigger value for each place it could fit.\n\t available.push(arrayMax(positions.slice(i, i + columnSpan)));\n\t }\n\t\n\t return available;\n\t}\n\t\n\t/**\n\t * Find index of short column, the first from the left where this item will go.\n\t *\n\t * @param {Array.} positions The array to search for the smallest number.\n\t * @param {number} buffer Optional buffer which is very useful when the height\n\t * is a percentage of the width.\n\t * @return {number} Index of the short column.\n\t */\n\tfunction getShortColumn(positions, buffer) {\n\t var minPosition = arrayMin(positions);\n\t for (var i = 0, len = positions.length; i < len; i++) {\n\t if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n\t return i;\n\t }\n\t }\n\t\n\t return 0;\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** shuffle.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 1e8dff1889ac409e1855\n **/","module.exports = require('./shuffle').default;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","'use strict';\n\nimport 'custom-event-polyfill';\nimport matches from 'matches-selector';\nimport arrayUnique from 'array-uniq';\nimport xtend from 'xtend';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\nimport Point from './point';\nimport ShuffleItem from './shuffle-item';\nimport Classes from './classes';\nimport getNumberStyle from './get-number-style';\nimport sorter from './sorter';\nimport { onTransitionEnd, cancelTransitionEnd } from './on-transition-end';\nimport { getItemPosition, getColumnSpan, getAvailablePositions, getShortColumn } from './layout';\n\nfunction toArray(arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n}\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayIncludes(array, obj) {\n if (arguments.length === 2) {\n return arrayIncludes(array)(obj);\n }\n\n return function (obj) {\n return array.indexOf(obj) > -1;\n };\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle {\n\n /**\n * Categorize, sort, and filter a responsive grid of items.\n *\n * @param {Element} element An element which is the parent container for the grid items.\n * @param {Object} [options=Shuffle.options] Options object.\n * @constructor\n */\n constructor(element, options = {}) {\n this.options = xtend(Shuffle.options, options);\n\n this.useSizer = false;\n this.lastSort = {};\n this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n this.isEnabled = true;\n this.isDestroyed = false;\n this.isInitialized = false;\n this._transitions = [];\n this.isTransitioning = false;\n this._queue = [];\n\n element = this._getElementOption(element);\n\n if (!element) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = element;\n this.id = 'shuffle_' + id++;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n\n this.options.sizer = this._getElementOption(this.options.sizer);\n\n if (this.options.sizer) {\n this.useSizer = true;\n }\n\n // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems();\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // Get container css all in one request. Causes reflow\n var containerCss = window.getComputedStyle(this.element, null);\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // Add styles to the container if it doesn't have them.\n this._validateStyles(containerCss);\n\n // We already got the container's width above, no need to cause another\n // reflow getting it again... Calculate the number of columns there will be\n this._setColumns(containerWidth);\n\n // Kick off!\n this.filter(this.options.group, this.options.initialSort);\n\n // The shuffle items haven't had transitions set on them yet so the user\n // doesn't see the first layout. Set them now that the first layout is done.\n // First, however, a synchronous layout must be caused for the previous\n // styles to be applied without transitions.\n this.element.offsetWidth; // jshint ignore: line\n this._setTransitions();\n this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n }\n\n /**\n * Returns a throttled and proxied function for the resize handler.\n * @return {Function}\n * @private\n */\n _getResizeFunction() {\n var resizeFunction = this._handleResize.bind(this);\n return this.options.throttle ?\n this.options.throttle(resizeFunction, this.options.throttleTime) :\n resizeFunction;\n }\n\n /**\n * Retrieve an element from an option.\n * @param {string|jQuery|Element} option The option to check.\n * @return {?Element} The plain element or null.\n * @private\n */\n _getElementOption(option) {\n // If column width is a string, treat is as a selector and search for the\n // sizer element within the outermost container\n if (typeof option === 'string') {\n return this.element.querySelector(option);\n\n // Check for an element\n } else if (option && option.nodeType && option.nodeType === 1) {\n return option;\n\n // Check for jQuery object\n } else if (option && option.jquery) {\n return option[0];\n }\n\n return null;\n }\n\n /**\n * Ensures the shuffle container has the css styles it needs applied to it.\n * @param {Object} styles Key value pairs for position and overflow.\n * @private\n */\n _validateStyles(styles) {\n // Position cannot be static.\n if (styles.position === 'static') {\n this.element.style.position = 'relative';\n }\n\n // Overflow has to be hidden.\n if (styles.overflow !== 'hidden') {\n this.element.style.overflow = 'hidden';\n }\n }\n\n /**\n * Filter the elements by a category.\n * @param {string} [category] Category to filter by. If it's given, the last\n * category will be used to filter the items.\n * @param {Array} [collection] Optionally filter a collection. Defaults to\n * all the items.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n var set = this._getFilteredSets(category, collection);\n\n // Individually add/remove hidden/visible classes\n this._toggleFilterClasses(set);\n\n // Save the last filter in case elements are appended.\n this.lastFilter = category;\n\n // This is saved mainly because providing a filter function (like searching)\n // will overwrite the `lastFilter` property every time its called.\n if (typeof category === 'string') {\n this.group = category;\n }\n\n return set;\n }\n\n /**\n * Returns an object containing the visible and hidden elements.\n * @param {string|Function} category Category or function to filter by.\n * @param {Array.} items A collection of items to filter.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n let hidden = [];\n\n // category === 'all', add visible class to everything\n if (category === Shuffle.ALL_ITEMS) {\n visible = items;\n\n // Loop through each item and use provided function to determine\n // whether to hide it or not.\n } else {\n items.forEach((item) => {\n if (this._doesPassFilter(category, item.element)) {\n visible.push(item);\n } else {\n hidden.push(item);\n }\n });\n }\n\n return {\n visible,\n hidden,\n };\n }\n\n /**\n * Test an item to see if it passes a category.\n * @param {string|Function} category Category or function to filter by.\n * @param {Element} element An element to test.\n * @return {boolean} Whether it passes the category/filter.\n * @private\n */\n _doesPassFilter(category, element) {\n\n if (typeof category === 'function') {\n return category.call(element, element, this);\n\n // Check each element's data-groups attribute against the given category.\n } else {\n let attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n let groups = JSON.parse(attr);\n let keys = this.delimeter && !Array.isArray(groups) ?\n groups.split(this.delimeter) :\n groups;\n\n if (Array.isArray(category)) {\n return category.some(arrayIncludes(keys));\n }\n\n return arrayIncludes(keys, category);\n }\n }\n\n /**\n * Toggles the visible and hidden class names.\n * @param {{visible, hidden}} Object with visible and hidden arrays.\n * @private\n */\n _toggleFilterClasses({ visible, hidden }) {\n visible.forEach((item) => {\n item.show();\n });\n\n hidden.forEach((item) => {\n item.hide();\n });\n }\n\n /**\n * Set the initial css for each item\n * @param {Array.} [items] Optionally specifiy at set to initialize.\n * @private\n */\n _initItems(items = this.items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @private\n */\n _disposeItems(items = this.items) {\n items.forEach((item) => {\n item.dispose();\n });\n }\n\n /**\n * Updates the visible item count.\n * @private\n */\n _updateItemCount() {\n this.visibleItems = this._getFilteredItems().length;\n }\n\n /**\n * Sets css transform transition on a group of elements. This is not executed\n * at the same time as `item.init` so that transitions don't occur upon\n * initialization of Shuffle.\n * @param {Array.} items Shuffle items to set transitions on.\n * @private\n */\n _setTransitions(items = this.items) {\n let speed = this.options.speed;\n let easing = this.options.easing;\n\n var str;\n if (this.options.useTransforms) {\n str = 'transform ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n } else {\n str = 'top ' + speed + 'ms ' + easing +\n ', left ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n }\n\n items.forEach((item) => {\n item.element.style.transition = str;\n });\n }\n\n _getItems() {\n return toArray(this.element.children)\n .filter(el => matches(el, this.options.itemSelector))\n .map(el => new ShuffleItem(el));\n }\n\n /**\n * When new elements are added to the shuffle container, update the array of\n * items because that is the order `_layout` calls them.\n */\n _updateItemsOrder() {\n let children = this.element.children;\n this.items = sorter(this.items, {\n by(element) {\n return Array.prototype.indexOf.call(children, element);\n },\n });\n }\n\n _getFilteredItems() {\n return this.items.filter(item => item.isVisible);\n }\n\n _getConcealedItems() {\n return this.items.filter(item => !item.isVisible);\n }\n\n /**\n * Returns the column size, based on column width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @param {number} gutterSize Size of the gutters.\n * @return {number}\n * @private\n */\n _getColumnSize(containerWidth, gutterSize) {\n var size;\n\n // If the columnWidth property is a function, then the grid is fluid\n if (typeof this.options.columnWidth === 'function') {\n size = this.options.columnWidth(containerWidth);\n\n // columnWidth option isn't a function, are they using a sizing element?\n } else if (this.useSizer) {\n size = Shuffle.getSize(this.options.sizer).width;\n\n // if not, how about the explicitly set option?\n } else if (this.options.columnWidth) {\n size = this.options.columnWidth;\n\n // or use the size of the first item\n } else if (this.items.length > 0) {\n size = Shuffle.getSize(this.items[0].element, true).width;\n\n // if there's no items, use size of container\n } else {\n size = containerWidth;\n }\n\n // Don't let them set a column width of zero.\n if (size === 0) {\n size = containerWidth;\n }\n\n return size + gutterSize;\n }\n\n /**\n * Returns the gutter size, based on gutter width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @return {number}\n * @private\n */\n _getGutterSize(containerWidth) {\n var size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.useSizer) {\n size = getNumberStyle(this.options.sizer, 'marginLeft');\n } else {\n size = this.options.gutterWidth;\n }\n\n return size;\n }\n\n /**\n * Calculate the number of columns to be used. Gets css if using sizer element.\n * @param {number} [containerWidth] Optionally specify a container width if\n * it's already available.\n */\n _setColumns(containerWidth = Shuffle.getSize(this.element).width) {\n var gutter = this._getGutterSize(containerWidth);\n var columnWidth = this._getColumnSize(containerWidth, gutter);\n var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\n // Widths given from getStyles are not precise enough...\n if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) <\n this.options.columnThreshold) {\n // e.g. calculatedColumns = 11.998876\n calculatedColumns = Math.round(calculatedColumns);\n }\n\n this.cols = Math.max(Math.floor(calculatedColumns), 1);\n this.containerWidth = containerWidth;\n this.colWidth = columnWidth;\n }\n\n /**\n * Adjust the height of the grid\n */\n _setContainerSize() {\n this.element.style.height = this._getContainerSize() + 'px';\n }\n\n /**\n * Based on the column heights, it returns the biggest one.\n * @return {number}\n * @private\n */\n _getContainerSize() {\n return arrayMax(this.positions);\n }\n\n /**\n * Get the clamped stagger amount.\n * @param {number} index Index of the item to be staggered.\n * @return {number}\n */\n _getStaggerAmount(index) {\n return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n }\n\n /**\n * @return {boolean} Whether the event was prevented or not.\n */\n _dispatch(name, details = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n details.shuffle = this;\n return !this.element.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n cancelable: false,\n detail: details,\n }));\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n var i = this.cols;\n this.positions = [];\n while (i--) {\n this.positions.push(0);\n }\n }\n\n /**\n * Loops through each item that should be shown and calculates the x, y position.\n * @param {Array.} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n let count = 0;\n items.forEach((item) => {\n var currPos = item.point;\n var currScale = item.scale;\n var itemSize = Shuffle.getSize(item.element, true);\n var pos = this._getItemPosition(itemSize);\n\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(currPos, pos) && currScale === ShuffleItem.Scale.VISIBLE) {\n callback();\n return;\n }\n\n item.point = pos;\n item.scale = ShuffleItem.Scale.VISIBLE;\n\n let styles = ShuffleItem.Css.VISIBLE.before;\n styles.transitionDelay = this._getStaggerAmount(count);\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Determine the location of the next item, based on its size.\n * @param {{width: number, height: number}} itemSize Object with width and height.\n * @return {Point}\n * @private\n */\n _getItemPosition(itemSize) {\n return getItemPosition({\n itemSize,\n positions: this.positions,\n gridSize: this.colWidth,\n total: this.cols,\n threshold: this.options.columnThreshold,\n buffer: this.options.buffer,\n });\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {Array.} collection Collection to shrink.\n * @private\n */\n _shrink(collection = this._getConcealedItems()) {\n let count = 0;\n collection.forEach((item) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n }\n\n // Continuing would add a transitionend event listener to the element, but\n // that listener would not execute because the transform and opacity would\n // stay the same.\n // The callback is executed here because it is not guaranteed to be called\n // after the transitionend event because the transitionend could be\n // canceled if another animation starts.\n if (item.scale === ShuffleItem.Scale.HIDDEN) {\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n\n let styles = ShuffleItem.Css.HIDDEN.before;\n styles.transitionDelay = this._getStaggerAmount(count);\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Resize handler.\n * @private\n */\n _handleResize() {\n // If shuffle is disabled, destroyed, don't do anything\n if (!this.isEnabled || this.isDestroyed) {\n return;\n }\n\n // Will need to check height in the future if it's layed out horizontaly\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // containerWidth hasn't changed, don't do anything\n if (containerWidth === this.containerWidth) {\n return;\n }\n\n this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {Object} obj Transition options.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @private\n */\n _getStylesForTransition({ item, styles }) {\n if (!styles.transitionDelay) {\n styles.transitionDelay = '0ms';\n }\n\n let x = item.point.x;\n let y = item.point.y;\n\n if (this.options.useTransforms) {\n styles.transform = `translate(${x}px, ${y}px) scale(${item.scale})`;\n } else {\n styles.left = x + 'px';\n styles.top = y + 'px';\n }\n\n return styles;\n }\n\n /**\n * Listen for the transition end on an element and execute the itemCallback\n * when it finishes.\n * @param {Element} element Element to listen on.\n * @param {Function} itemCallback Callback for the item.\n * @param {Function} done Callback to notify `parallel` that this one is done.\n */\n _whenTransitionDone(element, itemCallback, done) {\n let id = onTransitionEnd(element, (evt) => {\n evt.currentTarget.style.transitionDelay = '';\n itemCallback();\n done(null, evt);\n });\n\n this._transitions.push(id);\n }\n\n /**\n * Return a function which will set CSS styles and call the `done` function\n * when (if) the transition finishes.\n * @param {Object} opts Transition object.\n * @return {Function} A function to be called with a `done` function.\n */\n _getTransitionFunction(opts) {\n return (done) => {\n opts.item.applyCss(this._getStylesForTransition(opts));\n this._whenTransitionDone(opts.item.element, opts.callback, done);\n };\n }\n\n /**\n * Execute the styles gathered in the style queue. This applies styles to elements,\n * triggering transitions.\n * @private\n */\n _processQueue() {\n if (this.isTransitioning) {\n this._cancelMovement();\n }\n\n let hasSpeed = this.options.speed > 0;\n\n // Iterate over the queue and keep track of ones that use transitions.\n let immediates = [];\n let transitions = [];\n this._queue.forEach((obj) => {\n if (this.isInitialized && hasSpeed) {\n transitions.push(obj);\n } else {\n immediates.push(obj);\n }\n });\n\n this._styleImmediately(immediates);\n\n if (transitions.length > 0) {\n this._startTransitions(transitions);\n\n // A call to layout happened, but none of the newly visible items will\n // change position or the transition duration is zero, which will not trigger\n // the transitionend event.\n } else {\n this._dispatchLayout();\n }\n\n // Remove everything in the style queue\n this._queue.length = 0;\n }\n\n /**\n * Wait for each transition to finish, the emit the layout event.\n * @param {Array.} transitions Array of transition objects.\n */\n _startTransitions(transitions) {\n // Set flag that shuffle is currently in motion.\n this.isTransitioning = true;\n\n // Create an array of functions to be called.\n let callbacks = transitions.map(obj => this._getTransitionFunction(obj));\n\n parallel(callbacks, this._movementFinished.bind(this));\n }\n\n _cancelMovement() {\n // Remove the transition end event for each listener.\n this._transitions.forEach(cancelTransitionEnd);\n\n // Reset the array.\n this._transitions.length = 0;\n\n // Show it's no longer active.\n this.isTransitioning = false;\n }\n\n /**\n * Apply styles without a transition.\n * @param {Array.} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n let elements = objects.map(obj => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(this._getStylesForTransition(obj));\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatchLayout();\n }\n\n _dispatchLayout() {\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|Function|Array.} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {Object} [sortObj] A sort object which can sort the visible set\n */\n filter(category, sortObj) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS;\n }\n\n this._filter(category);\n\n // Shrink each hidden item\n this._shrink();\n\n // How many visible elements?\n this._updateItemCount();\n\n // Update transforms on visible elements so they will animate to their new positions.\n this.sort(sortObj);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {Object} opts the options object for the sorted plugin\n */\n sort(opts = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n var items = this._getFilteredItems();\n items = sorter(items, opts);\n\n this._layout(items);\n\n // `_layout` always happens after `_shrink`, so it's safe to process the style\n // queue here with styles from the shrink method.\n this._processQueue();\n\n // Adjust the height of the container.\n this._setContainerSize();\n\n this.lastSort = opts;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n * recalculated.\n */\n update(isOnlyLayout) {\n if (this.isEnabled) {\n\n if (!isOnlyLayout) {\n // Get updated colCount\n this._setColumns();\n }\n\n // Layout items\n this.sort();\n }\n }\n\n /**\n * Use this instead of `update()` if you don't need the columns and gutters updated\n * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n * could be off.\n */\n layout() {\n this.update(true);\n }\n\n /**\n * New items have been appended to shuffle. Mix them in with the current\n * filter or sort status.\n * @param {Array.} newItems Collection of new items.\n */\n add(newItems) {\n newItems = arrayUnique(newItems).map(el => new ShuffleItem(el));\n\n // Add classes and set initial positions.\n this._initItems(newItems);\n\n // Add transition to each item.\n this._setTransitions(newItems);\n\n // Update the list of items.\n this.items = this.items.concat(newItems);\n this._updateItemsOrder();\n this.filter(this.lastFilter);\n }\n\n /**\n * Disables shuffle from updating dimensions and layout on resize\n */\n disable() {\n this.isEnabled = false;\n }\n\n /**\n * Enables shuffle again\n * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n */\n enable(isUpdateLayout) {\n this.isEnabled = true;\n if (isUpdateLayout !== false) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items\n * @param {Array.} collection An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle object\n */\n remove(collection) {\n if (!collection.length) {\n return;\n }\n\n collection = arrayUnique(collection);\n\n let oldItems = collection\n .map(element => this.getItemByElement(element))\n .filter(item => !!item);\n\n let handleLayout = () => {\n this.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n this._disposeItems(oldItems);\n\n // Remove the collection in the callback\n collection.forEach((element) => {\n element.parentNode.removeChild(element);\n });\n\n this._dispatch(Shuffle.EventType.REMOVED, { collection });\n\n // Let it get garbage collected\n collection = null;\n oldItems = null;\n };\n\n // Hide collection first.\n this._toggleFilterClasses({\n visible: [],\n hidden: oldItems,\n });\n\n this._shrink(oldItems);\n\n this.sort();\n\n // Update the list of items here because `remove` could be called again\n // with an item that is in the process of being removed.\n this.items = this.items.filter(item => !arrayIncludes(oldItems, item));\n this._updateItemCount();\n\n this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n }\n\n /**\n * Retrieve a shuffle item by its element.\n * @param {Element} element Element to look for.\n * @return {?ShuffleItem} A shuffle item or null if it's not found.\n */\n getItemByElement(element) {\n for (var i = this.items.length - 1; i >= 0; i--) {\n if (this.items[i].element === element) {\n return this.items[i];\n }\n }\n\n return null;\n }\n\n /**\n * Destroys shuffle, removes events, styles, and classes\n */\n destroy() {\n this._cancelMovement();\n window.removeEventListener('resize', this._onResize);\n\n // Reset container styles\n this.element.classList.remove('shuffle');\n this.element.removeAttribute('style');\n\n // Reset individual item styles\n this._disposeItems();\n\n // Null DOM references\n this.items = null;\n this.options.sizer = null;\n this.element = null;\n this._transitions = null;\n\n // Set a flag so if a debounced resize has been triggered,\n // it can first check if it is actually isDestroyed and not doing anything\n this.isDestroyed = true;\n }\n\n /**\n * Returns the outer width of an element, optionally including its margins.\n *\n * There are a few different methods for getting the width of an element, none of\n * which work perfectly for all Shuffle's use cases.\n *\n * 1. getBoundingClientRect() `left` and `right` properties.\n * - Accounts for transform scaled elements, making it useless for Shuffle\n * elements which have shrunk.\n * 2. The `offsetWidth` property.\n * - This value stays the same regardless of the elements transform property,\n * however, it does not return subpixel values.\n * 3. getComputedStyle()\n * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n * padding and border when box-sizing: border-box is set, requiring a feature\n * test and extra work to add the padding back for IE and other browsers which\n * follow the W3C spec here.\n *\n * @param {Element} element The element.\n * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins) {\n // Store the styles so that they can be used by others without asking for it again.\n var styles = window.getComputedStyle(element, null);\n var width = getNumberStyle(element, 'width', styles);\n var height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n var marginLeft = getNumberStyle(element, 'marginLeft', styles);\n var marginRight = getNumberStyle(element, 'marginRight', styles);\n var marginTop = getNumberStyle(element, 'marginTop', styles);\n var marginBottom = getNumberStyle(element, 'marginBottom', styles);\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n }\n\n return {\n width,\n height,\n };\n }\n\n /**\n * Change a property or execute a function which will not have a transition\n * @param {Array.} elements DOM elements that won't be transitioned.\n * @param {Function} callback A function which will be called while transition\n * is set to 0ms.\n * @private\n */\n static _skipTransitions(elements, callback) {\n let zero = '0ms';\n\n // Save current duration and delay.\n let data = elements.map((element) => {\n let style = element.style;\n let duration = style.transitionDuration;\n let delay = style.transitionDelay;\n\n // Set the duration to zero so it happens immediately\n style.transitionDuration = zero;\n style.transitionDelay = zero;\n\n return {\n duration,\n delay,\n };\n });\n\n callback();\n\n // Cause reflow.\n elements[0].offsetWidth; // jshint ignore:line\n\n // Put the duration back\n elements.forEach((element, i) => {\n element.style.transitionDuration = data[i].duration;\n element.style.transitionDelay = data[i].delay;\n });\n }\n}\n\nShuffle.ShuffleItem = ShuffleItem;\n\nShuffle.ALL_ITEMS = 'all';\nShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\n/**\n * @enum {string}\n */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n// Overrideable options\nShuffle.options = {\n // Initial filter group.\n group: Shuffle.ALL_ITEMS,\n\n // Transition/animation speed (milliseconds).\n speed: 250,\n\n // CSS easing function to use.\n easing: 'ease',\n\n // e.g. '.picture-item'.\n itemSelector: '*',\n\n // Element or selector string. Use an element to determine the size of columns\n // and gutters.\n sizer: null,\n\n // A static number or function that tells the plugin how wide the gutters\n // between columns are (in pixels).\n gutterWidth: 0,\n\n // A static number or function that returns a number which tells the plugin\n // how wide the columns are (in pixels).\n columnWidth: 0,\n\n // If your group is not json, and is comma delimeted, you could set delimeter\n // to ','.\n delimeter: null,\n\n // Useful for percentage based heights when they might not always be exactly\n // the same (in pixels).\n buffer: 0,\n\n // Reading the width of elements isn't precise enough and can cause columns to\n // jump between values.\n columnThreshold: 0.01,\n\n // Shuffle can be isInitialized with a sort object. It is the same object\n // given to the sort method.\n initialSort: null,\n\n // By default, shuffle will throttle resize events. This can be changed or\n // removed.\n throttle: throttle,\n\n // How often shuffle can be called on resize (in milliseconds).\n throttleTime: 300,\n\n // Transition delay offset for each item in milliseconds.\n staggerAmount: 15,\n\n // Maximum stagger delay in milliseconds.\n staggerAmountMax: 250,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n};\n\n// Expose for testing. Hack at your own risk.\nShuffle.__Point = Point;\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\n\nexport default Shuffle;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle.js\n **/","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n new window.CustomEvent(\"test\");\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/custom-event-polyfill/custom-event-polyfill.js\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nvar proto = Element.prototype;\nvar vendor = proto.matches\n || proto.matchesSelector\n || proto.webkitMatchesSelector\n || proto.mozMatchesSelector\n || proto.msMatchesSelector\n || proto.oMatchesSelector;\n\nmodule.exports = match;\n\n/**\n * Match `el` to `selector`.\n *\n * @param {Element} el\n * @param {String} selector\n * @return {Boolean}\n * @api public\n */\n\nfunction match(el, selector) {\n if (vendor) return vendor.call(el, selector);\n var nodes = el.parentNode.querySelectorAll(selector);\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] == el) return true;\n }\n return false;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/matches-selector/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-uniq/index.js\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/xtend/immutable.js\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = throttle;\n\n/**\n * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n *\n * @param {Function} func Function to wrap.\n * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n * @return {Function} A new function that wraps the `func` function passed in.\n */\n\nfunction throttle (func, wait) {\n var ctx, args, rtn, timeoutID; // caching\n var last = 0;\n\n return function throttled () {\n ctx = this;\n args = arguments;\n var delta = new Date() - last;\n if (!timeoutID)\n if (delta >= wait) call();\n else timeoutID = setTimeout(call, wait - delta);\n return rtn;\n };\n\n function call () {\n timeoutID = 0;\n last = +new Date();\n rtn = func.apply(ctx, args);\n ctx = null;\n args = null;\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/throttleit/index.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function parallel(fns, context, callback) {\n if (!callback) {\n if (typeof context === 'function') {\n callback = context\n context = null\n } else {\n callback = noop\n }\n }\n\n var pending = fns && fns.length\n if (!pending) return callback(null, []);\n\n var finished = false\n var results = new Array(pending)\n\n fns.forEach(context ? function (fn, i) {\n fn.call(context, maybeDone(i))\n } : function (fn, i) {\n fn(maybeDone(i))\n })\n\n function maybeDone(i) {\n return function (err, result) {\n if (finished) return;\n\n if (err) {\n callback(err, results)\n finished = true\n return\n }\n\n results[i] = result\n\n if (!--pending) callback(null, results);\n }\n }\n}\n\nfunction noop() {}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-parallel/index.js\n ** module id = 7\n ** module chunks = 0\n **/","'use strict';\n\nimport getNumber from './get-number';\n\n/**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\nconst Point = function (x, y) {\n this.x = getNumber(x);\n this.y = getNumber(y);\n};\n\n/**\n * Whether two points are equal.\n * @param {Point} a Point A.\n * @param {Point} b Point B.\n * @return {boolean}\n */\nPoint.equals = function (a, b) {\n return a.x === b.x && a.y === b.y;\n};\n\nexport default Point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/point.js\n **/","'use strict';\n\n/**\n * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n * @param {*} value Possibly numeric value.\n * @return {number} `value` or zero if `value` isn't numeric.\n */\nexport default function getNumber(value) {\n return parseFloat(value) || 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number.js\n **/","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element) {\n this.id = id++;\n this.element = element;\n this.isVisible = true;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.scale = ShuffleItem.Scale.VISIBLE;\n this.point = new Point();\n }\n\n addClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.add(className);\n });\n }\n\n removeClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.remove(className);\n });\n }\n\n applyCss(obj) {\n for (var key in obj) {\n this.element.style[key] = obj[key];\n }\n }\n\n dispose() {\n this.removeClasses([\n Classes.HIDDEN,\n Classes.VISIBLE,\n Classes.SHUFFLE_ITEM,\n ]);\n\n this.element.removeAttribute('style');\n this.element = null;\n }\n}\n\nShuffleItem.Css = {\n INITIAL: {\n position: 'absolute',\n top: 0,\n left: 0,\n visibility: 'visible',\n 'will-change': 'transform',\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {},\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle-item.js\n **/","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/classes.js\n **/","'use strict';\n\nimport getNumber from './get-number';\nimport COMPUTED_SIZE_INCLUDES_PADDING from './computed-size';\n\n/**\n * Retrieve the computed style for an element, parsed as a float.\n * @param {Element} element Element to get style for.\n * @param {string} style Style property.\n * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n * use instead of asking for them again.\n * @return {number} The parsed computed value or zero if that fails because IE\n * will return 'auto' when the element doesn't have margins instead of\n * the computed style.\n */\nexport default function getNumberStyle(element, style,\n styles = window.getComputedStyle(element, null)) {\n var value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'width') {\n value += getNumber(styles.paddingLeft) +\n getNumber(styles.paddingRight) +\n getNumber(styles.borderLeftWidth) +\n getNumber(styles.borderRightWidth);\n } else if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'height') {\n value += getNumber(styles.paddingTop) +\n getNumber(styles.paddingBottom) +\n getNumber(styles.borderTopWidth) +\n getNumber(styles.borderBottomWidth);\n }\n\n return value;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number-style.js\n **/","\nlet element = document.body || document.documentElement;\nlet e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nlet width = window.getComputedStyle(e, null).width;\nlet ret = width === '10px';\n\nelement.removeChild(e);\n\nexport default ret;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/computed-size.js\n **/","'use strict';\n\nimport xtend from 'xtend';\n\n// http://stackoverflow.com/a/962890/373422\nfunction randomize(array) {\n var tmp;\n var current;\n let top = array.length;\n\n if (!top) {\n return array;\n }\n\n while (--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n\n return array;\n}\n\nlet defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // If true, this will skip the sorting and return a randomized order in the array\n randomize: false,\n\n // Determines which property of each item in the array is passed to the\n // sorting method.\n key: 'element',\n};\n\n// You can return `undefined` from the `by` function to revert to DOM order.\nexport default function sorter(arr, options) {\n let opts = xtend(defaults, options);\n let original = [].slice.call(arr);\n let revert = false;\n\n if (!arr.length) {\n return [];\n }\n\n if (opts.randomize) {\n return randomize(arr);\n }\n\n // Sort the elements by the opts.by function.\n // If we don't have opts.by, default to DOM order\n if (typeof opts.by === 'function') {\n arr.sort(function (a, b) {\n\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n let valA = opts.by(a[opts.key]);\n let valB = opts.by(b[opts.key]);\n\n // If both values are undefined, use the DOM order\n if (valA === undefined && valB === undefined) {\n revert = true;\n return 0;\n }\n\n if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n return -1;\n }\n\n if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n return 1;\n }\n\n return 0;\n });\n }\n\n // Revert to the original array if necessary\n if (revert) {\n return original;\n }\n\n if (opts.reverse) {\n arr.reverse();\n }\n\n return arr;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/sorter.js\n **/","'use strict';\n\nlet transitions = {};\nlet eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n return eventName + count++;\n}\n\nexport function onTransitionEnd(element, callback) {\n let id = uniqueId();\n let listener = (evt) => {\n if (evt.currentTarget === evt.target) {\n cancelTransitionEnd(id);\n callback(evt);\n }\n };\n\n element.addEventListener(eventName, listener);\n\n transitions[id] = { element, listener };\n\n return id;\n}\n\nexport function cancelTransitionEnd(id) {\n if (transitions[id]) {\n transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n transitions[id] = null;\n return true;\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/on-transition-end.js\n **/","'use strict';\n\nimport Point from './point';\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayMin(array) {\n return Math.min.apply(Math, array);\n}\n\n/**\n * Determine the location of the next item, based on its size.\n * @param {Object} itemSize Object with width and height.\n * @param {Array.} positions Positions of the other current items.\n * @param {number} gridSize The column width or row height.\n * @param {number} total The total number of columns or rows.\n * @param {number} threshold Buffer value for the column to fit.\n * @param {number} buffer Vertical buffer for the height of items.\n * @return {Point}\n */\nexport function getItemPosition({ itemSize, positions, gridSize, total, threshold, buffer }) {\n var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n var setY = getAvailablePositions(positions, span, total);\n var shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n var point = new Point(\n Math.round(gridSize * shortColumnIndex),\n Math.round(setY[shortColumnIndex]));\n\n // Update the columns array with the new values for each column.\n // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n var setHeight = setY[shortColumnIndex] + itemSize.height;\n for (var i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * Determine the number of columns an items spans.\n * @param {number} itemWidth Width of the item.\n * @param {number} columnWidth Width of the column (includes gutter).\n * @param {number} columns Total number of columns\n * @param {number} threshold A buffer value for the size of the column to fit.\n * @return {number}\n */\nexport function getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n var columnSpan = itemWidth / columnWidth;\n\n // If the difference between the rounded column span number and the\n // calculated column span number is really small, round the number to\n // make it fit.\n if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n // e.g. columnSpan = 4.0089945390298745\n columnSpan = Math.round(columnSpan);\n }\n\n // Ensure the column span is not more than the amount of columns in the whole layout.\n return Math.min(Math.ceil(columnSpan), columns);\n}\n\n/**\n * Retrieves the column set to use for placement.\n * @param {number} columnSpan The number of columns this current item spans.\n * @param {number} columns The total columns in the grid.\n * @return {Array.} An array of numbers represeting the column set.\n */\nexport function getAvailablePositions(positions, columnSpan, columns) {\n // The item spans only one column.\n if (columnSpan === 1) {\n return positions;\n }\n\n // The item spans more than one column, figure out how many different\n // places it could fit horizontally.\n // The group count is the number of places within the positions this block\n // could fit, ignoring the current positions of items.\n // Imagine a 2 column brick as the second item in a 4 column grid with\n // 10px height each. Find the places it would fit:\n // [20, 10, 10, 0]\n // | | |\n // * * *\n //\n // Then take the places which fit and get the bigger of the two:\n // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 0]\n // |\n // *\n //\n // And that's where it should be placed!\n //\n // Another example where the second column's item extends past the first:\n // [10, 20, 10, 0] => [20, 20, 10] => 10\n var available = [];\n\n // For how many possible positions for this item there are.\n for (var i = 0; i <= columns - columnSpan; i++) {\n // Find the bigger value for each place it could fit.\n available.push(arrayMax(positions.slice(i, i + columnSpan)));\n }\n\n return available;\n}\n\n/**\n * Find index of short column, the first from the left where this item will go.\n *\n * @param {Array.} positions The array to search for the smallest number.\n * @param {number} buffer Optional buffer which is very useful when the height\n * is a percentage of the width.\n * @return {number} Index of the short column.\n */\nexport function getShortColumn(positions, buffer) {\n var minPosition = arrayMin(positions);\n for (var i = 0, len = positions.length; i < len; i++) {\n if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n return i;\n }\n }\n\n return 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layout.js\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///shuffle.min.js","webpack:///webpack/bootstrap 15614b34d986e7daa0ea","webpack:///./src/index.js","webpack:///./src/shuffle.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/array-uniq/index.js","webpack:///./~/xtend/immutable.js","webpack:///./~/throttleit/index.js","webpack:///./~/array-parallel/index.js","webpack:///./src/point.js","webpack:///./src/get-number.js","webpack:///./src/shuffle-item.js","webpack:///./src/classes.js","webpack:///./src/get-number-style.js","webpack:///./src/computed-size.js","webpack:///./src/sorter.js","webpack:///./src/on-transition-end.js","webpack:///./src/layout.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_classCallCheck","instance","Constructor","TypeError","toArray","arrayLike","Array","prototype","slice","arrayMax","array","Math","max","apply","arrayIncludes","arguments","length","indexOf","Object","defineProperty","value","_createClass","defineProperties","target","props","i","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","_matchesSelector","_matchesSelector2","_arrayUniq","_arrayUniq2","_xtend","_xtend2","_throttleit","_throttleit2","_arrayParallel","_arrayParallel2","_point","_point2","_shuffleItem","_shuffleItem2","_classes","_classes2","_getNumberStyle","_getNumberStyle2","_sorter","_sorter2","_onTransitionEnd","_layout2","Shuffle","element","options","undefined","useSizer","lastSort","group","lastFilter","ALL_ITEMS","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","_init","items","_getItems","sizer","classList","add","Classes","BASE","_initItems","_onResize","_getResizeFunction","window","addEventListener","containerCss","getComputedStyle","containerWidth","getSize","width","_validateStyles","_setColumns","filter","initialSort","offsetWidth","_setTransitions","style","transition","speed","easing","resizeFunction","_handleResize","bind","throttle","throttleTime","option","querySelector","nodeType","jquery","styles","position","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","_this","visible","hidden","forEach","item","_doesPassFilter","push","attr","getAttribute","FILTER_ATTRIBUTE_KEY","groups","JSON","parse","keys","delimeter","isArray","split","some","_ref","show","hide","init","dispose","visibleItems","_getFilteredItems","str","useTransforms","_this2","children","el","itemSelector","map","by","isVisible","gutterSize","size","columnWidth","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","abs","round","columnThreshold","cols","floor","colWidth","height","_getContainerSize","positions","index","min","staggerAmount","staggerAmountMax","name","details","shuffle","dispatchEvent","CustomEvent","bubbles","cancelable","detail","_this3","count","callback","transitionDelay","applyCss","Css","VISIBLE","after","currPos","point","currScale","scale","itemSize","pos","_getItemPosition","equals","Scale","before","_getStaggerAmount","getItemPosition","gridSize","total","threshold","buffer","_this4","_getConcealedItems","HIDDEN","update","_ref2","x","y","transform","left","top","itemCallback","done","onTransitionEnd","evt","opts","_this5","_getStylesForTransition","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatchLayout","transitions","_this6","callbacks","_getTransitionFunction","_movementFinished","cancelTransitionEnd","objects","_this7","elements","_skipTransitions","_dispatch","EventType","LAYOUT","sortObj","_filter","_shrink","_updateItemCount","sort","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","concat","_updateItemsOrder","isUpdateLayout","_this8","oldItems","getItemByElement","handleLayout","removeEventListener","_disposeItems","parentNode","removeChild","REMOVED","remove","removeAttribute","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","data","duration","transitionDuration","delay","ShuffleItem","__Point","__sorter","__getColumnSpan","getColumnSpan","__getAvailablePositions","getAvailablePositions","__getShortColumn","getShortColumn","e","event","params","document","createEvent","initCustomEvent","Event","match","selector","vendor","nodes","querySelectorAll","proto","Element","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","global","uniqNoSet","arr","ret","uniqSet","seen","Set","has","uniqSetWithForEach","doesForEachActuallyWork","extend","source","hasOwnProperty","func","wait","timeoutID","last","Date","rtn","ctx","args","delta","setTimeout","noop","fns","context","maybeDone","err","result","finished","results","pending","fn","_getNumber","_getNumber2","Point","a","b","getNumber","parseFloat","addClasses","SHUFFLE_ITEM","INITIAL","classes","className","removeClasses","visibility","will-change","opacity","getNumberStyle","_computedSize2","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","_computedSize","body","documentElement","createElement","cssText","appendChild","randomize","tmp","current","random","sorter","defaults","original","revert","valA","valB","reverse","uniqueId","eventName","listener","currentTarget","arrayMin","span","setY","shortColumnIndex","setHeight","itemWidth","columns","columnSpan","ceil","available","minPosition","len"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,QAAAD,IAEAD,EAAA,QAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAASL,EAAQD,EAASM,GAE/B,YExDDL,GAAOD,QAAUM,EAAQ,GAARA,YF8DX,SAASL,EAAQD,EAASM,GG9DhC,YHsHC,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,GAEvF,QAASG,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCGxGjH,QAASC,GAAQC,GACf,MAAOC,OAAMC,UAAUC,MAAMhB,KAAKa,GAGpC,QAASI,GAASC,GAChB,MAAOC,MAAKC,IAAIC,MAAMF,KAAMD,GAG9B,QAASI,GAAcJ,EAAOb,GAC5B,MAAyB,KAArBkB,UAAUC,OACLF,EAAcJ,GAAOb,GAGvB,SAAUA,GACf,MAAOa,GAAMO,QAAQpB,GAAO,IHoC/BqB,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAMR,OAAQS,IAAK,CAAE,GAAIC,GAAaF,EAAMC,EAAIC,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMX,OAAOC,eAAeI,EAAQG,EAAWI,IAAKJ,IAAiB,MAAO,UAAUxB,EAAa6B,EAAYC,GAAiJ,MAA9HD,IAAYT,EAAiBpB,EAAYK,UAAWwB,GAAiBC,GAAaV,EAAiBpB,EAAa8B,GAAqB9B,KGpEjiBf,GAAA,EACA,IAAA8C,GAAA9C,EAAA,GHyEK+C,EAAoBtC,EAAuBqC,GGxEhDE,EAAAhD,EAAA,GH4EKiD,EAAcxC,EAAuBuC,GG3E1CE,EAAAlD,EAAA,GH+EKmD,EAAU1C,EAAuByC,GG9EtCE,EAAApD,EAAA,GHkFKqD,EAAe5C,EAAuB2C,GGjF3CE,EAAAtD,EAAA,GHqFKuD,EAAkB9C,EAAuB6C,GGpF9CE,EAAAxD,EAAA,GHwFKyD,EAAUhD,EAAuB+C,GGvFtCE,EAAA1D,EAAA,IH2FK2D,EAAgBlD,EAAuBiD,GG1F5CE,EAAA5D,EAAA,IH8FK6D,EAAYpD,EAAuBmD,GG7FxCE,EAAA9D,EAAA,IHiGK+D,EAAmBtD,EAAuBqD,GGhG/CE,EAAAhE,EAAA,IHoGKiE,EAAWxD,EAAuBuD,GGnGvCE,EAAAlE,EAAA,IACAmE,EAAAnE,EAAA,IAqBIG,EAAK,EAEHiE,EAAA,WASJ,QATIA,GASQC,GH4GT,GG5GkBC,GAAA1C,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,MAAUA,UAAA,EAe7B,IH+FCf,EAAgBf,KGvHfsE,GAUFtE,KAAKwE,SAAU,EAAAnB,cAAMiB,EAAQE,QAASA,GAEtCxE,KAAK0E,UAAW,EAChB1E,KAAK2E,YACL3E,KAAK4E,MAAQ5E,KAAK6E,WAAaP,EAAQQ,UACvC9E,KAAK+E,WAAY,EACjB/E,KAAKgF,aAAc,EACnBhF,KAAKiF,eAAgB,EACrBjF,KAAKkF,gBACLlF,KAAKmF,iBAAkB,EACvBnF,KAAKoF,UAELb,EAAUvE,KAAKqF,kBAAkBd,IAE5BA,EACH,KAAM,IAAIrD,WAAU,mDAGtBlB,MAAKuE,QAAUA,EACfvE,KAAKK,GAAK,WAAaA,IAEvBL,KAAKsF,QACLtF,KAAKiF,eAAgB,EHsuCtB,MApnCA7C,GGlJGkC,IHmJDzB,IAAK,QACLV,MAAO,WGhHRnC,KAAKuF,MAAQvF,KAAKwF,YAElBxF,KAAKwE,QAAQiB,MAAQzF,KAAKqF,kBAAkBrF,KAAKwE,QAAQiB,OAErDzF,KAAKwE,QAAQiB,QACfzF,KAAK0E,UAAW,GANZ1E,KAUDuE,QAAQmB,UAAUC,IAAIrB,EAAQsB,QAAQC,MAVrC7F,KAaD8F,aAbC9F,KAgBD+F,UAAY/F,KAAKgG,qBACtBC,OAAOC,iBAAiB,SAAUlG,KAAK+F,UAjBjC,IAoBFI,GAAeF,OAAOG,iBAAiBpG,KAAKuE,QAAS,MACrD8B,EAAiB/B,EAAQgC,QAAQtG,KAAKuE,SAASgC,KArB7CvG,MAwBDwG,gBAAgBL,GAxBfnG,KA4BDyG,YAAYJ,GA5BXrG,KA+BD0G,OAAO1G,KAAKwE,QAAQI,MAAO5E,KAAKwE,QAAQmC,aA/BvC3G,KAqCDuE,QAAQqC,YArCP5G,KAsCD6G,kBACL7G,KAAKuE,QAAQuC,MAAMC,WAAa,UAAY/G,KAAKwE,QAAQwC,MAAQ,MAAQhH,KAAKwE,QAAQyC,UH2HrFpE,IAAK,qBACLV,MAAO,WGnHR,GAAI+E,GAAiBlH,KAAKmH,cAAcC,KAAKpH,KAC7C,OAAOA,MAAKwE,QAAQ6C,SAChBrH,KAAKwE,QAAQ6C,SAASH,EAAgBlH,KAAKwE,QAAQ8C,cACnDJ,KH6HHrE,IAAK,oBACLV,MAAO,SGrHQoF,GAGhB,MAAsB,gBAAXA,GACFvH,KAAKuE,QAAQiD,cAAcD,GAGzBA,GAAUA,EAAOE,UAAgC,IAApBF,EAAOE,SACtCF,EAGEA,GAAUA,EAAOG,OACnBH,EAAO,GAGT,QH+HN1E,IAAK,kBACLV,MAAO,SGxHMwF,GAEU,WAApBA,EAAOC,WACT5H,KAAKuE,QAAQuC,MAAMc,SAAW,YAIR,WAApBD,EAAOE,WACT7H,KAAKuE,QAAQuC,MAAMe,SAAW,aHuI/BhF,IAAK,UACLV,MAAO,WACL,GG5HG2F,GAAAhG,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAW9B,KAAK6E,WAAL/C,UAAA,GAAiBiG,EAAAjG,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAa9B,KAAKuF,MAALzD,UAAA,GAC3CkG,EAAMhI,KAAKiI,iBAAiBH,EAAUC,EAc1C,OAf2D/H,MAItDkI,qBAAqBF,GAJiChI,KAOtD6E,WAAaiD,EAIM,gBAAbA,KACT9H,KAAK4E,MAAQkD,GAGRE,KH0INnF,IAAK,mBACLV,MAAO,SGjIO2F,EAAUvC,GHkItB,GAAI4C,GAAQnI,KGjIXoI,KACAC,IAkBJ,OAfIP,KAAaxD,EAAQQ,UACvBsD,EAAU7C,EAKVA,EAAM+C,QAAQ,SAACC,GACTJ,EAAKK,gBAAgBV,EAAUS,EAAKhE,SACtC6D,EAAQK,KAAKF,GAEbF,EAAOI,KAAKF,MAMhBH,UACAC,aHgJDxF,IAAK,kBACLV,MAAO,SGtIM2F,EAAUvD,GAExB,GAAwB,kBAAbuD,GACT,MAAOA,GAASvH,KAAKgE,EAASA,EAASvE,KAIvC,IAAI0I,GAAOnE,EAAQoE,aAAa,QAAUrE,EAAQsE,sBAC9CC,EAASC,KAAKC,MAAML,GACpBM,EAAOhJ,KAAKiJ,YAAc5H,MAAM6H,QAAQL,GACxCA,EAAOM,MAAMnJ,KAAKiJ,WAClBJ,CAEJ,OAAIxH,OAAM6H,QAAQpB,GACTA,EAASsB,KAAKvH,EAAcmH,IAG9BnH,EAAcmH,EAAMlB,MH+I5BjF,IAAK,uBACLV,MAAO,SAA8BkH,GACnC,GGxIkBjB,GAAAiB,EAAAjB,QAASC,EAAAgB,EAAAhB,MAC9BD,GAAQE,QAAQ,SAACC,GACfA,EAAKe,SAGPjB,EAAOC,QAAQ,SAACC,GACdA,EAAKgB,YHqJN1G,IAAK,aACLV,MAAO,WACL,GG9IMoD,GAAAzD,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAQ9B,KAAKuF,MAALzD,UAAA,EACjByD,GAAM+C,QAAQ,SAACC,GACbA,EAAKiB,YHyJN3G,IAAK,gBACLV,MAAO,WACL,GGnJSoD,GAAAzD,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAQ9B,KAAKuF,MAALzD,UAAA,EACpByD,GAAM+C,QAAQ,SAACC,GACbA,EAAKkB,eH8JN5G,IAAK,mBACLV,MAAO,WGtJRnC,KAAK0J,aAAe1J,KAAK2J,oBAAoB5H,UHmK5Cc,IAAK,kBACLV,MAAO,WACL,GGvJCyH,GAJUrE,EAAAzD,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAQ9B,KAAKuF,MAALzD,UAAA,GAClBkF,EAAQhH,KAAKwE,QAAQwC,MACrBC,EAASjH,KAAKwE,QAAQyC,MAIxB2C,GADE5J,KAAKwE,QAAQqF,cACT,aAAe7C,EAAQ,MAAQC,EACnC,aAAeD,EAAQ,MAAQC,EAE3B,OAASD,EAAQ,MAAQC,EAC7B,UAAYD,EAAQ,MAAQC,EAC5B,aAAeD,EAAQ,MAAQC,EAGnC1B,EAAM+C,QAAQ,SAACC,GACbA,EAAKhE,QAAQuC,MAAMC,WAAa6C,OH6JjC/G,IAAK,YACLV,MAAO,WACL,GAAI2H,GAAS9J,IG1JhB,OAAOmB,GAAQnB,KAAKuE,QAAQwF,UACzBrD,OAAO,SAAAsD,GH4JL,OG5JW,EAAA/G,cAAQ+G,EAAIF,EAAKtF,QAAQyF,gBACtCC,IAAI,SAAAF,GH6JF,MG7JQ,IAAAnG,cAAgBmG,QHuK5BnH,IAAK,oBACLV,MAAO,WGhKR,GAAI4H,GAAW/J,KAAKuE,QAAQwF,QAC5B/J,MAAKuF,OAAQ,EAAApB,cAAOnE,KAAKuF,OACvB4E,GAAA,SAAG5F,GACD,MAAOlD,OAAMC,UAAUU,QAAQzB,KAAKwJ,EAAUxF,SHsKjD1B,IAAK,oBACLV,MAAO,WGjKR,MAAOnC,MAAKuF,MAAMmB,OAAO,SAAA6B,GHmKpB,MGnK4BA,GAAK6B,eHuKrCvH,IAAK,qBACLV,MAAO,WGpKR,MAAOnC,MAAKuF,MAAMmB,OAAO,SAAA6B,GHsKpB,OGtK6BA,EAAK6B,eHmLtCvH,IAAK,iBACLV,MAAO,SG1KKkE,EAAgBgE,GAC7B,GAAIC,EA4BJ,OAxBEA,GADsC,kBAA7BtK,MAAKwE,QAAQ+F,YACfvK,KAAKwE,QAAQ+F,YAAYlE,GAGvBrG,KAAK0E,SACPJ,EAAQgC,QAAQtG,KAAKwE,QAAQiB,OAAOc,MAGlCvG,KAAKwE,QAAQ+F,YACfvK,KAAKwE,QAAQ+F,YAGXvK,KAAKuF,MAAMxD,OAAS,EACtBuC,EAAQgC,QAAQtG,KAAKuF,MAAM,GAAGhB,SAAS,GAAMgC,MAI7CF,EAII,IAATiE,IACFA,EAAOjE,GAGFiE,EAAOD,KHqLbxH,IAAK,iBACLV,MAAO,SG7KKkE,GACb,GAAIiE,EASJ,OAPEA,GADsC,kBAA7BtK,MAAKwE,QAAQgG,YACfxK,KAAKwE,QAAQgG,YAAYnE,GACvBrG,KAAK0E,UACP,EAAAT,cAAejE,KAAKwE,QAAQiB,MAAO,cAEnCzF,KAAKwE,QAAQgG,eH0LrB3H,IAAK,cACLV,MAAO,WACL,GGjLOkE,GAAAvE,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAiBwC,EAAQgC,QAAQtG,KAAKuE,SAASgC,MAA9BzE,UAAA,GACvB2I,EAASzK,KAAK0K,eAAerE,GAC7BkE,EAAcvK,KAAK2K,eAAetE,EAAgBoE,GAClDG,GAAqBvE,EAAiBoE,GAAUF,CAGhD7I,MAAKmJ,IAAInJ,KAAKoJ,MAAMF,GAAqBA,GACzC5K,KAAKwE,QAAQuG,kBAEfH,EAAoBlJ,KAAKoJ,MAAMF,IAGjC5K,KAAKgL,KAAOtJ,KAAKC,IAAID,KAAKuJ,MAAML,GAAoB,GACpD5K,KAAKqG,eAAiBA,EACtBrG,KAAKkL,SAAWX,KHyLf1H,IAAK,oBACLV,MAAO,WGnLRnC,KAAKuE,QAAQuC,MAAMqE,OAASnL,KAAKoL,oBAAsB,QH8LtDvI,IAAK,oBACLV,MAAO,WGtLR,MAAOX,GAASxB,KAAKqL,cHiMpBxI,IAAK,oBACLV,MAAO,SG1LQmJ,GAChB,MAAO5J,MAAK6J,IAAID,EAAQtL,KAAKwE,QAAQgH,cAAexL,KAAKwE,QAAQiH,qBHkMhE5I,IAAK,YACLV,MAAO,SG7LAuJ,GH8LL,GG9LWC,GAAA7J,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,MAAUA,UAAA,EACxB,KAAI9B,KAAKgF,YAKT,MADA2G,GAAQC,QAAU5L,MACVA,KAAKuE,QAAQsH,cAAc,GAAIC,aAAYJ,GACjDK,SAAS,EACTC,YAAY,EACZC,OAAQN,QHyMT9I,IAAK,aACLV,MAAO,WGjMR,GAAIK,GAAIxC,KAAKgL,IAEb,KADAhL,KAAKqL,aACE7I,KACLxC,KAAKqL,UAAU5C,KAAK,MH6MrB5F,IAAK,UACLV,MAAO,SGrMFoD,GHsMH,GAAI2G,GAASlM,KGrMZmM,EAAQ,CACZ5G,GAAM+C,QAAQ,SAACC,GAMb,QAAS6D,KACP7D,EAAKhE,QAAQuC,MAAMuF,gBAAkB,GACrC9D,EAAK+D,SAASzI,aAAY0I,IAAIC,QAAQC,OAPxC,GAAIC,GAAUnE,EAAKoE,MACfC,EAAYrE,EAAKsE,MACjBC,EAAWxI,EAAQgC,QAAQiC,EAAKhE,SAAS,GACzCwI,EAAMb,EAAKc,iBAAiBF,EAJV,IAalBnJ,aAAMsJ,OAAOP,EAASK,IAAQH,IAAc/I,aAAYqJ,MAAMV,QAEhE,WADAJ,IAIF7D,GAAKoE,MAAQI,EACbxE,EAAKsE,MAAQhJ,aAAYqJ,MAAMV,OAnBT,IAuBlB7E,IAAS,EAAAtE,cAAMQ,aAAY0I,IAAIC,QAAQW,OAC3CxF,GAAO0E,gBAAkBH,EAAKkB,kBAAkBjB,GAAS,KAEzDD,EAAK9G,OAAOqD,MACVF,OACAZ,SACAyE,aAGFD,SHmNDtJ,IAAK,mBACLV,MAAO,SG1MO2K,GACf,OAAO,EAAAzI,EAAAgJ,kBACLP,WACAzB,UAAWrL,KAAKqL,UAChBiC,SAAUtN,KAAKkL,SACfqC,MAAOvN,KAAKgL,KACZwC,UAAWxN,KAAKwE,QAAQuG,gBACxB0C,OAAQzN,KAAKwE,QAAQiJ,YHqNtB5K,IAAK,UACLV,MAAO,WACL,GAAIuL,GAAS1N,KG9MV+H,EAAAjG,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAa9B,KAAK2N,qBAAL7L,UAAA,GACfqK,EAAQ,CACZpE,GAAWO,QAAQ,SAACC,GAClB,QAAS6D,KACP7D,EAAK+D,SAASzI,aAAY0I,IAAIqB,OAAOnB,OAFZ,GAWvBlE,EAAKsE,QAAUhJ,aAAYqJ,MAAMU,OAEnC,WADAxB,IAIF7D,GAAKsE,MAAQhJ,aAAYqJ,MAAMU,MAE/B,IAAIjG,IAAS,EAAAtE,cAAMQ,aAAY0I,IAAIqB,OAAOT,OAC1CxF,GAAO0E,gBAAkBqB,EAAKN,kBAAkBjB,GAAS,KAEzDuB,EAAKtI,OAAOqD,MACVF,OACAZ,SACAyE,aAGFD,SH2NDtJ,IAAK,gBACLV,MAAO,WGlNR,GAAKnC,KAAK+E,YAAa/E,KAAKgF,YAA5B,CAFc,GAOVqB,GAAiB/B,EAAQgC,QAAQtG,KAAKuE,SAASgC,KAG/CF,KAAmBrG,KAAKqG,gBAI5BrG,KAAK6N,aH+NJhL,IAAK,0BACLV,MAAO,SAAiC2L,GACtC,GGxNqBvF,GAAAuF,EAAAvF,KAAMZ,EAAAmG,EAAAnG,MACzBA,GAAO0E,kBACV1E,EAAO0E,gBAAkB,MAG3B,IAAI0B,GAAIxF,EAAKoE,MAAMoB,EACfC,EAAIzF,EAAKoE,MAAMqB,CASnB,OAPIhO,MAAKwE,QAAQqF,cACflC,EAAOsG,UAAP,aAAgCF,EAAA,OAAQC,EAAA,aAAczF,EAAKsE,MAAL,KAEtDlF,EAAOuG,KAAOH,EAAI,KAClBpG,EAAOwG,IAAMH,EAAI,MAGZrG,KHsON9E,IAAK,sBACLV,MAAO,SG7NUoC,EAAS6J,EAAcC,GACzC,GAAIhO,IAAK,EAAA+D,EAAAkK,iBAAgB/J,EAAS,SAACgK,GACjCH,IACAC,EAAK,KAAME,IAGbvO,MAAKkF,aAAauD,KAAKpI,MHwOtBwC,IAAK,yBACLV,MAAO,SGhOaqM,GHiOlB,GAAIC,GAASzO,IGhOhB,OAAO,UAACqO,GACNG,EAAKjG,KAAK+D,SAASmC,EAAKC,wBAAwBF,IAChDC,EAAKE,oBAAoBH,EAAKjG,KAAKhE,QAASiK,EAAKpC,SAAUiC,OH6O5DxL,IAAK,gBACLV,MAAO,WGpOJnC,KAAKmF,iBACPnF,KAAK4O,iBAGP,IAAIC,GAAW7O,KAAKwE,QAAQwC,MAAQ,EAChC8H,EAAW9O,KAAKoF,OAAOrD,OAAS,CAEhC+M,IAAYD,GAAY7O,KAAKiF,cAC/BjF,KAAK+O,kBAAkB/O,KAAKoF,QAEnB0J,GACT9O,KAAKgP,kBAAkBhP,KAAKoF,QAC5BpF,KAAKiP,mBAMLjP,KAAKiP,kBAnBOjP,KAuBToF,OAAOrD,OAAS,KH6OpBc,IAAK,oBACLV,MAAO,SGvOQ+M,GHwOb,GAAIC,GAASnP,IGtOhBA,MAAKmF,iBAAkB,CAFM,IAKzBiK,GAAYF,EAAYhF,IAAI,SAAAtJ,GH0O3B,MG1OkCuO,GAAKE,uBAAuBzO,MAEnE,EAAA6C,cAAS2L,EAAWpP,KAAKsP,kBAAkBlI,KAAKpH,UH8O/C6C,IAAK,kBACLV,MAAO,WG1ORnC,KAAKkF,aAAaoD,QAAlBlE,EAAAmL,qBAFgBvP,KAKXkF,aAAanD,OAAS,EALX/B,KAQXmF,iBAAkB,KHsPtBtC,IAAK,oBACLV,MAAO,SG/OQqN,GHgPb,GAAIC,GAASzP,IG/OhB,IAAIwP,EAAQzN,OAAQ,CAClB,GAAI2N,GAAWF,EAAQtF,IAAI,SAAAtJ,GHkPtB,MGlP6BA,GAAI2H,KAAKhE,SAE3CD,GAAQqL,iBAAiBD,EAAU,WACjCF,EAAQlH,QAAQ,SAAC1H,GACfA,EAAI2H,KAAK+D,SAASmD,EAAKf,wBAAwB9N,IAC/CA,EAAIwL,mBHyPTvJ,IAAK,oBACLV,MAAO,WGnPRnC,KAAKkF,aAAanD,OAAS,EAC3B/B,KAAKmF,iBAAkB,EACvBnF,KAAKiP,qBHuPJpM,IAAK,kBACLV,MAAO,WGpPRnC,KAAK4P,UAAUtL,EAAQuL,UAAUC,WHgQhCjN,IAAK,SACLV,MAAO,SGxPH2F,EAAUiI,GACV/P,KAAK+E,cAIL+C,GAAaA,GAAgC,IAApBA,EAAS/F,UACrC+F,EAAWxD,EAAQQ,WAGrB9E,KAAKgQ,QAAQlI,GATW9H,KAYnBiQ,UAZmBjQ,KAenBkQ,mBAfmBlQ,KAkBnBmQ,KAAKJ,OHiQTlN,IAAK,OACLV,MAAO,WACL,GG5PAqM,GAAA1M,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAAO9B,KAAK2E,SAAL7C,UAAA,EACV,IAAK9B,KAAK+E,UAAV,CAIA/E,KAAKoQ,YAEL,IAAI7K,GAAQvF,KAAK2J,mBACjBpE,IAAQ,EAAApB,cAAOoB,EAAOiJ,GAEtBxO,KAAKqQ,QAAQ9K,GAVYvF,KAcpBsQ,gBAdoBtQ,KAiBpBuQ,oBAELvQ,KAAK2E,SAAW6J,MHuQf3L,IAAK,SACLV,MAAO,SGhQHqO,GACDxQ,KAAK+E,YAEFyL,GAEHxQ,KAAKyG,cAJWzG,KAQbmQ,WH2QNtN,IAAK,SACLV,MAAO,WGlQRnC,KAAK6N,QAAO,MH6QXhL,IAAK,MACLV,MAAO,SGtQNsO,GACFA,GAAW,EAAAtN,cAAYsN,GAAUvG,IAAI,SAAAF,GHuQhC,MGvQsC,IAAAnG,cAAgBmG,KAD/ChK,KAIP8F,WAAW2K,GAJJzQ,KAOP6G,gBAAgB4J,GAPTzQ,KAUPuF,MAAQvF,KAAKuF,MAAMmL,OAAOD,GAC/BzQ,KAAK2Q,oBACL3Q,KAAK0G,OAAO1G,KAAK6E,eHgRhBhC,IAAK,UACLV,MAAO,WG1QRnC,KAAK+E,WAAY,KHoRhBlC,IAAK,SACLV,MAAO,SG9QHyO,GACL5Q,KAAK+E,WAAY,EACb6L,KAAmB,GACrB5Q,KAAK6N,YH0RNhL,IAAK,SACLV,MAAO,SGjRH4F,GHkRF,GAAI8I,GAAS7Q,IGjRhB,IAAK+H,EAAWhG,OAAhB,CAIAgG,GAAa,EAAA5E,cAAY4E,EAEzB,IAAI+I,GAAW/I,EACZmC,IAAI,SAAA3F,GHmRF,MGnRasM,GAAKE,iBAAiBxM,KACrCmC,OAAO,SAAA6B,GHoRL,QGpReA,IAEhByI,EAAe,QAAfA,KACFH,EAAKtM,QAAQ0M,oBAAoB3M,EAAQuL,UAAUC,OAAQkB,GAC3DH,EAAKK,cAAcJ,GAFI/I,EAKZO,QAAQ,SAAC/D,GAClBA,EAAQ4M,WAAWC,YAAY7M,KAGjCsM,EAAKjB,UAAUtL,EAAQuL,UAAUwB,SAAWtJ,eATrBA,EAYV,KACb+I,EAAW,KAxBI9Q,MA4BZkI,sBACHE,WACAC,OAAQyI,IAGV9Q,KAAKiQ,QAAQa,GAEb9Q,KAAKmQ,OAnCYnQ,KAuCZuF,MAAQvF,KAAKuF,MAAMmB,OAAO,SAAA6B,GHsR1B,OGtRmC1G,EAAciP,EAAUvI,KAChEvI,KAAKkQ,mBAELlQ,KAAKuE,QAAQ2B,iBAAiB5B,EAAQuL,UAAUC,OAAQkB,OHiSvDnO,IAAK,mBACLV,MAAO,SG1ROoC,GACf,IAAK,GAAI/B,GAAIxC,KAAKuF,MAAMxD,OAAS,EAAGS,GAAK,EAAGA,IAC1C,GAAIxC,KAAKuF,MAAM/C,GAAG+B,UAAYA,EAC5B,MAAOvE,MAAKuF,MAAM/C,EAItB,OAAO,SHkSNK,IAAK,UACLV,MAAO,WG5RRnC,KAAK4O,kBACL3I,OAAOgL,oBAAoB,SAAUjR,KAAK+F,WAFlC/F,KAKHuE,QAAQmB,UAAU4L,OAAO,WAC9BtR,KAAKuE,QAAQgN,gBAAgB,SANrBvR,KASHkR,gBATGlR,KAYHuF,MAAQ,KACbvF,KAAKwE,QAAQiB,MAAQ,KACrBzF,KAAKuE,QAAU,KACfvE,KAAKkF,aAAe,KAfZlF,KAmBHgF,aAAc,OHwTlBnC,IAAK,UACLV,MAAO,SGhSKoC,EAASiN,GAEtB,GAAI7J,GAAS1B,OAAOG,iBAAiB7B,EAAS,MAC1CgC,GAAQ,EAAAtC,cAAeM,EAAS,QAASoD,GACzCwD,GAAS,EAAAlH,cAAeM,EAAS,SAAUoD,EAE/C,IAAI6J,EAAgB,CAClB,GAAIC,IAAa,EAAAxN,cAAeM,EAAS,aAAcoD,GACnD+J,GAAc,EAAAzN,cAAeM,EAAS,cAAeoD,GACrDgK,GAAY,EAAA1N,cAAeM,EAAS,YAAaoD,GACjDiK,GAAe,EAAA3N,cAAeM,EAAS,eAAgBoD,EAC3DpB,IAASkL,EAAaC,EACtBvG,GAAUwG,EAAYC,EAGxB,OACErL,QACA4E,aH6SDtI,IAAK,mBACLV,MAAO,SGnScuN,EAAUtD,GAChC,GAAIyF,GAAO,MAGPC,EAAOpC,EAASxF,IAAI,SAAC3F,GACvB,GAAIuC,GAAQvC,EAAQuC,MAChBiL,EAAWjL,EAAMkL,mBACjBC,EAAQnL,EAAMuF,eAMlB,OATmCvF,GAM7BkL,mBAAqBH,EAC3B/K,EAAMuF,gBAAkBwF,GAGtBE,WACAE,UAIJ7F,KAnB0CsD,EAsBjC,GAAG9I,YAtB8B8I,EAyBjCpH,QAAQ,SAAC/D,EAAS/B,GACzB+B,EAAQuC,MAAMkL,mBAAqBF,EAAKtP,GAAGuP,SAC3CxN,EAAQuC,MAAMuF,gBAAkByF,EAAKtP,GAAGyP,YA99BxC3N,IAm+BNA,GAAQ4N,YAARrO,aAEAS,EAAQQ,UAAY,MACpBR,EAAQsE,qBAAuB,SAK/BtE,EAAQuL,WACNC,OAAQ,iBACRuB,QAAS,mBAIX/M,EAAQsB,QAAR7B,aAGAO,EAAQE,SAENI,MAAON,EAAQQ,UAGfkC,MAAO,IAGPC,OAAQ,OAGRgD,aAAc,IAIdxE,MAAO,KAIP+E,YAAa,EAIbD,YAAa,EAIbtB,UAAW,KAIXwE,OAAQ,EAIR1C,gBAAiB,IAIjBpE,YAAa,KAIbU,SAAA9D,aAGA+D,aAAc,IAGdkE,cAAe,GAGfC,iBAAkB,IAGlB5B,eAAe,GAIjBvF,EAAQ6N,QAARxO,aACAW,EAAQ8N,SAARjO,aACAG,EAAQ+N,gBAARhO,EAAAiO,cACAhO,EAAQiO,wBAARlO,EAAAmO,sBACAlO,EAAQmO,iBAARpO,EAAAqO,eHwSC9S,aGtSc0E,GH0ST,SAASzE,EAAQD,GI93CvB,IACA,GAAAqG,QAAA6F,YAAA,QACC,MAAA6G,GACD,GAAA7G,GAAA,SAAA8G,EAAAC,GACA,GAAAtE,EASA,OARAsE,OACA9G,SAAA,EACAC,YAAA,EACAC,OAAAxH,QAGA8J,EAAAuE,SAAAC,YAAA,eACAxE,EAAAyE,gBAAAJ,EAAAC,EAAA9G,QAAA8G,EAAA7G,WAAA6G,EAAA5G,QACAsC,EAGAzC,GAAAxK,UAAA2E,OAAAgN,MAAA3R,UACA2E,OAAA6F,gBJ44CM,SAASjM,EAAQD,GKn6CvB,YAqBA,SAAAsT,GAAAlJ,EAAAmJ,GACA,GAAAC,EAAA,MAAAA,GAAA7S,KAAAyJ,EAAAmJ,EAEA,QADAE,GAAArJ,EAAAmH,WAAAmC,iBAAAH,GACA3Q,EAAA,EAAiBA,EAAA6Q,EAAAtR,OAAkBS,IACnC,GAAA6Q,EAAA7Q,IAAAwH,EAAA,QAEA,UAzBA,GAAAuJ,GAAAC,QAAAlS,UACA8R,EAAAG,EAAAE,SACAF,EAAAG,iBACAH,EAAAI,uBACAJ,EAAAK,oBACAL,EAAAM,mBACAN,EAAAO,gBAEAjU,GAAAD,QAAAsT,GL27CM,SAASrT,EAAQD,IMr8CvB,SAAAmU,GAAA,YAKA,SAAAC,GAAAC,GAGA,OAFAC,MAEA1R,EAAA,EAAgBA,EAAAyR,EAAAlS,OAAgBS,IAChC,KAAA0R,EAAAlS,QAAAiS,EAAAzR,KACA0R,EAAAzL,KAAAwL,EAAAzR,GAIA,OAAA0R,GAIA,QAAAC,GAAAF,GACA,GAAAG,GAAA,GAAAC,IACA,OAAAJ,GAAAvN,OAAA,SAAAsD,GACA,MAAAoK,GAAAE,IAAAtK,GAAA,QACAoK,EAAAzO,IAAAqE,IACA,KAMA,QAAAuK,GAAAN,GACA,GAAAC,KAMA,OAJA,IAAAG,KAAAJ,GAAA3L,QAAA,SAAA0B,GACAkK,EAAAzL,KAAAuB,KAGAkK,EAKA,QAAAM,KACA,GAAAN,IAAA,CAMA,OAJA,IAAAG,OAAA,IAAA/L,QAAA,SAAA0B,GACAkK,EAAAlK,IAGAkK,KAAA,EAGA,OAAAH,GACA,kBAAAM,KAAA/S,UAAAgH,SAAAkM,IACA3U,EAAAD,QAAA2U,EAEA1U,EAAAD,QAAAuU,EAGAtU,EAAAD,QAAAoU,IN08C8BzT,KAAKX,EAAU,WAAa,MAAOI,WAI3D,SAASH,EAAQD,GOpgDvB,QAAA6U,KAGA,OAFAnS,MAEAE,EAAA,EAAmBA,EAAAV,UAAAC,OAAsBS,IAAA,CACzC,GAAAkS,GAAA5S,UAAAU,EAEA,QAAAK,KAAA6R,GACAC,EAAApU,KAAAmU,EAAA7R,KACAP,EAAAO,GAAA6R,EAAA7R,IAKA,MAAAP,GAjBAzC,EAAAD,QAAA6U,CAEA,IAAAE,GAAA1S,OAAAX,UAAAqT,gBP+hDM,SAAS9U,EAAQD,GQvhDvB,QAAAyH,GAAAuN,EAAAC,GAcA,QAAAtU,KACAuU,EAAA,EACAC,GAAA,GAAAC,MACAC,EAAAL,EAAAhT,MAAAsT,EAAAC,GACAD,EAAA,KACAC,EAAA,KAlBA,GAAAD,GAAAC,EAAAF,EAAAH,EACAC,EAAA,CAEA,mBACAG,EAAAlV,KACAmV,EAAArT,SACA,IAAAsT,GAAA,GAAAJ,MAAAD,CAIA,OAHAD,KACAM,GAAAP,EAAAtU,IACAuU,EAAAO,WAAA9U,EAAAsU,EAAAO,IACAH,GArBApV,EAAAD,QAAAyH,GRukDM,SAASxH,EAAQD,GShiDvB,QAAA0V,MAvCAzV,EAAAD,QAAA,SAAA2V,EAAAC,EAAApJ,GAsBA,QAAAqJ,GAAAjT,GACA,gBAAAkT,EAAAC,GACA,IAAAC,EAAA,CAEA,GAAAF,EAGA,MAFAtJ,GAAAsJ,EAAAG,QACAD,GAAA,EAIAC,GAAArT,GAAAmT,IAEAG,GAAA1J,EAAA,KAAAyJ,KAjCAzJ,IACA,kBAAAoJ,IACApJ,EAAAoJ,EACAA,EAAA,MAEApJ,EAAAkJ,EAIA,IAAAQ,GAAAP,KAAAxT,MACA,KAAA+T,EAAA,MAAA1J,GAAA,QAEA,IAAAwJ,IAAA,EACAC,EAAA,GAAAxU,OAAAyU,EAEAP,GAAAjN,QAAAkN,EAAA,SAAAO,EAAAvT,GACAuT,EAAAxV,KAAAiV,EAAAC,EAAAjT,KACG,SAAAuT,EAAAvT,GACHuT,EAAAN,EAAAjT,QTkmDM,SAAS3C,EAAQD,EAASM,GUrnDhC,YVioDC,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,GARvFqB,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,GUxnDV,IAAA6T,GAAA9V,EAAA,GV6nDK+V,EAActV,EAAuBqV,GUtnDpCE,EAAQ,SAAUnI,EAAGC,GACzBhO,KAAK+N,GAAI,EAAAkI,cAAUlI,GACnB/N,KAAKgO,GAAI,EAAAiI,cAAUjI,GASrBkI,GAAMjJ,OAAS,SAAUkJ,EAAGC,GAC1B,MAAOD,GAAEpI,IAAMqI,EAAErI,GAAKoI,EAAEnI,IAAMoI,EAAEpI,GVkoDjCpO,aU/nDcsW,GVmoDT,SAASrW,EAAQD,GW3pDvB,YAOe,SAASyW,GAAUlU,GAChC,MAAOmU,YAAWnU,IAAU,EX6pD7BF,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,aWjqDuByW,GXwqDlB,SAASxW,EAAQD,EAASM,GAE/B,YAgBA,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,GAEvF,QAASG,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAhBhHe,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAIC,GAAI,EAAGA,EAAID,EAAMR,OAAQS,IAAK,CAAE,GAAIC,GAAaF,EAAMC,EAAIC,GAAWC,WAAaD,EAAWC,aAAc,EAAOD,EAAWE,cAAe,EAAU,SAAWF,KAAYA,EAAWG,UAAW,GAAMX,OAAOC,eAAeI,EAAQG,EAAWI,IAAKJ,IAAiB,MAAO,UAAUxB,EAAa6B,EAAYC,GAAiJ,MAA9HD,IAAYT,EAAiBpB,EAAYK,UAAWwB,GAAiBC,GAAaV,EAAiBpB,EAAa8B,GAAqB9B,MYvrDjiByC,EAAAxD,EAAA,GZ2rDKyD,EAAUhD,EAAuB+C,GY1rDtCI,EAAA5D,EAAA,IZ8rDK6D,EAAYpD,EAAuBmD,GY5rDpCzD,EAAK,EAEH6R,EAAA,WACJ,QADIA,GACQ3N,GZmsDTxD,EAAgBf,KYpsDfkS,GAEFlS,KAAKK,GAAKA,IACVL,KAAKuE,QAAUA,EACfvE,KAAKoK,WAAY,EZgwDlB,MAzDAhI,GY3sDG8P,IZ4sDDrP,IAAK,OACLV,MAAO,WYrsDRnC,KAAKoK,WAAY,EACjBpK,KAAKuE,QAAQmB,UAAU4L,OAAOvN,aAAQ6J,QACtC5N,KAAKuE,QAAQmB,UAAUC,IAAI5B,aAAQyI,YZysDlC3J,IAAK,OACLV,MAAO,WYtsDRnC,KAAKoK,WAAY,EACjBpK,KAAKuE,QAAQmB,UAAU4L,OAAOvN,aAAQyI,SACtCxM,KAAKuE,QAAQmB,UAAUC,IAAI5B,aAAQ6J,WZ0sDlC/K,IAAK,OACLV,MAAO,WYvsDRnC,KAAKuW,YAAYxS,aAAQyS,aAAczS,aAAQyI,UAC/CxM,KAAKsM,SAAS4F,EAAY3F,IAAIkK,SAC9BzW,KAAK6M,MAAQqF,EAAYhF,MAAMV,QAC/BxM,KAAK2M,MAAQ,GAAAhJ,iBZ2sDZd,IAAK,aACLV,MAAO,SYzsDCuU,GZ0sDN,GAAIvO,GAAQnI,IYzsDf0W,GAAQpO,QAAQ,SAACqO,GACfxO,EAAK5D,QAAQmB,UAAUC,IAAIgR,QZ+sD5B9T,IAAK,gBACLV,MAAO,SY5sDIuU,GZ6sDT,GAAI5M,GAAS9J,IY5sDhB0W,GAAQpO,QAAQ,SAACqO,GACf7M,EAAKvF,QAAQmB,UAAU4L,OAAOqF,QZktD/B9T,IAAK,WACLV,MAAO,SY/sDDvB,GACP,IAAK,GAAIiC,KAAOjC,GACdZ,KAAKuE,QAAQuC,MAAMjE,GAAOjC,EAAIiC,MZmtD/BA,IAAK,UACLV,MAAO,WY/sDRnC,KAAK4W,eACH7S,aAAQ6J,OACR7J,aAAQyI,QACRzI,aAAQyS,eAGVxW,KAAKuE,QAAQgN,gBAAgB,SAC7BvR,KAAKuE,QAAU,SApDb2N,IAwDNA,GAAY3F,KACVkK,SACE7O,SAAU,WACVuG,IAAK,EACLD,KAAM,EACN2I,WAAY,UACZC,cAAe,aAEjBtK,SACEW,QACE4J,QAAS,EACTF,WAAY,WAEdpK,UAEFmB,QACET,QACE4J,QAAS,GAEXtK,OACEoK,WAAY,YAKlB3E,EAAYhF,OACVV,QAAS,EACToB,OAAQ,MZktDThO,aY/sDcsS,GZmtDT,SAASrS,EAAQD,GAEtB,YAEAqC,QAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,capzDCiG,KAAM,UACN2Q,aAAc,eACdhK,QAAS,wBACToB,OAAQ,yBb0zDJ,SAAS/N,EAAQD,EAASM,Gc9zDhC,Yd+0DC,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,Gch0DzE,QAASoW,GAAezS,EAASuC,Gd60D7C,Gc50DCa,GAAA7F,UAAAC,QAAA,GAAA0C,SAAA3C,UAAA,GAASmE,OAAOG,iBAAiB7B,EAAS,MAAjCzC,UAAA,GACPK,GAAQ,EAAA8T,cAAUtO,EAAOb,GAe7B,OAZImQ,eAA6C,UAAVnQ,EAK5BmQ,cAA6C,WAAVnQ,IAC5C3E,IAAS,EAAA8T,cAAUtO,EAAOuP,aACxB,EAAAjB,cAAUtO,EAAOwP,gBACjB,EAAAlB,cAAUtO,EAAOyP,iBACjB,EAAAnB,cAAUtO,EAAO0P,oBARnBlV,IAAS,EAAA8T,cAAUtO,EAAO2P,cACxB,EAAArB,cAAUtO,EAAO4P,eACjB,EAAAtB,cAAUtO,EAAO6P,kBACjB,EAAAvB,cAAUtO,EAAO8P,kBAQdtV,EdkyDRF,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,actzDuBoX,CAbxB,IAAAhB,GAAA9V,EAAA,Gdu0DK+V,EAActV,EAAuBqV,Gct0D1C0B,EAAAxX,EAAA,Id00DK+W,EAAiBtW,EAAuB+W,IA+BvC,SAAS7X,EAAQD,GAEtB,YAEAqC,QAAOC,eAAetC,EAAS,cAC7BuC,OAAO,Geh3DV,IAAIoC,GAAUuO,SAAS6E,MAAQ7E,SAAS8E,gBACpCjF,EAAIG,SAAS+E,cAAc,MAC/BlF,GAAE7L,MAAMgR,QAAU,gDAClBvT,EAAQwT,YAAYpF,EAEpB,IAAIpM,GAAQN,OAAOG,iBAAiBuM,EAAG,MAAMpM,MACzC2N,EAAgB,SAAV3N,CAEVhC,GAAQ6M,YAAYuB,Gfq3DnB/S,aen3DcsU,Gfu3DT,SAASrU,EAAQD,EAASM,GgBl4DhC,YhB+4DC,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,GgB14DxF,QAASoX,GAAUvW,GACjB,GAAIwW,GACAC,EACA/J,EAAM1M,EAAMM,MAEhB,KAAKoM,EACH,MAAO1M,EAGT,QAAS0M,GACP+J,EAAUxW,KAAKuJ,MAAMvJ,KAAKyW,UAAYhK,EAAM,IAC5C8J,EAAMxW,EAAMyW,GACZzW,EAAMyW,GAAWzW,EAAM0M,GACvB1M,EAAM0M,GAAO8J,CAGf,OAAOxW,GAmBM,QAAS2W,GAAOnE,EAAKzP,GAClC,GAAIgK,IAAO,EAAAnL,cAAMgV,EAAU7T,GACvB8T,KAAc/W,MAAMhB,KAAK0T,GACzBsE,GAAS,CAEb,OAAKtE,GAAIlS,OAILyM,EAAKwJ,UACAA,EAAU/D,IAKI,kBAAZzF,GAAKrE,IACd8J,EAAI9D,KAAK,SAAUgG,EAAGC,GAGpB,GAAImC,EACF,MAAO,EAGT,IAAIC,GAAOhK,EAAKrE,GAAGgM,EAAE3H,EAAK3L,MACtB4V,EAAOjK,EAAKrE,GAAGiM,EAAE5H,EAAK3L,KARH,OAWV4B,UAAT+T,GAA+B/T,SAATgU,GACxBF,GAAS,EACF,GAGEE,EAAPD,GAAwB,cAATA,GAAiC,aAATC,EAClC,GAGLD,EAAOC,GAAiB,aAATD,GAAgC,cAATC,EACjC,EAGF,IAKPF,EACKD,GAGL9J,EAAKkK,SACPzE,EAAIyE,UAGCzE,OhByyDRhS,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,agBj2DuBwY,CAtCxB,IAAAhV,GAAAlD,EAAA,GhB24DKmD,EAAU1C,EAAuByC,GgBr3DlCiV,GAEFK,SAAS,EAGTvO,GAAI,KAGJ6N,WAAW,EAIXnV,IAAK,YhB28DD,SAAShD,EAAQD,GiB/+DvB,YAMA,SAAS+Y,KACP,MAAOC,GAAYzM,IAGd,QAASmC,GAAgB/J,EAAS6H,GACvC,GAAI/L,GAAKsY,IACLE,EAAW,SAACtK,GACVA,EAAIuK,gBAAkBvK,EAAIjM,SAC5BiN,EAAoBlP,GACpB+L,EAASmC,IAQb,OAJAhK,GAAQ2B,iBAAiB0S,EAAWC,GAEpC3J,EAAY7O,IAAQkE,UAASsU,YAEtBxY,EAGF,QAASkP,GAAoBlP,GAClC,MAAI6O,GAAY7O,IACd6O,EAAY7O,GAAIkE,QAAQ0M,oBAAoB2H,EAAW1J,EAAY7O,GAAIwY,UACvE3J,EAAY7O,GAAM,MACX,IAGF,EjBk9DR4B,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,EiB5+De0O,kBjB6+Df1O,EiB79De2P,qBAxBhB,IAAIL,MACA0J,EAAY,gBACZzM,EAAQ,GjBwhEN,SAAStM,EAAQD,EAASM,GkB5hEhC,YlB4iEC,SAASS,GAAuBC,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQE,UAASF,GkBxiExF,QAASY,GAASC,GAChB,MAAOC,MAAKC,IAAIC,MAAMF,KAAMD,GAG9B,QAASsX,GAAStX,GAChB,MAAOC,MAAK6J,IAAI3J,MAAMF,KAAMD,GAavB,QAAS4L,GAAThE,GAcL,IAAK,GAd2ByD,GAAAzD,EAAAyD,SAAUzB,EAAAhC,EAAAgC,UAAWiC,EAAAjE,EAAAiE,SAAUC,EAAAlE,EAAAkE,MAAOC,EAAAnE,EAAAmE,UAAWC,EAAApE,EAAAoE,OAC7EuL,EAAO1G,EAAcxF,EAASvG,MAAO+G,EAAUC,EAAOC,GACtDyL,EAAOzG,EAAsBnH,EAAW2N,EAAMzL,GAC9C2L,EAAmBxG,EAAeuG,EAAMxL,GAGxCd,EAAQ,GAAAhJ,cACVjC,KAAKoJ,MAAMwC,EAAW4L,GACtBxX,KAAKoJ,MAAMmO,EAAKC,KAKdC,EAAYF,EAAKC,GAAoBpM,EAAS3B,OACzC3I,EAAI,EAAOwW,EAAJxW,EAAUA,IACxB6I,EAAU6N,EAAmB1W,GAAK2W,CAGpC,OAAOxM,GAWF,QAAS2F,GAAc8G,EAAW7O,EAAa8O,EAAS7L,GAC7D,GAAI8L,GAAaF,EAAY7O,CAD2C,OAMpE7I,MAAKmJ,IAAInJ,KAAKoJ,MAAMwO,GAAcA,GAAc9L,IAElD8L,EAAa5X,KAAKoJ,MAAMwO,IAInB5X,KAAK6J,IAAI7J,KAAK6X,KAAKD,GAAaD,GASlC,QAAS7G,GAAsBnH,EAAWiO,EAAYD,GAE3D,GAAmB,IAAfC,EACF,MAAOjO,EAH2D,KA+B/D,GAHDmO,MAGKhX,EAAI,EAAQ6W,EAAUC,GAAf9W,EAA2BA,IAEzCgX,EAAU/Q,KAAKjH,EAAS6J,EAAU9J,MAAMiB,EAAGA,EAAI8W,IAGjD,OAAOE,GAWF,QAAS9G,GAAerH,EAAWoC,GAExC,IAAK,GADDgM,GAAcV,EAAS1N,GAClB7I,EAAI,EAAGkX,EAAMrO,EAAUtJ,OAAY2X,EAAJlX,EAASA,IAC/C,GAAI6I,EAAU7I,IAAMiX,EAAchM,GAAUpC,EAAU7I,IAAMiX,EAAchM,EACxE,MAAOjL,EAIX,OAAO,GlBi6DRP,OAAOC,eAAetC,EAAS,cAC7BuC,OAAO,IAETvC,EkB7gEeyN,kBlB8gEfzN,EkBj/De0S,gBlBk/Df1S,EkB79De4S,wBlB89Df5S,EkB/6De8S,gBArHhB,IAAAhP,GAAAxD,EAAA,GlBwiEKyD,EAAUhD,EAAuB+C","file":"shuffle.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"shuffle\"] = factory();\n\telse\n\t\troot[\"shuffle\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tmodule.exports = __webpack_require__(1).default;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\t__webpack_require__(2);\n\t\n\tvar _matchesSelector = __webpack_require__(3);\n\t\n\tvar _matchesSelector2 = _interopRequireDefault(_matchesSelector);\n\t\n\tvar _arrayUniq = __webpack_require__(4);\n\t\n\tvar _arrayUniq2 = _interopRequireDefault(_arrayUniq);\n\t\n\tvar _xtend = __webpack_require__(5);\n\t\n\tvar _xtend2 = _interopRequireDefault(_xtend);\n\t\n\tvar _throttleit = __webpack_require__(6);\n\t\n\tvar _throttleit2 = _interopRequireDefault(_throttleit);\n\t\n\tvar _arrayParallel = __webpack_require__(7);\n\t\n\tvar _arrayParallel2 = _interopRequireDefault(_arrayParallel);\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tvar _shuffleItem = __webpack_require__(10);\n\t\n\tvar _shuffleItem2 = _interopRequireDefault(_shuffleItem);\n\t\n\tvar _classes = __webpack_require__(11);\n\t\n\tvar _classes2 = _interopRequireDefault(_classes);\n\t\n\tvar _getNumberStyle = __webpack_require__(12);\n\t\n\tvar _getNumberStyle2 = _interopRequireDefault(_getNumberStyle);\n\t\n\tvar _sorter = __webpack_require__(14);\n\t\n\tvar _sorter2 = _interopRequireDefault(_sorter);\n\t\n\tvar _onTransitionEnd = __webpack_require__(15);\n\t\n\tvar _layout2 = __webpack_require__(16);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction toArray(arrayLike) {\n\t return Array.prototype.slice.call(arrayLike);\n\t}\n\t\n\tfunction arrayMax(array) {\n\t return Math.max.apply(Math, array);\n\t}\n\t\n\tfunction arrayIncludes(array, obj) {\n\t if (arguments.length === 2) {\n\t return arrayIncludes(array)(obj);\n\t }\n\t\n\t return function (obj) {\n\t return array.indexOf(obj) > -1;\n\t };\n\t}\n\t\n\t// Used for unique instance variables\n\tvar id = 0;\n\t\n\tvar Shuffle = function () {\n\t\n\t /**\n\t * Categorize, sort, and filter a responsive grid of items.\n\t *\n\t * @param {Element} element An element which is the parent container for the grid items.\n\t * @param {Object} [options=Shuffle.options] Options object.\n\t * @constructor\n\t */\n\t\n\t function Shuffle(element) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t _classCallCheck(this, Shuffle);\n\t\n\t this.options = (0, _xtend2.default)(Shuffle.options, options);\n\t\n\t this.useSizer = false;\n\t this.lastSort = {};\n\t this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n\t this.isEnabled = true;\n\t this.isDestroyed = false;\n\t this.isInitialized = false;\n\t this._transitions = [];\n\t this.isTransitioning = false;\n\t this._queue = [];\n\t\n\t element = this._getElementOption(element);\n\t\n\t if (!element) {\n\t throw new TypeError('Shuffle needs to be initialized with an element.');\n\t }\n\t\n\t this.element = element;\n\t this.id = 'shuffle_' + id++;\n\t\n\t this._init();\n\t this.isInitialized = true;\n\t }\n\t\n\t _createClass(Shuffle, [{\n\t key: '_init',\n\t value: function _init() {\n\t this.items = this._getItems();\n\t\n\t this.options.sizer = this._getElementOption(this.options.sizer);\n\t\n\t if (this.options.sizer) {\n\t this.useSizer = true;\n\t }\n\t\n\t // Add class and invalidate styles\n\t this.element.classList.add(Shuffle.Classes.BASE);\n\t\n\t // Set initial css for each item\n\t this._initItems();\n\t\n\t // Bind resize events\n\t this._onResize = this._getResizeFunction();\n\t window.addEventListener('resize', this._onResize);\n\t\n\t // Get container css all in one request. Causes reflow\n\t var containerCss = window.getComputedStyle(this.element, null);\n\t var containerWidth = Shuffle.getSize(this.element).width;\n\t\n\t // Add styles to the container if it doesn't have them.\n\t this._validateStyles(containerCss);\n\t\n\t // We already got the container's width above, no need to cause another\n\t // reflow getting it again... Calculate the number of columns there will be\n\t this._setColumns(containerWidth);\n\t\n\t // Kick off!\n\t this.filter(this.options.group, this.options.initialSort);\n\t\n\t // The shuffle items haven't had transitions set on them yet so the user\n\t // doesn't see the first layout. Set them now that the first layout is done.\n\t // First, however, a synchronous layout must be caused for the previous\n\t // styles to be applied without transitions.\n\t this.element.offsetWidth; // jshint ignore: line\n\t this._setTransitions();\n\t this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n\t }\n\t\n\t /**\n\t * Returns a throttled and proxied function for the resize handler.\n\t * @return {Function}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getResizeFunction',\n\t value: function _getResizeFunction() {\n\t var resizeFunction = this._handleResize.bind(this);\n\t return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : resizeFunction;\n\t }\n\t\n\t /**\n\t * Retrieve an element from an option.\n\t * @param {string|jQuery|Element} option The option to check.\n\t * @return {?Element} The plain element or null.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getElementOption',\n\t value: function _getElementOption(option) {\n\t // If column width is a string, treat is as a selector and search for the\n\t // sizer element within the outermost container\n\t if (typeof option === 'string') {\n\t return this.element.querySelector(option);\n\t\n\t // Check for an element\n\t } else if (option && option.nodeType && option.nodeType === 1) {\n\t return option;\n\t\n\t // Check for jQuery object\n\t } else if (option && option.jquery) {\n\t return option[0];\n\t }\n\t\n\t return null;\n\t }\n\t\n\t /**\n\t * Ensures the shuffle container has the css styles it needs applied to it.\n\t * @param {Object} styles Key value pairs for position and overflow.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_validateStyles',\n\t value: function _validateStyles(styles) {\n\t // Position cannot be static.\n\t if (styles.position === 'static') {\n\t this.element.style.position = 'relative';\n\t }\n\t\n\t // Overflow has to be hidden.\n\t if (styles.overflow !== 'hidden') {\n\t this.element.style.overflow = 'hidden';\n\t }\n\t }\n\t\n\t /**\n\t * Filter the elements by a category.\n\t * @param {string} [category] Category to filter by. If it's given, the last\n\t * category will be used to filter the items.\n\t * @param {Array} [collection] Optionally filter a collection. Defaults to\n\t * all the items.\n\t * @return {!{visible: Array, hidden: Array}}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_filter',\n\t value: function _filter() {\n\t var category = arguments.length <= 0 || arguments[0] === undefined ? this.lastFilter : arguments[0];\n\t var collection = arguments.length <= 1 || arguments[1] === undefined ? this.items : arguments[1];\n\t\n\t var set = this._getFilteredSets(category, collection);\n\t\n\t // Individually add/remove hidden/visible classes\n\t this._toggleFilterClasses(set);\n\t\n\t // Save the last filter in case elements are appended.\n\t this.lastFilter = category;\n\t\n\t // This is saved mainly because providing a filter function (like searching)\n\t // will overwrite the `lastFilter` property every time its called.\n\t if (typeof category === 'string') {\n\t this.group = category;\n\t }\n\t\n\t return set;\n\t }\n\t\n\t /**\n\t * Returns an object containing the visible and hidden elements.\n\t * @param {string|Function} category Category or function to filter by.\n\t * @param {Array.} items A collection of items to filter.\n\t * @return {!{visible: Array, hidden: Array}}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getFilteredSets',\n\t value: function _getFilteredSets(category, items) {\n\t var _this = this;\n\t\n\t var visible = [];\n\t var hidden = [];\n\t\n\t // category === 'all', add visible class to everything\n\t if (category === Shuffle.ALL_ITEMS) {\n\t visible = items;\n\t\n\t // Loop through each item and use provided function to determine\n\t // whether to hide it or not.\n\t } else {\n\t items.forEach(function (item) {\n\t if (_this._doesPassFilter(category, item.element)) {\n\t visible.push(item);\n\t } else {\n\t hidden.push(item);\n\t }\n\t });\n\t }\n\t\n\t return {\n\t visible: visible,\n\t hidden: hidden\n\t };\n\t }\n\t\n\t /**\n\t * Test an item to see if it passes a category.\n\t * @param {string|Function} category Category or function to filter by.\n\t * @param {Element} element An element to test.\n\t * @return {boolean} Whether it passes the category/filter.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_doesPassFilter',\n\t value: function _doesPassFilter(category, element) {\n\t\n\t if (typeof category === 'function') {\n\t return category.call(element, element, this);\n\t\n\t // Check each element's data-groups attribute against the given category.\n\t } else {\n\t var attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n\t var groups = JSON.parse(attr);\n\t var keys = this.delimeter && !Array.isArray(groups) ? groups.split(this.delimeter) : groups;\n\t\n\t if (Array.isArray(category)) {\n\t return category.some(arrayIncludes(keys));\n\t }\n\t\n\t return arrayIncludes(keys, category);\n\t }\n\t }\n\t\n\t /**\n\t * Toggles the visible and hidden class names.\n\t * @param {{visible, hidden}} Object with visible and hidden arrays.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_toggleFilterClasses',\n\t value: function _toggleFilterClasses(_ref) {\n\t var visible = _ref.visible;\n\t var hidden = _ref.hidden;\n\t\n\t visible.forEach(function (item) {\n\t item.show();\n\t });\n\t\n\t hidden.forEach(function (item) {\n\t item.hide();\n\t });\n\t }\n\t\n\t /**\n\t * Set the initial css for each item\n\t * @param {Array.} [items] Optionally specifiy at set to initialize.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_initItems',\n\t value: function _initItems() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t items.forEach(function (item) {\n\t item.init();\n\t });\n\t }\n\t\n\t /**\n\t * Remove element reference and styles.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_disposeItems',\n\t value: function _disposeItems() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t items.forEach(function (item) {\n\t item.dispose();\n\t });\n\t }\n\t\n\t /**\n\t * Updates the visible item count.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_updateItemCount',\n\t value: function _updateItemCount() {\n\t this.visibleItems = this._getFilteredItems().length;\n\t }\n\t\n\t /**\n\t * Sets css transform transition on a group of elements. This is not executed\n\t * at the same time as `item.init` so that transitions don't occur upon\n\t * initialization of Shuffle.\n\t * @param {Array.} items Shuffle items to set transitions on.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_setTransitions',\n\t value: function _setTransitions() {\n\t var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0];\n\t\n\t var speed = this.options.speed;\n\t var easing = this.options.easing;\n\t\n\t var str;\n\t if (this.options.useTransforms) {\n\t str = 'transform ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n\t } else {\n\t str = 'top ' + speed + 'ms ' + easing + ', left ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n\t }\n\t\n\t items.forEach(function (item) {\n\t item.element.style.transition = str;\n\t });\n\t }\n\t }, {\n\t key: '_getItems',\n\t value: function _getItems() {\n\t var _this2 = this;\n\t\n\t return toArray(this.element.children).filter(function (el) {\n\t return (0, _matchesSelector2.default)(el, _this2.options.itemSelector);\n\t }).map(function (el) {\n\t return new _shuffleItem2.default(el);\n\t });\n\t }\n\t\n\t /**\n\t * When new elements are added to the shuffle container, update the array of\n\t * items because that is the order `_layout` calls them.\n\t */\n\t\n\t }, {\n\t key: '_updateItemsOrder',\n\t value: function _updateItemsOrder() {\n\t var children = this.element.children;\n\t this.items = (0, _sorter2.default)(this.items, {\n\t by: function by(element) {\n\t return Array.prototype.indexOf.call(children, element);\n\t }\n\t });\n\t }\n\t }, {\n\t key: '_getFilteredItems',\n\t value: function _getFilteredItems() {\n\t return this.items.filter(function (item) {\n\t return item.isVisible;\n\t });\n\t }\n\t }, {\n\t key: '_getConcealedItems',\n\t value: function _getConcealedItems() {\n\t return this.items.filter(function (item) {\n\t return !item.isVisible;\n\t });\n\t }\n\t\n\t /**\n\t * Returns the column size, based on column width and sizer options.\n\t * @param {number} containerWidth Size of the parent container.\n\t * @param {number} gutterSize Size of the gutters.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getColumnSize',\n\t value: function _getColumnSize(containerWidth, gutterSize) {\n\t var size;\n\t\n\t // If the columnWidth property is a function, then the grid is fluid\n\t if (typeof this.options.columnWidth === 'function') {\n\t size = this.options.columnWidth(containerWidth);\n\t\n\t // columnWidth option isn't a function, are they using a sizing element?\n\t } else if (this.useSizer) {\n\t size = Shuffle.getSize(this.options.sizer).width;\n\t\n\t // if not, how about the explicitly set option?\n\t } else if (this.options.columnWidth) {\n\t size = this.options.columnWidth;\n\t\n\t // or use the size of the first item\n\t } else if (this.items.length > 0) {\n\t size = Shuffle.getSize(this.items[0].element, true).width;\n\t\n\t // if there's no items, use size of container\n\t } else {\n\t size = containerWidth;\n\t }\n\t\n\t // Don't let them set a column width of zero.\n\t if (size === 0) {\n\t size = containerWidth;\n\t }\n\t\n\t return size + gutterSize;\n\t }\n\t\n\t /**\n\t * Returns the gutter size, based on gutter width and sizer options.\n\t * @param {number} containerWidth Size of the parent container.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getGutterSize',\n\t value: function _getGutterSize(containerWidth) {\n\t var size;\n\t if (typeof this.options.gutterWidth === 'function') {\n\t size = this.options.gutterWidth(containerWidth);\n\t } else if (this.useSizer) {\n\t size = (0, _getNumberStyle2.default)(this.options.sizer, 'marginLeft');\n\t } else {\n\t size = this.options.gutterWidth;\n\t }\n\t\n\t return size;\n\t }\n\t\n\t /**\n\t * Calculate the number of columns to be used. Gets css if using sizer element.\n\t * @param {number} [containerWidth] Optionally specify a container width if\n\t * it's already available.\n\t */\n\t\n\t }, {\n\t key: '_setColumns',\n\t value: function _setColumns() {\n\t var containerWidth = arguments.length <= 0 || arguments[0] === undefined ? Shuffle.getSize(this.element).width : arguments[0];\n\t\n\t var gutter = this._getGutterSize(containerWidth);\n\t var columnWidth = this._getColumnSize(containerWidth, gutter);\n\t var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\t\n\t // Widths given from getStyles are not precise enough...\n\t if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) < this.options.columnThreshold) {\n\t // e.g. calculatedColumns = 11.998876\n\t calculatedColumns = Math.round(calculatedColumns);\n\t }\n\t\n\t this.cols = Math.max(Math.floor(calculatedColumns), 1);\n\t this.containerWidth = containerWidth;\n\t this.colWidth = columnWidth;\n\t }\n\t\n\t /**\n\t * Adjust the height of the grid\n\t */\n\t\n\t }, {\n\t key: '_setContainerSize',\n\t value: function _setContainerSize() {\n\t this.element.style.height = this._getContainerSize() + 'px';\n\t }\n\t\n\t /**\n\t * Based on the column heights, it returns the biggest one.\n\t * @return {number}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getContainerSize',\n\t value: function _getContainerSize() {\n\t return arrayMax(this.positions);\n\t }\n\t\n\t /**\n\t * Get the clamped stagger amount.\n\t * @param {number} index Index of the item to be staggered.\n\t * @return {number}\n\t */\n\t\n\t }, {\n\t key: '_getStaggerAmount',\n\t value: function _getStaggerAmount(index) {\n\t return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n\t }\n\t\n\t /**\n\t * @return {boolean} Whether the event was prevented or not.\n\t */\n\t\n\t }, {\n\t key: '_dispatch',\n\t value: function _dispatch(name) {\n\t var details = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t if (this.isDestroyed) {\n\t return;\n\t }\n\t\n\t details.shuffle = this;\n\t return !this.element.dispatchEvent(new CustomEvent(name, {\n\t bubbles: true,\n\t cancelable: false,\n\t detail: details\n\t }));\n\t }\n\t\n\t /**\n\t * Zeros out the y columns array, which is used to determine item placement.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_resetCols',\n\t value: function _resetCols() {\n\t var i = this.cols;\n\t this.positions = [];\n\t while (i--) {\n\t this.positions.push(0);\n\t }\n\t }\n\t\n\t /**\n\t * Loops through each item that should be shown and calculates the x, y position.\n\t * @param {Array.} items Array of items that will be shown/layed\n\t * out in order in their array.\n\t */\n\t\n\t }, {\n\t key: '_layout',\n\t value: function _layout(items) {\n\t var _this3 = this;\n\t\n\t var count = 0;\n\t items.forEach(function (item) {\n\t var currPos = item.point;\n\t var currScale = item.scale;\n\t var itemSize = Shuffle.getSize(item.element, true);\n\t var pos = _this3._getItemPosition(itemSize);\n\t\n\t function callback() {\n\t item.element.style.transitionDelay = '';\n\t item.applyCss(_shuffleItem2.default.Css.VISIBLE.after);\n\t }\n\t\n\t // If the item will not change its position, do not add it to the render\n\t // queue. Transitions don't fire when setting a property to the same value.\n\t if (_point2.default.equals(currPos, pos) && currScale === _shuffleItem2.default.Scale.VISIBLE) {\n\t callback();\n\t return;\n\t }\n\t\n\t item.point = pos;\n\t item.scale = _shuffleItem2.default.Scale.VISIBLE;\n\t\n\t // Use xtend here to clone the object so that the `before` object isn't\n\t // modified when the transition delay is added.\n\t var styles = (0, _xtend2.default)(_shuffleItem2.default.Css.VISIBLE.before);\n\t styles.transitionDelay = _this3._getStaggerAmount(count) + 'ms';\n\t\n\t _this3._queue.push({\n\t item: item,\n\t styles: styles,\n\t callback: callback\n\t });\n\t\n\t count++;\n\t });\n\t }\n\t\n\t /**\n\t * Determine the location of the next item, based on its size.\n\t * @param {{width: number, height: number}} itemSize Object with width and height.\n\t * @return {Point}\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getItemPosition',\n\t value: function _getItemPosition(itemSize) {\n\t return (0, _layout2.getItemPosition)({\n\t itemSize: itemSize,\n\t positions: this.positions,\n\t gridSize: this.colWidth,\n\t total: this.cols,\n\t threshold: this.options.columnThreshold,\n\t buffer: this.options.buffer\n\t });\n\t }\n\t\n\t /**\n\t * Hides the elements that don't match our filter.\n\t * @param {Array.} collection Collection to shrink.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_shrink',\n\t value: function _shrink() {\n\t var _this4 = this;\n\t\n\t var collection = arguments.length <= 0 || arguments[0] === undefined ? this._getConcealedItems() : arguments[0];\n\t\n\t var count = 0;\n\t collection.forEach(function (item) {\n\t function callback() {\n\t item.applyCss(_shuffleItem2.default.Css.HIDDEN.after);\n\t }\n\t\n\t // Continuing would add a transitionend event listener to the element, but\n\t // that listener would not execute because the transform and opacity would\n\t // stay the same.\n\t // The callback is executed here because it is not guaranteed to be called\n\t // after the transitionend event because the transitionend could be\n\t // canceled if another animation starts.\n\t if (item.scale === _shuffleItem2.default.Scale.HIDDEN) {\n\t callback();\n\t return;\n\t }\n\t\n\t item.scale = _shuffleItem2.default.Scale.HIDDEN;\n\t\n\t var styles = (0, _xtend2.default)(_shuffleItem2.default.Css.HIDDEN.before);\n\t styles.transitionDelay = _this4._getStaggerAmount(count) + 'ms';\n\t\n\t _this4._queue.push({\n\t item: item,\n\t styles: styles,\n\t callback: callback\n\t });\n\t\n\t count++;\n\t });\n\t }\n\t\n\t /**\n\t * Resize handler.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_handleResize',\n\t value: function _handleResize() {\n\t // If shuffle is disabled, destroyed, don't do anything\n\t if (!this.isEnabled || this.isDestroyed) {\n\t return;\n\t }\n\t\n\t // Will need to check height in the future if it's layed out horizontaly\n\t var containerWidth = Shuffle.getSize(this.element).width;\n\t\n\t // containerWidth hasn't changed, don't do anything\n\t if (containerWidth === this.containerWidth) {\n\t return;\n\t }\n\t\n\t this.update();\n\t }\n\t\n\t /**\n\t * Returns styles which will be applied to the an item for a transition.\n\t * @param {Object} obj Transition options.\n\t * @return {!Object} Transforms for transitions, left/top for animate.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_getStylesForTransition',\n\t value: function _getStylesForTransition(_ref2) {\n\t var item = _ref2.item;\n\t var styles = _ref2.styles;\n\t\n\t if (!styles.transitionDelay) {\n\t styles.transitionDelay = '0ms';\n\t }\n\t\n\t var x = item.point.x;\n\t var y = item.point.y;\n\t\n\t if (this.options.useTransforms) {\n\t styles.transform = 'translate(' + x + 'px, ' + y + 'px) scale(' + item.scale + ')';\n\t } else {\n\t styles.left = x + 'px';\n\t styles.top = y + 'px';\n\t }\n\t\n\t return styles;\n\t }\n\t\n\t /**\n\t * Listen for the transition end on an element and execute the itemCallback\n\t * when it finishes.\n\t * @param {Element} element Element to listen on.\n\t * @param {Function} itemCallback Callback for the item.\n\t * @param {Function} done Callback to notify `parallel` that this one is done.\n\t */\n\t\n\t }, {\n\t key: '_whenTransitionDone',\n\t value: function _whenTransitionDone(element, itemCallback, done) {\n\t var id = (0, _onTransitionEnd.onTransitionEnd)(element, function (evt) {\n\t itemCallback();\n\t done(null, evt);\n\t });\n\t\n\t this._transitions.push(id);\n\t }\n\t\n\t /**\n\t * Return a function which will set CSS styles and call the `done` function\n\t * when (if) the transition finishes.\n\t * @param {Object} opts Transition object.\n\t * @return {Function} A function to be called with a `done` function.\n\t */\n\t\n\t }, {\n\t key: '_getTransitionFunction',\n\t value: function _getTransitionFunction(opts) {\n\t var _this5 = this;\n\t\n\t return function (done) {\n\t opts.item.applyCss(_this5._getStylesForTransition(opts));\n\t _this5._whenTransitionDone(opts.item.element, opts.callback, done);\n\t };\n\t }\n\t\n\t /**\n\t * Execute the styles gathered in the style queue. This applies styles to elements,\n\t * triggering transitions.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_processQueue',\n\t value: function _processQueue() {\n\t if (this.isTransitioning) {\n\t this._cancelMovement();\n\t }\n\t\n\t var hasSpeed = this.options.speed > 0;\n\t var hasQueue = this._queue.length > 0;\n\t\n\t if (hasQueue && hasSpeed && this.isInitialized) {\n\t this._startTransitions(this._queue);\n\t } else if (hasQueue) {\n\t this._styleImmediately(this._queue);\n\t this._dispatchLayout();\n\t\n\t // A call to layout happened, but none of the newly visible items will\n\t // change position or the transition duration is zero, which will not trigger\n\t // the transitionend event.\n\t } else {\n\t this._dispatchLayout();\n\t }\n\t\n\t // Remove everything in the style queue\n\t this._queue.length = 0;\n\t }\n\t\n\t /**\n\t * Wait for each transition to finish, the emit the layout event.\n\t * @param {Array.} transitions Array of transition objects.\n\t */\n\t\n\t }, {\n\t key: '_startTransitions',\n\t value: function _startTransitions(transitions) {\n\t var _this6 = this;\n\t\n\t // Set flag that shuffle is currently in motion.\n\t this.isTransitioning = true;\n\t\n\t // Create an array of functions to be called.\n\t var callbacks = transitions.map(function (obj) {\n\t return _this6._getTransitionFunction(obj);\n\t });\n\t\n\t (0, _arrayParallel2.default)(callbacks, this._movementFinished.bind(this));\n\t }\n\t }, {\n\t key: '_cancelMovement',\n\t value: function _cancelMovement() {\n\t // Remove the transition end event for each listener.\n\t this._transitions.forEach(_onTransitionEnd.cancelTransitionEnd);\n\t\n\t // Reset the array.\n\t this._transitions.length = 0;\n\t\n\t // Show it's no longer active.\n\t this.isTransitioning = false;\n\t }\n\t\n\t /**\n\t * Apply styles without a transition.\n\t * @param {Array.} objects Array of transition objects.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_styleImmediately',\n\t value: function _styleImmediately(objects) {\n\t var _this7 = this;\n\t\n\t if (objects.length) {\n\t var elements = objects.map(function (obj) {\n\t return obj.item.element;\n\t });\n\t\n\t Shuffle._skipTransitions(elements, function () {\n\t objects.forEach(function (obj) {\n\t obj.item.applyCss(_this7._getStylesForTransition(obj));\n\t obj.callback();\n\t });\n\t });\n\t }\n\t }\n\t }, {\n\t key: '_movementFinished',\n\t value: function _movementFinished() {\n\t this._transitions.length = 0;\n\t this.isTransitioning = false;\n\t this._dispatchLayout();\n\t }\n\t }, {\n\t key: '_dispatchLayout',\n\t value: function _dispatchLayout() {\n\t this._dispatch(Shuffle.EventType.LAYOUT);\n\t }\n\t\n\t /**\n\t * The magic. This is what makes the plugin 'shuffle'\n\t * @param {string|Function|Array.} [category] Category to filter by.\n\t * Can be a function, string, or array of strings.\n\t * @param {Object} [sortObj] A sort object which can sort the visible set\n\t */\n\t\n\t }, {\n\t key: 'filter',\n\t value: function filter(category, sortObj) {\n\t if (!this.isEnabled) {\n\t return;\n\t }\n\t\n\t if (!category || category && category.length === 0) {\n\t category = Shuffle.ALL_ITEMS;\n\t }\n\t\n\t this._filter(category);\n\t\n\t // Shrink each hidden item\n\t this._shrink();\n\t\n\t // How many visible elements?\n\t this._updateItemCount();\n\t\n\t // Update transforms on visible elements so they will animate to their new positions.\n\t this.sort(sortObj);\n\t }\n\t\n\t /**\n\t * Gets the visible elements, sorts them, and passes them to layout.\n\t * @param {Object} opts the options object for the sorted plugin\n\t */\n\t\n\t }, {\n\t key: 'sort',\n\t value: function sort() {\n\t var opts = arguments.length <= 0 || arguments[0] === undefined ? this.lastSort : arguments[0];\n\t\n\t if (!this.isEnabled) {\n\t return;\n\t }\n\t\n\t this._resetCols();\n\t\n\t var items = this._getFilteredItems();\n\t items = (0, _sorter2.default)(items, opts);\n\t\n\t this._layout(items);\n\t\n\t // `_layout` always happens after `_shrink`, so it's safe to process the style\n\t // queue here with styles from the shrink method.\n\t this._processQueue();\n\t\n\t // Adjust the height of the container.\n\t this._setContainerSize();\n\t\n\t this.lastSort = opts;\n\t }\n\t\n\t /**\n\t * Reposition everything.\n\t * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n\t * recalculated.\n\t */\n\t\n\t }, {\n\t key: 'update',\n\t value: function update(isOnlyLayout) {\n\t if (this.isEnabled) {\n\t\n\t if (!isOnlyLayout) {\n\t // Get updated colCount\n\t this._setColumns();\n\t }\n\t\n\t // Layout items\n\t this.sort();\n\t }\n\t }\n\t\n\t /**\n\t * Use this instead of `update()` if you don't need the columns and gutters updated\n\t * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n\t * could be off.\n\t */\n\t\n\t }, {\n\t key: 'layout',\n\t value: function layout() {\n\t this.update(true);\n\t }\n\t\n\t /**\n\t * New items have been appended to shuffle. Mix them in with the current\n\t * filter or sort status.\n\t * @param {Array.} newItems Collection of new items.\n\t */\n\t\n\t }, {\n\t key: 'add',\n\t value: function add(newItems) {\n\t newItems = (0, _arrayUniq2.default)(newItems).map(function (el) {\n\t return new _shuffleItem2.default(el);\n\t });\n\t\n\t // Add classes and set initial positions.\n\t this._initItems(newItems);\n\t\n\t // Add transition to each item.\n\t this._setTransitions(newItems);\n\t\n\t // Update the list of items.\n\t this.items = this.items.concat(newItems);\n\t this._updateItemsOrder();\n\t this.filter(this.lastFilter);\n\t }\n\t\n\t /**\n\t * Disables shuffle from updating dimensions and layout on resize\n\t */\n\t\n\t }, {\n\t key: 'disable',\n\t value: function disable() {\n\t this.isEnabled = false;\n\t }\n\t\n\t /**\n\t * Enables shuffle again\n\t * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n\t */\n\t\n\t }, {\n\t key: 'enable',\n\t value: function enable(isUpdateLayout) {\n\t this.isEnabled = true;\n\t if (isUpdateLayout !== false) {\n\t this.update();\n\t }\n\t }\n\t\n\t /**\n\t * Remove 1 or more shuffle items\n\t * @param {Array.} collection An array containing one or more\n\t * elements in shuffle\n\t * @return {Shuffle} The shuffle object\n\t */\n\t\n\t }, {\n\t key: 'remove',\n\t value: function remove(collection) {\n\t var _this8 = this;\n\t\n\t if (!collection.length) {\n\t return;\n\t }\n\t\n\t collection = (0, _arrayUniq2.default)(collection);\n\t\n\t var oldItems = collection.map(function (element) {\n\t return _this8.getItemByElement(element);\n\t }).filter(function (item) {\n\t return !!item;\n\t });\n\t\n\t var handleLayout = function handleLayout() {\n\t _this8.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n\t _this8._disposeItems(oldItems);\n\t\n\t // Remove the collection in the callback\n\t collection.forEach(function (element) {\n\t element.parentNode.removeChild(element);\n\t });\n\t\n\t _this8._dispatch(Shuffle.EventType.REMOVED, { collection: collection });\n\t\n\t // Let it get garbage collected\n\t collection = null;\n\t oldItems = null;\n\t };\n\t\n\t // Hide collection first.\n\t this._toggleFilterClasses({\n\t visible: [],\n\t hidden: oldItems\n\t });\n\t\n\t this._shrink(oldItems);\n\t\n\t this.sort();\n\t\n\t // Update the list of items here because `remove` could be called again\n\t // with an item that is in the process of being removed.\n\t this.items = this.items.filter(function (item) {\n\t return !arrayIncludes(oldItems, item);\n\t });\n\t this._updateItemCount();\n\t\n\t this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n\t }\n\t\n\t /**\n\t * Retrieve a shuffle item by its element.\n\t * @param {Element} element Element to look for.\n\t * @return {?ShuffleItem} A shuffle item or null if it's not found.\n\t */\n\t\n\t }, {\n\t key: 'getItemByElement',\n\t value: function getItemByElement(element) {\n\t for (var i = this.items.length - 1; i >= 0; i--) {\n\t if (this.items[i].element === element) {\n\t return this.items[i];\n\t }\n\t }\n\t\n\t return null;\n\t }\n\t\n\t /**\n\t * Destroys shuffle, removes events, styles, and classes\n\t */\n\t\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cancelMovement();\n\t window.removeEventListener('resize', this._onResize);\n\t\n\t // Reset container styles\n\t this.element.classList.remove('shuffle');\n\t this.element.removeAttribute('style');\n\t\n\t // Reset individual item styles\n\t this._disposeItems();\n\t\n\t // Null DOM references\n\t this.items = null;\n\t this.options.sizer = null;\n\t this.element = null;\n\t this._transitions = null;\n\t\n\t // Set a flag so if a debounced resize has been triggered,\n\t // it can first check if it is actually isDestroyed and not doing anything\n\t this.isDestroyed = true;\n\t }\n\t\n\t /**\n\t * Returns the outer width of an element, optionally including its margins.\n\t *\n\t * There are a few different methods for getting the width of an element, none of\n\t * which work perfectly for all Shuffle's use cases.\n\t *\n\t * 1. getBoundingClientRect() `left` and `right` properties.\n\t * - Accounts for transform scaled elements, making it useless for Shuffle\n\t * elements which have shrunk.\n\t * 2. The `offsetWidth` property.\n\t * - This value stays the same regardless of the elements transform property,\n\t * however, it does not return subpixel values.\n\t * 3. getComputedStyle()\n\t * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n\t * padding and border when box-sizing: border-box is set, requiring a feature\n\t * test and extra work to add the padding back for IE and other browsers which\n\t * follow the W3C spec here.\n\t *\n\t * @param {Element} element The element.\n\t * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n\t * @return {{width: number, height: number}} The width and height.\n\t */\n\t\n\t }], [{\n\t key: 'getSize',\n\t value: function getSize(element, includeMargins) {\n\t // Store the styles so that they can be used by others without asking for it again.\n\t var styles = window.getComputedStyle(element, null);\n\t var width = (0, _getNumberStyle2.default)(element, 'width', styles);\n\t var height = (0, _getNumberStyle2.default)(element, 'height', styles);\n\t\n\t if (includeMargins) {\n\t var marginLeft = (0, _getNumberStyle2.default)(element, 'marginLeft', styles);\n\t var marginRight = (0, _getNumberStyle2.default)(element, 'marginRight', styles);\n\t var marginTop = (0, _getNumberStyle2.default)(element, 'marginTop', styles);\n\t var marginBottom = (0, _getNumberStyle2.default)(element, 'marginBottom', styles);\n\t width += marginLeft + marginRight;\n\t height += marginTop + marginBottom;\n\t }\n\t\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t }\n\t\n\t /**\n\t * Change a property or execute a function which will not have a transition\n\t * @param {Array.} elements DOM elements that won't be transitioned.\n\t * @param {Function} callback A function which will be called while transition\n\t * is set to 0ms.\n\t * @private\n\t */\n\t\n\t }, {\n\t key: '_skipTransitions',\n\t value: function _skipTransitions(elements, callback) {\n\t var zero = '0ms';\n\t\n\t // Save current duration and delay.\n\t var data = elements.map(function (element) {\n\t var style = element.style;\n\t var duration = style.transitionDuration;\n\t var delay = style.transitionDelay;\n\t\n\t // Set the duration to zero so it happens immediately\n\t style.transitionDuration = zero;\n\t style.transitionDelay = zero;\n\t\n\t return {\n\t duration: duration,\n\t delay: delay\n\t };\n\t });\n\t\n\t callback();\n\t\n\t // Cause reflow.\n\t elements[0].offsetWidth; // jshint ignore:line\n\t\n\t // Put the duration back\n\t elements.forEach(function (element, i) {\n\t element.style.transitionDuration = data[i].duration;\n\t element.style.transitionDelay = data[i].delay;\n\t });\n\t }\n\t }]);\n\t\n\t return Shuffle;\n\t}();\n\t\n\tShuffle.ShuffleItem = _shuffleItem2.default;\n\t\n\tShuffle.ALL_ITEMS = 'all';\n\tShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\t\n\t/**\n\t * @enum {string}\n\t */\n\tShuffle.EventType = {\n\t LAYOUT: 'shuffle:layout',\n\t REMOVED: 'shuffle:removed'\n\t};\n\t\n\t/** @enum {string} */\n\tShuffle.Classes = _classes2.default;\n\t\n\t// Overrideable options\n\tShuffle.options = {\n\t // Initial filter group.\n\t group: Shuffle.ALL_ITEMS,\n\t\n\t // Transition/animation speed (milliseconds).\n\t speed: 250,\n\t\n\t // CSS easing function to use.\n\t easing: 'ease',\n\t\n\t // e.g. '.picture-item'.\n\t itemSelector: '*',\n\t\n\t // Element or selector string. Use an element to determine the size of columns\n\t // and gutters.\n\t sizer: null,\n\t\n\t // A static number or function that tells the plugin how wide the gutters\n\t // between columns are (in pixels).\n\t gutterWidth: 0,\n\t\n\t // A static number or function that returns a number which tells the plugin\n\t // how wide the columns are (in pixels).\n\t columnWidth: 0,\n\t\n\t // If your group is not json, and is comma delimeted, you could set delimeter\n\t // to ','.\n\t delimeter: null,\n\t\n\t // Useful for percentage based heights when they might not always be exactly\n\t // the same (in pixels).\n\t buffer: 0,\n\t\n\t // Reading the width of elements isn't precise enough and can cause columns to\n\t // jump between values.\n\t columnThreshold: 0.01,\n\t\n\t // Shuffle can be isInitialized with a sort object. It is the same object\n\t // given to the sort method.\n\t initialSort: null,\n\t\n\t // By default, shuffle will throttle resize events. This can be changed or\n\t // removed.\n\t throttle: _throttleit2.default,\n\t\n\t // How often shuffle can be called on resize (in milliseconds).\n\t throttleTime: 300,\n\t\n\t // Transition delay offset for each item in milliseconds.\n\t staggerAmount: 15,\n\t\n\t // Maximum stagger delay in milliseconds.\n\t staggerAmountMax: 250,\n\t\n\t // Whether to use transforms or absolute positioning.\n\t useTransforms: true\n\t};\n\t\n\t// Expose for testing. Hack at your own risk.\n\tShuffle.__Point = _point2.default;\n\tShuffle.__sorter = _sorter2.default;\n\tShuffle.__getColumnSpan = _layout2.getColumnSpan;\n\tShuffle.__getAvailablePositions = _layout2.getAvailablePositions;\n\tShuffle.__getShortColumn = _layout2.getShortColumn;\n\t\n\texports.default = Shuffle;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t// Polyfill for creating CustomEvents on IE9/10/11\n\t\n\t// code pulled from:\n\t// https://github.com/d4tocchini/customevent-polyfill\n\t// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\t\n\ttry {\n\t new window.CustomEvent(\"test\");\n\t} catch(e) {\n\t var CustomEvent = function(event, params) {\n\t var evt;\n\t params = params || {\n\t bubbles: false,\n\t cancelable: false,\n\t detail: undefined\n\t };\n\t\n\t evt = document.createEvent(\"CustomEvent\");\n\t evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t return evt;\n\t };\n\t\n\t CustomEvent.prototype = window.Event.prototype;\n\t window.CustomEvent = CustomEvent; // expose definition to window\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar proto = Element.prototype;\n\tvar vendor = proto.matches\n\t || proto.matchesSelector\n\t || proto.webkitMatchesSelector\n\t || proto.mozMatchesSelector\n\t || proto.msMatchesSelector\n\t || proto.oMatchesSelector;\n\t\n\tmodule.exports = match;\n\t\n\t/**\n\t * Match `el` to `selector`.\n\t *\n\t * @param {Element} el\n\t * @param {String} selector\n\t * @return {Boolean}\n\t * @api public\n\t */\n\t\n\tfunction match(el, selector) {\n\t if (vendor) return vendor.call(el, selector);\n\t var nodes = el.parentNode.querySelectorAll(selector);\n\t for (var i = 0; i < nodes.length; i++) {\n\t if (nodes[i] == el) return true;\n\t }\n\t return false;\n\t}\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\t// there's 3 implementations written in increasing order of efficiency\n\t\n\t// 1 - no Set type is defined\n\tfunction uniqNoSet(arr) {\n\t\tvar ret = [];\n\t\n\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\t\tret.push(arr[i]);\n\t\t\t}\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t// 2 - a simple Set type is defined\n\tfunction uniqSet(arr) {\n\t\tvar seen = new Set();\n\t\treturn arr.filter(function (el) {\n\t\t\tif (!seen.has(el)) {\n\t\t\t\tseen.add(el);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t}\n\t\n\t// 3 - a standard Set type is defined and it has a forEach method\n\tfunction uniqSetWithForEach(arr) {\n\t\tvar ret = [];\n\t\n\t\t(new Set(arr)).forEach(function (el) {\n\t\t\tret.push(el);\n\t\t});\n\t\n\t\treturn ret;\n\t}\n\t\n\t// V8 currently has a broken implementation\n\t// https://github.com/joyent/node/issues/8449\n\tfunction doesForEachActuallyWork() {\n\t\tvar ret = false;\n\t\n\t\t(new Set([true])).forEach(function (el) {\n\t\t\tret = el;\n\t\t});\n\t\n\t\treturn ret === true;\n\t}\n\t\n\tif ('Set' in global) {\n\t\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\t\tmodule.exports = uniqSetWithForEach;\n\t\t} else {\n\t\t\tmodule.exports = uniqSet;\n\t\t}\n\t} else {\n\t\tmodule.exports = uniqNoSet;\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\tmodule.exports = extend\n\t\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\t\n\tfunction extend() {\n\t var target = {}\n\t\n\t for (var i = 0; i < arguments.length; i++) {\n\t var source = arguments[i]\n\t\n\t for (var key in source) {\n\t if (hasOwnProperty.call(source, key)) {\n\t target[key] = source[key]\n\t }\n\t }\n\t }\n\t\n\t return target\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\tmodule.exports = throttle;\n\t\n\t/**\n\t * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n\t *\n\t * @param {Function} func Function to wrap.\n\t * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n\t * @return {Function} A new function that wraps the `func` function passed in.\n\t */\n\t\n\tfunction throttle (func, wait) {\n\t var ctx, args, rtn, timeoutID; // caching\n\t var last = 0;\n\t\n\t return function throttled () {\n\t ctx = this;\n\t args = arguments;\n\t var delta = new Date() - last;\n\t if (!timeoutID)\n\t if (delta >= wait) call();\n\t else timeoutID = setTimeout(call, wait - delta);\n\t return rtn;\n\t };\n\t\n\t function call () {\n\t timeoutID = 0;\n\t last = +new Date();\n\t rtn = func.apply(ctx, args);\n\t ctx = null;\n\t args = null;\n\t }\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function parallel(fns, context, callback) {\n\t if (!callback) {\n\t if (typeof context === 'function') {\n\t callback = context\n\t context = null\n\t } else {\n\t callback = noop\n\t }\n\t }\n\t\n\t var pending = fns && fns.length\n\t if (!pending) return callback(null, []);\n\t\n\t var finished = false\n\t var results = new Array(pending)\n\t\n\t fns.forEach(context ? function (fn, i) {\n\t fn.call(context, maybeDone(i))\n\t } : function (fn, i) {\n\t fn(maybeDone(i))\n\t })\n\t\n\t function maybeDone(i) {\n\t return function (err, result) {\n\t if (finished) return;\n\t\n\t if (err) {\n\t callback(err, results)\n\t finished = true\n\t return\n\t }\n\t\n\t results[i] = result\n\t\n\t if (!--pending) callback(null, results);\n\t }\n\t }\n\t}\n\t\n\tfunction noop() {}\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _getNumber = __webpack_require__(9);\n\t\n\tvar _getNumber2 = _interopRequireDefault(_getNumber);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Represents a coordinate pair.\n\t * @param {number} [x=0] X.\n\t * @param {number} [y=0] Y.\n\t */\n\tvar Point = function Point(x, y) {\n\t this.x = (0, _getNumber2.default)(x);\n\t this.y = (0, _getNumber2.default)(y);\n\t};\n\t\n\t/**\n\t * Whether two points are equal.\n\t * @param {Point} a Point A.\n\t * @param {Point} b Point B.\n\t * @return {boolean}\n\t */\n\tPoint.equals = function (a, b) {\n\t return a.x === b.x && a.y === b.y;\n\t};\n\t\n\texports.default = Point;\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n\t * @param {*} value Possibly numeric value.\n\t * @return {number} `value` or zero if `value` isn't numeric.\n\t */\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = getNumber;\n\tfunction getNumber(value) {\n\t return parseFloat(value) || 0;\n\t}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tvar _classes = __webpack_require__(11);\n\t\n\tvar _classes2 = _interopRequireDefault(_classes);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar id = 0;\n\t\n\tvar ShuffleItem = function () {\n\t function ShuffleItem(element) {\n\t _classCallCheck(this, ShuffleItem);\n\t\n\t this.id = id++;\n\t this.element = element;\n\t this.isVisible = true;\n\t }\n\t\n\t _createClass(ShuffleItem, [{\n\t key: 'show',\n\t value: function show() {\n\t this.isVisible = true;\n\t this.element.classList.remove(_classes2.default.HIDDEN);\n\t this.element.classList.add(_classes2.default.VISIBLE);\n\t }\n\t }, {\n\t key: 'hide',\n\t value: function hide() {\n\t this.isVisible = false;\n\t this.element.classList.remove(_classes2.default.VISIBLE);\n\t this.element.classList.add(_classes2.default.HIDDEN);\n\t }\n\t }, {\n\t key: 'init',\n\t value: function init() {\n\t this.addClasses([_classes2.default.SHUFFLE_ITEM, _classes2.default.VISIBLE]);\n\t this.applyCss(ShuffleItem.Css.INITIAL);\n\t this.scale = ShuffleItem.Scale.VISIBLE;\n\t this.point = new _point2.default();\n\t }\n\t }, {\n\t key: 'addClasses',\n\t value: function addClasses(classes) {\n\t var _this = this;\n\t\n\t classes.forEach(function (className) {\n\t _this.element.classList.add(className);\n\t });\n\t }\n\t }, {\n\t key: 'removeClasses',\n\t value: function removeClasses(classes) {\n\t var _this2 = this;\n\t\n\t classes.forEach(function (className) {\n\t _this2.element.classList.remove(className);\n\t });\n\t }\n\t }, {\n\t key: 'applyCss',\n\t value: function applyCss(obj) {\n\t for (var key in obj) {\n\t this.element.style[key] = obj[key];\n\t }\n\t }\n\t }, {\n\t key: 'dispose',\n\t value: function dispose() {\n\t this.removeClasses([_classes2.default.HIDDEN, _classes2.default.VISIBLE, _classes2.default.SHUFFLE_ITEM]);\n\t\n\t this.element.removeAttribute('style');\n\t this.element = null;\n\t }\n\t }]);\n\t\n\t return ShuffleItem;\n\t}();\n\t\n\tShuffleItem.Css = {\n\t INITIAL: {\n\t position: 'absolute',\n\t top: 0,\n\t left: 0,\n\t visibility: 'visible',\n\t 'will-change': 'transform'\n\t },\n\t VISIBLE: {\n\t before: {\n\t opacity: 1,\n\t visibility: 'visible'\n\t },\n\t after: {}\n\t },\n\t HIDDEN: {\n\t before: {\n\t opacity: 0\n\t },\n\t after: {\n\t visibility: 'hidden'\n\t }\n\t }\n\t};\n\t\n\tShuffleItem.Scale = {\n\t VISIBLE: 1,\n\t HIDDEN: 0.001\n\t};\n\t\n\texports.default = ShuffleItem;\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = {\n\t BASE: 'shuffle',\n\t SHUFFLE_ITEM: 'shuffle-item',\n\t VISIBLE: 'shuffle-item--visible',\n\t HIDDEN: 'shuffle-item--hidden'\n\t};\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = getNumberStyle;\n\t\n\tvar _getNumber = __webpack_require__(9);\n\t\n\tvar _getNumber2 = _interopRequireDefault(_getNumber);\n\t\n\tvar _computedSize = __webpack_require__(13);\n\t\n\tvar _computedSize2 = _interopRequireDefault(_computedSize);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Retrieve the computed style for an element, parsed as a float.\n\t * @param {Element} element Element to get style for.\n\t * @param {string} style Style property.\n\t * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n\t * use instead of asking for them again.\n\t * @return {number} The parsed computed value or zero if that fails because IE\n\t * will return 'auto' when the element doesn't have margins instead of\n\t * the computed style.\n\t */\n\tfunction getNumberStyle(element, style) {\n\t var styles = arguments.length <= 2 || arguments[2] === undefined ? window.getComputedStyle(element, null) : arguments[2];\n\t\n\t var value = (0, _getNumber2.default)(styles[style]);\n\t\n\t // Support IE<=11 and W3C spec.\n\t if (!_computedSize2.default && style === 'width') {\n\t value += (0, _getNumber2.default)(styles.paddingLeft) + (0, _getNumber2.default)(styles.paddingRight) + (0, _getNumber2.default)(styles.borderLeftWidth) + (0, _getNumber2.default)(styles.borderRightWidth);\n\t } else if (!_computedSize2.default && style === 'height') {\n\t value += (0, _getNumber2.default)(styles.paddingTop) + (0, _getNumber2.default)(styles.paddingBottom) + (0, _getNumber2.default)(styles.borderTopWidth) + (0, _getNumber2.default)(styles.borderBottomWidth);\n\t }\n\t\n\t return value;\n\t}\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar element = document.body || document.documentElement;\n\tvar e = document.createElement('div');\n\te.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n\telement.appendChild(e);\n\t\n\tvar width = window.getComputedStyle(e, null).width;\n\tvar ret = width === '10px';\n\t\n\telement.removeChild(e);\n\t\n\texports.default = ret;\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = sorter;\n\t\n\tvar _xtend = __webpack_require__(5);\n\t\n\tvar _xtend2 = _interopRequireDefault(_xtend);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// http://stackoverflow.com/a/962890/373422\n\tfunction randomize(array) {\n\t var tmp;\n\t var current;\n\t var top = array.length;\n\t\n\t if (!top) {\n\t return array;\n\t }\n\t\n\t while (--top) {\n\t current = Math.floor(Math.random() * (top + 1));\n\t tmp = array[current];\n\t array[current] = array[top];\n\t array[top] = tmp;\n\t }\n\t\n\t return array;\n\t}\n\t\n\tvar defaults = {\n\t // Use array.reverse() to reverse the results\n\t reverse: false,\n\t\n\t // Sorting function\n\t by: null,\n\t\n\t // If true, this will skip the sorting and return a randomized order in the array\n\t randomize: false,\n\t\n\t // Determines which property of each item in the array is passed to the\n\t // sorting method.\n\t key: 'element'\n\t};\n\t\n\t// You can return `undefined` from the `by` function to revert to DOM order.\n\tfunction sorter(arr, options) {\n\t var opts = (0, _xtend2.default)(defaults, options);\n\t var original = [].slice.call(arr);\n\t var revert = false;\n\t\n\t if (!arr.length) {\n\t return [];\n\t }\n\t\n\t if (opts.randomize) {\n\t return randomize(arr);\n\t }\n\t\n\t // Sort the elements by the opts.by function.\n\t // If we don't have opts.by, default to DOM order\n\t if (typeof opts.by === 'function') {\n\t arr.sort(function (a, b) {\n\t\n\t // Exit early if we already know we want to revert\n\t if (revert) {\n\t return 0;\n\t }\n\t\n\t var valA = opts.by(a[opts.key]);\n\t var valB = opts.by(b[opts.key]);\n\t\n\t // If both values are undefined, use the DOM order\n\t if (valA === undefined && valB === undefined) {\n\t revert = true;\n\t return 0;\n\t }\n\t\n\t if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n\t return -1;\n\t }\n\t\n\t if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n\t return 1;\n\t }\n\t\n\t return 0;\n\t });\n\t }\n\t\n\t // Revert to the original array if necessary\n\t if (revert) {\n\t return original;\n\t }\n\t\n\t if (opts.reverse) {\n\t arr.reverse();\n\t }\n\t\n\t return arr;\n\t}\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.onTransitionEnd = onTransitionEnd;\n\texports.cancelTransitionEnd = cancelTransitionEnd;\n\tvar transitions = {};\n\tvar eventName = 'transitionend';\n\tvar count = 0;\n\t\n\tfunction uniqueId() {\n\t return eventName + count++;\n\t}\n\t\n\tfunction onTransitionEnd(element, callback) {\n\t var id = uniqueId();\n\t var listener = function listener(evt) {\n\t if (evt.currentTarget === evt.target) {\n\t cancelTransitionEnd(id);\n\t callback(evt);\n\t }\n\t };\n\t\n\t element.addEventListener(eventName, listener);\n\t\n\t transitions[id] = { element: element, listener: listener };\n\t\n\t return id;\n\t}\n\t\n\tfunction cancelTransitionEnd(id) {\n\t if (transitions[id]) {\n\t transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n\t transitions[id] = null;\n\t return true;\n\t }\n\t\n\t return false;\n\t}\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getItemPosition = getItemPosition;\n\texports.getColumnSpan = getColumnSpan;\n\texports.getAvailablePositions = getAvailablePositions;\n\texports.getShortColumn = getShortColumn;\n\t\n\tvar _point = __webpack_require__(8);\n\t\n\tvar _point2 = _interopRequireDefault(_point);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction arrayMax(array) {\n\t return Math.max.apply(Math, array);\n\t}\n\t\n\tfunction arrayMin(array) {\n\t return Math.min.apply(Math, array);\n\t}\n\t\n\t/**\n\t * Determine the location of the next item, based on its size.\n\t * @param {Object} itemSize Object with width and height.\n\t * @param {Array.} positions Positions of the other current items.\n\t * @param {number} gridSize The column width or row height.\n\t * @param {number} total The total number of columns or rows.\n\t * @param {number} threshold Buffer value for the column to fit.\n\t * @param {number} buffer Vertical buffer for the height of items.\n\t * @return {Point}\n\t */\n\tfunction getItemPosition(_ref) {\n\t var itemSize = _ref.itemSize;\n\t var positions = _ref.positions;\n\t var gridSize = _ref.gridSize;\n\t var total = _ref.total;\n\t var threshold = _ref.threshold;\n\t var buffer = _ref.buffer;\n\t\n\t var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n\t var setY = getAvailablePositions(positions, span, total);\n\t var shortColumnIndex = getShortColumn(setY, buffer);\n\t\n\t // Position the item\n\t var point = new _point2.default(Math.round(gridSize * shortColumnIndex), Math.round(setY[shortColumnIndex]));\n\t\n\t // Update the columns array with the new values for each column.\n\t // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n\t // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n\t var setHeight = setY[shortColumnIndex] + itemSize.height;\n\t for (var i = 0; i < span; i++) {\n\t positions[shortColumnIndex + i] = setHeight;\n\t }\n\t\n\t return point;\n\t}\n\t\n\t/**\n\t * Determine the number of columns an items spans.\n\t * @param {number} itemWidth Width of the item.\n\t * @param {number} columnWidth Width of the column (includes gutter).\n\t * @param {number} columns Total number of columns\n\t * @param {number} threshold A buffer value for the size of the column to fit.\n\t * @return {number}\n\t */\n\tfunction getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n\t var columnSpan = itemWidth / columnWidth;\n\t\n\t // If the difference between the rounded column span number and the\n\t // calculated column span number is really small, round the number to\n\t // make it fit.\n\t if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n\t // e.g. columnSpan = 4.0089945390298745\n\t columnSpan = Math.round(columnSpan);\n\t }\n\t\n\t // Ensure the column span is not more than the amount of columns in the whole layout.\n\t return Math.min(Math.ceil(columnSpan), columns);\n\t}\n\t\n\t/**\n\t * Retrieves the column set to use for placement.\n\t * @param {number} columnSpan The number of columns this current item spans.\n\t * @param {number} columns The total columns in the grid.\n\t * @return {Array.} An array of numbers represeting the column set.\n\t */\n\tfunction getAvailablePositions(positions, columnSpan, columns) {\n\t // The item spans only one column.\n\t if (columnSpan === 1) {\n\t return positions;\n\t }\n\t\n\t // The item spans more than one column, figure out how many different\n\t // places it could fit horizontally.\n\t // The group count is the number of places within the positions this block\n\t // could fit, ignoring the current positions of items.\n\t // Imagine a 2 column brick as the second item in a 4 column grid with\n\t // 10px height each. Find the places it would fit:\n\t // [20, 10, 10, 0]\n\t // | | |\n\t // * * *\n\t //\n\t // Then take the places which fit and get the bigger of the two:\n\t // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n\t //\n\t // Next, find the first smallest number (the short column).\n\t // [20, 10, 0]\n\t // |\n\t // *\n\t //\n\t // And that's where it should be placed!\n\t //\n\t // Another example where the second column's item extends past the first:\n\t // [10, 20, 10, 0] => [20, 20, 10] => 10\n\t var available = [];\n\t\n\t // For how many possible positions for this item there are.\n\t for (var i = 0; i <= columns - columnSpan; i++) {\n\t // Find the bigger value for each place it could fit.\n\t available.push(arrayMax(positions.slice(i, i + columnSpan)));\n\t }\n\t\n\t return available;\n\t}\n\t\n\t/**\n\t * Find index of short column, the first from the left where this item will go.\n\t *\n\t * @param {Array.} positions The array to search for the smallest number.\n\t * @param {number} buffer Optional buffer which is very useful when the height\n\t * is a percentage of the width.\n\t * @return {number} Index of the short column.\n\t */\n\tfunction getShortColumn(positions, buffer) {\n\t var minPosition = arrayMin(positions);\n\t for (var i = 0, len = positions.length; i < len; i++) {\n\t if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n\t return i;\n\t }\n\t }\n\t\n\t return 0;\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** shuffle.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 15614b34d986e7daa0ea\n **/","module.exports = require('./shuffle').default;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/index.js\n **/","'use strict';\n\nimport 'custom-event-polyfill';\nimport matches from 'matches-selector';\nimport arrayUnique from 'array-uniq';\nimport xtend from 'xtend';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\nimport Point from './point';\nimport ShuffleItem from './shuffle-item';\nimport Classes from './classes';\nimport getNumberStyle from './get-number-style';\nimport sorter from './sorter';\nimport { onTransitionEnd, cancelTransitionEnd } from './on-transition-end';\nimport { getItemPosition, getColumnSpan, getAvailablePositions, getShortColumn } from './layout';\n\nfunction toArray(arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n}\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayIncludes(array, obj) {\n if (arguments.length === 2) {\n return arrayIncludes(array)(obj);\n }\n\n return function (obj) {\n return array.indexOf(obj) > -1;\n };\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle {\n\n /**\n * Categorize, sort, and filter a responsive grid of items.\n *\n * @param {Element} element An element which is the parent container for the grid items.\n * @param {Object} [options=Shuffle.options] Options object.\n * @constructor\n */\n constructor(element, options = {}) {\n this.options = xtend(Shuffle.options, options);\n\n this.useSizer = false;\n this.lastSort = {};\n this.group = this.lastFilter = Shuffle.ALL_ITEMS;\n this.isEnabled = true;\n this.isDestroyed = false;\n this.isInitialized = false;\n this._transitions = [];\n this.isTransitioning = false;\n this._queue = [];\n\n element = this._getElementOption(element);\n\n if (!element) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = element;\n this.id = 'shuffle_' + id++;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n\n this.options.sizer = this._getElementOption(this.options.sizer);\n\n if (this.options.sizer) {\n this.useSizer = true;\n }\n\n // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems();\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // Get container css all in one request. Causes reflow\n var containerCss = window.getComputedStyle(this.element, null);\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // Add styles to the container if it doesn't have them.\n this._validateStyles(containerCss);\n\n // We already got the container's width above, no need to cause another\n // reflow getting it again... Calculate the number of columns there will be\n this._setColumns(containerWidth);\n\n // Kick off!\n this.filter(this.options.group, this.options.initialSort);\n\n // The shuffle items haven't had transitions set on them yet so the user\n // doesn't see the first layout. Set them now that the first layout is done.\n // First, however, a synchronous layout must be caused for the previous\n // styles to be applied without transitions.\n this.element.offsetWidth; // jshint ignore: line\n this._setTransitions();\n this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing;\n }\n\n /**\n * Returns a throttled and proxied function for the resize handler.\n * @return {Function}\n * @private\n */\n _getResizeFunction() {\n var resizeFunction = this._handleResize.bind(this);\n return this.options.throttle ?\n this.options.throttle(resizeFunction, this.options.throttleTime) :\n resizeFunction;\n }\n\n /**\n * Retrieve an element from an option.\n * @param {string|jQuery|Element} option The option to check.\n * @return {?Element} The plain element or null.\n * @private\n */\n _getElementOption(option) {\n // If column width is a string, treat is as a selector and search for the\n // sizer element within the outermost container\n if (typeof option === 'string') {\n return this.element.querySelector(option);\n\n // Check for an element\n } else if (option && option.nodeType && option.nodeType === 1) {\n return option;\n\n // Check for jQuery object\n } else if (option && option.jquery) {\n return option[0];\n }\n\n return null;\n }\n\n /**\n * Ensures the shuffle container has the css styles it needs applied to it.\n * @param {Object} styles Key value pairs for position and overflow.\n * @private\n */\n _validateStyles(styles) {\n // Position cannot be static.\n if (styles.position === 'static') {\n this.element.style.position = 'relative';\n }\n\n // Overflow has to be hidden.\n if (styles.overflow !== 'hidden') {\n this.element.style.overflow = 'hidden';\n }\n }\n\n /**\n * Filter the elements by a category.\n * @param {string} [category] Category to filter by. If it's given, the last\n * category will be used to filter the items.\n * @param {Array} [collection] Optionally filter a collection. Defaults to\n * all the items.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n var set = this._getFilteredSets(category, collection);\n\n // Individually add/remove hidden/visible classes\n this._toggleFilterClasses(set);\n\n // Save the last filter in case elements are appended.\n this.lastFilter = category;\n\n // This is saved mainly because providing a filter function (like searching)\n // will overwrite the `lastFilter` property every time its called.\n if (typeof category === 'string') {\n this.group = category;\n }\n\n return set;\n }\n\n /**\n * Returns an object containing the visible and hidden elements.\n * @param {string|Function} category Category or function to filter by.\n * @param {Array.} items A collection of items to filter.\n * @return {!{visible: Array, hidden: Array}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n let hidden = [];\n\n // category === 'all', add visible class to everything\n if (category === Shuffle.ALL_ITEMS) {\n visible = items;\n\n // Loop through each item and use provided function to determine\n // whether to hide it or not.\n } else {\n items.forEach((item) => {\n if (this._doesPassFilter(category, item.element)) {\n visible.push(item);\n } else {\n hidden.push(item);\n }\n });\n }\n\n return {\n visible,\n hidden,\n };\n }\n\n /**\n * Test an item to see if it passes a category.\n * @param {string|Function} category Category or function to filter by.\n * @param {Element} element An element to test.\n * @return {boolean} Whether it passes the category/filter.\n * @private\n */\n _doesPassFilter(category, element) {\n\n if (typeof category === 'function') {\n return category.call(element, element, this);\n\n // Check each element's data-groups attribute against the given category.\n } else {\n let attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n let groups = JSON.parse(attr);\n let keys = this.delimeter && !Array.isArray(groups) ?\n groups.split(this.delimeter) :\n groups;\n\n if (Array.isArray(category)) {\n return category.some(arrayIncludes(keys));\n }\n\n return arrayIncludes(keys, category);\n }\n }\n\n /**\n * Toggles the visible and hidden class names.\n * @param {{visible, hidden}} Object with visible and hidden arrays.\n * @private\n */\n _toggleFilterClasses({ visible, hidden }) {\n visible.forEach((item) => {\n item.show();\n });\n\n hidden.forEach((item) => {\n item.hide();\n });\n }\n\n /**\n * Set the initial css for each item\n * @param {Array.} [items] Optionally specifiy at set to initialize.\n * @private\n */\n _initItems(items = this.items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @private\n */\n _disposeItems(items = this.items) {\n items.forEach((item) => {\n item.dispose();\n });\n }\n\n /**\n * Updates the visible item count.\n * @private\n */\n _updateItemCount() {\n this.visibleItems = this._getFilteredItems().length;\n }\n\n /**\n * Sets css transform transition on a group of elements. This is not executed\n * at the same time as `item.init` so that transitions don't occur upon\n * initialization of Shuffle.\n * @param {Array.} items Shuffle items to set transitions on.\n * @private\n */\n _setTransitions(items = this.items) {\n let speed = this.options.speed;\n let easing = this.options.easing;\n\n var str;\n if (this.options.useTransforms) {\n str = 'transform ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n } else {\n str = 'top ' + speed + 'ms ' + easing +\n ', left ' + speed + 'ms ' + easing +\n ', opacity ' + speed + 'ms ' + easing;\n }\n\n items.forEach((item) => {\n item.element.style.transition = str;\n });\n }\n\n _getItems() {\n return toArray(this.element.children)\n .filter(el => matches(el, this.options.itemSelector))\n .map(el => new ShuffleItem(el));\n }\n\n /**\n * When new elements are added to the shuffle container, update the array of\n * items because that is the order `_layout` calls them.\n */\n _updateItemsOrder() {\n let children = this.element.children;\n this.items = sorter(this.items, {\n by(element) {\n return Array.prototype.indexOf.call(children, element);\n },\n });\n }\n\n _getFilteredItems() {\n return this.items.filter(item => item.isVisible);\n }\n\n _getConcealedItems() {\n return this.items.filter(item => !item.isVisible);\n }\n\n /**\n * Returns the column size, based on column width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @param {number} gutterSize Size of the gutters.\n * @return {number}\n * @private\n */\n _getColumnSize(containerWidth, gutterSize) {\n var size;\n\n // If the columnWidth property is a function, then the grid is fluid\n if (typeof this.options.columnWidth === 'function') {\n size = this.options.columnWidth(containerWidth);\n\n // columnWidth option isn't a function, are they using a sizing element?\n } else if (this.useSizer) {\n size = Shuffle.getSize(this.options.sizer).width;\n\n // if not, how about the explicitly set option?\n } else if (this.options.columnWidth) {\n size = this.options.columnWidth;\n\n // or use the size of the first item\n } else if (this.items.length > 0) {\n size = Shuffle.getSize(this.items[0].element, true).width;\n\n // if there's no items, use size of container\n } else {\n size = containerWidth;\n }\n\n // Don't let them set a column width of zero.\n if (size === 0) {\n size = containerWidth;\n }\n\n return size + gutterSize;\n }\n\n /**\n * Returns the gutter size, based on gutter width and sizer options.\n * @param {number} containerWidth Size of the parent container.\n * @return {number}\n * @private\n */\n _getGutterSize(containerWidth) {\n var size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.useSizer) {\n size = getNumberStyle(this.options.sizer, 'marginLeft');\n } else {\n size = this.options.gutterWidth;\n }\n\n return size;\n }\n\n /**\n * Calculate the number of columns to be used. Gets css if using sizer element.\n * @param {number} [containerWidth] Optionally specify a container width if\n * it's already available.\n */\n _setColumns(containerWidth = Shuffle.getSize(this.element).width) {\n var gutter = this._getGutterSize(containerWidth);\n var columnWidth = this._getColumnSize(containerWidth, gutter);\n var calculatedColumns = (containerWidth + gutter) / columnWidth;\n\n // Widths given from getStyles are not precise enough...\n if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) <\n this.options.columnThreshold) {\n // e.g. calculatedColumns = 11.998876\n calculatedColumns = Math.round(calculatedColumns);\n }\n\n this.cols = Math.max(Math.floor(calculatedColumns), 1);\n this.containerWidth = containerWidth;\n this.colWidth = columnWidth;\n }\n\n /**\n * Adjust the height of the grid\n */\n _setContainerSize() {\n this.element.style.height = this._getContainerSize() + 'px';\n }\n\n /**\n * Based on the column heights, it returns the biggest one.\n * @return {number}\n * @private\n */\n _getContainerSize() {\n return arrayMax(this.positions);\n }\n\n /**\n * Get the clamped stagger amount.\n * @param {number} index Index of the item to be staggered.\n * @return {number}\n */\n _getStaggerAmount(index) {\n return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax);\n }\n\n /**\n * @return {boolean} Whether the event was prevented or not.\n */\n _dispatch(name, details = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n details.shuffle = this;\n return !this.element.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n cancelable: false,\n detail: details,\n }));\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n var i = this.cols;\n this.positions = [];\n while (i--) {\n this.positions.push(0);\n }\n }\n\n /**\n * Loops through each item that should be shown and calculates the x, y position.\n * @param {Array.} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n let count = 0;\n items.forEach((item) => {\n var currPos = item.point;\n var currScale = item.scale;\n var itemSize = Shuffle.getSize(item.element, true);\n var pos = this._getItemPosition(itemSize);\n\n function callback() {\n item.element.style.transitionDelay = '';\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(currPos, pos) && currScale === ShuffleItem.Scale.VISIBLE) {\n callback();\n return;\n }\n\n item.point = pos;\n item.scale = ShuffleItem.Scale.VISIBLE;\n\n // Use xtend here to clone the object so that the `before` object isn't\n // modified when the transition delay is added.\n let styles = xtend(ShuffleItem.Css.VISIBLE.before);\n styles.transitionDelay = this._getStaggerAmount(count) + 'ms';\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Determine the location of the next item, based on its size.\n * @param {{width: number, height: number}} itemSize Object with width and height.\n * @return {Point}\n * @private\n */\n _getItemPosition(itemSize) {\n return getItemPosition({\n itemSize,\n positions: this.positions,\n gridSize: this.colWidth,\n total: this.cols,\n threshold: this.options.columnThreshold,\n buffer: this.options.buffer,\n });\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {Array.} collection Collection to shrink.\n * @private\n */\n _shrink(collection = this._getConcealedItems()) {\n let count = 0;\n collection.forEach((item) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n }\n\n // Continuing would add a transitionend event listener to the element, but\n // that listener would not execute because the transform and opacity would\n // stay the same.\n // The callback is executed here because it is not guaranteed to be called\n // after the transitionend event because the transitionend could be\n // canceled if another animation starts.\n if (item.scale === ShuffleItem.Scale.HIDDEN) {\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n\n let styles = xtend(ShuffleItem.Css.HIDDEN.before);\n styles.transitionDelay = this._getStaggerAmount(count) + 'ms';\n\n this._queue.push({\n item,\n styles,\n callback,\n });\n\n count++;\n });\n }\n\n /**\n * Resize handler.\n * @private\n */\n _handleResize() {\n // If shuffle is disabled, destroyed, don't do anything\n if (!this.isEnabled || this.isDestroyed) {\n return;\n }\n\n // Will need to check height in the future if it's layed out horizontaly\n var containerWidth = Shuffle.getSize(this.element).width;\n\n // containerWidth hasn't changed, don't do anything\n if (containerWidth === this.containerWidth) {\n return;\n }\n\n this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {Object} obj Transition options.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @private\n */\n _getStylesForTransition({ item, styles }) {\n if (!styles.transitionDelay) {\n styles.transitionDelay = '0ms';\n }\n\n let x = item.point.x;\n let y = item.point.y;\n\n if (this.options.useTransforms) {\n styles.transform = `translate(${x}px, ${y}px) scale(${item.scale})`;\n } else {\n styles.left = x + 'px';\n styles.top = y + 'px';\n }\n\n return styles;\n }\n\n /**\n * Listen for the transition end on an element and execute the itemCallback\n * when it finishes.\n * @param {Element} element Element to listen on.\n * @param {Function} itemCallback Callback for the item.\n * @param {Function} done Callback to notify `parallel` that this one is done.\n */\n _whenTransitionDone(element, itemCallback, done) {\n let id = onTransitionEnd(element, (evt) => {\n itemCallback();\n done(null, evt);\n });\n\n this._transitions.push(id);\n }\n\n /**\n * Return a function which will set CSS styles and call the `done` function\n * when (if) the transition finishes.\n * @param {Object} opts Transition object.\n * @return {Function} A function to be called with a `done` function.\n */\n _getTransitionFunction(opts) {\n return (done) => {\n opts.item.applyCss(this._getStylesForTransition(opts));\n this._whenTransitionDone(opts.item.element, opts.callback, done);\n };\n }\n\n /**\n * Execute the styles gathered in the style queue. This applies styles to elements,\n * triggering transitions.\n * @private\n */\n _processQueue() {\n if (this.isTransitioning) {\n this._cancelMovement();\n }\n\n let hasSpeed = this.options.speed > 0;\n let hasQueue = this._queue.length > 0;\n\n if (hasQueue && hasSpeed && this.isInitialized) {\n this._startTransitions(this._queue);\n\n } else if (hasQueue) {\n this._styleImmediately(this._queue);\n this._dispatchLayout();\n\n // A call to layout happened, but none of the newly visible items will\n // change position or the transition duration is zero, which will not trigger\n // the transitionend event.\n } else {\n this._dispatchLayout();\n }\n\n // Remove everything in the style queue\n this._queue.length = 0;\n }\n\n /**\n * Wait for each transition to finish, the emit the layout event.\n * @param {Array.} transitions Array of transition objects.\n */\n _startTransitions(transitions) {\n // Set flag that shuffle is currently in motion.\n this.isTransitioning = true;\n\n // Create an array of functions to be called.\n let callbacks = transitions.map(obj => this._getTransitionFunction(obj));\n\n parallel(callbacks, this._movementFinished.bind(this));\n }\n\n _cancelMovement() {\n // Remove the transition end event for each listener.\n this._transitions.forEach(cancelTransitionEnd);\n\n // Reset the array.\n this._transitions.length = 0;\n\n // Show it's no longer active.\n this.isTransitioning = false;\n }\n\n /**\n * Apply styles without a transition.\n * @param {Array.} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n let elements = objects.map(obj => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(this._getStylesForTransition(obj));\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatchLayout();\n }\n\n _dispatchLayout() {\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|Function|Array.} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {Object} [sortObj] A sort object which can sort the visible set\n */\n filter(category, sortObj) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS;\n }\n\n this._filter(category);\n\n // Shrink each hidden item\n this._shrink();\n\n // How many visible elements?\n this._updateItemCount();\n\n // Update transforms on visible elements so they will animate to their new positions.\n this.sort(sortObj);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {Object} opts the options object for the sorted plugin\n */\n sort(opts = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n var items = this._getFilteredItems();\n items = sorter(items, opts);\n\n this._layout(items);\n\n // `_layout` always happens after `_shrink`, so it's safe to process the style\n // queue here with styles from the shrink method.\n this._processQueue();\n\n // Adjust the height of the container.\n this._setContainerSize();\n\n this.lastSort = opts;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} isOnlyLayout If true, column and gutter widths won't be\n * recalculated.\n */\n update(isOnlyLayout) {\n if (this.isEnabled) {\n\n if (!isOnlyLayout) {\n // Get updated colCount\n this._setColumns();\n }\n\n // Layout items\n this.sort();\n }\n }\n\n /**\n * Use this instead of `update()` if you don't need the columns and gutters updated\n * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations\n * could be off.\n */\n layout() {\n this.update(true);\n }\n\n /**\n * New items have been appended to shuffle. Mix them in with the current\n * filter or sort status.\n * @param {Array.} newItems Collection of new items.\n */\n add(newItems) {\n newItems = arrayUnique(newItems).map(el => new ShuffleItem(el));\n\n // Add classes and set initial positions.\n this._initItems(newItems);\n\n // Add transition to each item.\n this._setTransitions(newItems);\n\n // Update the list of items.\n this.items = this.items.concat(newItems);\n this._updateItemsOrder();\n this.filter(this.lastFilter);\n }\n\n /**\n * Disables shuffle from updating dimensions and layout on resize\n */\n disable() {\n this.isEnabled = false;\n }\n\n /**\n * Enables shuffle again\n * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters\n */\n enable(isUpdateLayout) {\n this.isEnabled = true;\n if (isUpdateLayout !== false) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items\n * @param {Array.} collection An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle object\n */\n remove(collection) {\n if (!collection.length) {\n return;\n }\n\n collection = arrayUnique(collection);\n\n let oldItems = collection\n .map(element => this.getItemByElement(element))\n .filter(item => !!item);\n\n let handleLayout = () => {\n this.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n this._disposeItems(oldItems);\n\n // Remove the collection in the callback\n collection.forEach((element) => {\n element.parentNode.removeChild(element);\n });\n\n this._dispatch(Shuffle.EventType.REMOVED, { collection });\n\n // Let it get garbage collected\n collection = null;\n oldItems = null;\n };\n\n // Hide collection first.\n this._toggleFilterClasses({\n visible: [],\n hidden: oldItems,\n });\n\n this._shrink(oldItems);\n\n this.sort();\n\n // Update the list of items here because `remove` could be called again\n // with an item that is in the process of being removed.\n this.items = this.items.filter(item => !arrayIncludes(oldItems, item));\n this._updateItemCount();\n\n this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n }\n\n /**\n * Retrieve a shuffle item by its element.\n * @param {Element} element Element to look for.\n * @return {?ShuffleItem} A shuffle item or null if it's not found.\n */\n getItemByElement(element) {\n for (var i = this.items.length - 1; i >= 0; i--) {\n if (this.items[i].element === element) {\n return this.items[i];\n }\n }\n\n return null;\n }\n\n /**\n * Destroys shuffle, removes events, styles, and classes\n */\n destroy() {\n this._cancelMovement();\n window.removeEventListener('resize', this._onResize);\n\n // Reset container styles\n this.element.classList.remove('shuffle');\n this.element.removeAttribute('style');\n\n // Reset individual item styles\n this._disposeItems();\n\n // Null DOM references\n this.items = null;\n this.options.sizer = null;\n this.element = null;\n this._transitions = null;\n\n // Set a flag so if a debounced resize has been triggered,\n // it can first check if it is actually isDestroyed and not doing anything\n this.isDestroyed = true;\n }\n\n /**\n * Returns the outer width of an element, optionally including its margins.\n *\n * There are a few different methods for getting the width of an element, none of\n * which work perfectly for all Shuffle's use cases.\n *\n * 1. getBoundingClientRect() `left` and `right` properties.\n * - Accounts for transform scaled elements, making it useless for Shuffle\n * elements which have shrunk.\n * 2. The `offsetWidth` property.\n * - This value stays the same regardless of the elements transform property,\n * however, it does not return subpixel values.\n * 3. getComputedStyle()\n * - This works great Chrome, Firefox, Safari, but IE<=11 does not include\n * padding and border when box-sizing: border-box is set, requiring a feature\n * test and extra work to add the padding back for IE and other browsers which\n * follow the W3C spec here.\n *\n * @param {Element} element The element.\n * @param {boolean} [includeMargins] Whether to include margins. Default is false.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins) {\n // Store the styles so that they can be used by others without asking for it again.\n var styles = window.getComputedStyle(element, null);\n var width = getNumberStyle(element, 'width', styles);\n var height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n var marginLeft = getNumberStyle(element, 'marginLeft', styles);\n var marginRight = getNumberStyle(element, 'marginRight', styles);\n var marginTop = getNumberStyle(element, 'marginTop', styles);\n var marginBottom = getNumberStyle(element, 'marginBottom', styles);\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n }\n\n return {\n width,\n height,\n };\n }\n\n /**\n * Change a property or execute a function which will not have a transition\n * @param {Array.} elements DOM elements that won't be transitioned.\n * @param {Function} callback A function which will be called while transition\n * is set to 0ms.\n * @private\n */\n static _skipTransitions(elements, callback) {\n let zero = '0ms';\n\n // Save current duration and delay.\n let data = elements.map((element) => {\n let style = element.style;\n let duration = style.transitionDuration;\n let delay = style.transitionDelay;\n\n // Set the duration to zero so it happens immediately\n style.transitionDuration = zero;\n style.transitionDelay = zero;\n\n return {\n duration,\n delay,\n };\n });\n\n callback();\n\n // Cause reflow.\n elements[0].offsetWidth; // jshint ignore:line\n\n // Put the duration back\n elements.forEach((element, i) => {\n element.style.transitionDuration = data[i].duration;\n element.style.transitionDelay = data[i].delay;\n });\n }\n}\n\nShuffle.ShuffleItem = ShuffleItem;\n\nShuffle.ALL_ITEMS = 'all';\nShuffle.FILTER_ATTRIBUTE_KEY = 'groups';\n\n/**\n * @enum {string}\n */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n// Overrideable options\nShuffle.options = {\n // Initial filter group.\n group: Shuffle.ALL_ITEMS,\n\n // Transition/animation speed (milliseconds).\n speed: 250,\n\n // CSS easing function to use.\n easing: 'ease',\n\n // e.g. '.picture-item'.\n itemSelector: '*',\n\n // Element or selector string. Use an element to determine the size of columns\n // and gutters.\n sizer: null,\n\n // A static number or function that tells the plugin how wide the gutters\n // between columns are (in pixels).\n gutterWidth: 0,\n\n // A static number or function that returns a number which tells the plugin\n // how wide the columns are (in pixels).\n columnWidth: 0,\n\n // If your group is not json, and is comma delimeted, you could set delimeter\n // to ','.\n delimeter: null,\n\n // Useful for percentage based heights when they might not always be exactly\n // the same (in pixels).\n buffer: 0,\n\n // Reading the width of elements isn't precise enough and can cause columns to\n // jump between values.\n columnThreshold: 0.01,\n\n // Shuffle can be isInitialized with a sort object. It is the same object\n // given to the sort method.\n initialSort: null,\n\n // By default, shuffle will throttle resize events. This can be changed or\n // removed.\n throttle: throttle,\n\n // How often shuffle can be called on resize (in milliseconds).\n throttleTime: 300,\n\n // Transition delay offset for each item in milliseconds.\n staggerAmount: 15,\n\n // Maximum stagger delay in milliseconds.\n staggerAmountMax: 250,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n};\n\n// Expose for testing. Hack at your own risk.\nShuffle.__Point = Point;\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\n\nexport default Shuffle;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle.js\n **/","// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\ntry {\n new window.CustomEvent(\"test\");\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt;\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/custom-event-polyfill/custom-event-polyfill.js\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nvar proto = Element.prototype;\nvar vendor = proto.matches\n || proto.matchesSelector\n || proto.webkitMatchesSelector\n || proto.mozMatchesSelector\n || proto.msMatchesSelector\n || proto.oMatchesSelector;\n\nmodule.exports = match;\n\n/**\n * Match `el` to `selector`.\n *\n * @param {Element} el\n * @param {String} selector\n * @return {Boolean}\n * @api public\n */\n\nfunction match(el, selector) {\n if (vendor) return vendor.call(el, selector);\n var nodes = el.parentNode.querySelectorAll(selector);\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] == el) return true;\n }\n return false;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/matches-selector/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-uniq/index.js\n ** module id = 4\n ** module chunks = 0\n **/","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/xtend/immutable.js\n ** module id = 5\n ** module chunks = 0\n **/","module.exports = throttle;\n\n/**\n * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.\n *\n * @param {Function} func Function to wrap.\n * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.\n * @return {Function} A new function that wraps the `func` function passed in.\n */\n\nfunction throttle (func, wait) {\n var ctx, args, rtn, timeoutID; // caching\n var last = 0;\n\n return function throttled () {\n ctx = this;\n args = arguments;\n var delta = new Date() - last;\n if (!timeoutID)\n if (delta >= wait) call();\n else timeoutID = setTimeout(call, wait - delta);\n return rtn;\n };\n\n function call () {\n timeoutID = 0;\n last = +new Date();\n rtn = func.apply(ctx, args);\n ctx = null;\n args = null;\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/throttleit/index.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function parallel(fns, context, callback) {\n if (!callback) {\n if (typeof context === 'function') {\n callback = context\n context = null\n } else {\n callback = noop\n }\n }\n\n var pending = fns && fns.length\n if (!pending) return callback(null, []);\n\n var finished = false\n var results = new Array(pending)\n\n fns.forEach(context ? function (fn, i) {\n fn.call(context, maybeDone(i))\n } : function (fn, i) {\n fn(maybeDone(i))\n })\n\n function maybeDone(i) {\n return function (err, result) {\n if (finished) return;\n\n if (err) {\n callback(err, results)\n finished = true\n return\n }\n\n results[i] = result\n\n if (!--pending) callback(null, results);\n }\n }\n}\n\nfunction noop() {}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/array-parallel/index.js\n ** module id = 7\n ** module chunks = 0\n **/","'use strict';\n\nimport getNumber from './get-number';\n\n/**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\nconst Point = function (x, y) {\n this.x = getNumber(x);\n this.y = getNumber(y);\n};\n\n/**\n * Whether two points are equal.\n * @param {Point} a Point A.\n * @param {Point} b Point B.\n * @return {boolean}\n */\nPoint.equals = function (a, b) {\n return a.x === b.x && a.y === b.y;\n};\n\nexport default Point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/point.js\n **/","'use strict';\n\n/**\n * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`.\n * @param {*} value Possibly numeric value.\n * @return {number} `value` or zero if `value` isn't numeric.\n */\nexport default function getNumber(value) {\n return parseFloat(value) || 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number.js\n **/","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element) {\n this.id = id++;\n this.element = element;\n this.isVisible = true;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.scale = ShuffleItem.Scale.VISIBLE;\n this.point = new Point();\n }\n\n addClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.add(className);\n });\n }\n\n removeClasses(classes) {\n classes.forEach((className) => {\n this.element.classList.remove(className);\n });\n }\n\n applyCss(obj) {\n for (var key in obj) {\n this.element.style[key] = obj[key];\n }\n }\n\n dispose() {\n this.removeClasses([\n Classes.HIDDEN,\n Classes.VISIBLE,\n Classes.SHUFFLE_ITEM,\n ]);\n\n this.element.removeAttribute('style');\n this.element = null;\n }\n}\n\nShuffleItem.Css = {\n INITIAL: {\n position: 'absolute',\n top: 0,\n left: 0,\n visibility: 'visible',\n 'will-change': 'transform',\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {},\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/shuffle-item.js\n **/","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/classes.js\n **/","'use strict';\n\nimport getNumber from './get-number';\nimport COMPUTED_SIZE_INCLUDES_PADDING from './computed-size';\n\n/**\n * Retrieve the computed style for an element, parsed as a float.\n * @param {Element} element Element to get style for.\n * @param {string} style Style property.\n * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n * use instead of asking for them again.\n * @return {number} The parsed computed value or zero if that fails because IE\n * will return 'auto' when the element doesn't have margins instead of\n * the computed style.\n */\nexport default function getNumberStyle(element, style,\n styles = window.getComputedStyle(element, null)) {\n var value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'width') {\n value += getNumber(styles.paddingLeft) +\n getNumber(styles.paddingRight) +\n getNumber(styles.borderLeftWidth) +\n getNumber(styles.borderRightWidth);\n } else if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'height') {\n value += getNumber(styles.paddingTop) +\n getNumber(styles.paddingBottom) +\n getNumber(styles.borderTopWidth) +\n getNumber(styles.borderBottomWidth);\n }\n\n return value;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/get-number-style.js\n **/","\nlet element = document.body || document.documentElement;\nlet e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nlet width = window.getComputedStyle(e, null).width;\nlet ret = width === '10px';\n\nelement.removeChild(e);\n\nexport default ret;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/computed-size.js\n **/","'use strict';\n\nimport xtend from 'xtend';\n\n// http://stackoverflow.com/a/962890/373422\nfunction randomize(array) {\n var tmp;\n var current;\n let top = array.length;\n\n if (!top) {\n return array;\n }\n\n while (--top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n\n return array;\n}\n\nlet defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // If true, this will skip the sorting and return a randomized order in the array\n randomize: false,\n\n // Determines which property of each item in the array is passed to the\n // sorting method.\n key: 'element',\n};\n\n// You can return `undefined` from the `by` function to revert to DOM order.\nexport default function sorter(arr, options) {\n let opts = xtend(defaults, options);\n let original = [].slice.call(arr);\n let revert = false;\n\n if (!arr.length) {\n return [];\n }\n\n if (opts.randomize) {\n return randomize(arr);\n }\n\n // Sort the elements by the opts.by function.\n // If we don't have opts.by, default to DOM order\n if (typeof opts.by === 'function') {\n arr.sort(function (a, b) {\n\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n let valA = opts.by(a[opts.key]);\n let valB = opts.by(b[opts.key]);\n\n // If both values are undefined, use the DOM order\n if (valA === undefined && valB === undefined) {\n revert = true;\n return 0;\n }\n\n if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') {\n return -1;\n }\n\n if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') {\n return 1;\n }\n\n return 0;\n });\n }\n\n // Revert to the original array if necessary\n if (revert) {\n return original;\n }\n\n if (opts.reverse) {\n arr.reverse();\n }\n\n return arr;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/sorter.js\n **/","'use strict';\n\nlet transitions = {};\nlet eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n return eventName + count++;\n}\n\nexport function onTransitionEnd(element, callback) {\n let id = uniqueId();\n let listener = (evt) => {\n if (evt.currentTarget === evt.target) {\n cancelTransitionEnd(id);\n callback(evt);\n }\n };\n\n element.addEventListener(eventName, listener);\n\n transitions[id] = { element, listener };\n\n return id;\n}\n\nexport function cancelTransitionEnd(id) {\n if (transitions[id]) {\n transitions[id].element.removeEventListener(eventName, transitions[id].listener);\n transitions[id] = null;\n return true;\n }\n\n return false;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/on-transition-end.js\n **/","'use strict';\n\nimport Point from './point';\n\nfunction arrayMax(array) {\n return Math.max.apply(Math, array);\n}\n\nfunction arrayMin(array) {\n return Math.min.apply(Math, array);\n}\n\n/**\n * Determine the location of the next item, based on its size.\n * @param {Object} itemSize Object with width and height.\n * @param {Array.} positions Positions of the other current items.\n * @param {number} gridSize The column width or row height.\n * @param {number} total The total number of columns or rows.\n * @param {number} threshold Buffer value for the column to fit.\n * @param {number} buffer Vertical buffer for the height of items.\n * @return {Point}\n */\nexport function getItemPosition({ itemSize, positions, gridSize, total, threshold, buffer }) {\n var span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n var setY = getAvailablePositions(positions, span, total);\n var shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n var point = new Point(\n Math.round(gridSize * shortColumnIndex),\n Math.round(setY[shortColumnIndex]));\n\n // Update the columns array with the new values for each column.\n // e.g. before the update the columns could be [250, 0, 0, 0] for an item\n // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0].\n var setHeight = setY[shortColumnIndex] + itemSize.height;\n for (var i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * Determine the number of columns an items spans.\n * @param {number} itemWidth Width of the item.\n * @param {number} columnWidth Width of the column (includes gutter).\n * @param {number} columns Total number of columns\n * @param {number} threshold A buffer value for the size of the column to fit.\n * @return {number}\n */\nexport function getColumnSpan(itemWidth, columnWidth, columns, threshold) {\n var columnSpan = itemWidth / columnWidth;\n\n // If the difference between the rounded column span number and the\n // calculated column span number is really small, round the number to\n // make it fit.\n if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) {\n // e.g. columnSpan = 4.0089945390298745\n columnSpan = Math.round(columnSpan);\n }\n\n // Ensure the column span is not more than the amount of columns in the whole layout.\n return Math.min(Math.ceil(columnSpan), columns);\n}\n\n/**\n * Retrieves the column set to use for placement.\n * @param {number} columnSpan The number of columns this current item spans.\n * @param {number} columns The total columns in the grid.\n * @return {Array.} An array of numbers represeting the column set.\n */\nexport function getAvailablePositions(positions, columnSpan, columns) {\n // The item spans only one column.\n if (columnSpan === 1) {\n return positions;\n }\n\n // The item spans more than one column, figure out how many different\n // places it could fit horizontally.\n // The group count is the number of places within the positions this block\n // could fit, ignoring the current positions of items.\n // Imagine a 2 column brick as the second item in a 4 column grid with\n // 10px height each. Find the places it would fit:\n // [20, 10, 10, 0]\n // | | |\n // * * *\n //\n // Then take the places which fit and get the bigger of the two:\n // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 0]\n // |\n // *\n //\n // And that's where it should be placed!\n //\n // Another example where the second column's item extends past the first:\n // [10, 20, 10, 0] => [20, 20, 10] => 10\n var available = [];\n\n // For how many possible positions for this item there are.\n for (var i = 0; i <= columns - columnSpan; i++) {\n // Find the bigger value for each place it could fit.\n available.push(arrayMax(positions.slice(i, i + columnSpan)));\n }\n\n return available;\n}\n\n/**\n * Find index of short column, the first from the left where this item will go.\n *\n * @param {Array.} positions The array to search for the smallest number.\n * @param {number} buffer Optional buffer which is very useful when the height\n * is a percentage of the width.\n * @return {number} Index of the short column.\n */\nexport function getShortColumn(positions, buffer) {\n var minPosition = arrayMin(positions);\n for (var i = 0, len = positions.length; i < len; i++) {\n if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) {\n return i;\n }\n }\n\n return 0;\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layout.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/src/shuffle.js b/src/shuffle.js index c4c5c22..583fff9 100644 --- a/src/shuffle.js +++ b/src/shuffle.js @@ -497,6 +497,7 @@ class Shuffle { var pos = this._getItemPosition(itemSize); function callback() { + item.element.style.transitionDelay = ''; item.applyCss(ShuffleItem.Css.VISIBLE.after); } @@ -510,8 +511,10 @@ class Shuffle { item.point = pos; item.scale = ShuffleItem.Scale.VISIBLE; - let styles = ShuffleItem.Css.VISIBLE.before; - styles.transitionDelay = this._getStaggerAmount(count); + // Use xtend here to clone the object so that the `before` object isn't + // modified when the transition delay is added. + let styles = xtend(ShuffleItem.Css.VISIBLE.before); + styles.transitionDelay = this._getStaggerAmount(count) + 'ms'; this._queue.push({ item, @@ -565,8 +568,8 @@ class Shuffle { item.scale = ShuffleItem.Scale.HIDDEN; - let styles = ShuffleItem.Css.HIDDEN.before; - styles.transitionDelay = this._getStaggerAmount(count); + let styles = xtend(ShuffleItem.Css.HIDDEN.before); + styles.transitionDelay = this._getStaggerAmount(count) + 'ms'; this._queue.push({ item, @@ -632,7 +635,6 @@ class Shuffle { */ _whenTransitionDone(element, itemCallback, done) { let id = onTransitionEnd(element, (evt) => { - evt.currentTarget.style.transitionDelay = ''; itemCallback(); done(null, evt); }); @@ -664,22 +666,14 @@ class Shuffle { } let hasSpeed = this.options.speed > 0; + let hasQueue = this._queue.length > 0; - // Iterate over the queue and keep track of ones that use transitions. - let immediates = []; - let transitions = []; - this._queue.forEach((obj) => { - if (this.isInitialized && hasSpeed) { - transitions.push(obj); - } else { - immediates.push(obj); - } - }); + if (hasQueue && hasSpeed && this.isInitialized) { + this._startTransitions(this._queue); - this._styleImmediately(immediates); - - if (transitions.length > 0) { - this._startTransitions(transitions); + } else if (hasQueue) { + this._styleImmediately(this._queue); + this._dispatchLayout(); // A call to layout happened, but none of the newly visible items will // change position or the transition duration is zero, which will not trigger