diff --git a/.babelrc b/.babelrc index c13c5f6..9897749 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,5 @@ { - "presets": ["es2015"] + "presets": [ + ["es2015", { "modules": false }] + ] } diff --git a/README.md b/README.md index 5da1e9d..e90d8d2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# [Shuffle][homepage] [![Build Status][travis-img]][travis-url] [![Dependency Status][david-img]][david-url] [![NPM version][npm-img]][npm-url] +# [Shuffle][homepage] [![Build Status][travis-img]][travis-url] [![Dependency Status][david-img]][david-url] [![Greenkeeper badge][greenkeeper-img]][greenkeeper-img] [![NPM version][npm-img]][npm-url] + Categorize, sort, and filter a responsive grid of items. ```bash @@ -34,3 +35,5 @@ This project was inspired by [Isotope](http://isotope.metafizzy.co/) and [Packer [david-img]: https://david-dm.org/Vestride/Shuffle.svg [npm-url]: https://www.npmjs.com/package/shufflejs [npm-img]: https://img.shields.io/npm/v/shufflejs.svg +[greenkeeper-url]: https://greenkeeper.io/ +[greenkeeper-img]: https://badges.greenkeeper.io/Vestride/Shuffle.svg diff --git a/css/style.css b/css/style.css index f1812da..71ac92f 100644 --- a/css/style.css +++ b/css/style.css @@ -534,14 +534,11 @@ h3:hover > a { margin-right: -8px; } .row--centered { display: -webkit-box; - display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; -webkit-box-pack: center; - -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; } diff --git a/dist/shuffle.js b/dist/shuffle.js index 1f9f1cb..55a238a 100644 --- a/dist/shuffle.js +++ b/dist/shuffle.js @@ -21,16 +21,16 @@ return /******/ (function(modules) { // webpackBootstrap /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded -/******/ module.loaded = true; +/******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; @@ -43,2188 +43,2195 @@ return /******/ (function(modules) { // webpackBootstrap /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(0); +/******/ return __webpack_require__(__webpack_require__.s = 17); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_number__ = __webpack_require__(2); + + + - 'use strict'; - - module.exports = __webpack_require__(1).default; +/** + * Represents a coordinate pair. + * @param {number} [x=0] X. + * @param {number} [y=0] Y. + */ +var Point = function Point(x, y) { + this.x = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(x); + this.y = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(y); +}; -/***/ }, +/** + * Whether two points are equal. + * @param {Point} a Point A. + * @param {Point} b Point B. + * @return {boolean} + */ +Point.equals = function (a, b) { + return a.x === b.x && a.y === b.y; +}; + +/* harmony default export */ __webpack_exports__["a"] = Point; + +/***/ }), /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _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; }; }(); - - __webpack_require__(2); - - var _matchesSelector = __webpack_require__(3); - - var _matchesSelector2 = _interopRequireDefault(_matchesSelector); - - var _arrayUniq = __webpack_require__(4); - - var _arrayUniq2 = _interopRequireDefault(_arrayUniq); - - var _xtend = __webpack_require__(5); - - var _xtend2 = _interopRequireDefault(_xtend); - - var _throttleit = __webpack_require__(6); - - var _throttleit2 = _interopRequireDefault(_throttleit); - - var _arrayParallel = __webpack_require__(7); - - var _arrayParallel2 = _interopRequireDefault(_arrayParallel); - - var _point = __webpack_require__(8); - - var _point2 = _interopRequireDefault(_point); - - var _shuffleItem = __webpack_require__(10); - - var _shuffleItem2 = _interopRequireDefault(_shuffleItem); - - var _classes = __webpack_require__(11); - - var _classes2 = _interopRequireDefault(_classes); - - var _getNumberStyle = __webpack_require__(12); - - var _getNumberStyle2 = _interopRequireDefault(_getNumberStyle); - - var _sorter = __webpack_require__(14); - - var _sorter2 = _interopRequireDefault(_sorter); - - var _onTransitionEnd = __webpack_require__(15); - - var _layout2 = __webpack_require__(16); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function toArray(arrayLike) { - return Array.prototype.slice.call(arrayLike); - } - - function arrayMax(array) { - return Math.max.apply(Math, array); - } - - function arrayIncludes(array, obj) { - if (arguments.length === 2) { - return arrayIncludes(array)(obj); - } - - return function (obj) { - return array.indexOf(obj) > -1; - }; - } - - // Used for unique instance variables - var id = 0; - - var Shuffle = function () { - - /** - * Categorize, sort, and filter a responsive grid of items. - * - * @param {Element} element An element which is the parent container for the grid items. - * @param {Object} [options=Shuffle.options] Options object. - * @constructor - */ - function Shuffle(element) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - _classCallCheck(this, Shuffle); - - this.options = (0, _xtend2.default)(Shuffle.options, options); - - this.useSizer = false; - this.lastSort = {}; - this.group = this.lastFilter = Shuffle.ALL_ITEMS; - this.isEnabled = true; - this.isDestroyed = false; - this.isInitialized = false; - this._transitions = []; - this.isTransitioning = false; - this._queue = []; - - element = this._getElementOption(element); - - if (!element) { - throw new TypeError('Shuffle needs to be initialized with an element.'); - } - - this.element = element; - this.id = 'shuffle_' + id++; - - this._init(); - this.isInitialized = true; - } - - _createClass(Shuffle, [{ - key: '_init', - value: function _init() { - this.items = this._getItems(); - - this.options.sizer = this._getElementOption(this.options.sizer); - - if (this.options.sizer) { - this.useSizer = true; - } - - // Add class and invalidate styles - this.element.classList.add(Shuffle.Classes.BASE); - - // Set initial css for each item - this._initItems(); - - // Bind resize events - this._onResize = this._getResizeFunction(); - window.addEventListener('resize', this._onResize); - - // Get container css all in one request. Causes reflow - var containerCss = window.getComputedStyle(this.element, null); - var containerWidth = Shuffle.getSize(this.element).width; - - // Add styles to the container if it doesn't have them. - this._validateStyles(containerCss); - - // We already got the container's width above, no need to cause another - // reflow getting it again... Calculate the number of columns there will be - this._setColumns(containerWidth); - - // Kick off! - this.filter(this.options.group, this.options.initialSort); - - // The shuffle items haven't had transitions set on them yet so the user - // doesn't see the first layout. Set them now that the first layout is done. - // First, however, a synchronous layout must be caused for the previous - // styles to be applied without transitions. - this.element.offsetWidth; // jshint ignore: line - this._setTransitions(); - this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing; - } - - /** - * Returns a throttled and proxied function for the resize handler. - * @return {Function} - * @private - */ - - }, { - key: '_getResizeFunction', - value: function _getResizeFunction() { - var resizeFunction = this._handleResize.bind(this); - return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : resizeFunction; - } - - /** - * Retrieve an element from an option. - * @param {string|jQuery|Element} option The option to check. - * @return {?Element} The plain element or null. - * @private - */ - - }, { - key: '_getElementOption', - value: function _getElementOption(option) { - // If column width is a string, treat is as a selector and search for the - // sizer element within the outermost container - if (typeof option === 'string') { - return this.element.querySelector(option); - - // Check for an element - } else if (option && option.nodeType && option.nodeType === 1) { - return option; - - // Check for jQuery object - } else if (option && option.jquery) { - return option[0]; - } - - return null; - } - - /** - * Ensures the shuffle container has the css styles it needs applied to it. - * @param {Object} styles Key value pairs for position and overflow. - * @private - */ - - }, { - key: '_validateStyles', - value: function _validateStyles(styles) { - // Position cannot be static. - if (styles.position === 'static') { - this.element.style.position = 'relative'; - } - - // Overflow has to be hidden. - if (styles.overflow !== 'hidden') { - this.element.style.overflow = 'hidden'; - } - } - - /** - * Filter the elements by a category. - * @param {string} [category] Category to filter by. If it's given, the last - * category will be used to filter the items. - * @param {Array} [collection] Optionally filter a collection. Defaults to - * all the items. - * @return {!{visible: Array, hidden: Array}} - * @private - */ - - }, { - key: '_filter', - value: function _filter() { - var category = arguments.length <= 0 || arguments[0] === undefined ? this.lastFilter : arguments[0]; - var collection = arguments.length <= 1 || arguments[1] === undefined ? this.items : arguments[1]; - - var set = this._getFilteredSets(category, collection); - - // Individually add/remove hidden/visible classes - this._toggleFilterClasses(set); - - // Save the last filter in case elements are appended. - this.lastFilter = category; - - // This is saved mainly because providing a filter function (like searching) - // will overwrite the `lastFilter` property every time its called. - if (typeof category === 'string') { - this.group = category; - } - - return set; - } - - /** - * Returns an object containing the visible and hidden elements. - * @param {string|Function} category Category or function to filter by. - * @param {Array.} items A collection of items to filter. - * @return {!{visible: Array, hidden: Array}} - * @private - */ - - }, { - key: '_getFilteredSets', - value: function _getFilteredSets(category, items) { - var _this = this; - - var visible = []; - var hidden = []; - - // category === 'all', add visible class to everything - if (category === Shuffle.ALL_ITEMS) { - visible = items; - - // Loop through each item and use provided function to determine - // whether to hide it or not. - } else { - items.forEach(function (item) { - if (_this._doesPassFilter(category, item.element)) { - visible.push(item); - } else { - hidden.push(item); - } - }); - } - - return { - visible: visible, - hidden: hidden - }; - } - - /** - * Test an item to see if it passes a category. - * @param {string|Function} category Category or function to filter by. - * @param {Element} element An element to test. - * @return {boolean} Whether it passes the category/filter. - * @private - */ - - }, { - key: '_doesPassFilter', - value: function _doesPassFilter(category, element) { - - if (typeof category === 'function') { - return category.call(element, element, this); - - // Check each element's data-groups attribute against the given category. - } else { - var attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY); - var keys = this.options.delimeter ? attr.split(this.options.delimeter) : JSON.parse(attr); - - if (Array.isArray(category)) { - return category.some(arrayIncludes(keys)); - } - - return arrayIncludes(keys, category); - } - } - - /** - * Toggles the visible and hidden class names. - * @param {{visible, hidden}} Object with visible and hidden arrays. - * @private - */ - - }, { - key: '_toggleFilterClasses', - value: function _toggleFilterClasses(_ref) { - var visible = _ref.visible; - var hidden = _ref.hidden; - - visible.forEach(function (item) { - item.show(); - }); - - hidden.forEach(function (item) { - item.hide(); - }); - } - - /** - * Set the initial css for each item - * @param {Array.} [items] Optionally specifiy at set to initialize. - * @private - */ - - }, { - key: '_initItems', - value: function _initItems() { - var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0]; - - items.forEach(function (item) { - item.init(); - }); - } - - /** - * Remove element reference and styles. - * @private - */ - - }, { - key: '_disposeItems', - value: function _disposeItems() { - var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0]; - - items.forEach(function (item) { - item.dispose(); - }); - } - - /** - * Updates the visible item count. - * @private - */ - - }, { - key: '_updateItemCount', - value: function _updateItemCount() { - this.visibleItems = this._getFilteredItems().length; - } - - /** - * Sets css transform transition on a group of elements. This is not executed - * at the same time as `item.init` so that transitions don't occur upon - * initialization of Shuffle. - * @param {Array.} items Shuffle items to set transitions on. - * @private - */ - - }, { - key: '_setTransitions', - value: function _setTransitions() { - var items = arguments.length <= 0 || arguments[0] === undefined ? this.items : arguments[0]; - - var speed = this.options.speed; - var easing = this.options.easing; - - var str; - if (this.options.useTransforms) { - str = 'transform ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing; - } else { - str = 'top ' + speed + 'ms ' + easing + ', left ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing; - } - - items.forEach(function (item) { - item.element.style.transition = str; - }); - } - }, { - key: '_getItems', - value: function _getItems() { - var _this2 = this; - - return toArray(this.element.children).filter(function (el) { - return (0, _matchesSelector2.default)(el, _this2.options.itemSelector); - }).map(function (el) { - return new _shuffleItem2.default(el); - }); - } - - /** - * When new elements are added to the shuffle container, update the array of - * items because that is the order `_layout` calls them. - */ - - }, { - key: '_updateItemsOrder', - value: function _updateItemsOrder() { - var children = this.element.children; - this.items = (0, _sorter2.default)(this.items, { - by: function by(element) { - return Array.prototype.indexOf.call(children, element); - } - }); - } - }, { - key: '_getFilteredItems', - value: function _getFilteredItems() { - return this.items.filter(function (item) { - return item.isVisible; - }); - } - }, { - key: '_getConcealedItems', - value: function _getConcealedItems() { - return this.items.filter(function (item) { - return !item.isVisible; - }); - } - - /** - * Returns the column size, based on column width and sizer options. - * @param {number} containerWidth Size of the parent container. - * @param {number} gutterSize Size of the gutters. - * @return {number} - * @private - */ - - }, { - key: '_getColumnSize', - value: function _getColumnSize(containerWidth, gutterSize) { - var size; - - // If the columnWidth property is a function, then the grid is fluid - if (typeof this.options.columnWidth === 'function') { - size = this.options.columnWidth(containerWidth); - - // columnWidth option isn't a function, are they using a sizing element? - } else if (this.useSizer) { - size = Shuffle.getSize(this.options.sizer).width; - - // if not, how about the explicitly set option? - } else if (this.options.columnWidth) { - size = this.options.columnWidth; - - // or use the size of the first item - } else if (this.items.length > 0) { - size = Shuffle.getSize(this.items[0].element, true).width; - - // if there's no items, use size of container - } else { - size = containerWidth; - } - - // Don't let them set a column width of zero. - if (size === 0) { - size = containerWidth; - } - - return size + gutterSize; - } - - /** - * Returns the gutter size, based on gutter width and sizer options. - * @param {number} containerWidth Size of the parent container. - * @return {number} - * @private - */ - - }, { - key: '_getGutterSize', - value: function _getGutterSize(containerWidth) { - var size; - if (typeof this.options.gutterWidth === 'function') { - size = this.options.gutterWidth(containerWidth); - } else if (this.useSizer) { - size = (0, _getNumberStyle2.default)(this.options.sizer, 'marginLeft'); - } else { - size = this.options.gutterWidth; - } - - return size; - } - - /** - * Calculate the number of columns to be used. Gets css if using sizer element. - * @param {number} [containerWidth] Optionally specify a container width if - * it's already available. - */ - - }, { - key: '_setColumns', - value: function _setColumns() { - var containerWidth = arguments.length <= 0 || arguments[0] === undefined ? Shuffle.getSize(this.element).width : arguments[0]; - - var gutter = this._getGutterSize(containerWidth); - var columnWidth = this._getColumnSize(containerWidth, gutter); - var calculatedColumns = (containerWidth + gutter) / columnWidth; - - // Widths given from getStyles are not precise enough... - if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) < this.options.columnThreshold) { - // e.g. calculatedColumns = 11.998876 - calculatedColumns = Math.round(calculatedColumns); - } - - this.cols = Math.max(Math.floor(calculatedColumns), 1); - this.containerWidth = containerWidth; - this.colWidth = columnWidth; - } - - /** - * Adjust the height of the grid - */ - - }, { - key: '_setContainerSize', - value: function _setContainerSize() { - this.element.style.height = this._getContainerSize() + 'px'; - } - - /** - * Based on the column heights, it returns the biggest one. - * @return {number} - * @private - */ - - }, { - key: '_getContainerSize', - value: function _getContainerSize() { - return arrayMax(this.positions); - } - - /** - * Get the clamped stagger amount. - * @param {number} index Index of the item to be staggered. - * @return {number} - */ - - }, { - key: '_getStaggerAmount', - value: function _getStaggerAmount(index) { - return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax); - } - - /** - * @return {boolean} Whether the event was prevented or not. - */ - - }, { - key: '_dispatch', - value: function _dispatch(name) { - var details = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - if (this.isDestroyed) { - return; - } - - details.shuffle = this; - return !this.element.dispatchEvent(new CustomEvent(name, { - bubbles: true, - cancelable: false, - detail: details - })); - } - - /** - * Zeros out the y columns array, which is used to determine item placement. - * @private - */ - - }, { - key: '_resetCols', - value: function _resetCols() { - var i = this.cols; - this.positions = []; - while (i--) { - this.positions.push(0); - } - } - - /** - * Loops through each item that should be shown and calculates the x, y position. - * @param {Array.} items Array of items that will be shown/layed - * out in order in their array. - */ - - }, { - key: '_layout', - value: function _layout(items) { - var _this3 = this; - - var count = 0; - items.forEach(function (item) { - var currPos = item.point; - var currScale = item.scale; - var itemSize = Shuffle.getSize(item.element, true); - var pos = _this3._getItemPosition(itemSize); - - function callback() { - item.element.style.transitionDelay = ''; - item.applyCss(_shuffleItem2.default.Css.VISIBLE.after); - } - - // If the item will not change its position, do not add it to the render - // queue. Transitions don't fire when setting a property to the same value. - if (_point2.default.equals(currPos, pos) && currScale === _shuffleItem2.default.Scale.VISIBLE) { - callback(); - return; - } - - item.point = pos; - item.scale = _shuffleItem2.default.Scale.VISIBLE; - - // 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, - styles: styles, - callback: callback - }); - - count++; - }); - } - - /** - * Determine the location of the next item, based on its size. - * @param {{width: number, height: number}} itemSize Object with width and height. - * @return {Point} - * @private - */ - - }, { - key: '_getItemPosition', - value: function _getItemPosition(itemSize) { - return (0, _layout2.getItemPosition)({ - itemSize: itemSize, - positions: this.positions, - gridSize: this.colWidth, - total: this.cols, - threshold: this.options.columnThreshold, - buffer: this.options.buffer - }); - } - - /** - * Hides the elements that don't match our filter. - * @param {Array.} collection Collection to shrink. - * @private - */ - - }, { - key: '_shrink', - value: function _shrink() { - var _this4 = this; - - var collection = arguments.length <= 0 || arguments[0] === undefined ? this._getConcealedItems() : arguments[0]; - - var count = 0; - collection.forEach(function (item) { - function callback() { - item.applyCss(_shuffleItem2.default.Css.HIDDEN.after); - } - - // Continuing would add a transitionend event listener to the element, but - // that listener would not execute because the transform and opacity would - // stay the same. - // The callback is executed here because it is not guaranteed to be called - // after the transitionend event because the transitionend could be - // canceled if another animation starts. - if (item.scale === _shuffleItem2.default.Scale.HIDDEN) { - callback(); - return; - } - - item.scale = _shuffleItem2.default.Scale.HIDDEN; - - var styles = (0, _xtend2.default)(_shuffleItem2.default.Css.HIDDEN.before); - styles.transitionDelay = _this4._getStaggerAmount(count) + 'ms'; - - _this4._queue.push({ - item: item, - styles: styles, - callback: callback - }); - - count++; - }); - } - - /** - * Resize handler. - * @private - */ - - }, { - key: '_handleResize', - value: function _handleResize() { - // If shuffle is disabled, destroyed, don't do anything - if (!this.isEnabled || this.isDestroyed) { - return; - } - - // Will need to check height in the future if it's layed out horizontaly - var containerWidth = Shuffle.getSize(this.element).width; - - // containerWidth hasn't changed, don't do anything - if (containerWidth === this.containerWidth) { - return; - } - - this.update(); - } - - /** - * Returns styles which will be applied to the an item for a transition. - * @param {Object} obj Transition options. - * @return {!Object} Transforms for transitions, left/top for animate. - * @private - */ - - }, { - key: '_getStylesForTransition', - value: function _getStylesForTransition(_ref2) { - var item = _ref2.item; - var styles = _ref2.styles; - - if (!styles.transitionDelay) { - styles.transitionDelay = '0ms'; - } - - var x = item.point.x; - var y = item.point.y; - - if (this.options.useTransforms) { - styles.transform = 'translate(' + x + 'px, ' + y + 'px) scale(' + item.scale + ')'; - } else { - styles.left = x + 'px'; - styles.top = y + 'px'; - } - - return styles; - } - - /** - * Listen for the transition end on an element and execute the itemCallback - * when it finishes. - * @param {Element} element Element to listen on. - * @param {Function} itemCallback Callback for the item. - * @param {Function} done Callback to notify `parallel` that this one is done. - */ - - }, { - key: '_whenTransitionDone', - value: function _whenTransitionDone(element, itemCallback, done) { - var id = (0, _onTransitionEnd.onTransitionEnd)(element, function (evt) { - itemCallback(); - done(null, evt); - }); - - this._transitions.push(id); - } - - /** - * Return a function which will set CSS styles and call the `done` function - * when (if) the transition finishes. - * @param {Object} opts Transition object. - * @return {Function} A function to be called with a `done` function. - */ - - }, { - key: '_getTransitionFunction', - value: function _getTransitionFunction(opts) { - var _this5 = this; - - return function (done) { - opts.item.applyCss(_this5._getStylesForTransition(opts)); - _this5._whenTransitionDone(opts.item.element, opts.callback, done); - }; - } - - /** - * Execute the styles gathered in the style queue. This applies styles to elements, - * triggering transitions. - * @private - */ - - }, { - key: '_processQueue', - value: function _processQueue() { - if (this.isTransitioning) { - this._cancelMovement(); - } - - var hasSpeed = this.options.speed > 0; - var hasQueue = this._queue.length > 0; - - 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 - // the transitionend event. - } else { - this._dispatchLayout(); - } - - // Remove everything in the style queue - this._queue.length = 0; - } - - /** - * Wait for each transition to finish, the emit the layout event. - * @param {Array.} transitions Array of transition objects. - */ - - }, { - key: '_startTransitions', - value: function _startTransitions(transitions) { - 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 _this6._getTransitionFunction(obj); - }); - - (0, _arrayParallel2.default)(callbacks, this._movementFinished.bind(this)); - } - }, { - key: '_cancelMovement', - value: function _cancelMovement() { - // Remove the transition end event for each listener. - this._transitions.forEach(_onTransitionEnd.cancelTransitionEnd); - - // Reset the array. - this._transitions.length = 0; - - // Show it's no longer active. - this.isTransitioning = false; - } - - /** - * Apply styles without a transition. - * @param {Array.} objects Array of transition objects. - * @private - */ - - }, { - key: '_styleImmediately', - value: function _styleImmediately(objects) { - var _this7 = this; - - if (objects.length) { - var elements = objects.map(function (obj) { - return obj.item.element; - }); - - Shuffle._skipTransitions(elements, function () { - objects.forEach(function (obj) { - obj.item.applyCss(_this7._getStylesForTransition(obj)); - obj.callback(); - }); - }); - } - } - }, { - key: '_movementFinished', - value: function _movementFinished() { - this._transitions.length = 0; - this.isTransitioning = false; - this._dispatchLayout(); - } - }, { - key: '_dispatchLayout', - value: function _dispatchLayout() { - this._dispatch(Shuffle.EventType.LAYOUT); - } - - /** - * The magic. This is what makes the plugin 'shuffle' - * @param {string|Function|Array.} [category] Category to filter by. - * Can be a function, string, or array of strings. - * @param {Object} [sortObj] A sort object which can sort the visible set - */ - - }, { - key: 'filter', - value: function filter(category, sortObj) { - if (!this.isEnabled) { - return; - } - - if (!category || category && category.length === 0) { - category = Shuffle.ALL_ITEMS; - } - - this._filter(category); - - // Shrink each hidden item - this._shrink(); - - // How many visible elements? - this._updateItemCount(); - - // Update transforms on visible elements so they will animate to their new positions. - this.sort(sortObj); - } - - /** - * Gets the visible elements, sorts them, and passes them to layout. - * @param {Object} opts the options object for the sorted plugin - */ - - }, { - key: 'sort', - value: function sort() { - var opts = arguments.length <= 0 || arguments[0] === undefined ? this.lastSort : arguments[0]; - - if (!this.isEnabled) { - return; - } - - this._resetCols(); - - var items = this._getFilteredItems(); - items = (0, _sorter2.default)(items, opts); - - this._layout(items); - - // `_layout` always happens after `_shrink`, so it's safe to process the style - // queue here with styles from the shrink method. - this._processQueue(); - - // Adjust the height of the container. - this._setContainerSize(); - - this.lastSort = opts; - } - - /** - * Reposition everything. - * @param {boolean} isOnlyLayout If true, column and gutter widths won't be - * recalculated. - */ - - }, { - key: 'update', - value: function update(isOnlyLayout) { - if (this.isEnabled) { - - if (!isOnlyLayout) { - // Get updated colCount - this._setColumns(); - } - - // Layout items - this.sort(); - } - } - - /** - * Use this instead of `update()` if you don't need the columns and gutters updated - * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations - * could be off. - */ - - }, { - key: 'layout', - value: function layout() { - this.update(true); - } - - /** - * New items have been appended to shuffle. Mix them in with the current - * filter or sort status. - * @param {Array.} newItems Collection of new items. - */ - - }, { - key: 'add', - value: function add(newItems) { - newItems = (0, _arrayUniq2.default)(newItems).map(function (el) { - return new _shuffleItem2.default(el); - }); - - // Add classes and set initial positions. - this._initItems(newItems); - - // Add transition to each item. - this._setTransitions(newItems); - - // Update the list of items. - this.items = this.items.concat(newItems); - this._updateItemsOrder(); - this.filter(this.lastFilter); - } - - /** - * Disables shuffle from updating dimensions and layout on resize - */ - - }, { - key: 'disable', - value: function disable() { - this.isEnabled = false; - } - - /** - * Enables shuffle again - * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters - */ - - }, { - key: 'enable', - value: function enable(isUpdateLayout) { - this.isEnabled = true; - if (isUpdateLayout !== false) { - this.update(); - } - } - - /** - * Remove 1 or more shuffle items - * @param {Array.} collection An array containing one or more - * elements in shuffle - * @return {Shuffle} The shuffle object - */ - - }, { - key: 'remove', - value: function remove(collection) { - var _this8 = this; - - if (!collection.length) { - return; - } - - collection = (0, _arrayUniq2.default)(collection); - - var oldItems = collection.map(function (element) { - return _this8.getItemByElement(element); - }).filter(function (item) { - return !!item; - }); - - var handleLayout = function handleLayout() { - _this8.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout); - _this8._disposeItems(oldItems); - - // Remove the collection in the callback - collection.forEach(function (element) { - element.parentNode.removeChild(element); - }); - - _this8._dispatch(Shuffle.EventType.REMOVED, { collection: collection }); - - // Let it get garbage collected - collection = null; - oldItems = null; - }; - - // Hide collection first. - this._toggleFilterClasses({ - visible: [], - hidden: oldItems - }); - - this._shrink(oldItems); - - this.sort(); - - // Update the list of items here because `remove` could be called again - // with an item that is in the process of being removed. - this.items = this.items.filter(function (item) { - return !arrayIncludes(oldItems, item); - }); - this._updateItemCount(); - - this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout); - } - - /** - * Retrieve a shuffle item by its element. - * @param {Element} element Element to look for. - * @return {?ShuffleItem} A shuffle item or null if it's not found. - */ - - }, { - key: 'getItemByElement', - value: function getItemByElement(element) { - for (var i = this.items.length - 1; i >= 0; i--) { - if (this.items[i].element === element) { - return this.items[i]; - } - } - - return null; - } - - /** - * Destroys shuffle, removes events, styles, and classes - */ - - }, { - key: 'destroy', - value: function destroy() { - this._cancelMovement(); - window.removeEventListener('resize', this._onResize); - - // Reset container styles - this.element.classList.remove('shuffle'); - this.element.removeAttribute('style'); - - // Reset individual item styles - this._disposeItems(); - - // Null DOM references - this.items = null; - this.options.sizer = null; - this.element = null; - this._transitions = null; - - // Set a flag so if a debounced resize has been triggered, - // it can first check if it is actually isDestroyed and not doing anything - this.isDestroyed = true; - } - - /** - * Returns the outer width of an element, optionally including its margins. - * - * There are a few different methods for getting the width of an element, none of - * which work perfectly for all Shuffle's use cases. - * - * 1. getBoundingClientRect() `left` and `right` properties. - * - Accounts for transform scaled elements, making it useless for Shuffle - * elements which have shrunk. - * 2. The `offsetWidth` property. - * - This value stays the same regardless of the elements transform property, - * however, it does not return subpixel values. - * 3. getComputedStyle() - * - This works great Chrome, Firefox, Safari, but IE<=11 does not include - * padding and border when box-sizing: border-box is set, requiring a feature - * test and extra work to add the padding back for IE and other browsers which - * follow the W3C spec here. - * - * @param {Element} element The element. - * @param {boolean} [includeMargins] Whether to include margins. Default is false. - * @return {{width: number, height: number}} The width and height. - */ - - }], [{ - key: 'getSize', - value: function getSize(element, includeMargins) { - // Store the styles so that they can be used by others without asking for it again. - var styles = window.getComputedStyle(element, null); - var width = (0, _getNumberStyle2.default)(element, 'width', styles); - var height = (0, _getNumberStyle2.default)(element, 'height', styles); - - if (includeMargins) { - var marginLeft = (0, _getNumberStyle2.default)(element, 'marginLeft', styles); - var marginRight = (0, _getNumberStyle2.default)(element, 'marginRight', styles); - var marginTop = (0, _getNumberStyle2.default)(element, 'marginTop', styles); - var marginBottom = (0, _getNumberStyle2.default)(element, 'marginBottom', styles); - width += marginLeft + marginRight; - height += marginTop + marginBottom; - } - - return { - width: width, - height: height - }; - } - - /** - * Change a property or execute a function which will not have a transition - * @param {Array.} elements DOM elements that won't be transitioned. - * @param {Function} callback A function which will be called while transition - * is set to 0ms. - * @private - */ - - }, { - key: '_skipTransitions', - value: function _skipTransitions(elements, callback) { - var zero = '0ms'; - - // Save current duration and delay. - var data = elements.map(function (element) { - var style = element.style; - var duration = style.transitionDuration; - var delay = style.transitionDelay; - - // Set the duration to zero so it happens immediately - style.transitionDuration = zero; - style.transitionDelay = zero; - - return { - duration: duration, - delay: delay - }; - }); - - callback(); - - // Cause reflow. - elements[0].offsetWidth; // jshint ignore:line - - // Put the duration back - elements.forEach(function (element, i) { - element.style.transitionDuration = data[i].duration; - element.style.transitionDelay = data[i].delay; - }); - } - }]); - - return Shuffle; - }(); - - Shuffle.ShuffleItem = _shuffleItem2.default; - - Shuffle.ALL_ITEMS = 'all'; - Shuffle.FILTER_ATTRIBUTE_KEY = 'groups'; - - /** - * @enum {string} - */ - Shuffle.EventType = { - LAYOUT: 'shuffle:layout', - REMOVED: 'shuffle:removed' - }; - - /** @enum {string} */ - Shuffle.Classes = _classes2.default; - - // Overrideable options - Shuffle.options = { - // Initial filter group. - group: Shuffle.ALL_ITEMS, - - // Transition/animation speed (milliseconds). - speed: 250, - - // CSS easing function to use. - easing: 'ease', - - // e.g. '.picture-item'. - itemSelector: '*', - - // Element or selector string. Use an element to determine the size of columns - // and gutters. - sizer: null, - - // A static number or function that tells the plugin how wide the gutters - // between columns are (in pixels). - gutterWidth: 0, - - // A static number or function that returns a number which tells the plugin - // how wide the columns are (in pixels). - columnWidth: 0, - - // If your group is not json, and is comma delimeted, you could set delimeter - // to ','. - delimeter: null, - - // Useful for percentage based heights when they might not always be exactly - // the same (in pixels). - buffer: 0, - - // Reading the width of elements isn't precise enough and can cause columns to - // jump between values. - columnThreshold: 0.01, - - // Shuffle can be isInitialized with a sort object. It is the same object - // given to the sort method. - initialSort: null, - - // By default, shuffle will throttle resize events. This can be changed or - // removed. - throttle: _throttleit2.default, - - // How often shuffle can be called on resize (in milliseconds). - throttleTime: 300, - - // Transition delay offset for each item in milliseconds. - staggerAmount: 15, - - // Maximum stagger delay in milliseconds. - staggerAmountMax: 250, - - // Whether to use transforms or absolute positioning. - useTransforms: true - }; - - // Expose for testing. Hack at your own risk. - Shuffle.__Point = _point2.default; - Shuffle.__sorter = _sorter2.default; - Shuffle.__getColumnSpan = _layout2.getColumnSpan; - Shuffle.__getAvailablePositions = _layout2.getAvailablePositions; - Shuffle.__getShortColumn = _layout2.getShortColumn; - - exports.default = Shuffle; - -/***/ }, +"use strict"; +/* harmony default export */ __webpack_exports__["a"] = { + BASE: 'shuffle', + SHUFFLE_ITEM: 'shuffle-item', + VISIBLE: 'shuffle-item--visible', + HIDDEN: 'shuffle-item--hidden' +}; + +/***/ }), /* 2 */ -/***/ function(module, exports) { - - // Polyfill for creating CustomEvents on IE9/10/11 - - // code pulled from: - // https://github.com/d4tocchini/customevent-polyfill - // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill - - try { - new window.CustomEvent("test"); - } catch(e) { - var CustomEvent = function(event, params) { - var evt; - params = params || { - bubbles: false, - cancelable: false, - detail: undefined - }; - - evt = document.createEvent("CustomEvent"); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); - return evt; - }; - - CustomEvent.prototype = window.Event.prototype; - window.CustomEvent = CustomEvent; // expose definition to window - } +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = getNumber; + + +/** + * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`. + * @param {*} value Possibly numeric value. + * @return {number} `value` or zero if `value` isn't numeric. + */ +function getNumber(value) { + return parseFloat(value) || 0; +} -/***/ }, +/***/ }), /* 3 */ -/***/ function(module, exports) { - - 'use strict'; - - var proto = Element.prototype; - var vendor = proto.matches - || proto.matchesSelector - || proto.webkitMatchesSelector - || proto.mozMatchesSelector - || proto.msMatchesSelector - || proto.oMatchesSelector; - - module.exports = match; - - /** - * Match `el` to `selector`. - * - * @param {Element} el - * @param {String} selector - * @return {Boolean} - * @api public - */ - - function match(el, selector) { - if (vendor) return vendor.call(el, selector); - var nodes = el.parentNode.querySelectorAll(selector); - for (var i = 0; i < nodes.length; i++) { - if (nodes[i] == el) return true; - } - return false; - } +/***/ (function(module, exports) { + +module.exports = extend + +var hasOwnProperty = Object.prototype.hasOwnProperty; -/***/ }, +function extend() { + var target = {} + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target +} + + +/***/ }), /* 4 */ -/***/ function(module, exports) { - - /* WEBPACK VAR INJECTION */(function(global) {'use strict'; - - // there's 3 implementations written in increasing order of efficiency - - // 1 - no Set type is defined - function uniqNoSet(arr) { - var ret = []; - - for (var i = 0; i < arr.length; i++) { - if (ret.indexOf(arr[i]) === -1) { - ret.push(arr[i]); - } +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill__ = __webpack_require__(13); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_matches_selector__ = __webpack_require__(14); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_matches_selector___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_matches_selector__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_array_uniq__ = __webpack_require__(6); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_array_uniq___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_array_uniq__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_xtend__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_xtend___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_xtend__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_throttleit__ = __webpack_require__(15); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_throttleit___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_throttleit__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_array_parallel__ = __webpack_require__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_array_parallel___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_array_parallel__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__point__ = __webpack_require__(0); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__shuffle_item__ = __webpack_require__(11); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__classes__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__get_number_style__ = __webpack_require__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__sorter__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__on_transition_end__ = __webpack_require__(10); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__layout__ = __webpack_require__(9); + + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + + + + + + + + + + + + + + +function toArray(arrayLike) { + return Array.prototype.slice.call(arrayLike); +} + +function arrayMax(array) { + return Math.max.apply(Math, array); +} + +function arrayIncludes(array, obj) { + if (arguments.length === 2) { + return arrayIncludes(array)(obj); + } + + return function (obj) { + return array.indexOf(obj) > -1; + }; +} + +// Used for unique instance variables +var id = 0; + +var Shuffle = function () { + + /** + * Categorize, sort, and filter a responsive grid of items. + * + * @param {Element} element An element which is the parent container for the grid items. + * @param {Object} [options=Shuffle.options] Options object. + * @constructor + */ + function Shuffle(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Shuffle); + + this.options = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(Shuffle.options, options); + + this.useSizer = false; + this.lastSort = {}; + this.group = this.lastFilter = Shuffle.ALL_ITEMS; + this.isEnabled = true; + this.isDestroyed = false; + this.isInitialized = false; + this._transitions = []; + this.isTransitioning = false; + this._queue = []; + + element = this._getElementOption(element); + + if (!element) { + throw new TypeError('Shuffle needs to be initialized with an element.'); + } + + this.element = element; + this.id = 'shuffle_' + id++; + + this._init(); + this.isInitialized = true; + } + + _createClass(Shuffle, [{ + key: '_init', + value: function _init() { + this.items = this._getItems(); + + this.options.sizer = this._getElementOption(this.options.sizer); + + if (this.options.sizer) { + this.useSizer = true; + } + + // Add class and invalidate styles + this.element.classList.add(Shuffle.Classes.BASE); + + // Set initial css for each item + this._initItems(); + + // Bind resize events + this._onResize = this._getResizeFunction(); + window.addEventListener('resize', this._onResize); + + // Get container css all in one request. Causes reflow + var containerCss = window.getComputedStyle(this.element, null); + var containerWidth = Shuffle.getSize(this.element).width; + + // Add styles to the container if it doesn't have them. + this._validateStyles(containerCss); + + // We already got the container's width above, no need to cause another + // reflow getting it again... Calculate the number of columns there will be + this._setColumns(containerWidth); + + // Kick off! + this.filter(this.options.group, this.options.initialSort); + + // The shuffle items haven't had transitions set on them yet so the user + // doesn't see the first layout. Set them now that the first layout is done. + // First, however, a synchronous layout must be caused for the previous + // styles to be applied without transitions. + this.element.offsetWidth; // jshint ignore: line + this._setTransitions(); + this.element.style.transition = 'height ' + this.options.speed + 'ms ' + this.options.easing; + } + + /** + * Returns a throttled and proxied function for the resize handler. + * @return {Function} + * @private + */ + + }, { + key: '_getResizeFunction', + value: function _getResizeFunction() { + var resizeFunction = this._handleResize.bind(this); + return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : resizeFunction; + } + + /** + * Retrieve an element from an option. + * @param {string|jQuery|Element} option The option to check. + * @return {?Element} The plain element or null. + * @private + */ + + }, { + key: '_getElementOption', + value: function _getElementOption(option) { + // If column width is a string, treat is as a selector and search for the + // sizer element within the outermost container + if (typeof option === 'string') { + return this.element.querySelector(option); + + // Check for an element + } else if (option && option.nodeType && option.nodeType === 1) { + return option; + + // Check for jQuery object + } else if (option && option.jquery) { + return option[0]; + } + + return null; + } + + /** + * Ensures the shuffle container has the css styles it needs applied to it. + * @param {Object} styles Key value pairs for position and overflow. + * @private + */ + + }, { + key: '_validateStyles', + value: function _validateStyles(styles) { + // Position cannot be static. + if (styles.position === 'static') { + this.element.style.position = 'relative'; + } + + // Overflow has to be hidden. + if (styles.overflow !== 'hidden') { + this.element.style.overflow = 'hidden'; + } + } + + /** + * Filter the elements by a category. + * @param {string} [category] Category to filter by. If it's given, the last + * category will be used to filter the items. + * @param {Array} [collection] Optionally filter a collection. Defaults to + * all the items. + * @return {!{visible: Array, hidden: Array}} + * @private + */ + + }, { + key: '_filter', + value: function _filter() { + var category = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastFilter; + var collection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.items; + + var set = this._getFilteredSets(category, collection); + + // Individually add/remove hidden/visible classes + this._toggleFilterClasses(set); + + // Save the last filter in case elements are appended. + this.lastFilter = category; + + // This is saved mainly because providing a filter function (like searching) + // will overwrite the `lastFilter` property every time its called. + if (typeof category === 'string') { + this.group = category; + } + + return set; + } + + /** + * Returns an object containing the visible and hidden elements. + * @param {string|Function} category Category or function to filter by. + * @param {Array.} items A collection of items to filter. + * @return {!{visible: Array, hidden: Array}} + * @private + */ + + }, { + key: '_getFilteredSets', + value: function _getFilteredSets(category, items) { + var _this = this; + + var visible = []; + var hidden = []; + + // category === 'all', add visible class to everything + if (category === Shuffle.ALL_ITEMS) { + visible = items; + + // Loop through each item and use provided function to determine + // whether to hide it or not. + } else { + items.forEach(function (item) { + if (_this._doesPassFilter(category, item.element)) { + visible.push(item); + } else { + hidden.push(item); + } + }); + } + + return { + visible: visible, + hidden: hidden + }; + } + + /** + * Test an item to see if it passes a category. + * @param {string|Function} category Category or function to filter by. + * @param {Element} element An element to test. + * @return {boolean} Whether it passes the category/filter. + * @private + */ + + }, { + key: '_doesPassFilter', + value: function _doesPassFilter(category, element) { + + if (typeof category === 'function') { + return category.call(element, element, this); + + // Check each element's data-groups attribute against the given category. + } else { + var attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY); + var keys = this.options.delimeter ? attr.split(this.options.delimeter) : JSON.parse(attr); + + if (Array.isArray(category)) { + return category.some(arrayIncludes(keys)); + } + + return arrayIncludes(keys, category); + } + } + + /** + * Toggles the visible and hidden class names. + * @param {{visible, hidden}} Object with visible and hidden arrays. + * @private + */ + + }, { + key: '_toggleFilterClasses', + value: function _toggleFilterClasses(_ref) { + var visible = _ref.visible, + hidden = _ref.hidden; + + visible.forEach(function (item) { + item.show(); + }); + + hidden.forEach(function (item) { + item.hide(); + }); + } + + /** + * Set the initial css for each item + * @param {Array.} [items] Optionally specifiy at set to initialize. + * @private + */ + + }, { + key: '_initItems', + value: function _initItems() { + var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items; + + items.forEach(function (item) { + item.init(); + }); + } + + /** + * Remove element reference and styles. + * @private + */ + + }, { + key: '_disposeItems', + value: function _disposeItems() { + var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items; + + items.forEach(function (item) { + item.dispose(); + }); + } + + /** + * Updates the visible item count. + * @private + */ + + }, { + key: '_updateItemCount', + value: function _updateItemCount() { + this.visibleItems = this._getFilteredItems().length; + } + + /** + * Sets css transform transition on a group of elements. This is not executed + * at the same time as `item.init` so that transitions don't occur upon + * initialization of Shuffle. + * @param {Array.} items Shuffle items to set transitions on. + * @private + */ + + }, { + key: '_setTransitions', + value: function _setTransitions() { + var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items; + + var speed = this.options.speed; + var easing = this.options.easing; + + var str; + if (this.options.useTransforms) { + str = 'transform ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing; + } else { + str = 'top ' + speed + 'ms ' + easing + ', left ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing; + } + + items.forEach(function (item) { + item.element.style.transition = str; + }); + } + }, { + key: '_getItems', + value: function _getItems() { + var _this2 = this; + + return toArray(this.element.children).filter(function (el) { + return __WEBPACK_IMPORTED_MODULE_1_matches_selector___default()(el, _this2.options.itemSelector); + }).map(function (el) { + return new __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */](el); + }); + } + + /** + * When new elements are added to the shuffle container, update the array of + * items because that is the order `_layout` calls them. + */ + + }, { + key: '_updateItemsOrder', + value: function _updateItemsOrder() { + var children = this.element.children; + this.items = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__sorter__["a" /* default */])(this.items, { + by: function by(element) { + return Array.prototype.indexOf.call(children, element); + } + }); + } + }, { + key: '_getFilteredItems', + value: function _getFilteredItems() { + return this.items.filter(function (item) { + return item.isVisible; + }); + } + }, { + key: '_getConcealedItems', + value: function _getConcealedItems() { + return this.items.filter(function (item) { + return !item.isVisible; + }); + } + + /** + * Returns the column size, based on column width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @param {number} gutterSize Size of the gutters. + * @return {number} + * @private + */ + + }, { + key: '_getColumnSize', + value: function _getColumnSize(containerWidth, gutterSize) { + var size; + + // If the columnWidth property is a function, then the grid is fluid + if (typeof this.options.columnWidth === 'function') { + size = this.options.columnWidth(containerWidth); + + // columnWidth option isn't a function, are they using a sizing element? + } else if (this.useSizer) { + size = Shuffle.getSize(this.options.sizer).width; + + // if not, how about the explicitly set option? + } else if (this.options.columnWidth) { + size = this.options.columnWidth; + + // or use the size of the first item + } else if (this.items.length > 0) { + size = Shuffle.getSize(this.items[0].element, true).width; + + // if there's no items, use size of container + } else { + size = containerWidth; + } + + // Don't let them set a column width of zero. + if (size === 0) { + size = containerWidth; + } + + return size + gutterSize; + } + + /** + * Returns the gutter size, based on gutter width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @return {number} + * @private + */ + + }, { + key: '_getGutterSize', + value: function _getGutterSize(containerWidth) { + var size; + if (typeof this.options.gutterWidth === 'function') { + size = this.options.gutterWidth(containerWidth); + } else if (this.useSizer) { + size = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(this.options.sizer, 'marginLeft'); + } else { + size = this.options.gutterWidth; + } + + return size; + } + + /** + * Calculate the number of columns to be used. Gets css if using sizer element. + * @param {number} [containerWidth] Optionally specify a container width if + * it's already available. + */ + + }, { + key: '_setColumns', + value: function _setColumns() { + var containerWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Shuffle.getSize(this.element).width; + + var gutter = this._getGutterSize(containerWidth); + var columnWidth = this._getColumnSize(containerWidth, gutter); + var calculatedColumns = (containerWidth + gutter) / columnWidth; + + // Widths given from getStyles are not precise enough... + if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) < this.options.columnThreshold) { + // e.g. calculatedColumns = 11.998876 + calculatedColumns = Math.round(calculatedColumns); + } + + this.cols = Math.max(Math.floor(calculatedColumns), 1); + this.containerWidth = containerWidth; + this.colWidth = columnWidth; + } + + /** + * Adjust the height of the grid + */ + + }, { + key: '_setContainerSize', + value: function _setContainerSize() { + this.element.style.height = this._getContainerSize() + 'px'; + } + + /** + * Based on the column heights, it returns the biggest one. + * @return {number} + * @private + */ + + }, { + key: '_getContainerSize', + value: function _getContainerSize() { + return arrayMax(this.positions); + } + + /** + * Get the clamped stagger amount. + * @param {number} index Index of the item to be staggered. + * @return {number} + */ + + }, { + key: '_getStaggerAmount', + value: function _getStaggerAmount(index) { + return Math.min(index * this.options.staggerAmount, this.options.staggerAmountMax); + } + + /** + * @return {boolean} Whether the event was prevented or not. + */ + + }, { + key: '_dispatch', + value: function _dispatch(name) { + var details = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (this.isDestroyed) { + return; + } + + details.shuffle = this; + return !this.element.dispatchEvent(new CustomEvent(name, { + bubbles: true, + cancelable: false, + detail: details + })); + } + + /** + * Zeros out the y columns array, which is used to determine item placement. + * @private + */ + + }, { + key: '_resetCols', + value: function _resetCols() { + var i = this.cols; + this.positions = []; + while (i--) { + this.positions.push(0); + } + } + + /** + * Loops through each item that should be shown and calculates the x, y position. + * @param {Array.} items Array of items that will be shown/layed + * out in order in their array. + */ + + }, { + key: '_layout', + value: function _layout(items) { + var _this3 = this; + + var count = 0; + items.forEach(function (item) { + var currPos = item.point; + var currScale = item.scale; + var itemSize = Shuffle.getSize(item.element, true); + var pos = _this3._getItemPosition(itemSize); + + function callback() { + item.element.style.transitionDelay = ''; + item.applyCss(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Css.VISIBLE.after); + } + + // If the item will not change its position, do not add it to the render + // queue. Transitions don't fire when setting a property to the same value. + if (__WEBPACK_IMPORTED_MODULE_6__point__["a" /* default */].equals(currPos, pos) && currScale === __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Scale.VISIBLE) { + callback(); + return; + } + + item.point = pos; + item.scale = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Scale.VISIBLE; + + // Use xtend here to clone the object so that the `before` object isn't + // modified when the transition delay is added. + var styles = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Css.VISIBLE.before); + styles.transitionDelay = _this3._getStaggerAmount(count) + 'ms'; + + _this3._queue.push({ + item: item, + styles: styles, + callback: callback + }); + + count++; + }); + } + + /** + * Determine the location of the next item, based on its size. + * @param {{width: number, height: number}} itemSize Object with width and height. + * @return {Point} + * @private + */ + + }, { + key: '_getItemPosition', + value: function _getItemPosition(itemSize) { + return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_12__layout__["a" /* getItemPosition */])({ + itemSize: itemSize, + positions: this.positions, + gridSize: this.colWidth, + total: this.cols, + threshold: this.options.columnThreshold, + buffer: this.options.buffer + }); + } + + /** + * Hides the elements that don't match our filter. + * @param {Array.} collection Collection to shrink. + * @private + */ + + }, { + key: '_shrink', + value: function _shrink() { + var _this4 = this; + + var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._getConcealedItems(); + + var count = 0; + collection.forEach(function (item) { + function callback() { + item.applyCss(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Css.HIDDEN.after); + } + + // Continuing would add a transitionend event listener to the element, but + // that listener would not execute because the transform and opacity would + // stay the same. + // The callback is executed here because it is not guaranteed to be called + // after the transitionend event because the transitionend could be + // canceled if another animation starts. + if (item.scale === __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Scale.HIDDEN) { + callback(); + return; + } + + item.scale = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Scale.HIDDEN; + + var styles = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */].Css.HIDDEN.before); + styles.transitionDelay = _this4._getStaggerAmount(count) + 'ms'; + + _this4._queue.push({ + item: item, + styles: styles, + callback: callback + }); + + count++; + }); + } + + /** + * Resize handler. + * @private + */ + + }, { + key: '_handleResize', + value: function _handleResize() { + // If shuffle is disabled, destroyed, don't do anything + if (!this.isEnabled || this.isDestroyed) { + return; + } + + // Will need to check height in the future if it's layed out horizontaly + var containerWidth = Shuffle.getSize(this.element).width; + + // containerWidth hasn't changed, don't do anything + if (containerWidth === this.containerWidth) { + return; + } + + this.update(); + } + + /** + * Returns styles which will be applied to the an item for a transition. + * @param {Object} obj Transition options. + * @return {!Object} Transforms for transitions, left/top for animate. + * @private + */ + + }, { + key: '_getStylesForTransition', + value: function _getStylesForTransition(_ref2) { + var item = _ref2.item, + styles = _ref2.styles; + + if (!styles.transitionDelay) { + styles.transitionDelay = '0ms'; + } + + var x = item.point.x; + var y = item.point.y; + + if (this.options.useTransforms) { + styles.transform = 'translate(' + x + 'px, ' + y + 'px) scale(' + item.scale + ')'; + } else { + styles.left = x + 'px'; + styles.top = y + 'px'; + } + + return styles; + } + + /** + * Listen for the transition end on an element and execute the itemCallback + * when it finishes. + * @param {Element} element Element to listen on. + * @param {Function} itemCallback Callback for the item. + * @param {Function} done Callback to notify `parallel` that this one is done. + */ + + }, { + key: '_whenTransitionDone', + value: function _whenTransitionDone(element, itemCallback, done) { + var id = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_11__on_transition_end__["a" /* onTransitionEnd */])(element, function (evt) { + itemCallback(); + done(null, evt); + }); + + this._transitions.push(id); + } + + /** + * Return a function which will set CSS styles and call the `done` function + * when (if) the transition finishes. + * @param {Object} opts Transition object. + * @return {Function} A function to be called with a `done` function. + */ + + }, { + key: '_getTransitionFunction', + value: function _getTransitionFunction(opts) { + var _this5 = this; + + return function (done) { + opts.item.applyCss(_this5._getStylesForTransition(opts)); + _this5._whenTransitionDone(opts.item.element, opts.callback, done); + }; + } + + /** + * Execute the styles gathered in the style queue. This applies styles to elements, + * triggering transitions. + * @private + */ + + }, { + key: '_processQueue', + value: function _processQueue() { + if (this.isTransitioning) { + this._cancelMovement(); + } + + var hasSpeed = this.options.speed > 0; + var hasQueue = this._queue.length > 0; + + 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 + // the transitionend event. + } else { + this._dispatchLayout(); + } + + // Remove everything in the style queue + this._queue.length = 0; + } + + /** + * Wait for each transition to finish, the emit the layout event. + * @param {Array.} transitions Array of transition objects. + */ + + }, { + key: '_startTransitions', + value: function _startTransitions(transitions) { + 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 _this6._getTransitionFunction(obj); + }); + + __WEBPACK_IMPORTED_MODULE_5_array_parallel___default()(callbacks, this._movementFinished.bind(this)); + } + }, { + key: '_cancelMovement', + value: function _cancelMovement() { + // Remove the transition end event for each listener. + this._transitions.forEach(__WEBPACK_IMPORTED_MODULE_11__on_transition_end__["b" /* cancelTransitionEnd */]); + + // Reset the array. + this._transitions.length = 0; + + // Show it's no longer active. + this.isTransitioning = false; + } + + /** + * Apply styles without a transition. + * @param {Array.} objects Array of transition objects. + * @private + */ + + }, { + key: '_styleImmediately', + value: function _styleImmediately(objects) { + var _this7 = this; + + if (objects.length) { + var elements = objects.map(function (obj) { + return obj.item.element; + }); + + Shuffle._skipTransitions(elements, function () { + objects.forEach(function (obj) { + obj.item.applyCss(_this7._getStylesForTransition(obj)); + obj.callback(); + }); + }); + } + } + }, { + key: '_movementFinished', + value: function _movementFinished() { + this._transitions.length = 0; + this.isTransitioning = false; + this._dispatchLayout(); + } + }, { + key: '_dispatchLayout', + value: function _dispatchLayout() { + this._dispatch(Shuffle.EventType.LAYOUT); + } + + /** + * The magic. This is what makes the plugin 'shuffle' + * @param {string|Function|Array.} [category] Category to filter by. + * Can be a function, string, or array of strings. + * @param {Object} [sortObj] A sort object which can sort the visible set + */ + + }, { + key: 'filter', + value: function filter(category, sortObj) { + if (!this.isEnabled) { + return; + } + + if (!category || category && category.length === 0) { + category = Shuffle.ALL_ITEMS; + } + + this._filter(category); + + // Shrink each hidden item + this._shrink(); + + // How many visible elements? + this._updateItemCount(); + + // Update transforms on visible elements so they will animate to their new positions. + this.sort(sortObj); + } + + /** + * Gets the visible elements, sorts them, and passes them to layout. + * @param {Object} opts the options object for the sorted plugin + */ + + }, { + key: 'sort', + value: function sort() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastSort; + + if (!this.isEnabled) { + return; + } + + this._resetCols(); + + var items = this._getFilteredItems(); + items = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__sorter__["a" /* default */])(items, opts); + + this._layout(items); + + // `_layout` always happens after `_shrink`, so it's safe to process the style + // queue here with styles from the shrink method. + this._processQueue(); + + // Adjust the height of the container. + this._setContainerSize(); + + this.lastSort = opts; + } + + /** + * Reposition everything. + * @param {boolean} isOnlyLayout If true, column and gutter widths won't be + * recalculated. + */ + + }, { + key: 'update', + value: function update(isOnlyLayout) { + if (this.isEnabled) { + + if (!isOnlyLayout) { + // Get updated colCount + this._setColumns(); + } + + // Layout items + this.sort(); + } + } + + /** + * Use this instead of `update()` if you don't need the columns and gutters updated + * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations + * could be off. + */ + + }, { + key: 'layout', + value: function layout() { + this.update(true); + } + + /** + * New items have been appended to shuffle. Mix them in with the current + * filter or sort status. + * @param {Array.} newItems Collection of new items. + */ + + }, { + key: 'add', + value: function add(newItems) { + newItems = __WEBPACK_IMPORTED_MODULE_2_array_uniq___default()(newItems).map(function (el) { + return new __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */](el); + }); + + // Add classes and set initial positions. + this._initItems(newItems); + + // Add transition to each item. + this._setTransitions(newItems); + + // Update the list of items. + this.items = this.items.concat(newItems); + this._updateItemsOrder(); + this.filter(this.lastFilter); + } + + /** + * Disables shuffle from updating dimensions and layout on resize + */ + + }, { + key: 'disable', + value: function disable() { + this.isEnabled = false; + } + + /** + * Enables shuffle again + * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters + */ + + }, { + key: 'enable', + value: function enable(isUpdateLayout) { + this.isEnabled = true; + if (isUpdateLayout !== false) { + this.update(); + } + } + + /** + * Remove 1 or more shuffle items + * @param {Array.} collection An array containing one or more + * elements in shuffle + * @return {Shuffle} The shuffle object + */ + + }, { + key: 'remove', + value: function remove(collection) { + var _this8 = this; + + if (!collection.length) { + return; + } + + collection = __WEBPACK_IMPORTED_MODULE_2_array_uniq___default()(collection); + + var oldItems = collection.map(function (element) { + return _this8.getItemByElement(element); + }).filter(function (item) { + return !!item; + }); + + var handleLayout = function handleLayout() { + _this8.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout); + _this8._disposeItems(oldItems); + + // Remove the collection in the callback + collection.forEach(function (element) { + element.parentNode.removeChild(element); + }); + + _this8._dispatch(Shuffle.EventType.REMOVED, { collection: collection }); + + // Let it get garbage collected + collection = null; + oldItems = null; + }; + + // Hide collection first. + this._toggleFilterClasses({ + visible: [], + hidden: oldItems + }); + + this._shrink(oldItems); + + this.sort(); + + // Update the list of items here because `remove` could be called again + // with an item that is in the process of being removed. + this.items = this.items.filter(function (item) { + return !arrayIncludes(oldItems, item); + }); + this._updateItemCount(); + + this.element.addEventListener(Shuffle.EventType.LAYOUT, handleLayout); + } + + /** + * Retrieve a shuffle item by its element. + * @param {Element} element Element to look for. + * @return {?ShuffleItem} A shuffle item or null if it's not found. + */ + + }, { + key: 'getItemByElement', + value: function getItemByElement(element) { + for (var i = this.items.length - 1; i >= 0; i--) { + if (this.items[i].element === element) { + return this.items[i]; + } + } + + return null; + } + + /** + * Destroys shuffle, removes events, styles, and classes + */ + + }, { + key: 'destroy', + value: function destroy() { + this._cancelMovement(); + window.removeEventListener('resize', this._onResize); + + // Reset container styles + this.element.classList.remove('shuffle'); + this.element.removeAttribute('style'); + + // Reset individual item styles + this._disposeItems(); + + // Null DOM references + this.items = null; + this.options.sizer = null; + this.element = null; + this._transitions = null; + + // Set a flag so if a debounced resize has been triggered, + // it can first check if it is actually isDestroyed and not doing anything + this.isDestroyed = true; + } + + /** + * Returns the outer width of an element, optionally including its margins. + * + * There are a few different methods for getting the width of an element, none of + * which work perfectly for all Shuffle's use cases. + * + * 1. getBoundingClientRect() `left` and `right` properties. + * - Accounts for transform scaled elements, making it useless for Shuffle + * elements which have shrunk. + * 2. The `offsetWidth` property. + * - This value stays the same regardless of the elements transform property, + * however, it does not return subpixel values. + * 3. getComputedStyle() + * - This works great Chrome, Firefox, Safari, but IE<=11 does not include + * padding and border when box-sizing: border-box is set, requiring a feature + * test and extra work to add the padding back for IE and other browsers which + * follow the W3C spec here. + * + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {{width: number, height: number}} The width and height. + */ + + }], [{ + key: 'getSize', + value: function getSize(element, includeMargins) { + // Store the styles so that they can be used by others without asking for it again. + var styles = window.getComputedStyle(element, null); + var width = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'width', styles); + var height = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'height', styles); + + if (includeMargins) { + var marginLeft = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'marginLeft', styles); + var marginRight = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'marginRight', styles); + var marginTop = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'marginTop', styles); + var marginBottom = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__["a" /* default */])(element, 'marginBottom', styles); + width += marginLeft + marginRight; + height += marginTop + marginBottom; + } + + return { + width: width, + height: height + }; + } + + /** + * Change a property or execute a function which will not have a transition + * @param {Array.} elements DOM elements that won't be transitioned. + * @param {Function} callback A function which will be called while transition + * is set to 0ms. + * @private + */ + + }, { + key: '_skipTransitions', + value: function _skipTransitions(elements, callback) { + var zero = '0ms'; + + // Save current duration and delay. + var data = elements.map(function (element) { + var style = element.style; + var duration = style.transitionDuration; + var delay = style.transitionDelay; + + // Set the duration to zero so it happens immediately + style.transitionDuration = zero; + style.transitionDelay = zero; + + return { + duration: duration, + delay: delay + }; + }); + + callback(); + + // Cause reflow. + elements[0].offsetWidth; // jshint ignore:line + + // Put the duration back + elements.forEach(function (element, i) { + element.style.transitionDuration = data[i].duration; + element.style.transitionDelay = data[i].delay; + }); + } + }]); + + return Shuffle; +}(); + +Shuffle.ShuffleItem = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__["a" /* default */]; + +Shuffle.ALL_ITEMS = 'all'; +Shuffle.FILTER_ATTRIBUTE_KEY = 'groups'; + +/** + * @enum {string} + */ +Shuffle.EventType = { + LAYOUT: 'shuffle:layout', + REMOVED: 'shuffle:removed' +}; + +/** @enum {string} */ +Shuffle.Classes = __WEBPACK_IMPORTED_MODULE_8__classes__["a" /* default */]; + +// Overrideable options +Shuffle.options = { + // Initial filter group. + group: Shuffle.ALL_ITEMS, + + // Transition/animation speed (milliseconds). + speed: 250, + + // CSS easing function to use. + easing: 'ease', + + // e.g. '.picture-item'. + itemSelector: '*', + + // Element or selector string. Use an element to determine the size of columns + // and gutters. + sizer: null, + + // A static number or function that tells the plugin how wide the gutters + // between columns are (in pixels). + gutterWidth: 0, + + // A static number or function that returns a number which tells the plugin + // how wide the columns are (in pixels). + columnWidth: 0, + + // If your group is not json, and is comma delimeted, you could set delimeter + // to ','. + delimeter: null, + + // Useful for percentage based heights when they might not always be exactly + // the same (in pixels). + buffer: 0, + + // Reading the width of elements isn't precise enough and can cause columns to + // jump between values. + columnThreshold: 0.01, + + // Shuffle can be isInitialized with a sort object. It is the same object + // given to the sort method. + initialSort: null, + + // By default, shuffle will throttle resize events. This can be changed or + // removed. + throttle: __WEBPACK_IMPORTED_MODULE_4_throttleit___default.a, + + // How often shuffle can be called on resize (in milliseconds). + throttleTime: 300, + + // Transition delay offset for each item in milliseconds. + staggerAmount: 15, + + // Maximum stagger delay in milliseconds. + staggerAmountMax: 250, + + // Whether to use transforms or absolute positioning. + useTransforms: true +}; + +// Expose for testing. Hack at your own risk. +Shuffle.__Point = __WEBPACK_IMPORTED_MODULE_6__point__["a" /* default */]; +Shuffle.__sorter = __WEBPACK_IMPORTED_MODULE_10__sorter__["a" /* default */]; +Shuffle.__getColumnSpan = __WEBPACK_IMPORTED_MODULE_12__layout__["b" /* getColumnSpan */]; +Shuffle.__getAvailablePositions = __WEBPACK_IMPORTED_MODULE_12__layout__["c" /* getAvailablePositions */]; +Shuffle.__getShortColumn = __WEBPACK_IMPORTED_MODULE_12__layout__["d" /* getShortColumn */]; + +/* harmony default export */ __webpack_exports__["default"] = Shuffle; + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +module.exports = function parallel(fns, context, callback) { + if (!callback) { + if (typeof context === 'function') { + callback = context + context = null + } else { + callback = noop + } + } + + var pending = fns && fns.length + if (!pending) return callback(null, []); + + var finished = false + var results = new Array(pending) + + fns.forEach(context ? function (fn, i) { + fn.call(context, maybeDone(i)) + } : function (fn, i) { + fn(maybeDone(i)) + }) + + function maybeDone(i) { + return function (err, result) { + if (finished) return; + + if (err) { + callback(err, results) + finished = true + return + } + + results[i] = result + + if (!--pending) callback(null, results); + } + } +} + +function noop() {} + + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +// there's 3 implementations written in increasing order of efficiency + +// 1 - no Set type is defined +function uniqNoSet(arr) { + var ret = []; + + for (var i = 0; i < arr.length; i++) { + if (ret.indexOf(arr[i]) === -1) { + ret.push(arr[i]); } - - return ret; - } - - // 2 - a simple Set type is defined - function uniqSet(arr) { - var seen = new Set(); - return arr.filter(function (el) { - if (!seen.has(el)) { - seen.add(el); - return true; - } - - return false; - }); - } - - // 3 - a standard Set type is defined and it has a forEach method - function uniqSetWithForEach(arr) { - var ret = []; - - (new Set(arr)).forEach(function (el) { - ret.push(el); - }); - - return ret; - } - - // V8 currently has a broken implementation - // https://github.com/joyent/node/issues/8449 - function doesForEachActuallyWork() { - var ret = false; - - (new Set([true])).forEach(function (el) { - ret = el; - }); - - return ret === true; } - - if ('Set' in global) { - if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { - module.exports = uniqSetWithForEach; - } else { - module.exports = uniqSet; + + return ret; +} + +// 2 - a simple Set type is defined +function uniqSet(arr) { + var seen = new Set(); + return arr.filter(function (el) { + if (!seen.has(el)) { + seen.add(el); + return true; } - } else { - module.exports = uniqNoSet; - } - - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) -/***/ }, -/* 5 */ -/***/ function(module, exports) { - - module.exports = extend - - var hasOwnProperty = Object.prototype.hasOwnProperty; - - function extend() { - var target = {} - - for (var i = 0; i < arguments.length; i++) { - var source = arguments[i] - - for (var key in source) { - if (hasOwnProperty.call(source, key)) { - target[key] = source[key] - } - } - } - - return target - } + return false; + }); +} +// 3 - a standard Set type is defined and it has a forEach method +function uniqSetWithForEach(arr) { + var ret = []; -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - module.exports = throttle; - - /** - * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds. - * - * @param {Function} func Function to wrap. - * @param {Number} wait Number of milliseconds that must elapse between `func` invocations. - * @return {Function} A new function that wraps the `func` function passed in. - */ - - function throttle (func, wait) { - var ctx, args, rtn, timeoutID; // caching - var last = 0; - - return function throttled () { - ctx = this; - args = arguments; - var delta = new Date() - last; - if (!timeoutID) - if (delta >= wait) call(); - else timeoutID = setTimeout(call, wait - delta); - return rtn; - }; - - function call () { - timeoutID = 0; - last = +new Date(); - rtn = func.apply(ctx, args); - ctx = null; - args = null; - } + (new Set(arr)).forEach(function (el) { + ret.push(el); + }); + + return ret; +} + +// V8 currently has a broken implementation +// https://github.com/joyent/node/issues/8449 +function doesForEachActuallyWork() { + var ret = false; + + (new Set([true])).forEach(function (el) { + ret = el; + }); + + return ret === true; +} + +if ('Set' in global) { + if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { + module.exports = uniqSetWithForEach; + } else { + module.exports = uniqSet; } +} else { + module.exports = uniqNoSet; +} +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16))) -/***/ }, +/***/ }), /* 7 */ -/***/ function(module, exports) { - - module.exports = function parallel(fns, context, callback) { - if (!callback) { - if (typeof context === 'function') { - callback = context - context = null - } else { - callback = noop - } - } - - var pending = fns && fns.length - if (!pending) return callback(null, []); - - var finished = false - var results = new Array(pending) - - fns.forEach(context ? function (fn, i) { - fn.call(context, maybeDone(i)) - } : function (fn, i) { - fn(maybeDone(i)) - }) - - function maybeDone(i) { - return function (err, result) { - if (finished) return; - - if (err) { - callback(err, results) - finished = true - return - } - - results[i] = result - - if (!--pending) callback(null, results); - } - } - } - - function noop() {} +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; + +var element = document.body || document.documentElement; +var e = document.createElement('div'); +e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;'; +element.appendChild(e); + +var width = window.getComputedStyle(e, null).width; +var ret = width === '10px'; + +element.removeChild(e); +/* harmony default export */ __webpack_exports__["a"] = ret; -/***/ }, +/***/ }), /* 8 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _getNumber = __webpack_require__(9); - - var _getNumber2 = _interopRequireDefault(_getNumber); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * Represents a coordinate pair. - * @param {number} [x=0] X. - * @param {number} [y=0] Y. - */ - var Point = function Point(x, y) { - this.x = (0, _getNumber2.default)(x); - this.y = (0, _getNumber2.default)(y); - }; - - /** - * Whether two points are equal. - * @param {Point} a Point A. - * @param {Point} b Point B. - * @return {boolean} - */ - Point.equals = function (a, b) { - return a.x === b.x && a.y === b.y; - }; - - exports.default = Point; - -/***/ }, +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_number__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__computed_size__ = __webpack_require__(7); +/* harmony export (immutable) */ __webpack_exports__["a"] = getNumberStyle; + + + + + +/** + * Retrieve the computed style for an element, parsed as a float. + * @param {Element} element Element to get style for. + * @param {string} style Style property. + * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to + * use instead of asking for them again. + * @return {number} The parsed computed value or zero if that fails because IE + * will return 'auto' when the element doesn't have margins instead of + * the computed style. + */ +function getNumberStyle(element, style) { + var styles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window.getComputedStyle(element, null); + + var value = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles[style]); + + // Support IE<=11 and W3C spec. + if (!__WEBPACK_IMPORTED_MODULE_1__computed_size__["a" /* default */] && style === 'width') { + value += __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.paddingLeft) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.paddingRight) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.borderLeftWidth) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.borderRightWidth); + } else if (!__WEBPACK_IMPORTED_MODULE_1__computed_size__["a" /* default */] && style === 'height') { + value += __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.paddingTop) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.paddingBottom) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.borderTopWidth) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__["a" /* default */])(styles.borderBottomWidth); + } + + return value; +} + +/***/ }), /* 9 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Always returns a numeric value, given a value. Logic from jQuery's `isNumeric`. - * @param {*} value Possibly numeric value. - * @return {number} `value` or zero if `value` isn't numeric. - */ - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = getNumber; - function getNumber(value) { - return parseFloat(value) || 0; - } +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__point__ = __webpack_require__(0); +/* harmony export (immutable) */ __webpack_exports__["a"] = getItemPosition; +/* harmony export (immutable) */ __webpack_exports__["b"] = getColumnSpan; +/* harmony export (immutable) */ __webpack_exports__["c"] = getAvailablePositions; +/* harmony export (immutable) */ __webpack_exports__["d"] = getShortColumn; + + + + +function arrayMax(array) { + return Math.max.apply(Math, array); +} + +function arrayMin(array) { + return Math.min.apply(Math, array); +} + +/** + * Determine the location of the next item, based on its size. + * @param {Object} itemSize Object with width and height. + * @param {Array.} positions Positions of the other current items. + * @param {number} gridSize The column width or row height. + * @param {number} total The total number of columns or rows. + * @param {number} threshold Buffer value for the column to fit. + * @param {number} buffer Vertical buffer for the height of items. + * @return {Point} + */ +function getItemPosition(_ref) { + var itemSize = _ref.itemSize, + positions = _ref.positions, + gridSize = _ref.gridSize, + total = _ref.total, + threshold = _ref.threshold, + buffer = _ref.buffer; + + var span = getColumnSpan(itemSize.width, gridSize, total, threshold); + var setY = getAvailablePositions(positions, span, total); + var shortColumnIndex = getShortColumn(setY, buffer); + + // Position the item + var point = new __WEBPACK_IMPORTED_MODULE_0__point__["a" /* default */](Math.round(gridSize * shortColumnIndex), Math.round(setY[shortColumnIndex])); + + // Update the columns array with the new values for each column. + // e.g. before the update the columns could be [250, 0, 0, 0] for an item + // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0]. + var setHeight = setY[shortColumnIndex] + itemSize.height; + for (var i = 0; i < span; i++) { + positions[shortColumnIndex + i] = setHeight; + } -/***/ }, + return point; +} + +/** + * Determine the number of columns an items spans. + * @param {number} itemWidth Width of the item. + * @param {number} columnWidth Width of the column (includes gutter). + * @param {number} columns Total number of columns + * @param {number} threshold A buffer value for the size of the column to fit. + * @return {number} + */ +function getColumnSpan(itemWidth, columnWidth, columns, threshold) { + var columnSpan = itemWidth / columnWidth; + + // If the difference between the rounded column span number and the + // calculated column span number is really small, round the number to + // make it fit. + if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) { + // e.g. columnSpan = 4.0089945390298745 + columnSpan = Math.round(columnSpan); + } + + // Ensure the column span is not more than the amount of columns in the whole layout. + return Math.min(Math.ceil(columnSpan), columns); +} + +/** + * Retrieves the column set to use for placement. + * @param {number} columnSpan The number of columns this current item spans. + * @param {number} columns The total columns in the grid. + * @return {Array.} An array of numbers represeting the column set. + */ +function getAvailablePositions(positions, columnSpan, columns) { + // The item spans only one column. + if (columnSpan === 1) { + return positions; + } + + // The item spans more than one column, figure out how many different + // places it could fit horizontally. + // The group count is the number of places within the positions this block + // could fit, ignoring the current positions of items. + // Imagine a 2 column brick as the second item in a 4 column grid with + // 10px height each. Find the places it would fit: + // [20, 10, 10, 0] + // | | | + // * * * + // + // Then take the places which fit and get the bigger of the two: + // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0] + // + // Next, find the first smallest number (the short column). + // [20, 10, 0] + // | + // * + // + // And that's where it should be placed! + // + // Another example where the second column's item extends past the first: + // [10, 20, 10, 0] => [20, 20, 10] => 10 + var available = []; + + // For how many possible positions for this item there are. + for (var i = 0; i <= columns - columnSpan; i++) { + // Find the bigger value for each place it could fit. + available.push(arrayMax(positions.slice(i, i + columnSpan))); + } + + return available; +} + +/** + * Find index of short column, the first from the left where this item will go. + * + * @param {Array.} positions The array to search for the smallest number. + * @param {number} buffer Optional buffer which is very useful when the height + * is a percentage of the width. + * @return {number} Index of the short column. + */ +function getShortColumn(positions, buffer) { + var minPosition = arrayMin(positions); + for (var i = 0, len = positions.length; i < len; i++) { + if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) { + return i; + } + } + + return 0; +} + +/***/ }), /* 10 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _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; }; }(); - - var _point = __webpack_require__(8); - - var _point2 = _interopRequireDefault(_point); - - var _classes = __webpack_require__(11); - - var _classes2 = _interopRequireDefault(_classes); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var id = 0; - - var ShuffleItem = function () { - function ShuffleItem(element) { - _classCallCheck(this, ShuffleItem); - - this.id = id++; - this.element = element; - this.isVisible = true; - } - - _createClass(ShuffleItem, [{ - key: 'show', - value: function show() { - this.isVisible = true; - this.element.classList.remove(_classes2.default.HIDDEN); - this.element.classList.add(_classes2.default.VISIBLE); - } - }, { - key: 'hide', - value: function hide() { - this.isVisible = false; - this.element.classList.remove(_classes2.default.VISIBLE); - this.element.classList.add(_classes2.default.HIDDEN); - } - }, { - key: 'init', - value: function init() { - this.addClasses([_classes2.default.SHUFFLE_ITEM, _classes2.default.VISIBLE]); - this.applyCss(ShuffleItem.Css.INITIAL); - this.scale = ShuffleItem.Scale.VISIBLE; - this.point = new _point2.default(); - } - }, { - key: 'addClasses', - value: function addClasses(classes) { - var _this = this; - - classes.forEach(function (className) { - _this.element.classList.add(className); - }); - } - }, { - key: 'removeClasses', - value: function removeClasses(classes) { - var _this2 = this; - - classes.forEach(function (className) { - _this2.element.classList.remove(className); - }); - } - }, { - key: 'applyCss', - value: function applyCss(obj) { - for (var key in obj) { - this.element.style[key] = obj[key]; - } - } - }, { - key: 'dispose', - value: function dispose() { - this.removeClasses([_classes2.default.HIDDEN, _classes2.default.VISIBLE, _classes2.default.SHUFFLE_ITEM]); - - this.element.removeAttribute('style'); - this.element = null; - } - }]); - - return ShuffleItem; - }(); - - ShuffleItem.Css = { - INITIAL: { - position: 'absolute', - top: 0, - left: 0, - visibility: 'visible', - 'will-change': 'transform' - }, - VISIBLE: { - before: { - opacity: 1, - visibility: 'visible' - }, - after: {} - }, - HIDDEN: { - before: { - opacity: 0 - }, - after: { - visibility: 'hidden' - } - } - }; - - ShuffleItem.Scale = { - VISIBLE: 1, - HIDDEN: 0.001 - }; - - exports.default = ShuffleItem; - -/***/ }, +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = onTransitionEnd; +/* harmony export (immutable) */ __webpack_exports__["b"] = cancelTransitionEnd; + + +var transitions = {}; +var eventName = 'transitionend'; +var count = 0; + +function uniqueId() { + return eventName + count++; +} + +function onTransitionEnd(element, callback) { + var id = uniqueId(); + var listener = function listener(evt) { + if (evt.currentTarget === evt.target) { + cancelTransitionEnd(id); + callback(evt); + } + }; + + element.addEventListener(eventName, listener); + + transitions[id] = { element: element, listener: listener }; + + return id; +} + +function cancelTransitionEnd(id) { + if (transitions[id]) { + transitions[id].element.removeEventListener(eventName, transitions[id].listener); + transitions[id] = null; + return true; + } + + return false; +} + +/***/ }), /* 11 */ -/***/ function(module, exports) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = { - BASE: 'shuffle', - SHUFFLE_ITEM: 'shuffle-item', - VISIBLE: 'shuffle-item--visible', - HIDDEN: 'shuffle-item--hidden' - }; - -/***/ }, +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__point__ = __webpack_require__(0); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__classes__ = __webpack_require__(1); +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + + + +var id = 0; + +var ShuffleItem = function () { + function ShuffleItem(element) { + _classCallCheck(this, ShuffleItem); + + this.id = id++; + this.element = element; + this.isVisible = true; + } + + _createClass(ShuffleItem, [{ + key: 'show', + value: function show() { + this.isVisible = true; + this.element.classList.remove(__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].HIDDEN); + this.element.classList.add(__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].VISIBLE); + } + }, { + key: 'hide', + value: function hide() { + this.isVisible = false; + this.element.classList.remove(__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].VISIBLE); + this.element.classList.add(__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].HIDDEN); + } + }, { + key: 'init', + value: function init() { + this.addClasses([__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].SHUFFLE_ITEM, __WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].VISIBLE]); + this.applyCss(ShuffleItem.Css.INITIAL); + this.scale = ShuffleItem.Scale.VISIBLE; + this.point = new __WEBPACK_IMPORTED_MODULE_0__point__["a" /* default */](); + } + }, { + key: 'addClasses', + value: function addClasses(classes) { + var _this = this; + + classes.forEach(function (className) { + _this.element.classList.add(className); + }); + } + }, { + key: 'removeClasses', + value: function removeClasses(classes) { + var _this2 = this; + + classes.forEach(function (className) { + _this2.element.classList.remove(className); + }); + } + }, { + key: 'applyCss', + value: function applyCss(obj) { + for (var key in obj) { + this.element.style[key] = obj[key]; + } + } + }, { + key: 'dispose', + value: function dispose() { + this.removeClasses([__WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].HIDDEN, __WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].VISIBLE, __WEBPACK_IMPORTED_MODULE_1__classes__["a" /* default */].SHUFFLE_ITEM]); + + this.element.removeAttribute('style'); + this.element = null; + } + }]); + + return ShuffleItem; +}(); + +ShuffleItem.Css = { + INITIAL: { + position: 'absolute', + top: 0, + left: 0, + visibility: 'visible', + 'will-change': 'transform' + }, + VISIBLE: { + before: { + opacity: 1, + visibility: 'visible' + }, + after: {} + }, + HIDDEN: { + before: { + opacity: 0 + }, + after: { + visibility: 'hidden' + } + } +}; + +ShuffleItem.Scale = { + VISIBLE: 1, + HIDDEN: 0.001 +}; + +/* harmony default export */ __webpack_exports__["a"] = ShuffleItem; + +/***/ }), /* 12 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_xtend__ = __webpack_require__(3); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_xtend___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_xtend__); +/* harmony export (immutable) */ __webpack_exports__["a"] = sorter; + - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = getNumberStyle; - - var _getNumber = __webpack_require__(9); - - var _getNumber2 = _interopRequireDefault(_getNumber); - - var _computedSize = __webpack_require__(13); - - var _computedSize2 = _interopRequireDefault(_computedSize); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - /** - * Retrieve the computed style for an element, parsed as a float. - * @param {Element} element Element to get style for. - * @param {string} style Style property. - * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to - * use instead of asking for them again. - * @return {number} The parsed computed value or zero if that fails because IE - * will return 'auto' when the element doesn't have margins instead of - * the computed style. - */ - function getNumberStyle(element, style) { - var styles = arguments.length <= 2 || arguments[2] === undefined ? window.getComputedStyle(element, null) : arguments[2]; - - var value = (0, _getNumber2.default)(styles[style]); - - // Support IE<=11 and W3C spec. - if (!_computedSize2.default && style === 'width') { - value += (0, _getNumber2.default)(styles.paddingLeft) + (0, _getNumber2.default)(styles.paddingRight) + (0, _getNumber2.default)(styles.borderLeftWidth) + (0, _getNumber2.default)(styles.borderRightWidth); - } else if (!_computedSize2.default && style === 'height') { - value += (0, _getNumber2.default)(styles.paddingTop) + (0, _getNumber2.default)(styles.paddingBottom) + (0, _getNumber2.default)(styles.borderTopWidth) + (0, _getNumber2.default)(styles.borderBottomWidth); - } - - return value; - } -/***/ }, + +// http://stackoverflow.com/a/962890/373422 +function randomize(array) { + var tmp; + var current; + var top = array.length; + + if (!top) { + return array; + } + + while (--top) { + current = Math.floor(Math.random() * (top + 1)); + tmp = array[current]; + array[current] = array[top]; + array[top] = tmp; + } + + return array; +} + +var defaults = { + // Use array.reverse() to reverse the results + reverse: false, + + // Sorting function + by: null, + + // If true, this will skip the sorting and return a randomized order in the array + randomize: false, + + // Determines which property of each item in the array is passed to the + // sorting method. + key: 'element' +}; + +// You can return `undefined` from the `by` function to revert to DOM order. +function sorter(arr, options) { + var opts = __WEBPACK_IMPORTED_MODULE_0_xtend___default()(defaults, options); + var original = [].slice.call(arr); + var revert = false; + + if (!arr.length) { + return []; + } + + if (opts.randomize) { + return randomize(arr); + } + + // Sort the elements by the opts.by function. + // If we don't have opts.by, default to DOM order + if (typeof opts.by === 'function') { + arr.sort(function (a, b) { + + // Exit early if we already know we want to revert + if (revert) { + return 0; + } + + var valA = opts.by(a[opts.key]); + var valB = opts.by(b[opts.key]); + + // If both values are undefined, use the DOM order + if (valA === undefined && valB === undefined) { + revert = true; + return 0; + } + + if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') { + return -1; + } + + if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') { + return 1; + } + + return 0; + }); + } + + // Revert to the original array if necessary + if (revert) { + return original; + } + + if (opts.reverse) { + arr.reverse(); + } + + return arr; +} + +/***/ }), /* 13 */ -/***/ function(module, exports) { +/***/ (function(module, exports) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var element = document.body || document.documentElement; - var e = document.createElement('div'); - e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;'; - element.appendChild(e); - - var width = window.getComputedStyle(e, null).width; - var ret = width === '10px'; - - element.removeChild(e); - - exports.default = ret; - -/***/ }, +// Polyfill for creating CustomEvents on IE9/10/11 + +// code pulled from: +// https://github.com/d4tocchini/customevent-polyfill +// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill + +try { + var ce = new window.CustomEvent('test'); + ce.preventDefault(); + if (ce.defaultPrevented !== true) { + // IE has problems with .preventDefault() on custom events + // http://stackoverflow.com/questions/23349191 + throw new Error('Could not prevent default'); + } +} catch(e) { + var CustomEvent = function(event, params) { + var evt, origPrevent; + params = params || { + bubbles: false, + cancelable: false, + detail: undefined + }; + + evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + origPrevent = evt.preventDefault; + evt.preventDefault = function () { + origPrevent.call(this); + try { + Object.defineProperty(this, 'defaultPrevented', { + get: function () { + return true; + } + }); + } catch(e) { + this.defaultPrevented = true; + } + }; + return evt; + }; + + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; // expose definition to window +} + + +/***/ }), /* 14 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = sorter; - - var _xtend = __webpack_require__(5); - - var _xtend2 = _interopRequireDefault(_xtend); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - // http://stackoverflow.com/a/962890/373422 - function randomize(array) { - var tmp; - var current; - var top = array.length; - - if (!top) { - return array; - } - - while (--top) { - current = Math.floor(Math.random() * (top + 1)); - tmp = array[current]; - array[current] = array[top]; - array[top] = tmp; - } - - return array; - } - - var defaults = { - // Use array.reverse() to reverse the results - reverse: false, - - // Sorting function - by: null, - - // If true, this will skip the sorting and return a randomized order in the array - randomize: false, - - // Determines which property of each item in the array is passed to the - // sorting method. - key: 'element' - }; - - // You can return `undefined` from the `by` function to revert to DOM order. - function sorter(arr, options) { - var opts = (0, _xtend2.default)(defaults, options); - var original = [].slice.call(arr); - var revert = false; - - if (!arr.length) { - return []; - } - - if (opts.randomize) { - return randomize(arr); - } - - // Sort the elements by the opts.by function. - // If we don't have opts.by, default to DOM order - if (typeof opts.by === 'function') { - arr.sort(function (a, b) { - - // Exit early if we already know we want to revert - if (revert) { - return 0; - } - - var valA = opts.by(a[opts.key]); - var valB = opts.by(b[opts.key]); - - // If both values are undefined, use the DOM order - if (valA === undefined && valB === undefined) { - revert = true; - return 0; - } - - if (valA < valB || valA === 'sortFirst' || valB === 'sortLast') { - return -1; - } - - if (valA > valB || valA === 'sortLast' || valB === 'sortFirst') { - return 1; - } - - return 0; - }); - } - - // Revert to the original array if necessary - if (revert) { - return original; - } - - if (opts.reverse) { - arr.reverse(); - } - - return arr; - } +"use strict"; + + +var proto = Element.prototype; +var vendor = proto.matches + || proto.matchesSelector + || proto.webkitMatchesSelector + || proto.mozMatchesSelector + || proto.msMatchesSelector + || proto.oMatchesSelector; + +module.exports = match; -/***/ }, +/** + * Match `el` to `selector`. + * + * @param {Element} el + * @param {String} selector + * @return {Boolean} + * @api public + */ + +function match(el, selector) { + if (vendor) return vendor.call(el, selector); + var nodes = el.parentNode.querySelectorAll(selector); + for (var i = 0; i < nodes.length; i++) { + if (nodes[i] == el) return true; + } + return false; +} + +/***/ }), /* 15 */ -/***/ function(module, exports) { +/***/ (function(module, exports) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.onTransitionEnd = onTransitionEnd; - exports.cancelTransitionEnd = cancelTransitionEnd; - var transitions = {}; - var eventName = 'transitionend'; - var count = 0; - - function uniqueId() { - return eventName + count++; - } - - function onTransitionEnd(element, callback) { - var id = uniqueId(); - var listener = function listener(evt) { - if (evt.currentTarget === evt.target) { - cancelTransitionEnd(id); - callback(evt); - } - }; - - element.addEventListener(eventName, listener); - - transitions[id] = { element: element, listener: listener }; - - return id; - } - - function cancelTransitionEnd(id) { - if (transitions[id]) { - transitions[id].element.removeEventListener(eventName, transitions[id].listener); - transitions[id] = null; - return true; - } - - return false; - } +module.exports = throttle; + +/** + * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds. + * + * @param {Function} func Function to wrap. + * @param {Number} wait Number of milliseconds that must elapse between `func` invocations. + * @return {Function} A new function that wraps the `func` function passed in. + */ -/***/ }, +function throttle (func, wait) { + var ctx, args, rtn, timeoutID; // caching + var last = 0; + + return function throttled () { + ctx = this; + args = arguments; + var delta = new Date() - last; + if (!timeoutID) + if (delta >= wait) call(); + else timeoutID = setTimeout(call, wait - delta); + return rtn; + }; + + function call () { + timeoutID = 0; + last = +new Date(); + rtn = func.apply(ctx, args); + ctx = null; + args = null; + } +} + + +/***/ }), /* 16 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.getItemPosition = getItemPosition; - exports.getColumnSpan = getColumnSpan; - exports.getAvailablePositions = getAvailablePositions; - exports.getShortColumn = getShortColumn; - - var _point = __webpack_require__(8); - - var _point2 = _interopRequireDefault(_point); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function arrayMax(array) { - return Math.max.apply(Math, array); - } - - function arrayMin(array) { - return Math.min.apply(Math, array); - } - - /** - * Determine the location of the next item, based on its size. - * @param {Object} itemSize Object with width and height. - * @param {Array.} positions Positions of the other current items. - * @param {number} gridSize The column width or row height. - * @param {number} total The total number of columns or rows. - * @param {number} threshold Buffer value for the column to fit. - * @param {number} buffer Vertical buffer for the height of items. - * @return {Point} - */ - function getItemPosition(_ref) { - var itemSize = _ref.itemSize; - var positions = _ref.positions; - var gridSize = _ref.gridSize; - var total = _ref.total; - var threshold = _ref.threshold; - var buffer = _ref.buffer; - - var span = getColumnSpan(itemSize.width, gridSize, total, threshold); - var setY = getAvailablePositions(positions, span, total); - var shortColumnIndex = getShortColumn(setY, buffer); - - // Position the item - var point = new _point2.default(Math.round(gridSize * shortColumnIndex), Math.round(setY[shortColumnIndex])); - - // Update the columns array with the new values for each column. - // e.g. before the update the columns could be [250, 0, 0, 0] for an item - // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0]. - var setHeight = setY[shortColumnIndex] + itemSize.height; - for (var i = 0; i < span; i++) { - positions[shortColumnIndex + i] = setHeight; - } - - return point; - } - - /** - * Determine the number of columns an items spans. - * @param {number} itemWidth Width of the item. - * @param {number} columnWidth Width of the column (includes gutter). - * @param {number} columns Total number of columns - * @param {number} threshold A buffer value for the size of the column to fit. - * @return {number} - */ - function getColumnSpan(itemWidth, columnWidth, columns, threshold) { - var columnSpan = itemWidth / columnWidth; - - // If the difference between the rounded column span number and the - // calculated column span number is really small, round the number to - // make it fit. - if (Math.abs(Math.round(columnSpan) - columnSpan) < threshold) { - // e.g. columnSpan = 4.0089945390298745 - columnSpan = Math.round(columnSpan); - } - - // Ensure the column span is not more than the amount of columns in the whole layout. - return Math.min(Math.ceil(columnSpan), columns); - } - - /** - * Retrieves the column set to use for placement. - * @param {number} columnSpan The number of columns this current item spans. - * @param {number} columns The total columns in the grid. - * @return {Array.} An array of numbers represeting the column set. - */ - function getAvailablePositions(positions, columnSpan, columns) { - // The item spans only one column. - if (columnSpan === 1) { - return positions; - } - - // The item spans more than one column, figure out how many different - // places it could fit horizontally. - // The group count is the number of places within the positions this block - // could fit, ignoring the current positions of items. - // Imagine a 2 column brick as the second item in a 4 column grid with - // 10px height each. Find the places it would fit: - // [20, 10, 10, 0] - // | | | - // * * * - // - // Then take the places which fit and get the bigger of the two: - // max([20, 10]), max([10, 10]), max([10, 0]) = [20, 10, 0] - // - // Next, find the first smallest number (the short column). - // [20, 10, 0] - // | - // * - // - // And that's where it should be placed! - // - // Another example where the second column's item extends past the first: - // [10, 20, 10, 0] => [20, 20, 10] => 10 - var available = []; - - // For how many possible positions for this item there are. - for (var i = 0; i <= columns - columnSpan; i++) { - // Find the bigger value for each place it could fit. - available.push(arrayMax(positions.slice(i, i + columnSpan))); - } - - return available; - } - - /** - * Find index of short column, the first from the left where this item will go. - * - * @param {Array.} positions The array to search for the smallest number. - * @param {number} buffer Optional buffer which is very useful when the height - * is a percentage of the width. - * @return {number} Index of the short column. - */ - function getShortColumn(positions, buffer) { - var minPosition = arrayMin(positions); - for (var i = 0, len = positions.length; i < len; i++) { - if (positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer) { - return i; - } - } - - return 0; - } +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(4).default; -/***/ } -/******/ ]) +/***/ }) +/******/ ]); }); -; //# sourceMappingURL=shuffle.js.map \ No newline at end of file diff --git a/dist/shuffle.js.map b/dist/shuffle.js.map index c8aea7f..67dfa2f 100644 --- a/dist/shuffle.js.map +++ b/dist/shuffle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 6540d140dc5adcdc9ea3","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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","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 6540d140dc5adcdc9ea3\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 keys = this.options.delimeter ?\n attr.split(this.options.delimeter) :\n JSON.parse(attr);\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\n\t\treturn false;\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 2bda26189da0ab787d25","webpack:///./src/point.js","webpack:///./src/classes.js","webpack:///./src/get-number.js","webpack:///./~/xtend/immutable.js","webpack:///./src/shuffle.js","webpack:///./~/array-parallel/index.js","webpack:///./~/array-uniq/index.js","webpack:///./src/computed-size.js","webpack:///./src/get-number-style.js","webpack:///./src/layout.js","webpack:///./src/on-transition-end.js","webpack:///./src/shuffle-item.js","webpack:///./src/sorter.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/throttleit/index.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/index.js"],"names":["Point","x","y","getNumber","equals","a","b","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","value","parseFloat","toArray","arrayLike","Array","prototype","slice","call","arrayMax","array","Math","max","apply","arrayIncludes","obj","arguments","length","indexOf","id","Shuffle","element","options","xtend","useSizer","lastSort","group","lastFilter","ALL_ITEMS","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","TypeError","_init","items","_getItems","sizer","classList","add","Classes","_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","visible","hidden","forEach","item","_doesPassFilter","push","attr","getAttribute","FILTER_ATTRIBUTE_KEY","keys","delimeter","split","JSON","parse","isArray","some","show","hide","init","dispose","visibleItems","_getFilteredItems","str","useTransforms","children","matches","el","itemSelector","map","sorter","by","isVisible","gutterSize","size","columnWidth","gutterWidth","getNumberStyle","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","i","count","currPos","point","currScale","scale","itemSize","pos","_getItemPosition","callback","transitionDelay","applyCss","ShuffleItem","Css","after","Scale","before","_getStaggerAmount","getItemPosition","gridSize","total","threshold","buffer","_getConcealedItems","update","transform","left","top","itemCallback","done","onTransitionEnd","evt","opts","_getStylesForTransition","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatchLayout","transitions","callbacks","_getTransitionFunction","parallel","_movementFinished","objects","elements","_skipTransitions","_dispatch","EventType","LAYOUT","sortObj","_filter","_shrink","_updateItemCount","sort","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","arrayUnique","concat","_updateItemsOrder","isUpdateLayout","oldItems","getItemByElement","handleLayout","removeEventListener","_disposeItems","parentNode","removeChild","REMOVED","remove","removeAttribute","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","data","duration","transitionDuration","delay","__Point","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","document","body","documentElement","e","createElement","cssText","appendChild","ret","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","arrayMin","span","getColumnSpan","setY","getAvailablePositions","shortColumnIndex","getShortColumn","setHeight","itemWidth","columns","columnSpan","ceil","available","minPosition","len","eventName","uniqueId","listener","currentTarget","target","cancelTransitionEnd","addClasses","INITIAL","classes","className","key","removeClasses","visibility","opacity","randomize","tmp","current","random","defaults","reverse","arr","original","revert","valA","valB","undefined","module","exports","require","default"],"mappings":"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OD,QAAP;AACD;;AAED,MAAIhH,KAAK8G,OAAT,EAAkB;AAChBC,QAAID,OAAJ;AACD;;AAED,SAAOC,GAAP;AACD,C;;;;;;AC9FD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA,C;;;;;;AC5BA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,YAAY,SAAS;AACrB;;AAEA;AACA,gCAAgC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/BA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;ACpBAM,OAAOC,OAAP,GAAiB,mBAAAC,CAAQ,CAAR,EAAqBC,OAAtC,C","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"," \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\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\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.l = 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// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2bda26189da0ab787d25","'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","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","'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","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 = 3\n// module chunks = 0","'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 keys = this.options.delimeter ?\n attr.split(this.options.delimeter) :\n JSON.parse(attr);\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","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 = 5\n// module chunks = 0","'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\n\t\treturn false;\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 = 6\n// module chunks = 0","\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","'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","'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","'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","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","'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","// 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 var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\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 origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\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 = 13\n// module chunks = 0","'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 = 14\n// module chunks = 0","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 = 15\n// module chunks = 0","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 16\n// module chunks = 0","module.exports = require('./shuffle').default;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/shuffle.min.js b/dist/shuffle.min.js index 49d7e95..1a9dc3b 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 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:v["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;is||"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)}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])),p=c[d]+e.height,v=0;v=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)}])}); +!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]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,e),s.l=!0,s.exports}var i={};return e.m=t,e.c=i,e.i=function(t){return t},e.d=function(t,i,n){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=17)}([function(t,e,i){"use strict";var n=i(2),s=function(t,e){this.x=i.i(n.a)(t),this.y=i.i(n.a)(e)};s.equals=function(t,e){return t.x===e.x&&t.y===e.y},e.a=s},function(t,e,i){"use strict";e.a={BASE:"shuffle",SHUFFLE_ITEM:"shuffle-item",VISIBLE:"shuffle-item--visible",HIDDEN:"shuffle-item--hidden"}},function(t,e,i){"use strict";function n(t){return parseFloat(t)||0}e.a=n},function(t,e){function i(){for(var t={},e=0;e-1}}Object.defineProperty(e,"__esModule",{value:!0});var a=i(13),u=(i.n(a),i(14)),l=i.n(u),h=i(6),c=i.n(h),f=i(3),d=i.n(f),p=i(15),v=i.n(p),m=i(5),y=i.n(m),g=i(0),_=i(11),E=i(1),b=i(8),S=i(12),I=i(10),k=i(9),w=function(){function t(t,e){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{};if(n(this,t),this.options=d()(t.options,i),this.useSizer=!1,this.lastSort={},this.group=this.lastFilter=t.ALL_ITEMS,this.isEnabled=!0,this.isDestroyed=!1,this.isInitialized=!1,this._transitions=[],this.isTransitioning=!1,this._queue=[],e=this._getElementOption(e),!e)throw new TypeError("Shuffle needs to be initialized with an element.");this.element=e,this.id="shuffle_"+T++,this._init(),this.isInitialized=!0}return w(t,[{key:"_init",value:function(){this.items=this._getItems(),this.options.sizer=this._getElementOption(this.options.sizer),this.options.sizer&&(this.useSizer=!0),this.element.classList.add(t.Classes.BASE),this._initItems(),this._onResize=this._getResizeFunction(),window.addEventListener("resize",this._onResize);var e=window.getComputedStyle(this.element,null),i=t.getSize(this.element).width;this._validateStyles(e),this._setColumns(i),this.filter(this.options.group,this.options.initialSort),this.element.offsetWidth,this._setTransitions(),this.element.style.transition="height "+this.options.speed+"ms "+this.options.easing}},{key:"_getResizeFunction",value:function(){var t=this._handleResize.bind(this);return this.options.throttle?this.options.throttle(t,this.options.throttleTime):t}},{key:"_getElementOption",value:function(t){return"string"==typeof t?this.element.querySelector(t):t&&t.nodeType&&1===t.nodeType?t:t&&t.jquery?t[0]:null}},{key:"_validateStyles",value:function(t){"static"===t.position&&(this.element.style.position="relative"),"hidden"!==t.overflow&&(this.element.style.overflow="hidden")}},{key:"_filter",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.lastFilter,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.items,i=this._getFilteredSets(t,e);return this._toggleFilterClasses(i),this.lastFilter=t,"string"==typeof t&&(this.group=t),i}},{key:"_getFilteredSets",value:function(e,i){var n=this,s=[],o=[];return e===t.ALL_ITEMS?s=i:i.forEach(function(t){n._doesPassFilter(e,t.element)?s.push(t):o.push(t)}),{visible:s,hidden:o}}},{key:"_doesPassFilter",value:function(e,i){if("function"==typeof e)return e.call(i,i,this);var n=i.getAttribute("data-"+t.FILTER_ATTRIBUTE_KEY),s=this.options.delimeter?n.split(this.options.delimeter):JSON.parse(n);return Array.isArray(e)?e.some(r(s)):r(s,e)}},{key:"_toggleFilterClasses",value:function(t){var e=t.visible,i=t.hidden;e.forEach(function(t){t.show()}),i.forEach(function(t){t.hide()})}},{key:"_initItems",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.items;t.forEach(function(t){t.init()})}},{key:"_disposeItems",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.items;t.forEach(function(t){t.dispose()})}},{key:"_updateItemCount",value:function(){this.visibleItems=this._getFilteredItems().length}},{key:"_setTransitions",value:function(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.items,i=this.options.speed,n=this.options.easing;t=this.options.useTransforms?"transform "+i+"ms "+n+", opacity "+i+"ms "+n:"top "+i+"ms "+n+", left "+i+"ms "+n+", opacity "+i+"ms "+n,e.forEach(function(e){e.element.style.transition=t})}},{key:"_getItems",value:function(){var t=this;return s(this.element.children).filter(function(e){return l()(e,t.options.itemSelector)}).map(function(t){return new _.a(t)})}},{key:"_updateItemsOrder",value:function(){var t=this.element.children;this.items=i.i(S.a)(this.items,{by:function(e){return Array.prototype.indexOf.call(t,e)}})}},{key:"_getFilteredItems",value:function(){return this.items.filter(function(t){return t.isVisible})}},{key:"_getConcealedItems",value:function(){return this.items.filter(function(t){return!t.isVisible})}},{key:"_getColumnSize",value:function(e,i){var n;return n="function"==typeof this.options.columnWidth?this.options.columnWidth(e):this.useSizer?t.getSize(this.options.sizer).width:this.options.columnWidth?this.options.columnWidth:this.items.length>0?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?i.i(b.a)(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.getSize(this.element).width,i=this._getGutterSize(e),n=this._getColumnSize(e,i),s=(e+i)/n;Math.abs(Math.round(s)-s)1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isDestroyed)return e.shuffle=this,!this.element.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!1,detail:e}))}},{key:"_resetCols",value:function(){var t=this.cols;for(this.positions=[];t--;)this.positions.push(0)}},{key:"_layout",value:function(e){var i=this,n=0;e.forEach(function(e){function s(){e.element.style.transitionDelay="",e.applyCss(_.a.Css.VISIBLE.after)}var o=e.point,r=e.scale,a=t.getSize(e.element,!0),u=i._getItemPosition(a);if(g.a.equals(o,u)&&r===_.a.Scale.VISIBLE)return void s();e.point=u,e.scale=_.a.Scale.VISIBLE;var l=d()(_.a.Css.VISIBLE.before);l.transitionDelay=i._getStaggerAmount(n)+"ms",i._queue.push({item:e,styles:l,callback:s}),n++})}},{key:"_getItemPosition",value:function(t){return i.i(k.a)({itemSize:t,positions:this.positions,gridSize:this.colWidth,total:this.cols,threshold:this.options.columnThreshold,buffer:this.options.buffer})}},{key:"_shrink",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this._getConcealedItems(),i=0;e.forEach(function(e){function n(){e.applyCss(_.a.Css.HIDDEN.after)}if(e.scale===_.a.Scale.HIDDEN)return void n();e.scale=_.a.Scale.HIDDEN;var s=d()(_.a.Css.HIDDEN.before);s.transitionDelay=t._getStaggerAmount(i)+"ms",t._queue.push({item:e,styles:s,callback:n}),i++})}},{key:"_handleResize",value:function(){if(this.isEnabled&&!this.isDestroyed){var e=t.getSize(this.element).width;e!==this.containerWidth&&this.update()}}},{key:"_getStylesForTransition",value:function(t){var e=t.item,i=t.styles;i.transitionDelay||(i.transitionDelay="0ms");var n=e.point.x,s=e.point.y;return this.options.useTransforms?i.transform="translate("+n+"px, "+s+"px) scale("+e.scale+")":(i.left=n+"px",i.top=s+"px"),i}},{key:"_whenTransitionDone",value:function(t,e,n){var s=i.i(I.a)(t,function(t){e(),n(null,t)});this._transitions.push(s)}},{key:"_getTransitionFunction",value:function(t){var e=this;return function(i){t.item.applyCss(e._getStylesForTransition(t)),e._whenTransitionDone(t.item.element,t.callback,i)}}},{key:"_processQueue",value:function(){this.isTransitioning&&this._cancelMovement();var t=this.options.speed>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)});y()(i,this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(I.b),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]?arguments[0]:this.lastSort;if(this.isEnabled){this._resetCols();var e=this._getFilteredItems();e=i.i(S.a)(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=c()(t).map(function(t){return new _.a(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=c()(e);var n=e.map(function(t){return i.getItemByElement(t)}).filter(function(t){return!!t}),s=function s(){i.element.removeEventListener(t.EventType.LAYOUT,s),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!r(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 n=window.getComputedStyle(t,null),s=i.i(b.a)(t,"width",n),o=i.i(b.a)(t,"height",n);if(e){var r=i.i(b.a)(t,"marginLeft",n),a=i.i(b.a)(t,"marginRight",n),u=i.i(b.a)(t,"marginTop",n),l=i.i(b.a)(t,"marginBottom",n);s+=r+a,o+=u+l}return{width:s,height:o}}},{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}();L.ShuffleItem=_.a,L.ALL_ITEMS="all",L.FILTER_ATTRIBUTE_KEY="groups",L.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},L.Classes=E.a,L.options={group:L.ALL_ITEMS,speed:250,easing:"ease",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimeter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:v.a,throttleTime:300,staggerAmount:15,staggerAmountMax:250,useTransforms:!0},L.__Point=g.a,L.__sorter=S.a,L.__getColumnSpan=k.b,L.__getAvailablePositions=k.c,L.__getShortColumn=k.d,e.default=L},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,a),void(r=!0);a[t]=i,--o||n(null,a)}}}n||("function"==typeof e?(n=e,e=null):n=i);var o=t&&t.length;if(!o)return n(null,[]);var r=!1,a=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(e){function i(t){for(var e=[],i=0;i2&&void 0!==arguments[2]?arguments[2]:window.getComputedStyle(t,null),r=i.i(s.a)(n[e]);return o.a||"width"!==e?o.a||"height"!==e||(r+=i.i(s.a)(n.paddingTop)+i.i(s.a)(n.paddingBottom)+i.i(s.a)(n.borderTopWidth)+i.i(s.a)(n.borderBottomWidth)):r+=i.i(s.a)(n.paddingLeft)+i.i(s.a)(n.paddingRight)+i.i(s.a)(n.borderLeftWidth)+i.i(s.a)(n.borderRightWidth),r}var s=i(2),o=i(7);e.a=n},function(t,e,i){"use strict";function n(t){return Math.max.apply(Math,t)}function s(t){return Math.min.apply(Math,t)}function o(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,h=t.buffer,c=r(e.width,n,s,o),f=a(i,c,s),d=u(f,h),p=new l.a(Math.round(n*d),Math.round(f[d])),v=f[d]+e.height,m=0;m=i-e&&t[n]<=i+e)return n;return 0}var l=i(0);e.a=o,e.b=r,e.c=a,e.d=u},function(t,e,i){"use strict";function n(){return a+u++}function s(t,e){var i=n(),s=function(t){t.currentTarget===t.target&&(o(i),e(t))};return t.addEventListener(a,s),r[i]={element:t,listener:s},i}function o(t){return!!r[t]&&(r[t].element.removeEventListener(a,r[t].listener),r[t]=null,!0)}e.a=s,e.b=o;var r={},a="transitionend",u=0},function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var s=i(0),o=i(1),r=function(){function t(t,e){for(var i=0;is||"sortLast"===n||"sortFirst"===s?1:0}),o?s:(i.reverse&&t.reverse(),t)):[]}var o=i(3),r=i.n(o);e.a=s;var a={reverse:!1,by:null,randomize:!1,key:"element"}},function(t,e){try{var i=new window.CustomEvent("test");if(i.preventDefault(),i.defaultPrevented!==!0)throw new Error("Could not prevent default")}catch(t){var n=function(t,e){var i,n;return e=e||{bubbles:!1,cancelable:!1,detail:void 0},i=document.createEvent("CustomEvent"),i.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n=i.preventDefault,i.preventDefault=function(){n.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(t){this.defaultPrevented=!0}},i};n.prototype=window.Event.prototype,window.CustomEvent=n}},function(t,e,i){"use strict";function n(t,e){if(o)return o.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){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){t.exports=i(4).default}])}); //# 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 df5a3f7..49c7d34 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 0e2e67c75d4d0ac81302","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","keys","delimeter","split","JSON","parse","isArray","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":"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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 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 keys = this.options.delimeter ? attr.split(this.options.delimeter) : JSON.parse(attr);\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\n\t\t\treturn false;\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 0e2e67c75d4d0ac81302\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 keys = this.options.delimeter ?\n attr.split(this.options.delimeter) :\n JSON.parse(attr);\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\n\t\treturn false;\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 2f5af03259079ae93e5f","webpack:///./src/point.js","webpack:///./src/classes.js","webpack:///./src/get-number.js","webpack:///./~/xtend/immutable.js","webpack:///./src/shuffle.js","webpack:///./~/array-parallel/index.js","webpack:///./~/array-uniq/index.js","webpack:///./src/computed-size.js","webpack:///./src/get-number-style.js","webpack:///./src/layout.js","webpack:///./src/on-transition-end.js","webpack:///./src/shuffle-item.js","webpack:///./src/sorter.js","webpack:///./~/custom-event-polyfill/custom-event-polyfill.js","webpack:///./~/matches-selector/index.js","webpack:///./~/throttleit/index.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","__WEBPACK_IMPORTED_MODULE_0__get_number__","Point","x","y","equals","a","b","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","getNumber","parseFloat","extend","target","arguments","length","source","key","_classCallCheck","instance","Constructor","TypeError","toArray","arrayLike","Array","slice","arrayMax","array","Math","max","apply","arrayIncludes","obj","indexOf","__WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill__","__WEBPACK_IMPORTED_MODULE_1_matches_selector__","__WEBPACK_IMPORTED_MODULE_1_matches_selector___default","__WEBPACK_IMPORTED_MODULE_2_array_uniq__","__WEBPACK_IMPORTED_MODULE_2_array_uniq___default","__WEBPACK_IMPORTED_MODULE_3_xtend__","__WEBPACK_IMPORTED_MODULE_3_xtend___default","__WEBPACK_IMPORTED_MODULE_4_throttleit__","__WEBPACK_IMPORTED_MODULE_4_throttleit___default","__WEBPACK_IMPORTED_MODULE_5_array_parallel__","__WEBPACK_IMPORTED_MODULE_5_array_parallel___default","__WEBPACK_IMPORTED_MODULE_6__point__","__WEBPACK_IMPORTED_MODULE_7__shuffle_item__","__WEBPACK_IMPORTED_MODULE_8__classes__","__WEBPACK_IMPORTED_MODULE_9__get_number_style__","__WEBPACK_IMPORTED_MODULE_10__sorter__","__WEBPACK_IMPORTED_MODULE_11__on_transition_end__","__WEBPACK_IMPORTED_MODULE_12__layout__","_createClass","defineProperties","props","descriptor","writable","protoProps","staticProps","id","Shuffle","element","options","undefined","useSizer","lastSort","group","lastFilter","ALL_ITEMS","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","_init","items","_getItems","sizer","classList","add","Classes","_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","keys","delimeter","split","JSON","parse","isArray","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","details","shuffle","dispatchEvent","CustomEvent","bubbles","cancelable","detail","_this3","count","callback","transitionDelay","applyCss","Css","after","currPos","point","currScale","scale","itemSize","pos","_getItemPosition","Scale","before","_getStaggerAmount","gridSize","total","threshold","buffer","_this4","_getConcealedItems","update","_ref2","transform","left","top","itemCallback","done","evt","opts","_this5","_getStylesForTransition","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatchLayout","transitions","_this6","callbacks","_getTransitionFunction","_movementFinished","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","__getAvailablePositions","__getShortColumn","noop","fns","context","maybeDone","err","result","finished","results","pending","fn","global","uniqNoSet","arr","ret","uniqSet","seen","Set","has","uniqSetWithForEach","doesForEachActuallyWork","document","body","documentElement","e","createElement","cssText","appendChild","getNumberStyle","__WEBPACK_IMPORTED_MODULE_1__computed_size__","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","arrayMin","getItemPosition","span","getColumnSpan","setY","getAvailablePositions","shortColumnIndex","getShortColumn","__WEBPACK_IMPORTED_MODULE_0__point__","setHeight","itemWidth","columns","columnSpan","ceil","available","minPosition","len","uniqueId","eventName","onTransitionEnd","listener","currentTarget","cancelTransitionEnd","__WEBPACK_IMPORTED_MODULE_1__classes__","addClasses","INITIAL","classes","className","removeClasses","visibility","will-change","opacity","randomize","tmp","current","random","sorter","__WEBPACK_IMPORTED_MODULE_0_xtend___default","defaults","original","revert","valA","valB","reverse","__WEBPACK_IMPORTED_MODULE_0_xtend__","ce","preventDefault","defaultPrevented","Error","event","params","origPrevent","createEvent","initCustomEvent","Event","match","selector","vendor","nodes","querySelectorAll","proto","Element","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","func","wait","timeoutID","last","Date","rtn","ctx","args","delta","setTimeout","g","Function","eval","default"],"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","(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\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\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.l = 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// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 17);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_number__ = __webpack_require__(2);\n\n\n\n\n/**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\nvar Point = function Point(x, y) {\n this.x = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(x);\n this.y = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(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\n/* harmony default export */ __webpack_exports__[\"a\"] = Point;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden'\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = getNumber;\n\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 */\n\nfunction getNumber(value) {\n return parseFloat(value) || 0;\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.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/* 4 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_custom_event_polyfill__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_matches_selector__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_matches_selector___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_matches_selector__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_array_uniq__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_array_uniq___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_array_uniq__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_xtend__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_xtend___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_xtend__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_throttleit__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_throttleit___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_throttleit__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_array_parallel__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_array_parallel___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_array_parallel__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__point__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__shuffle_item__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__classes__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__get_number_style__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__sorter__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__on_transition_end__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__layout__ = __webpack_require__(9);\n\n\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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\nvar id = 0;\n\nvar Shuffle = function () {\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 function Shuffle(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Shuffle);\n\n this.options = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(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 _createClass(Shuffle, [{\n key: '_init',\n value: function _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\n }, {\n key: '_getResizeFunction',\n value: function _getResizeFunction() {\n var resizeFunction = this._handleResize.bind(this);\n return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : 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\n }, {\n key: '_getElementOption',\n value: function _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\n }, {\n key: '_validateStyles',\n value: function _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\n }, {\n key: '_filter',\n value: function _filter() {\n var category = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastFilter;\n var collection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.items;\n\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\n }, {\n key: '_getFilteredSets',\n value: function _getFilteredSets(category, items) {\n var _this = this;\n\n var visible = [];\n var 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(function (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: visible,\n hidden: 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\n }, {\n key: '_doesPassFilter',\n value: function _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 var attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n var keys = this.options.delimeter ? attr.split(this.options.delimeter) : JSON.parse(attr);\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\n }, {\n key: '_toggleFilterClasses',\n value: function _toggleFilterClasses(_ref) {\n var visible = _ref.visible,\n hidden = _ref.hidden;\n\n visible.forEach(function (item) {\n item.show();\n });\n\n hidden.forEach(function (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\n }, {\n key: '_initItems',\n value: function _initItems() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items;\n\n items.forEach(function (item) {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @private\n */\n\n }, {\n key: '_disposeItems',\n value: function _disposeItems() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items;\n\n items.forEach(function (item) {\n item.dispose();\n });\n }\n\n /**\n * Updates the visible item count.\n * @private\n */\n\n }, {\n key: '_updateItemCount',\n value: function _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\n }, {\n key: '_setTransitions',\n value: function _setTransitions() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items;\n\n var speed = this.options.speed;\n var easing = this.options.easing;\n\n var str;\n if (this.options.useTransforms) {\n str = 'transform ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n } else {\n str = 'top ' + speed + 'ms ' + easing + ', left ' + speed + 'ms ' + easing + ', opacity ' + speed + 'ms ' + easing;\n }\n\n items.forEach(function (item) {\n item.element.style.transition = str;\n });\n }\n }, {\n key: '_getItems',\n value: function _getItems() {\n var _this2 = this;\n\n return toArray(this.element.children).filter(function (el) {\n return __WEBPACK_IMPORTED_MODULE_1_matches_selector___default()(el, _this2.options.itemSelector);\n }).map(function (el) {\n return new __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */](el);\n });\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\n }, {\n key: '_updateItemsOrder',\n value: function _updateItemsOrder() {\n var children = this.element.children;\n this.items = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__sorter__[\"a\" /* default */])(this.items, {\n by: function by(element) {\n return Array.prototype.indexOf.call(children, element);\n }\n });\n }\n }, {\n key: '_getFilteredItems',\n value: function _getFilteredItems() {\n return this.items.filter(function (item) {\n return item.isVisible;\n });\n }\n }, {\n key: '_getConcealedItems',\n value: function _getConcealedItems() {\n return this.items.filter(function (item) {\n return !item.isVisible;\n });\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\n }, {\n key: '_getColumnSize',\n value: function _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\n }, {\n key: '_getGutterSize',\n value: function _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 = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(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\n }, {\n key: '_setColumns',\n value: function _setColumns() {\n var containerWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Shuffle.getSize(this.element).width;\n\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) < 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\n }, {\n key: '_setContainerSize',\n value: function _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\n }, {\n key: '_getContainerSize',\n value: function _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\n }, {\n key: '_getStaggerAmount',\n value: function _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\n }, {\n key: '_dispatch',\n value: function _dispatch(name) {\n var details = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\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\n }, {\n key: '_resetCols',\n value: function _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\n }, {\n key: '_layout',\n value: function _layout(items) {\n var _this3 = this;\n\n var count = 0;\n items.forEach(function (item) {\n var currPos = item.point;\n var currScale = item.scale;\n var itemSize = Shuffle.getSize(item.element, true);\n var pos = _this3._getItemPosition(itemSize);\n\n function callback() {\n item.element.style.transitionDelay = '';\n item.applyCss(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].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 (__WEBPACK_IMPORTED_MODULE_6__point__[\"a\" /* default */].equals(currPos, pos) && currScale === __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].Scale.VISIBLE) {\n callback();\n return;\n }\n\n item.point = pos;\n item.scale = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].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 var styles = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].Css.VISIBLE.before);\n styles.transitionDelay = _this3._getStaggerAmount(count) + 'ms';\n\n _this3._queue.push({\n item: item,\n styles: styles,\n callback: 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\n }, {\n key: '_getItemPosition',\n value: function _getItemPosition(itemSize) {\n return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_12__layout__[\"a\" /* getItemPosition */])({\n itemSize: 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\n }, {\n key: '_shrink',\n value: function _shrink() {\n var _this4 = this;\n\n var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._getConcealedItems();\n\n var count = 0;\n collection.forEach(function (item) {\n function callback() {\n item.applyCss(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].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 === __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].Scale.HIDDEN) {\n callback();\n return;\n }\n\n item.scale = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].Scale.HIDDEN;\n\n var styles = __WEBPACK_IMPORTED_MODULE_3_xtend___default()(__WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */].Css.HIDDEN.before);\n styles.transitionDelay = _this4._getStaggerAmount(count) + 'ms';\n\n _this4._queue.push({\n item: item,\n styles: styles,\n callback: callback\n });\n\n count++;\n });\n }\n\n /**\n * Resize handler.\n * @private\n */\n\n }, {\n key: '_handleResize',\n value: function _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\n }, {\n key: '_getStylesForTransition',\n value: function _getStylesForTransition(_ref2) {\n var item = _ref2.item,\n styles = _ref2.styles;\n\n if (!styles.transitionDelay) {\n styles.transitionDelay = '0ms';\n }\n\n var x = item.point.x;\n var 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\n }, {\n key: '_whenTransitionDone',\n value: function _whenTransitionDone(element, itemCallback, done) {\n var id = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_11__on_transition_end__[\"a\" /* onTransitionEnd */])(element, function (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\n }, {\n key: '_getTransitionFunction',\n value: function _getTransitionFunction(opts) {\n var _this5 = this;\n\n return function (done) {\n opts.item.applyCss(_this5._getStylesForTransition(opts));\n _this5._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\n }, {\n key: '_processQueue',\n value: function _processQueue() {\n if (this.isTransitioning) {\n this._cancelMovement();\n }\n\n var hasSpeed = this.options.speed > 0;\n var hasQueue = this._queue.length > 0;\n\n if (hasQueue && hasSpeed && this.isInitialized) {\n this._startTransitions(this._queue);\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\n }, {\n key: '_startTransitions',\n value: function _startTransitions(transitions) {\n var _this6 = this;\n\n // Set flag that shuffle is currently in motion.\n this.isTransitioning = true;\n\n // Create an array of functions to be called.\n var callbacks = transitions.map(function (obj) {\n return _this6._getTransitionFunction(obj);\n });\n\n __WEBPACK_IMPORTED_MODULE_5_array_parallel___default()(callbacks, this._movementFinished.bind(this));\n }\n }, {\n key: '_cancelMovement',\n value: function _cancelMovement() {\n // Remove the transition end event for each listener.\n this._transitions.forEach(__WEBPACK_IMPORTED_MODULE_11__on_transition_end__[\"b\" /* 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\n }, {\n key: '_styleImmediately',\n value: function _styleImmediately(objects) {\n var _this7 = this;\n\n if (objects.length) {\n var elements = objects.map(function (obj) {\n return obj.item.element;\n });\n\n Shuffle._skipTransitions(elements, function () {\n objects.forEach(function (obj) {\n obj.item.applyCss(_this7._getStylesForTransition(obj));\n obj.callback();\n });\n });\n }\n }\n }, {\n key: '_movementFinished',\n value: function _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatchLayout();\n }\n }, {\n key: '_dispatchLayout',\n value: function _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\n }, {\n key: 'filter',\n value: function 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\n }, {\n key: 'sort',\n value: function sort() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastSort;\n\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n var items = this._getFilteredItems();\n items = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__sorter__[\"a\" /* default */])(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\n }, {\n key: 'update',\n value: function 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\n }, {\n key: 'layout',\n value: function 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\n }, {\n key: 'add',\n value: function add(newItems) {\n newItems = __WEBPACK_IMPORTED_MODULE_2_array_uniq___default()(newItems).map(function (el) {\n return new __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */](el);\n });\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\n }, {\n key: 'disable',\n value: function 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\n }, {\n key: 'enable',\n value: function 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\n }, {\n key: 'remove',\n value: function remove(collection) {\n var _this8 = this;\n\n if (!collection.length) {\n return;\n }\n\n collection = __WEBPACK_IMPORTED_MODULE_2_array_uniq___default()(collection);\n\n var oldItems = collection.map(function (element) {\n return _this8.getItemByElement(element);\n }).filter(function (item) {\n return !!item;\n });\n\n var handleLayout = function handleLayout() {\n _this8.element.removeEventListener(Shuffle.EventType.LAYOUT, handleLayout);\n _this8._disposeItems(oldItems);\n\n // Remove the collection in the callback\n collection.forEach(function (element) {\n element.parentNode.removeChild(element);\n });\n\n _this8._dispatch(Shuffle.EventType.REMOVED, { collection: 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(function (item) {\n return !arrayIncludes(oldItems, item);\n });\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\n }, {\n key: 'getItemByElement',\n value: function 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\n }, {\n key: 'destroy',\n value: function 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\n }], [{\n key: 'getSize',\n value: function 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 = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'width', styles);\n var height = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'height', styles);\n\n if (includeMargins) {\n var marginLeft = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'marginLeft', styles);\n var marginRight = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'marginRight', styles);\n var marginTop = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'marginTop', styles);\n var marginBottom = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__get_number_style__[\"a\" /* default */])(element, 'marginBottom', styles);\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n }\n\n return {\n width: width,\n height: 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\n }, {\n key: '_skipTransitions',\n value: function _skipTransitions(elements, callback) {\n var zero = '0ms';\n\n // Save current duration and delay.\n var data = elements.map(function (element) {\n var style = element.style;\n var duration = style.transitionDuration;\n var 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: duration,\n delay: 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(function (element, i) {\n element.style.transitionDuration = data[i].duration;\n element.style.transitionDelay = data[i].delay;\n });\n }\n }]);\n\n return Shuffle;\n}();\n\nShuffle.ShuffleItem = __WEBPACK_IMPORTED_MODULE_7__shuffle_item__[\"a\" /* default */];\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 = __WEBPACK_IMPORTED_MODULE_8__classes__[\"a\" /* default */];\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: __WEBPACK_IMPORTED_MODULE_4_throttleit___default.a,\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 = __WEBPACK_IMPORTED_MODULE_6__point__[\"a\" /* default */];\nShuffle.__sorter = __WEBPACK_IMPORTED_MODULE_10__sorter__[\"a\" /* default */];\nShuffle.__getColumnSpan = __WEBPACK_IMPORTED_MODULE_12__layout__[\"b\" /* getColumnSpan */];\nShuffle.__getAvailablePositions = __WEBPACK_IMPORTED_MODULE_12__layout__[\"c\" /* getAvailablePositions */];\nShuffle.__getShortColumn = __WEBPACK_IMPORTED_MODULE_12__layout__[\"d\" /* getShortColumn */];\n\n/* harmony default export */ __webpack_exports__[\"default\"] = Shuffle;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nmodule.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/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\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\n\t\treturn false;\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/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(16)))\n\n/***/ }),\n/* 7 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\nvar element = document.body || document.documentElement;\nvar e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nvar width = window.getComputedStyle(e, null).width;\nvar ret = width === '10px';\n\nelement.removeChild(e);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ret;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__get_number__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__computed_size__ = __webpack_require__(7);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = getNumberStyle;\n\n\n\n\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 */\nfunction getNumberStyle(element, style) {\n var styles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window.getComputedStyle(element, null);\n\n var value = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!__WEBPACK_IMPORTED_MODULE_1__computed_size__[\"a\" /* default */] && style === 'width') {\n value += __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.paddingLeft) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.paddingRight) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.borderLeftWidth) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.borderRightWidth);\n } else if (!__WEBPACK_IMPORTED_MODULE_1__computed_size__[\"a\" /* default */] && style === 'height') {\n value += __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.paddingTop) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.paddingBottom) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.borderTopWidth) + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__get_number__[\"a\" /* default */])(styles.borderBottomWidth);\n }\n\n return value;\n}\n\n/***/ }),\n/* 9 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__point__ = __webpack_require__(0);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = getItemPosition;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = getColumnSpan;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = getAvailablePositions;\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = getShortColumn;\n\n\n\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 */\nfunction getItemPosition(_ref) {\n var itemSize = _ref.itemSize,\n positions = _ref.positions,\n gridSize = _ref.gridSize,\n total = _ref.total,\n threshold = _ref.threshold,\n buffer = _ref.buffer;\n\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 __WEBPACK_IMPORTED_MODULE_0__point__[\"a\" /* default */](Math.round(gridSize * shortColumnIndex), 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 */\nfunction 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 */\nfunction 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 */\nfunction 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/* 10 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = onTransitionEnd;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = cancelTransitionEnd;\n\n\nvar transitions = {};\nvar eventName = 'transitionend';\nvar count = 0;\n\nfunction uniqueId() {\n return eventName + count++;\n}\n\nfunction onTransitionEnd(element, callback) {\n var id = uniqueId();\n var listener = function 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: element, listener: listener };\n\n return id;\n}\n\nfunction 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/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__point__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__classes__ = __webpack_require__(1);\nvar _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\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar id = 0;\n\nvar ShuffleItem = function () {\n function ShuffleItem(element) {\n _classCallCheck(this, ShuffleItem);\n\n this.id = id++;\n this.element = element;\n this.isVisible = true;\n }\n\n _createClass(ShuffleItem, [{\n key: 'show',\n value: function show() {\n this.isVisible = true;\n this.element.classList.remove(__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].HIDDEN);\n this.element.classList.add(__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].VISIBLE);\n }\n }, {\n key: 'hide',\n value: function hide() {\n this.isVisible = false;\n this.element.classList.remove(__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].VISIBLE);\n this.element.classList.add(__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].HIDDEN);\n }\n }, {\n key: 'init',\n value: function init() {\n this.addClasses([__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].SHUFFLE_ITEM, __WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.scale = ShuffleItem.Scale.VISIBLE;\n this.point = new __WEBPACK_IMPORTED_MODULE_0__point__[\"a\" /* default */]();\n }\n }, {\n key: 'addClasses',\n value: function addClasses(classes) {\n var _this = this;\n\n classes.forEach(function (className) {\n _this.element.classList.add(className);\n });\n }\n }, {\n key: 'removeClasses',\n value: function removeClasses(classes) {\n var _this2 = this;\n\n classes.forEach(function (className) {\n _this2.element.classList.remove(className);\n });\n }\n }, {\n key: 'applyCss',\n value: function applyCss(obj) {\n for (var key in obj) {\n this.element.style[key] = obj[key];\n }\n }\n }, {\n key: 'dispose',\n value: function dispose() {\n this.removeClasses([__WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].HIDDEN, __WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].VISIBLE, __WEBPACK_IMPORTED_MODULE_1__classes__[\"a\" /* default */].SHUFFLE_ITEM]);\n\n this.element.removeAttribute('style');\n this.element = null;\n }\n }]);\n\n return ShuffleItem;\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\n/* harmony default export */ __webpack_exports__[\"a\"] = ShuffleItem;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_xtend__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_xtend___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_xtend__);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = sorter;\n\n\n\n\n// http://stackoverflow.com/a/962890/373422\nfunction randomize(array) {\n var tmp;\n var current;\n var 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\nvar 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.\nfunction sorter(arr, options) {\n var opts = __WEBPACK_IMPORTED_MODULE_0_xtend___default()(defaults, options);\n var original = [].slice.call(arr);\n var 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 var valA = opts.by(a[opts.key]);\n var 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/* 13 */\n/***/ (function(module, exports) {\n\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 var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\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 origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\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/* 15 */\n/***/ (function(module, exports) {\n\nmodule.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/* 16 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(4).default;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// shuffle.min.js"," \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\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\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.l = 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// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2f5af03259079ae93e5f","'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","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","'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","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 = 3\n// module chunks = 0","'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 keys = this.options.delimeter ?\n attr.split(this.options.delimeter) :\n JSON.parse(attr);\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","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 = 5\n// module chunks = 0","'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\n\t\treturn false;\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 = 6\n// module chunks = 0","\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","'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","'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","'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","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","'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","// 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 var ce = new window.CustomEvent('test');\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n} catch(e) {\n var CustomEvent = function(event, params) {\n var evt, origPrevent;\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 origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch(e) {\n this.defaultPrevented = true;\n }\n };\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 = 13\n// module chunks = 0","'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 = 14\n// module chunks = 0","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 = 15\n// module chunks = 0","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 16\n// module chunks = 0","module.exports = require('./shuffle').default;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index ca2b81d..eb408ec 100644 --- a/package.json +++ b/package.json @@ -58,11 +58,11 @@ "gulp": "gulpjs/gulp.git#4.0", "gulp-mocha-phantomjs": "^0.12.0", "gulp-postcss": "^6.1.0", - "gulp-sass": "^2.2.0", + "gulp-sass": "^3.1.0", "gulp-shell": "^0.5.2", "gulp-util": "^3.0.7", "mocha": "^3.0.0", "sinon": "^1.17.3", - "webpack": "^1.13.0" + "webpack": "^2.2.1" } } diff --git a/webpack.config.js b/webpack.config.js index 68bdbe9..331deed 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,14 +11,17 @@ module.exports = { libraryTarget: 'umd', }, resolve: { - root: [path.resolve('./src')], + modules: [ + path.resolve('./src'), + 'node_modules', + ], }, module: { - loaders: [ + rules: [ { test: /\.js$/, exclude: /node_modules/, - loader: 'babel', + loader: 'babel-loader', }, ], }, diff --git a/webpack.config.min.js b/webpack.config.min.js index 2d40263..06fbf23 100644 --- a/webpack.config.min.js +++ b/webpack.config.min.js @@ -12,23 +12,27 @@ module.exports = { libraryTarget: 'umd', }, resolve: { - root: [path.resolve('./src')], + modules: [ + path.resolve('./src'), + 'node_modules', + ], }, module: { - loaders: [ + rules: [ { test: /\.js$/, exclude: /node_modules/, - loader: 'babel', + loader: 'babel-loader', }, ], }, plugins: [ - new webpack.optimize.DedupePlugin(), new webpack.optimize.UglifyJsPlugin({ + sourceMap: true, comments: false, screw_ie8: true, compress: { + warnings: true, drop_console: true, }, mangle: true,